From 0e3a501db3ab360babf9197453d71bb3751efcc8 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Mon, 3 Jun 2024 15:01:51 +0000
Subject: [PATCH 001/257] Update dependencies from
https://github.com/dotnet/source-build-externals build 20240528.2 (#56037)
[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 295416a435f1..9080d04b7708 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -368,9 +368,9 @@
745230568e52639e229dcc24c98fe0dbb4c1641d
-
+
https://github.com/dotnet/source-build-externals
- 59204e5b14e6e197b3c942f992f6e3ec9196e50b
+ f1b44a365df0b8dbc38403ee8696adc25fbdd76a
diff --git a/eng/Versions.props b/eng/Versions.props
index c65b00fd2b72..fe971a973904 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -165,7 +165,7 @@
9.0.0-beta.24272.5
9.0.0-beta.24272.5
- 9.0.0-alpha.1.24263.2
+ 9.0.0-alpha.1.24278.2
9.0.0-alpha.1.24278.2
From 1daeea6499b579a725fc05fbe69e2b574f8663b7 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Mon, 3 Jun 2024 15:09:33 +0000
Subject: [PATCH 002/257] Update dependencies from
https://github.com/dotnet/winforms build 20240602.1 (#56040)
[main] Update dependencies from dotnet/winforms
---
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 9080d04b7708..9063e19083d6 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -380,9 +380,9 @@
https://github.com/dotnet/runtime
745230568e52639e229dcc24c98fe0dbb4c1641d
-
+
https://github.com/dotnet/winforms
- b546fbde291f4562dd1c0ab30f6dc39f8fa0253d
+ 9f9d572dd4fdf6e55cf91548ab8ee18c8f003990
https://github.com/dotnet/arcade
diff --git a/eng/Versions.props b/eng/Versions.props
index fe971a973904..0f1ef2535cb4 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -171,7 +171,7 @@
2.1.0-beta.24208.1
- 9.0.0-preview.6.24275.1
+ 9.0.0-preview.6.24302.1
9.0.0-preview.24277.2
9.0.0-preview.24277.2
From 0ffc29649a8047ad969445fd185450892b3fc75b Mon Sep 17 00:00:00 2001
From: Martin Costello
Date: Mon, 3 Jun 2024 22:16:50 +0100
Subject: [PATCH 003/257] Bump update-dotnet-sdk action (#56010)
Bump the update-dotnet-sdk action to 3.2.3 to handle upcoming changes from the merging of the installer and sdk repos.
---
.github/workflows/update-sdk.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/update-sdk.yml b/.github/workflows/update-sdk.yml
index 4f2f798fe1b1..c96f6b550c5c 100644
--- a/.github/workflows/update-sdk.yml
+++ b/.github/workflows/update-sdk.yml
@@ -20,7 +20,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- - uses: martincostello/update-dotnet-sdk@9d42ad9bcbd97a74394c7273c9c616b4bf136b53 # v3.1.3
+ - uses: martincostello/update-dotnet-sdk@67d6e2b14939c06978a7f80444157296c3defe14 # v3.2.3
with:
quality: 'daily'
repo-token: ${{ secrets.GITHUB_TOKEN }}
From b8566e110b1d3918b5f7319db463aa69dbb0c183 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Mon, 3 Jun 2024 23:02:53 +0000
Subject: [PATCH 004/257] Update dependencies from
https://github.com/dotnet/extensions build 20240601.1 (#56038)
[main] Update dependencies from dotnet/extensions
---
eng/Version.Details.xml | 8 ++++----
eng/Versions.props | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 9063e19083d6..04668f67ffca 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -410,13 +410,13 @@
https://github.com/dotnet/arcade
2001d73c8ff942331a73300ba61fa6164805b231
-
+
https://github.com/dotnet/extensions
- 5dfd054e528f38926ad2c137896bd86036ad07b0
+ 74a55056def261bb3b433ceb040dc4134a35f63e
-
+
https://github.com/dotnet/extensions
- 5dfd054e528f38926ad2c137896bd86036ad07b0
+ 74a55056def261bb3b433ceb040dc4134a35f63e
https://github.com/nuget/nuget.client
diff --git a/eng/Versions.props b/eng/Versions.props
index 0f1ef2535cb4..ca14ce40594a 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -137,8 +137,8 @@
9.0.0-preview.5.24272.1
9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24273.3
- 9.0.0-preview.5.24273.3
+ 9.0.0-preview.5.24301.1
+ 9.0.0-preview.5.24301.1
9.0.0-preview.5.24271.1
9.0.0-preview.5.24271.1
From afa0b365a9bc4a45e3b245903ce3eacfe2658d40 Mon Sep 17 00:00:00 2001
From: Safia Abdalla
Date: Mon, 3 Jun 2024 16:41:45 -0700
Subject: [PATCH 005/257] Add test coverage for generic types (#55940)
---
.../src/Schemas/OpenApiJsonSchema.Helpers.cs | 8 ++
.../src/Schemas/OpenApiSchemaKeywords.cs | 1 +
...OpenApiComponentService.ResponseSchemas.cs | 136 ++++++++++++++++++
src/OpenApi/test/SharedTypes.cs | 9 ++
4 files changed, 154 insertions(+)
diff --git a/src/OpenApi/src/Schemas/OpenApiJsonSchema.Helpers.cs b/src/OpenApi/src/Schemas/OpenApiJsonSchema.Helpers.cs
index e76fdc8811dd..7493f4313732 100644
--- a/src/OpenApi/src/Schemas/OpenApiJsonSchema.Helpers.cs
+++ b/src/OpenApi/src/Schemas/OpenApiJsonSchema.Helpers.cs
@@ -265,6 +265,11 @@ public static void ReadProperty(ref Utf8JsonReader reader, string propertyName,
var props = ReadDictionary(ref reader);
schema.Properties = props?.ToDictionary(p => p.Key, p => p.Value.Schema);
break;
+ case OpenApiSchemaKeywords.AdditionalPropertiesKeyword:
+ reader.Read();
+ var additionalPropsConverter = (JsonConverter)options.GetTypeInfo(typeof(OpenApiJsonSchema)).Converter;
+ schema.AdditionalProperties = additionalPropsConverter.Read(ref reader, typeof(OpenApiJsonSchema), options)?.Schema;
+ break;
case OpenApiSchemaKeywords.AnyOfKeyword:
reader.Read();
schema.Type = "object";
@@ -284,6 +289,9 @@ public static void ReadProperty(ref Utf8JsonReader reader, string propertyName,
var mappings = ReadDictionary(ref reader);
schema.Discriminator.Mapping = mappings;
break;
+ default:
+ reader.Skip();
+ break;
}
}
}
diff --git a/src/OpenApi/src/Schemas/OpenApiSchemaKeywords.cs b/src/OpenApi/src/Schemas/OpenApiSchemaKeywords.cs
index 063569ea270f..69ba96d77016 100644
--- a/src/OpenApi/src/Schemas/OpenApiSchemaKeywords.cs
+++ b/src/OpenApi/src/Schemas/OpenApiSchemaKeywords.cs
@@ -7,6 +7,7 @@ internal class OpenApiSchemaKeywords
public const string FormatKeyword = "format";
public const string ItemsKeyword = "items";
public const string PropertiesKeyword = "properties";
+ public const string AdditionalPropertiesKeyword = "additionalProperties";
public const string RequiredKeyword = "required";
public const string AnyOfKeyword = "anyOf";
public const string EnumKeyword = "enum";
diff --git a/src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.ResponseSchemas.cs b/src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.ResponseSchemas.cs
index 4a1eb57f7162..c9edafae041d 100644
--- a/src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.ResponseSchemas.cs
+++ b/src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.ResponseSchemas.cs
@@ -393,4 +393,140 @@ await VerifyOpenApiDocument(builder, document =>
});
});
}
+
+ [Fact]
+ public async Task GetOpenApiResponse_HandlesGenericType()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ // Act
+ builder.MapGet("/", () => TypedResults.Ok>(new(0, 1, 5, 50, [new Todo(1, "Test Title", true, DateTime.Now), new Todo(2, "Test Title 2", false, DateTime.Now)])));
+
+ // Assert that the response schema is correctly generated. For now, generics are inlined
+ // in the generated OpenAPI schema since OpenAPI supports generics via dynamic references as of
+ // OpenAPI 3.1.0.
+ await VerifyOpenApiDocument(builder, document =>
+ {
+ var operation = document.Paths["/"].Operations[OperationType.Get];
+ var responses = Assert.Single(operation.Responses);
+ var response = responses.Value;
+ Assert.True(response.Content.TryGetValue("application/json", out var mediaType));
+ Assert.Equal("object", mediaType.Schema.Type);
+ Assert.Collection(mediaType.Schema.Properties,
+ property =>
+ {
+ Assert.Equal("pageIndex", property.Key);
+ Assert.Equal("integer", property.Value.Type);
+ Assert.Equal("int32", property.Value.Format);
+ },
+ property =>
+ {
+ Assert.Equal("pageSize", property.Key);
+ Assert.Equal("integer", property.Value.Type);
+ Assert.Equal("int32", property.Value.Format);
+ },
+ property =>
+ {
+ Assert.Equal("totalItems", property.Key);
+ Assert.Equal("integer", property.Value.Type);
+ Assert.Equal("int64", property.Value.Format);
+ },
+ property =>
+ {
+ Assert.Equal("totalPages", property.Key);
+ Assert.Equal("integer", property.Value.Type);
+ Assert.Equal("int32", property.Value.Format);
+ },
+ property =>
+ {
+ Assert.Equal("items", property.Key);
+ Assert.Equal("array", property.Value.Type);
+ Assert.NotNull(property.Value.Items);
+ Assert.Equal("object", property.Value.Items.Type);
+ Assert.Collection(property.Value.Items.Properties,
+ property =>
+ {
+ Assert.Equal("id", property.Key);
+ Assert.Equal("integer", property.Value.Type);
+ Assert.Equal("int32", property.Value.Format);
+ },
+ property =>
+ {
+ Assert.Equal("title", property.Key);
+ Assert.Equal("string", property.Value.Type);
+ },
+ property =>
+ {
+ Assert.Equal("completed", property.Key);
+ Assert.Equal("boolean", property.Value.Type);
+ },
+ property =>
+ {
+ Assert.Equal("createdAt", property.Key);
+ Assert.Equal("string", property.Value.Type);
+ Assert.Equal("date-time", property.Value.Format);
+ });
+ });
+ });
+ }
+
+ [Fact]
+ public async Task GetOpenApiResponse_HandlesValidationProblem()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ // Act
+ builder.MapGet("/", () => TypedResults.ValidationProblem(new Dictionary
+ {
+ ["Name"] = ["Name is required"]
+ }));
+
+ // Assert
+ await VerifyOpenApiDocument(builder, document =>
+ {
+ var operation = document.Paths["/"].Operations[OperationType.Get];
+ var responses = Assert.Single(operation.Responses);
+ var response = responses.Value;
+ Assert.True(response.Content.TryGetValue("application/problem+json", out var mediaType));
+ Assert.Equal("object", mediaType.Schema.Type);
+ Assert.Collection(mediaType.Schema.Properties,
+ property =>
+ {
+ Assert.Equal("type", property.Key);
+ Assert.Equal("string", property.Value.Type);
+ },
+ property =>
+ {
+ Assert.Equal("title", property.Key);
+ Assert.Equal("string", property.Value.Type);
+ },
+ property =>
+ {
+ Assert.Equal("status", property.Key);
+ Assert.Equal("integer", property.Value.Type);
+ Assert.Equal("int32", property.Value.Format);
+ },
+ property =>
+ {
+ Assert.Equal("detail", property.Key);
+ Assert.Equal("string", property.Value.Type);
+ },
+ property =>
+ {
+ Assert.Equal("instance", property.Key);
+ Assert.Equal("string", property.Value.Type);
+ },
+ property =>
+ {
+ Assert.Equal("errors", property.Key);
+ Assert.Equal("object", property.Value.Type);
+ // The errors object is a dictionary of string[]. Use `additionalProperties`
+ // to indicate that the payload can be arbitrary keys with string[] values.
+ Assert.Equal("array", property.Value.AdditionalProperties.Type);
+ Assert.Equal("string", property.Value.AdditionalProperties.Items.Type);
+ });
+ });
+ }
}
diff --git a/src/OpenApi/test/SharedTypes.cs b/src/OpenApi/test/SharedTypes.cs
index c691f54acd30..edf8f45c29b5 100644
--- a/src/OpenApi/test/SharedTypes.cs
+++ b/src/OpenApi/test/SharedTypes.cs
@@ -63,3 +63,12 @@ internal class Proposal
public required Proposal ProposalElement { get; set; }
public required Stream Stream { get; set; }
}
+
+internal class PaginatedItems(int pageIndex, int pageSize, long totalItems, int totalPages, IEnumerable items) where T : class
+{
+ public int PageIndex { get; set; } = pageIndex;
+ public int PageSize { get; set; } = pageSize;
+ public long TotalItems { get; set; } = totalItems;
+ public int TotalPages { get; set; } = totalPages;
+ public IEnumerable Items { get; set; } = items;
+}
From 31ff604dd6c9917e20af2b10c7fad1afccba9a12 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 4 Jun 2024 12:09:24 -0700
Subject: [PATCH 006/257] [main] (deps): Bump src/submodules/googletest
(#55995)
Bumps [src/submodules/googletest](https://github.com/google/googletest) from `9b4993c` to `a7f443b`.
- [Release notes](https://github.com/google/googletest/releases)
- [Commits](https://github.com/google/googletest/compare/9b4993ca7d1279dec5c5d41ba327cb11a77bdc00...a7f443b80b105f940225332ed3c31f2790092f47)
---
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 9b4993ca7d12..a7f443b80b10 160000
--- a/src/submodules/googletest
+++ b/src/submodules/googletest
@@ -1 +1 @@
-Subproject commit 9b4993ca7d1279dec5c5d41ba327cb11a77bdc00
+Subproject commit a7f443b80b105f940225332ed3c31f2790092f47
From 54e37afd64fdf166ad5310cea062158dbe2cf5c1 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Tue, 4 Jun 2024 12:19:04 -0700
Subject: [PATCH 007/257] Update dependencies from
https://github.com/dotnet/xdt build 20240603.1 (#56066)
Microsoft.SourceBuild.Intermediate.xdt , Microsoft.Web.Xdt
From Version 9.0.0-preview.24277.2 -> To Version 9.0.0-preview.24303.1
Co-authored-by: dotnet-maestro[bot]
---
eng/Version.Details.xml | 8 ++++----
eng/Versions.props | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 04668f67ffca..b95d02a9e892 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -325,14 +325,14 @@
https://github.com/dotnet/runtime
745230568e52639e229dcc24c98fe0dbb4c1641d
-
+
https://github.com/dotnet/xdt
- 7e5dc8069868619c4d90b96f4e57bdef9b16c8e0
+ b1d534fe8831bbf62dc4356a7e611befee6ece33
-
+
https://github.com/dotnet/xdt
- 7e5dc8069868619c4d90b96f4e57bdef9b16c8e0
+ b1d534fe8831bbf62dc4356a7e611befee6ece33
diff --git a/eng/Versions.props b/eng/Versions.props
index ca14ce40594a..1f3037b5a204 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -173,8 +173,8 @@
9.0.0-preview.6.24302.1
- 9.0.0-preview.24277.2
- 9.0.0-preview.24277.2
+ 9.0.0-preview.24303.1
+ 9.0.0-preview.24303.1
diff --git a/eng/Versions.props b/eng/Versions.props
index 1f3037b5a204..9ac12ed5af9f 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -167,7 +167,7 @@
9.0.0-alpha.1.24278.2
- 9.0.0-alpha.1.24278.2
+ 9.0.0-alpha.1.24303.1
2.1.0-beta.24208.1
From 228900c8b3692f8684f4dc9c7cd5d9d53a276a8e Mon Sep 17 00:00:00 2001
From: Mackinnon Buck
Date: Tue, 4 Jun 2024 14:38:20 -0700
Subject: [PATCH 009/257] Update Selenium dependencies (#56070)
---
eng/Versions.props | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/eng/Versions.props b/eng/Versions.props
index 9ac12ed5af9f..2ade8626acc2 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -318,8 +318,8 @@
1.28.0
3.0.0
7.2.4
- 4.20.0
- 4.20.0
+ 4.21.0
+ 4.21.0
1.4.0
4.0.0
2.7.27
From 197c491b0f098d5dfa7645f30d30a1bdf56d1433 Mon Sep 17 00:00:00 2001
From: William Godbe
Date: Tue, 4 Jun 2024 16:19:39 -0700
Subject: [PATCH 010/257] Fix milestones for July servicing (#56078)
---
.github/policies/resourceManagement.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/policies/resourceManagement.yml b/.github/policies/resourceManagement.yml
index 0459bbb84f56..2eaec4a1df83 100644
--- a/.github/policies/resourceManagement.yml
+++ b/.github/policies/resourceManagement.yml
@@ -670,7 +670,7 @@ configuration:
then:
- removeMilestone
- addMilestone:
- milestone: 6.0.31
+ milestone: 6.0.32
description: '[Milestone Assignments] Assign Milestone to PRs merged to release/6.0 branch'
- if:
- payloadType: Pull_Request
@@ -681,7 +681,7 @@ configuration:
then:
- removeMilestone
- addMilestone:
- milestone: 8.0.6
+ milestone: 8.0.7
description: '[Milestone Assignments] Assign Milestone to PRs merged to release/8.0 branch'
- if:
- payloadType: Issues
From d831a501a36b4ee6f4f177e7cd86a2f6e2b36df4 Mon Sep 17 00:00:00 2001
From: Matthias Huygelen
Date: Wed, 5 Jun 2024 18:41:04 +0200
Subject: [PATCH 011/257] Fix SetLockoutEnabledAsync comments (#56062)
---
src/Identity/Extensions.Core/src/UserManager.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Identity/Extensions.Core/src/UserManager.cs b/src/Identity/Extensions.Core/src/UserManager.cs
index 33c5eaaf62bd..cca2005d10d0 100644
--- a/src/Identity/Extensions.Core/src/UserManager.cs
+++ b/src/Identity/Extensions.Core/src/UserManager.cs
@@ -1735,11 +1735,11 @@ public virtual async Task IsLockedOutAsync(TUser user)
}
///
- /// Sets a flag indicating whether the specified is locked out,
+ /// Sets a flag indicating whether the specified can be locked out,
/// as an asynchronous operation.
///
/// The user whose locked out status should be set.
- /// Flag indicating whether the user is locked out or not.
+ /// Flag indicating whether the user can be locked out or not.
///
/// The that represents the asynchronous operation, the of the operation
///
From 8adff2c3cf5a5f08ff8cf7715af7b3f540339c12 Mon Sep 17 00:00:00 2001
From: Safia Abdalla
Date: Wed, 5 Jun 2024 11:14:34 -0700
Subject: [PATCH 012/257] Move schema store into service and add schema keys
(#56084)
---
.../OpenApiServiceCollectionExtensions.cs | 3 +-
.../src/Services/OpenApiDocumentService.cs | 2 +-
.../src/Services/Schemas/OpenApiSchemaKey.cs | 12 ++++++
.../OpenApiSchemaService.cs} | 25 +++---------
.../Services/Schemas/OpenApiSchemaStore.cs | 40 +++++++++++++++++++
...OpenApiServiceCollectionExtensionsTests.cs | 12 +++---
.../OpenApiDocumentServiceTestsBase.cs | 35 +++++++++-------
...penApiComponentService.ParameterSchemas.cs | 0
...nApiComponentService.RequestBodySchemas.cs | 0
...OpenApiComponentService.ResponseSchemas.cs | 0
10 files changed, 88 insertions(+), 41 deletions(-)
create mode 100644 src/OpenApi/src/Services/Schemas/OpenApiSchemaKey.cs
rename src/OpenApi/src/Services/{OpenApiComponentService.cs => Schemas/OpenApiSchemaService.cs} (75%)
create mode 100644 src/OpenApi/src/Services/Schemas/OpenApiSchemaStore.cs
rename src/OpenApi/test/Services/{OpenApiComponentService => OpenApiSchemaService}/OpenApiComponentService.ParameterSchemas.cs (100%)
rename src/OpenApi/test/Services/{OpenApiComponentService => OpenApiSchemaService}/OpenApiComponentService.RequestBodySchemas.cs (100%)
rename src/OpenApi/test/Services/{OpenApiComponentService => OpenApiSchemaService}/OpenApiComponentService.ResponseSchemas.cs (100%)
diff --git a/src/OpenApi/src/Extensions/OpenApiServiceCollectionExtensions.cs b/src/OpenApi/src/Extensions/OpenApiServiceCollectionExtensions.cs
index 20573f1e3ff9..aef8d1794616 100644
--- a/src/OpenApi/src/Extensions/OpenApiServiceCollectionExtensions.cs
+++ b/src/OpenApi/src/Extensions/OpenApiServiceCollectionExtensions.cs
@@ -64,7 +64,8 @@ public static IServiceCollection AddOpenApi(this IServiceCollection services)
private static IServiceCollection AddOpenApiCore(this IServiceCollection services, string documentName)
{
services.AddEndpointsApiExplorer();
- services.AddKeyedSingleton(documentName);
+ services.AddKeyedSingleton(documentName);
+ services.AddKeyedSingleton(documentName);
services.AddKeyedSingleton(documentName);
// Required for build-time generation
services.AddSingleton();
diff --git a/src/OpenApi/src/Services/OpenApiDocumentService.cs b/src/OpenApi/src/Services/OpenApiDocumentService.cs
index 8a2d6090c1ff..04402b16b459 100644
--- a/src/OpenApi/src/Services/OpenApiDocumentService.cs
+++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs
@@ -30,7 +30,7 @@ internal sealed class OpenApiDocumentService(
IServiceProvider serviceProvider)
{
private readonly OpenApiOptions _options = optionsMonitor.Get(documentName);
- private readonly OpenApiComponentService _componentService = serviceProvider.GetRequiredKeyedService(documentName);
+ private readonly OpenApiSchemaService _componentService = serviceProvider.GetRequiredKeyedService(documentName);
private readonly IOpenApiDocumentTransformer _scrubExtensionsTransformer = new ScrubExtensionsTransformer();
private static readonly OpenApiEncoding _defaultFormEncoding = new OpenApiEncoding { Style = ParameterStyle.Form, Explode = true };
diff --git a/src/OpenApi/src/Services/Schemas/OpenApiSchemaKey.cs b/src/OpenApi/src/Services/Schemas/OpenApiSchemaKey.cs
new file mode 100644
index 000000000000..7286ce119d0a
--- /dev/null
+++ b/src/OpenApi/src/Services/Schemas/OpenApiSchemaKey.cs
@@ -0,0 +1,12 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection;
+
+namespace Microsoft.AspNetCore.OpenApi;
+
+///
+/// Represents a unique identifier that is used to store and retrieve
+/// JSON schemas associated with a given property.
+///
+internal record struct OpenApiSchemaKey(Type Type, ParameterInfo? ParameterInfo);
diff --git a/src/OpenApi/src/Services/OpenApiComponentService.cs b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
similarity index 75%
rename from src/OpenApi/src/Services/OpenApiComponentService.cs
rename to src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
index f1314797e165..119634e4f9f0 100644
--- a/src/OpenApi/src/Services/OpenApiComponentService.cs
+++ b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
@@ -1,10 +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.Collections.Concurrent;
using System.ComponentModel.DataAnnotations;
using System.IO.Pipelines;
-using System.Reflection;
using System.Text.Json;
using System.Text.Json.Nodes;
using JsonSchemaMapper;
@@ -12,6 +10,7 @@
using Microsoft.AspNetCore.Http.Json;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
@@ -22,21 +21,9 @@ namespace Microsoft.AspNetCore.OpenApi;
/// an OpenAPI document. In particular, this is the API that is used to
/// interact with the JSON schemas that are managed by a given OpenAPI document.
///
-internal sealed class OpenApiComponentService(IOptions jsonOptions)
+internal sealed class OpenApiSchemaService([ServiceKey] string documentName, IOptions jsonOptions, IServiceProvider serviceProvider)
{
- private readonly ConcurrentDictionary<(Type, ParameterInfo?), JsonObject> _schemas = new()
- {
- // Pre-populate OpenAPI schemas for well-defined types in ASP.NET Core.
- [(typeof(IFormFile), null)] = new JsonObject { ["type"] = "string", ["format"] = "binary" },
- [(typeof(IFormFileCollection), null)] = new JsonObject
- {
- ["type"] = "array",
- ["items"] = new JsonObject { ["type"] = "string", ["format"] = "binary" }
- },
- [(typeof(Stream), null)] = new JsonObject { ["type"] = "string", ["format"] = "binary" },
- [(typeof(PipeReader), null)] = new JsonObject { ["type"] = "string", ["format"] = "binary" },
- };
-
+ private readonly OpenApiSchemaStore _schemaStore = serviceProvider.GetRequiredKeyedService(documentName);
private readonly JsonSerializerOptions _jsonSerializerOptions = jsonOptions.Value.SerializerOptions;
private readonly JsonSchemaMapperConfiguration _configuration = new()
{
@@ -74,8 +61,8 @@ internal OpenApiSchema GetOrCreateSchema(Type type, ApiParameterDescription? par
{
var key = parameterDescription?.ParameterDescriptor is IParameterInfoParameterDescriptor parameterInfoDescription
&& parameterDescription.ModelMetadata.PropertyName is null
- ? (type, parameterInfoDescription.ParameterInfo) : (type, null);
- var schemaAsJsonObject = _schemas.GetOrAdd(key, CreateSchema);
+ ? new OpenApiSchemaKey(type, parameterInfoDescription.ParameterInfo) : new OpenApiSchemaKey(type, null);
+ var schemaAsJsonObject = _schemaStore.GetOrAdd(key, CreateSchema);
if (parameterDescription is not null)
{
schemaAsJsonObject.ApplyParameterInfo(parameterDescription);
@@ -84,7 +71,7 @@ internal OpenApiSchema GetOrCreateSchema(Type type, ApiParameterDescription? par
return deserializedSchema != null ? deserializedSchema.Schema : new OpenApiSchema();
}
- private JsonObject CreateSchema((Type Type, ParameterInfo? ParameterInfo) key)
+ private JsonObject CreateSchema(OpenApiSchemaKey key)
=> key.ParameterInfo is not null
? JsonSchemaMapper.JsonSchemaMapper.GetJsonSchema(_jsonSerializerOptions, key.ParameterInfo, _configuration)
: JsonSchemaMapper.JsonSchemaMapper.GetJsonSchema(_jsonSerializerOptions, key.Type, _configuration);
diff --git a/src/OpenApi/src/Services/Schemas/OpenApiSchemaStore.cs b/src/OpenApi/src/Services/Schemas/OpenApiSchemaStore.cs
new file mode 100644
index 000000000000..b37466ad0bae
--- /dev/null
+++ b/src/OpenApi/src/Services/Schemas/OpenApiSchemaStore.cs
@@ -0,0 +1,40 @@
+// 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.Concurrent;
+using System.IO.Pipelines;
+using System.Text.Json.Nodes;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.OpenApi;
+
+///
+/// Stores schemas generated by the JsonSchemaMapper for a
+/// given OpenAPI document for later resolution.
+///
+internal sealed class OpenApiSchemaStore
+{
+ private readonly ConcurrentDictionary _schemas = new()
+ {
+ // Pre-populate OpenAPI schemas for well-defined types in ASP.NET Core.
+ [new OpenApiSchemaKey(typeof(IFormFile), null)] = new JsonObject { ["type"] = "string", ["format"] = "binary" },
+ [new OpenApiSchemaKey(typeof(IFormFileCollection), null)] = new JsonObject
+ {
+ ["type"] = "array",
+ ["items"] = new JsonObject { ["type"] = "string", ["format"] = "binary" }
+ },
+ [new OpenApiSchemaKey(typeof(Stream), null)] = new JsonObject { ["type"] = "string", ["format"] = "binary" },
+ [new OpenApiSchemaKey(typeof(PipeReader), null)] = new JsonObject { ["type"] = "string", ["format"] = "binary" },
+ };
+
+ ///
+ /// Resolves the JSON schema for the given type and parameter description.
+ ///
+ /// The key associated with the generated schema.
+ /// A function used to generated the JSON object representing the schema.
+ /// A representing the JSON schema associated with the key.
+ public JsonObject GetOrAdd(OpenApiSchemaKey key, Func valueFactory)
+ {
+ return _schemas.GetOrAdd(key, valueFactory);
+ }
+}
diff --git a/src/OpenApi/test/Extensions/OpenApiServiceCollectionExtensionsTests.cs b/src/OpenApi/test/Extensions/OpenApiServiceCollectionExtensionsTests.cs
index d113642181ef..57e177605258 100644
--- a/src/OpenApi/test/Extensions/OpenApiServiceCollectionExtensionsTests.cs
+++ b/src/OpenApi/test/Extensions/OpenApiServiceCollectionExtensionsTests.cs
@@ -35,7 +35,7 @@ public void AddOpenApi_WithDocumentName_RegistersServices()
var serviceProvider = services.BuildServiceProvider();
// Assert
- Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiComponentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
+ Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiSchemaService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiDocumentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(IDocumentProvider) && sd.Lifetime == ServiceLifetime.Singleton);
var options = serviceProvider.GetRequiredService>();
@@ -69,7 +69,7 @@ public void AddOpenApi_WithDocumentNameAndConfigureOptions_RegistersServices()
var serviceProvider = services.BuildServiceProvider();
// Assert
- Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiComponentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
+ Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiSchemaService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiDocumentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(IDocumentProvider) && sd.Lifetime == ServiceLifetime.Singleton);
var options = serviceProvider.GetRequiredService>();
@@ -102,7 +102,7 @@ public void AddOpenApi_WithoutDocumentName_RegistersServices()
var serviceProvider = services.BuildServiceProvider();
// Assert
- Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiComponentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
+ Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiSchemaService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiDocumentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(IDocumentProvider) && sd.Lifetime == ServiceLifetime.Singleton);
var options = serviceProvider.GetRequiredService>();
@@ -135,7 +135,7 @@ public void AddOpenApi_WithConfigureOptions_RegistersServices()
var serviceProvider = services.BuildServiceProvider();
// Assert
- Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiComponentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
+ Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiSchemaService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiDocumentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(IDocumentProvider) && sd.Lifetime == ServiceLifetime.Singleton);
var options = serviceProvider.GetRequiredService>();
@@ -157,7 +157,7 @@ public void AddOpenApi_WithDuplicateDocumentNames_UsesLastRegistration()
var serviceProvider = services.BuildServiceProvider();
// Assert
- Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiComponentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
+ Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiSchemaService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiDocumentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(IDocumentProvider) && sd.Lifetime == ServiceLifetime.Singleton);
var options = serviceProvider.GetRequiredService>();
@@ -181,7 +181,7 @@ public void AddOpenApi_WithDuplicateDocumentNames_UsesLastRegistration_ValidateO
var serviceProvider = services.BuildServiceProvider();
// Assert
- Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiComponentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
+ Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiSchemaService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(OpenApiDocumentService) && sd.Lifetime == ServiceLifetime.Singleton && (string)sd.ServiceKey == documentName);
Assert.Contains(services, sd => sd.ServiceType == typeof(IDocumentProvider) && sd.Lifetime == ServiceLifetime.Singleton);
var options = serviceProvider.GetRequiredService>();
diff --git a/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs b/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs
index bb400c6e5790..f6a2d749294e 100644
--- a/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs
+++ b/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs
@@ -2,10 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Reflection;
-using System.Text.Json;
using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Http.Json;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
@@ -18,7 +15,6 @@
using Microsoft.AspNetCore.Routing.Constraints;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
-using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Moq;
using static Microsoft.AspNetCore.OpenApi.Tests.OpenApiOperationGeneratorTests;
@@ -217,27 +213,38 @@ private class TestServiceProvider : IServiceProvider, IKeyedServiceProvider
public static TestServiceProvider Instance { get; } = new TestServiceProvider();
private IKeyedServiceProvider _serviceProvider;
internal OpenApiDocumentService TestDocumentService { get; set; }
- internal OpenApiComponentService TestComponentService { get; set; } = new OpenApiComponentService(Options.Create(new Microsoft.AspNetCore.Http.Json.JsonOptions()));
+ internal OpenApiSchemaStore TestSchemaStoreService { get; } = new OpenApiSchemaStore();
+ private OpenApiSchemaService _testSchemaService;
public void SetInternalServiceProvider(IServiceCollection serviceCollection)
{
+ serviceCollection.AddKeyedSingleton("Test");
_serviceProvider = serviceCollection.BuildServiceProvider();
+ _testSchemaService = new OpenApiSchemaService(
+ "Test",
+ Options.Create(new Microsoft.AspNetCore.Http.Json.JsonOptions()),
+ _serviceProvider
+ );
}
public object GetKeyedService(Type serviceType, object serviceKey)
{
+
if (serviceType == typeof(OpenApiDocumentService))
{
return TestDocumentService;
}
- if (serviceType == typeof(OpenApiComponentService))
+ if (serviceType == typeof(OpenApiSchemaService))
{
- return TestComponentService;
+ return _testSchemaService;
}
-
- if (serviceType == typeof(OpenApiComponentService))
+ if (serviceType == typeof(OpenApiSchemaService))
+ {
+ return _testSchemaService;
+ }
+ if (serviceType == typeof(OpenApiSchemaStore))
{
- return TestComponentService;
+ return TestSchemaStoreService;
}
return _serviceProvider.GetKeyedService(serviceType, serviceKey);
@@ -249,14 +256,14 @@ public object GetRequiredKeyedService(Type serviceType, object serviceKey)
{
return TestDocumentService;
}
- if (serviceType == typeof(OpenApiComponentService))
+ if (serviceType == typeof(OpenApiSchemaService))
{
- return TestComponentService;
+ return _testSchemaService;
}
- if (serviceType == typeof(OpenApiComponentService))
+ if (serviceType == typeof(OpenApiSchemaService))
{
- return TestComponentService;
+ return _testSchemaService;
}
return _serviceProvider.GetRequiredKeyedService(serviceType, serviceKey);
diff --git a/src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.ParameterSchemas.cs b/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ParameterSchemas.cs
similarity index 100%
rename from src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.ParameterSchemas.cs
rename to src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ParameterSchemas.cs
diff --git a/src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.RequestBodySchemas.cs b/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.RequestBodySchemas.cs
similarity index 100%
rename from src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.RequestBodySchemas.cs
rename to src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.RequestBodySchemas.cs
diff --git a/src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.ResponseSchemas.cs b/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ResponseSchemas.cs
similarity index 100%
rename from src/OpenApi/test/Services/OpenApiComponentService/OpenApiComponentService.ResponseSchemas.cs
rename to src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ResponseSchemas.cs
From 0780e765e46787278a37208f432e287b7e83a83f Mon Sep 17 00:00:00 2001
From: Andrew Casey
Date: Wed, 5 Jun 2024 14:31:48 -0700
Subject: [PATCH 013/257] Quarantine the flakiest IIS tests (#55938)
There's already a bulk retry for IIS tests, but these are still failing often enough to be irritating.
Part of #55936 and #55937
---
src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs | 1 +
src/Servers/IIS/IIS/test/IIS.Tests/ClientDisconnectTests.cs | 1 +
2 files changed, 2 insertions(+)
diff --git a/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs b/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs
index 5d82142bcddd..875e8898d4c3 100644
--- a/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs
+++ b/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs
@@ -537,6 +537,7 @@ public async Task ConfigurationChangeCanBeIgnoredOutOfProcess()
await deploymentResult.HttpClient.RetryRequestAsync("/ProcessId", async r => await r.Content.ReadAsStringAsync() == processBefore);
}
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/55937")]
[ConditionalFact]
public async Task OutOfProcessToInProcessHostingModelSwitchWorks()
{
diff --git a/src/Servers/IIS/IIS/test/IIS.Tests/ClientDisconnectTests.cs b/src/Servers/IIS/IIS/test/IIS.Tests/ClientDisconnectTests.cs
index e71bb522f53c..eace234e8f98 100644
--- a/src/Servers/IIS/IIS/test/IIS.Tests/ClientDisconnectTests.cs
+++ b/src/Servers/IIS/IIS/test/IIS.Tests/ClientDisconnectTests.cs
@@ -225,6 +225,7 @@ public async Task ReaderThrowsCanceledException()
}
}
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/55936")]
[ConditionalFact]
public async Task ReaderThrowsResetExceptionOnInvalidBody()
{
From 8e74eef13de251e4db180ac2e98b83f8afb25811 Mon Sep 17 00:00:00 2001
From: Ken Dale
Date: Wed, 5 Jun 2024 19:40:24 -0400
Subject: [PATCH 014/257] Update AuthenticationSchemeProvider.cs public
constructor summary punctuation (#55919)
---
.../Authentication.Core/src/AuthenticationSchemeProvider.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs b/src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs
index e2e1585376f3..a24b8785e889 100644
--- a/src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs
+++ b/src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs
@@ -14,7 +14,7 @@ public class AuthenticationSchemeProvider : IAuthenticationSchemeProvider
{
///
/// Creates an instance of
- /// using the specified ,
+ /// using the specified .
///
/// The options.
public AuthenticationSchemeProvider(IOptions options)
From f244d1d5dd72525e0f679870ce592284d03b358a Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Wed, 5 Jun 2024 16:43:45 -0700
Subject: [PATCH 015/257] Update dependencies from
https://github.com/dotnet/source-build-reference-packages build 20240604.1
(#56083)
Microsoft.SourceBuild.Intermediate.source-build-reference-packages
From Version 9.0.0-alpha.1.24303.1 -> To Version 9.0.0-alpha.1.24304.1
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 eb76a50e90bb..5039a14f48f6 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -335,9 +335,9 @@
b1d534fe8831bbf62dc4356a7e611befee6ece33
-
+
https://github.com/dotnet/source-build-reference-packages
- 92f050c4768a6a8da3f79eba6dca60effd9c20fa
+ 9ae78a4e6412926d19ba97cfed159bf9de70b538
diff --git a/eng/Versions.props b/eng/Versions.props
index 2ade8626acc2..4c1a5e7dfe92 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -167,7 +167,7 @@
9.0.0-alpha.1.24278.2
- 9.0.0-alpha.1.24303.1
+ 9.0.0-alpha.1.24304.1
2.1.0-beta.24208.1
From 3612a9f261c696447844eb748a545bd062beeab4 Mon Sep 17 00:00:00 2001
From: Mackinnon Buck
Date: Wed, 5 Jun 2024 18:26:37 -0700
Subject: [PATCH 016/257] Unquarantine `HeartbeatLoopRunsWithSpecifiedInterval`
(#56091)
---
src/Servers/Kestrel/Core/test/HeartbeatTests.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/Servers/Kestrel/Core/test/HeartbeatTests.cs b/src/Servers/Kestrel/Core/test/HeartbeatTests.cs
index 02062e71f00b..5d027529f53c 100644
--- a/src/Servers/Kestrel/Core/test/HeartbeatTests.cs
+++ b/src/Servers/Kestrel/Core/test/HeartbeatTests.cs
@@ -20,7 +20,6 @@ public void HeartbeatIntervalIsOneSecond()
}
[Fact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/55297")]
public async void HeartbeatLoopRunsWithSpecifiedInterval()
{
var heartbeatCallCount = 0;
From 73067c12a90dae337dff1cf3584f660f516c84dc Mon Sep 17 00:00:00 2001
From: ladeak
Date: Thu, 6 Jun 2024 17:55:50 +0200
Subject: [PATCH 017/257] Allow HTTP2 encoder to split headers across frames
(#55322)
* Initial implementation
* Review feedback
* Updating a comment
* Minor perf opt when all headers fit in a single header frame.
* Adding MaxResponseHeadersLimit to H2 framewriter
* Protect against overflow
* Validating the header length in HPackHeaderWriter
* Removing a test file commented out and adding more tests.
* Review feedback
* Removing header limits related code because it is up to the service owner to not to ddos itself
* A test for 1MB header value
* Review comments - removing an unneeded if condition
* Sketch
* using arraypool instead of arraybufferwriter
* Re-using the rented buffers
* Preserving the size of the temporary larger buffer within the framewriter. This way if the same large header is written multiple times over the lifespan of a connection, it does not need to go through the loops of increasing the headers repetitively.
* Adjusting the logic of UpdateMaxFrameSize for setting a new _headersEncodingLargeBufferSize
* Adjusting the logic of _headersEncodingLargeBufferSize to avoid 0 values.
* Extenting Benachmark with headers sized 0, 10KB and 20KB
* Remove int.Max on header size increase and using checked arithmetic instead.
* Tests
* Update src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs
Co-authored-by: James Newton-King
* Review feedback: HeaderWriteResult not an inner type, adding comments on size increase
* Update src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs
Co-authored-by: Andrew Casey
* - Moving comments around for _headersEncodingLargeBufferSize
- Rename splitting method to SplitHeaderAcrossFrames
* Merging the implementation of BeginEncodeHeaders and RetryBeginEncodeHeaders
* Apply suggestions from code review
Co-authored-by: James Newton-King
---------
Co-authored-by: ladeak
Co-authored-by: James Newton-King
Co-authored-by: Andrew Casey
---
.../src/Internal/Http2/Http2Connection.cs | 6 +-
.../src/Internal/Http2/Http2FrameWriter.cs | 135 +++-
.../Core/test/HPackHeaderWriterTests.cs | 199 ------
.../Core/test/Http2/Http2FrameWriterTests.cs | 15 +-
.../Core/test/Http2/Http2HPackEncoderTests.cs | 106 ++-
.../Http2/HPackHeaderWriterBenchmark.cs | 4 -
.../Http2/Http2FrameWriterBenchmark.cs | 23 +-
.../Kestrel/shared/HPackHeaderWriter.cs | 59 +-
.../test/PipeWriterHttp2FrameExtensions.cs | 7 +-
.../Http2/Http2StreamTests.cs | 623 +++++++++++++++++-
.../Http2/Http2TestBase.cs | 8 +-
.../Http2/Http2RequestTests.cs | 40 ++
.../Interop.FunctionalTests/HttpHelpers.cs | 7 +-
13 files changed, 908 insertions(+), 324 deletions(-)
delete mode 100644 src/Servers/Kestrel/Core/test/HPackHeaderWriterTests.cs
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs
index 44fd7ad794b8..890cf2aed347 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs
@@ -938,7 +938,9 @@ private Task ProcessSettingsFrameAsync(in ReadOnlySequence payload)
if (_clientSettings.MaxFrameSize != previousMaxFrameSize)
{
// Don't let the client choose an arbitrarily large size, this will be used for response buffers.
- _frameWriter.UpdateMaxFrameSize(Math.Min(_clientSettings.MaxFrameSize, _serverSettings.MaxFrameSize));
+ // Safe cast, MaxFrameSize is limited to 2^24-1 bytes by the protocol and by Http2PeerSettings.
+ // Ref: https://datatracker.ietf.org/doc/html/rfc7540#section-4.2
+ _frameWriter.UpdateMaxFrameSize((int)Math.Min(_clientSettings.MaxFrameSize, _serverSettings.MaxFrameSize));
}
// This difference can be negative.
@@ -1829,4 +1831,4 @@ private static class GracefulCloseInitiator
public const int Server = 1;
public const int Client = 2;
}
-}
\ No newline at end of file
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs
index 802c68c4126f..b799ef02797c 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs
@@ -29,6 +29,8 @@ internal sealed class Http2FrameWriter
/// TODO (https://github.com/dotnet/aspnetcore/issues/51309): eliminate this limit.
private const string MaximumFlowControlQueueSizeProperty = "Microsoft.AspNetCore.Server.Kestrel.Http2.MaxConnectionFlowControlQueueSize";
+ private const int HeaderBufferSizeMultiplier = 2;
+
private static readonly int? AppContextMaximumFlowControlQueueSize = GetAppContextMaximumFlowControlQueueSize();
private static int? GetAppContextMaximumFlowControlQueueSize()
@@ -71,8 +73,12 @@ internal sealed class Http2FrameWriter
// This is only set to true by tests.
private readonly bool _scheduleInline;
- private uint _maxFrameSize = Http2PeerSettings.MinAllowedMaxFrameSize;
+ private int _maxFrameSize = Http2PeerSettings.MinAllowedMaxFrameSize;
private byte[] _headerEncodingBuffer;
+
+ // Keep track of the high-water mark of _headerEncodingBuffer's size so we don't have to grow
+ // through intermediate sizes repeatedly.
+ private int _headersEncodingLargeBufferSize = Http2PeerSettings.MinAllowedMaxFrameSize * HeaderBufferSizeMultiplier;
private long _unflushedBytes;
private bool _completed;
@@ -110,7 +116,6 @@ public Http2FrameWriter(
_headerEncodingBuffer = new byte[_maxFrameSize];
_scheduleInline = serviceContext.Scheduler == PipeScheduler.Inline;
-
_hpackEncoder = new DynamicHPackEncoder(serviceContext.ServerOptions.AllowResponseHeaderCompression);
_maximumFlowControlQueueSize = AppContextMaximumFlowControlQueueSize is null
@@ -367,12 +372,15 @@ public void UpdateMaxHeaderTableSize(uint maxHeaderTableSize)
}
}
- public void UpdateMaxFrameSize(uint maxFrameSize)
+ public void UpdateMaxFrameSize(int maxFrameSize)
{
lock (_writeLock)
{
if (_maxFrameSize != maxFrameSize)
{
+ // Safe multiply, MaxFrameSize is limited to 2^24-1 bytes by the protocol and by Http2PeerSettings.
+ // Ref: https://datatracker.ietf.org/doc/html/rfc7540#section-4.2
+ _headersEncodingLargeBufferSize = int.Max(_headersEncodingLargeBufferSize, maxFrameSize * HeaderBufferSizeMultiplier);
_maxFrameSize = maxFrameSize;
_headerEncodingBuffer = new byte[_maxFrameSize];
}
@@ -507,11 +515,12 @@ private void WriteResponseHeadersUnsynchronized(int streamId, int statusCode, Ht
{
try
{
+ // In the case of the headers, there is always a status header to be returned, so BeginEncodeHeaders will not return BufferTooSmall.
_headersEnumerator.Initialize(headers);
_outgoingFrame.PrepareHeaders(headerFrameFlags, streamId);
- var buffer = _headerEncodingBuffer.AsSpan();
- var done = HPackHeaderWriter.BeginEncodeHeaders(statusCode, _hpackEncoder, _headersEnumerator, buffer, out var payloadLength);
- FinishWritingHeadersUnsynchronized(streamId, payloadLength, done);
+ var writeResult = HPackHeaderWriter.BeginEncodeHeaders(statusCode, _hpackEncoder, _headersEnumerator, _headerEncodingBuffer, out var payloadLength);
+ Debug.Assert(writeResult != HeaderWriteResult.BufferTooSmall, "This always writes the status as the first header, and it should never be an over the buffer size.");
+ FinishWritingHeadersUnsynchronized(streamId, payloadLength, writeResult);
}
// Any exception from the HPack encoder can leave the dynamic table in a corrupt state.
// Since we allow custom header encoders we don't know what type of exceptions to expect.
@@ -548,11 +557,11 @@ private ValueTask WriteDataAndTrailersAsync(Http2Stream stream, in
try
{
- _headersEnumerator.Initialize(headers);
+ // In the case of the trailers, there is no status header to be written, so even the first call to BeginEncodeHeaders can return BufferTooSmall.
_outgoingFrame.PrepareHeaders(Http2HeadersFrameFlags.END_STREAM, streamId);
- var buffer = _headerEncodingBuffer.AsSpan();
- var done = HPackHeaderWriter.BeginEncodeHeaders(_hpackEncoder, _headersEnumerator, buffer, out var payloadLength);
- FinishWritingHeadersUnsynchronized(streamId, payloadLength, done);
+ _headersEnumerator.Initialize(headers);
+ var writeResult = HPackHeaderWriter.BeginEncodeHeaders(_hpackEncoder, _headersEnumerator, _headerEncodingBuffer, out var payloadLength);
+ FinishWritingHeadersUnsynchronized(streamId, payloadLength, writeResult);
}
// Any exception from the HPack encoder can leave the dynamic table in a corrupt state.
// Since we allow custom header encoders we don't know what type of exceptions to expect.
@@ -566,32 +575,102 @@ private ValueTask WriteDataAndTrailersAsync(Http2Stream stream, in
}
}
- private void FinishWritingHeadersUnsynchronized(int streamId, int payloadLength, bool done)
+ private void SplitHeaderAcrossFrames(int streamId, ReadOnlySpan dataToFrame, bool endOfHeaders, bool isFramePrepared)
{
- var buffer = _headerEncodingBuffer.AsSpan();
- _outgoingFrame.PayloadLength = payloadLength;
- if (done)
+ var shouldPrepareFrame = !isFramePrepared;
+ while (dataToFrame.Length > 0)
{
- _outgoingFrame.HeadersFlags |= Http2HeadersFrameFlags.END_HEADERS;
- }
+ if (shouldPrepareFrame)
+ {
+ _outgoingFrame.PrepareContinuation(Http2ContinuationFrameFlags.NONE, streamId);
+ }
- WriteHeaderUnsynchronized();
- _outputWriter.Write(buffer.Slice(0, payloadLength));
+ // Should prepare continuation frames.
+ shouldPrepareFrame = true;
+ var currentSize = Math.Min(dataToFrame.Length, _maxFrameSize);
+ _outgoingFrame.PayloadLength = currentSize;
+ if (endOfHeaders && dataToFrame.Length == currentSize)
+ {
+ _outgoingFrame.HeadersFlags |= Http2HeadersFrameFlags.END_HEADERS;
+ }
- while (!done)
- {
- _outgoingFrame.PrepareContinuation(Http2ContinuationFrameFlags.NONE, streamId);
+ WriteHeaderUnsynchronized();
+ _outputWriter.Write(dataToFrame[..currentSize]);
+ dataToFrame = dataToFrame.Slice(currentSize);
+ }
+ }
- done = HPackHeaderWriter.ContinueEncodeHeaders(_hpackEncoder, _headersEnumerator, buffer, out payloadLength);
+ private void FinishWritingHeadersUnsynchronized(int streamId, int payloadLength, HeaderWriteResult writeResult)
+ {
+ Debug.Assert(payloadLength <= _maxFrameSize, "The initial payload lengths is written to _headerEncodingBuffer with size of _maxFrameSize");
+ byte[]? largeHeaderBuffer = null;
+ Span buffer;
+ if (writeResult == HeaderWriteResult.Done)
+ {
+ // Fast path, only a single HEADER frame.
_outgoingFrame.PayloadLength = payloadLength;
-
- if (done)
+ _outgoingFrame.HeadersFlags |= Http2HeadersFrameFlags.END_HEADERS;
+ WriteHeaderUnsynchronized();
+ _outputWriter.Write(_headerEncodingBuffer.AsSpan(0, payloadLength));
+ return;
+ }
+ else if (writeResult == HeaderWriteResult.MoreHeaders)
+ {
+ _outgoingFrame.PayloadLength = payloadLength;
+ WriteHeaderUnsynchronized();
+ _outputWriter.Write(_headerEncodingBuffer.AsSpan(0, payloadLength));
+ }
+ else
+ {
+ // This may happen in case of the TRAILERS after the initial encode operation.
+ // The _maxFrameSize sized _headerEncodingBuffer was too small.
+ while (writeResult == HeaderWriteResult.BufferTooSmall)
+ {
+ Debug.Assert(payloadLength == 0, "Payload written even though buffer is too small");
+ largeHeaderBuffer = ArrayPool.Shared.Rent(_headersEncodingLargeBufferSize);
+ buffer = largeHeaderBuffer.AsSpan(0, _headersEncodingLargeBufferSize);
+ writeResult = HPackHeaderWriter.RetryBeginEncodeHeaders(_hpackEncoder, _headersEnumerator, buffer, out payloadLength);
+ if (writeResult != HeaderWriteResult.BufferTooSmall)
+ {
+ SplitHeaderAcrossFrames(streamId, buffer[..payloadLength], endOfHeaders: writeResult == HeaderWriteResult.Done, isFramePrepared: true);
+ }
+ else
+ {
+ _headersEncodingLargeBufferSize = checked(_headersEncodingLargeBufferSize * HeaderBufferSizeMultiplier);
+ }
+ ArrayPool.Shared.Return(largeHeaderBuffer);
+ largeHeaderBuffer = null;
+ }
+ if (writeResult == HeaderWriteResult.Done)
{
- _outgoingFrame.ContinuationFlags = Http2ContinuationFrameFlags.END_HEADERS;
+ return;
}
+ }
- WriteHeaderUnsynchronized();
- _outputWriter.Write(buffer.Slice(0, payloadLength));
+ // HEADERS and zero or more CONTINUATIONS sent - all subsequent frames are (unprepared) CONTINUATIONs
+ buffer = _headerEncodingBuffer;
+ while (writeResult != HeaderWriteResult.Done)
+ {
+ writeResult = HPackHeaderWriter.ContinueEncodeHeaders(_hpackEncoder, _headersEnumerator, buffer, out payloadLength);
+ if (writeResult == HeaderWriteResult.BufferTooSmall)
+ {
+ if (largeHeaderBuffer != null)
+ {
+ ArrayPool.Shared.Return(largeHeaderBuffer);
+ _headersEncodingLargeBufferSize = checked(_headersEncodingLargeBufferSize * HeaderBufferSizeMultiplier);
+ }
+ largeHeaderBuffer = ArrayPool.Shared.Rent(_headersEncodingLargeBufferSize);
+ buffer = largeHeaderBuffer.AsSpan(0, _headersEncodingLargeBufferSize);
+ }
+ else
+ {
+ // In case of Done or MoreHeaders: write to output.
+ SplitHeaderAcrossFrames(streamId, buffer[..payloadLength], endOfHeaders: writeResult == HeaderWriteResult.Done, isFramePrepared: false);
+ }
+ }
+ if (largeHeaderBuffer != null)
+ {
+ ArrayPool.Shared.Return(largeHeaderBuffer);
}
}
@@ -1023,4 +1102,4 @@ private void EnqueueWaitingForMoreConnectionWindow(Http2OutputProducer producer)
_http2Connection.Abort(new ConnectionAbortedException("HTTP/2 connection exceeded the outgoing flow control maximum queue size."));
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Servers/Kestrel/Core/test/HPackHeaderWriterTests.cs b/src/Servers/Kestrel/Core/test/HPackHeaderWriterTests.cs
deleted file mode 100644
index cc6d85be4950..000000000000
--- a/src/Servers/Kestrel/Core/test/HPackHeaderWriterTests.cs
+++ /dev/null
@@ -1,199 +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 System;
-//using System.Collections.Generic;
-//using System.Linq;
-//using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-//using Microsoft.Extensions.Primitives;
-//using Xunit;
-
-//namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
-//{
-// public class HPackHeaderWriterTests
-// {
-// public static TheoryData[], byte[], int?> SinglePayloadData
-// {
-// get
-// {
-// var data = new TheoryData[], byte[], int?>();
-
-// // Lowercase header name letters only
-// data.Add(
-// new[]
-// {
-// new KeyValuePair("CustomHeader", "CustomValue"),
-// },
-// new byte[]
-// {
-// // 0 12 c u s t o m
-// 0x00, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,
-// // h e a d e r 11 C
-// 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0b, 0x43,
-// // u s t o m V a l
-// 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x56, 0x61, 0x6c,
-// // u e
-// 0x75, 0x65
-// },
-// null);
-// // Lowercase header name letters only
-// data.Add(
-// new[]
-// {
-// new KeyValuePair("CustomHeader!#$%&'*+-.^_`|~", "CustomValue"),
-// },
-// new byte[]
-// {
-// // 0 27 c u s t o m
-// 0x00, 0x1b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,
-// // h e a d e r ! #
-// 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x21, 0x23,
-// // $ % & ' * + - .
-// 0x24, 0x25, 0x26, 0x27, 0x2a, 0x2b, 0x2d, 0x2e,
-// // ^ _ ` | ~ 11 C u
-// 0x5e, 0x5f, 0x60, 0x7c, 0x7e, 0x0b, 0x43, 0x75,
-// // s t o m V a l u
-// 0x73, 0x74, 0x6f, 0x6d, 0x56, 0x61, 0x6c, 0x75,
-// // e
-// 0x65
-// },
-// null);
-// // Single Payload
-// data.Add(
-// new[]
-// {
-// new KeyValuePair("date", "Mon, 24 Jul 2017 19:22:30 GMT"),
-// new KeyValuePair("content-type", "text/html; charset=utf-8"),
-// new KeyValuePair("server", "Kestrel")
-// },
-// new byte[]
-// {
-// 0x88, 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x1d,
-// 0x4d, 0x6f, 0x6e, 0x2c, 0x20, 0x32, 0x34, 0x20,
-// 0x4a, 0x75, 0x6c, 0x20, 0x32, 0x30, 0x31, 0x37,
-// 0x20, 0x31, 0x39, 0x3a, 0x32, 0x32, 0x3a, 0x33,
-// 0x30, 0x20, 0x47, 0x4d, 0x54, 0x00, 0x0c, 0x63,
-// 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74,
-// 0x79, 0x70, 0x65, 0x18, 0x74, 0x65, 0x78, 0x74,
-// 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63,
-// 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75,
-// 0x74, 0x66, 0x2d, 0x38, 0x00, 0x06, 0x73, 0x65,
-// 0x72, 0x76, 0x65, 0x72, 0x07, 0x4b, 0x65, 0x73,
-// 0x74, 0x72, 0x65, 0x6c
-// },
-// 200);
-
-// return data;
-// }
-// }
-
-// [Theory]
-// [MemberData(nameof(SinglePayloadData))]
-// public void EncodesHeadersInSinglePayloadWhenSpaceAvailable(KeyValuePair[] headers, byte[] expectedPayload, int? statusCode)
-// {
-// var payload = new byte[1024];
-// var length = 0;
-// if (statusCode.HasValue)
-// {
-// Assert.True(HPackHeaderWriter.BeginEncodeHeaders(statusCode.Value, GetHeadersEnumerator(headers), payload, out length));
-// }
-// else
-// {
-// Assert.True(HPackHeaderWriter.BeginEncodeHeaders(GetHeadersEnumerator(headers), payload, out length));
-// }
-// Assert.Equal(expectedPayload.Length, length);
-
-// for (var i = 0; i < length; i++)
-// {
-// Assert.True(expectedPayload[i] == payload[i], $"{expectedPayload[i]} != {payload[i]} at {i} (len {length})");
-// }
-
-// Assert.Equal(expectedPayload, new ArraySegment(payload, 0, length));
-// }
-
-// [Theory]
-// [InlineData(true)]
-// [InlineData(false)]
-// public void EncodesHeadersInMultiplePayloadsWhenSpaceNotAvailable(bool exactSize)
-// {
-// var statusCode = 200;
-// var headers = new[]
-// {
-// new KeyValuePair("date", "Mon, 24 Jul 2017 19:22:30 GMT"),
-// new KeyValuePair("content-type", "text/html; charset=utf-8"),
-// new KeyValuePair("server", "Kestrel")
-// };
-
-// var expectedStatusCodePayload = new byte[]
-// {
-// 0x88
-// };
-
-// var expectedDateHeaderPayload = new byte[]
-// {
-// 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x1d, 0x4d,
-// 0x6f, 0x6e, 0x2c, 0x20, 0x32, 0x34, 0x20, 0x4a,
-// 0x75, 0x6c, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20,
-// 0x31, 0x39, 0x3a, 0x32, 0x32, 0x3a, 0x33, 0x30,
-// 0x20, 0x47, 0x4d, 0x54
-// };
-
-// var expectedContentTypeHeaderPayload = new byte[]
-// {
-// 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-// 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x18, 0x74,
-// 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c,
-// 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,
-// 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38
-// };
-
-// var expectedServerHeaderPayload = new byte[]
-// {
-// 0x00, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
-// 0x07, 0x4b, 0x65, 0x73, 0x74, 0x72, 0x65, 0x6c
-// };
-
-// Span payload = new byte[1024];
-// var offset = 0;
-// var headerEnumerator = GetHeadersEnumerator(headers);
-
-// // When !exactSize, slices are one byte short of fitting the next header
-// var sliceLength = expectedStatusCodePayload.Length + (exactSize ? 0 : expectedDateHeaderPayload.Length - 1);
-// Assert.False(HPackHeaderWriter.BeginEncodeHeaders(statusCode, headerEnumerator, payload.Slice(offset, sliceLength), out var length));
-// Assert.Equal(expectedStatusCodePayload.Length, length);
-// Assert.Equal(expectedStatusCodePayload, payload.Slice(0, length).ToArray());
-
-// offset += length;
-
-// sliceLength = expectedDateHeaderPayload.Length + (exactSize ? 0 : expectedContentTypeHeaderPayload.Length - 1);
-// Assert.False(HPackHeaderWriter.ContinueEncodeHeaders(headerEnumerator, payload.Slice(offset, sliceLength), out length));
-// Assert.Equal(expectedDateHeaderPayload.Length, length);
-// Assert.Equal(expectedDateHeaderPayload, payload.Slice(offset, length).ToArray());
-
-// offset += length;
-
-// sliceLength = expectedContentTypeHeaderPayload.Length + (exactSize ? 0 : expectedServerHeaderPayload.Length - 1);
-// Assert.False(HPackHeaderWriter.ContinueEncodeHeaders(headerEnumerator, payload.Slice(offset, sliceLength), out length));
-// Assert.Equal(expectedContentTypeHeaderPayload.Length, length);
-// Assert.Equal(expectedContentTypeHeaderPayload, payload.Slice(offset, length).ToArray());
-
-// offset += length;
-
-// sliceLength = expectedServerHeaderPayload.Length;
-// Assert.True(HPackHeaderWriter.ContinueEncodeHeaders(headerEnumerator, payload.Slice(offset, sliceLength), out length));
-// Assert.Equal(expectedServerHeaderPayload.Length, length);
-// Assert.Equal(expectedServerHeaderPayload, payload.Slice(offset, length).ToArray());
-// }
-
-// private static Http2HeadersEnumerator GetHeadersEnumerator(IEnumerable> headers)
-// {
-// var groupedHeaders = headers
-// .GroupBy(k => k.Key)
-// .ToDictionary(g => g.Key, g => new StringValues(g.Select(gg => gg.Value).ToArray()));
-
-// var enumerator = new Http2HeadersEnumerator();
-// enumerator.Initialize(groupedHeaders);
-// return enumerator;
-// }
-// }
-//}
diff --git a/src/Servers/Kestrel/Core/test/Http2/Http2FrameWriterTests.cs b/src/Servers/Kestrel/Core/test/Http2/Http2FrameWriterTests.cs
index cafd8a98a0f2..ea2ec9ba5609 100644
--- a/src/Servers/Kestrel/Core/test/Http2/Http2FrameWriterTests.cs
+++ b/src/Servers/Kestrel/Core/test/Http2/Http2FrameWriterTests.cs
@@ -1,17 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
using System.Buffers;
using System.IO.Pipelines;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.InternalTesting;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Moq;
-using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
@@ -92,6 +86,13 @@ public async Task WriteHeader_UnsetsReservedBit()
Assert.Equal(new byte[] { 0x00, 0x00, 0x00, 0x00 }, payload.Skip(5).Take(4).ToArray());
}
+
+ [Fact]
+ public void UpdateMaxFrameSize_To_ProtocolMaximum()
+ {
+ var sut = CreateFrameWriter(new Pipe());
+ sut.UpdateMaxFrameSize((int)Math.Pow(2, 24) - 1);
+ }
}
public static class PipeReaderExtensions
diff --git a/src/Servers/Kestrel/Core/test/Http2/Http2HPackEncoderTests.cs b/src/Servers/Kestrel/Core/test/Http2/Http2HPackEncoderTests.cs
index e65d33eaf0fd..2edf4628129e 100644
--- a/src/Servers/Kestrel/Core/test/Http2/Http2HPackEncoderTests.cs
+++ b/src/Servers/Kestrel/Core/test/Http2/Http2HPackEncoderTests.cs
@@ -1,19 +1,12 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
-using System.Linq;
using System.Net.Http.HPack;
using System.Text;
-using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Microsoft.Extensions.Primitives;
-using Microsoft.Net.Http.Headers;
-
-using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
@@ -29,7 +22,7 @@ public void BeginEncodeHeaders_Status302_NewIndexValue()
enumerator.Initialize(headers);
var hpackEncoder = new DynamicHPackEncoder();
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
var result = buffer.Slice(0, length).ToArray();
var hex = BitConverter.ToString(result);
@@ -52,7 +45,7 @@ public void BeginEncodeHeaders_CacheControlPrivate_NewIndexValue()
enumerator.Initialize(headers);
var hpackEncoder = new DynamicHPackEncoder();
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
var result = buffer.Slice(5, length - 5).ToArray();
var hex = BitConverter.ToString(result);
@@ -67,7 +60,6 @@ public void BeginEncodeHeaders_CacheControlPrivate_NewIndexValue()
public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
{
// Test follows example https://tools.ietf.org/html/rfc7541#appendix-C.5
-
Span buffer = new byte[1024 * 16];
var headers = (IHeaderDictionary)new HttpResponseHeaders();
@@ -81,7 +73,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
// First response
enumerator.Initialize(headers);
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
var result = buffer.Slice(0, length).ToArray();
var hex = BitConverter.ToString(result);
@@ -123,7 +115,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
// Second response
enumerator.Initialize(headers);
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(307, hpackEncoder, enumerator, buffer, out length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(307, hpackEncoder, enumerator, buffer, out length));
result = buffer.Slice(0, length).ToArray();
hex = BitConverter.ToString(result);
@@ -164,7 +156,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
headers.SetCookie = "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1";
enumerator.Initialize(headers);
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out length));
result = buffer.Slice(0, length).ToArray();
hex = BitConverter.ToString(result);
@@ -225,7 +217,7 @@ public void BeginEncodeHeadersCustomEncoding_MaxHeaderTableSizeExceeded_Eviction
// First response
enumerator.Initialize((HttpResponseHeaders)headers);
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
var result = buffer.Slice(0, length).ToArray();
var hex = BitConverter.ToString(result);
@@ -267,7 +259,7 @@ public void BeginEncodeHeadersCustomEncoding_MaxHeaderTableSizeExceeded_Eviction
// Second response
enumerator.Initialize(headers);
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(307, hpackEncoder, enumerator, buffer, out length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(307, hpackEncoder, enumerator, buffer, out length));
result = buffer.Slice(0, length).ToArray();
hex = BitConverter.ToString(result);
@@ -308,7 +300,7 @@ public void BeginEncodeHeadersCustomEncoding_MaxHeaderTableSizeExceeded_Eviction
headers.SetCookie = "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1";
enumerator.Initialize(headers);
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out length));
result = buffer.Slice(0, length).ToArray();
hex = BitConverter.ToString(result);
@@ -366,7 +358,7 @@ public void BeginEncodeHeaders_ExcludedHeaders_NotAddedToTable(string headerName
enumerator.Initialize(headers);
var hpackEncoder = new DynamicHPackEncoder(maxHeaderTableSize: Http2PeerSettings.DefaultHeaderTableSize);
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out _));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out _));
if (neverIndex)
{
@@ -392,7 +384,7 @@ public void BeginEncodeHeaders_HeaderExceedHeaderTableSize_NoIndexAndNoHeaderEnt
enumerator.Initialize(headers);
var hpackEncoder = new DynamicHPackEncoder();
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out var length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out var length));
Assert.Empty(GetHeaderEntries(hpackEncoder));
}
@@ -477,16 +469,15 @@ public void BeginEncodeHeaders_HeaderExceedHeaderTableSize_NoIndexAndNoHeaderEnt
public void EncodesHeadersInSinglePayloadWhenSpaceAvailable(KeyValuePair[] headers, byte[] expectedPayload, int? statusCode)
{
var hpackEncoder = new DynamicHPackEncoder();
-
var payload = new byte[1024];
var length = 0;
if (statusCode.HasValue)
{
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(statusCode.Value, hpackEncoder, GetHeadersEnumerator(headers), payload, out length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(statusCode.Value, hpackEncoder, GetHeadersEnumerator(headers), payload, out length));
}
else
{
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, GetHeadersEnumerator(headers), payload, out length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, GetHeadersEnumerator(headers), payload, out length));
}
Assert.Equal(expectedPayload.Length, length);
@@ -548,28 +539,28 @@ public void EncodesHeadersInMultiplePayloadsWhenSpaceNotAvailable(bool exactSize
// When !exactSize, slices are one byte short of fitting the next header
var sliceLength = expectedStatusCodePayload.Length + (exactSize ? 0 : expectedDateHeaderPayload.Length - 1);
- Assert.False(HPackHeaderWriter.BeginEncodeHeaders(statusCode, hpackEncoder, headerEnumerator, payload.Slice(offset, sliceLength), out var length));
+ Assert.Equal(HeaderWriteResult.MoreHeaders, HPackHeaderWriter.BeginEncodeHeaders(statusCode, hpackEncoder, headerEnumerator, payload.Slice(offset, sliceLength), out var length));
Assert.Equal(expectedStatusCodePayload.Length, length);
Assert.Equal(expectedStatusCodePayload, payload.Slice(0, length).ToArray());
offset += length;
sliceLength = expectedDateHeaderPayload.Length + (exactSize ? 0 : expectedContentTypeHeaderPayload.Length - 1);
- Assert.False(HPackHeaderWriter.ContinueEncodeHeaders(hpackEncoder, headerEnumerator, payload.Slice(offset, sliceLength), out length));
+ Assert.Equal(HeaderWriteResult.MoreHeaders, HPackHeaderWriter.ContinueEncodeHeaders(hpackEncoder, headerEnumerator, payload.Slice(offset, sliceLength), out length));
Assert.Equal(expectedDateHeaderPayload.Length, length);
Assert.Equal(expectedDateHeaderPayload, payload.Slice(offset, length).ToArray());
offset += length;
sliceLength = expectedContentTypeHeaderPayload.Length + (exactSize ? 0 : expectedServerHeaderPayload.Length - 1);
- Assert.False(HPackHeaderWriter.ContinueEncodeHeaders(hpackEncoder, headerEnumerator, payload.Slice(offset, sliceLength), out length));
+ Assert.Equal(HeaderWriteResult.MoreHeaders, HPackHeaderWriter.ContinueEncodeHeaders(hpackEncoder, headerEnumerator, payload.Slice(offset, sliceLength), out length));
Assert.Equal(expectedContentTypeHeaderPayload.Length, length);
Assert.Equal(expectedContentTypeHeaderPayload, payload.Slice(offset, length).ToArray());
offset += length;
sliceLength = expectedServerHeaderPayload.Length;
- Assert.True(HPackHeaderWriter.ContinueEncodeHeaders(hpackEncoder, headerEnumerator, payload.Slice(offset, sliceLength), out length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.ContinueEncodeHeaders(hpackEncoder, headerEnumerator, payload.Slice(offset, sliceLength), out length));
Assert.Equal(expectedServerHeaderPayload.Length, length);
Assert.Equal(expectedServerHeaderPayload, payload.Slice(offset, length).ToArray());
}
@@ -586,7 +577,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeUpdated_SizeUpdateInHeaders()
// First request
enumerator.Initialize(new Dictionary());
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out var length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out var length));
Assert.Equal(2, length);
@@ -600,11 +591,72 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeUpdated_SizeUpdateInHeaders()
// Second request
enumerator.Initialize(new Dictionary());
- Assert.True(HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out length));
+ Assert.Equal(HeaderWriteResult.Done, HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out length));
+
+ Assert.Equal(0, length);
+ }
+
+ [Fact]
+ public void WithStatusCode_TooLargeHeader_ReturnsMoreHeaders()
+ {
+ Span buffer = new byte[1024 * 16];
+
+ IHeaderDictionary headers = new HttpResponseHeaders();
+ headers.Cookie = new string('a', buffer.Length + 1);
+ var enumerator = new Http2HeadersEnumerator();
+ enumerator.Initialize(headers);
+
+ var hpackEncoder = new DynamicHPackEncoder();
+ Assert.Equal(HeaderWriteResult.MoreHeaders, HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out var length));
+ Assert.Equal(1, length);
+ }
+
+ [Fact]
+ public void NoStatusCodeLargeHeader_ReturnsOversized()
+ {
+ Span buffer = new byte[1024 * 16];
+
+ IHeaderDictionary headers = new HttpResponseHeaders();
+ headers.Cookie = new string('a', buffer.Length + 1);
+ var enumerator = new Http2HeadersEnumerator();
+ enumerator.Initialize(headers);
+ var hpackEncoder = new DynamicHPackEncoder();
+ Assert.Equal(HeaderWriteResult.BufferTooSmall, HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out var length));
Assert.Equal(0, length);
}
+ [Fact]
+ public void WithStatusCode_JustFittingHeaderNoSpace_ReturnsMoreHeaders()
+ {
+ Span buffer = new byte[1024 * 16];
+
+ IHeaderDictionary headers = new HttpResponseHeaders();
+ headers.Cookie = new string('a', buffer.Length - 1);
+ var enumerator = new Http2HeadersEnumerator();
+ enumerator.Initialize(headers);
+
+ var hpackEncoder = new DynamicHPackEncoder();
+ Assert.Equal(HeaderWriteResult.MoreHeaders, HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out var length));
+ Assert.Equal(1, length);
+ }
+
+ [Fact]
+ public void NoStatusCode_JustFittingHeaderNoSpace_ReturnsMoreHeaders()
+ {
+ Span buffer = new byte[1024 * 16];
+
+ IHeaderDictionary headers = new HttpResponseHeaders();
+ headers.Accept = "application/json;";
+ headers.Cookie = new string('a', buffer.Length - 1);
+ var enumerator = new Http2HeadersEnumerator();
+ enumerator.Initialize(headers);
+
+ var hpackEncoder = new DynamicHPackEncoder();
+ Assert.Equal(HeaderWriteResult.MoreHeaders, HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out var length));
+ Assert.Equal(26, length);
+ }
+
private static Http2HeadersEnumerator GetHeadersEnumerator(IEnumerable> headers)
{
var groupedHeaders = headers
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/HPackHeaderWriterBenchmark.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/HPackHeaderWriterBenchmark.cs
index cff79ef3dd96..cff2aa9bed9d 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/HPackHeaderWriterBenchmark.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/HPackHeaderWriterBenchmark.cs
@@ -1,16 +1,12 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Linq;
using System.Net.Http.HPack;
using System.Text;
-using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks;
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2FrameWriterBenchmark.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2FrameWriterBenchmark.cs
index 9fe40252d54f..03589ed07b77 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2FrameWriterBenchmark.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2FrameWriterBenchmark.cs
@@ -44,11 +44,26 @@ public void GlobalSetup()
"TestConnectionId",
_memoryPool,
serviceContext);
+ }
+
+ private int _largeHeaderSize;
- _responseHeaders = new HttpResponseHeaders();
- var headers = (IHeaderDictionary)_responseHeaders;
- headers.ContentType = "application/json";
- headers.ContentLength = 1024;
+ [Params(0, 10, 20)]
+ public int LargeHeaderSize
+ {
+ get => _largeHeaderSize;
+ set
+ {
+ _largeHeaderSize = value;
+ _responseHeaders = new HttpResponseHeaders();
+ var headers = (IHeaderDictionary)_responseHeaders;
+ headers.ContentType = "application/json";
+ headers.ContentLength = 1024;
+ if (value > 0)
+ {
+ headers.Add("my", new string('a', value * 1024));
+ }
+ }
}
[Benchmark]
diff --git a/src/Servers/Kestrel/shared/HPackHeaderWriter.cs b/src/Servers/Kestrel/shared/HPackHeaderWriter.cs
index 22cf2256cd53..454346e86c70 100644
--- a/src/Servers/Kestrel/shared/HPackHeaderWriter.cs
+++ b/src/Servers/Kestrel/shared/HPackHeaderWriter.cs
@@ -10,6 +10,18 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
#endif
+internal enum HeaderWriteResult : byte
+{
+ // Not all headers written.
+ MoreHeaders = 0,
+
+ // All headers written.
+ Done = 1,
+
+ // Oversized header for the given buffer.
+ BufferTooSmall = 2,
+}
+
// This file is used by Kestrel to write response headers and tests to write request headers.
// To avoid adding test code to Kestrel this file is shared. Test specifc code is excluded from Kestrel by ifdefs.
internal static class HPackHeaderWriter
@@ -17,7 +29,7 @@ internal static class HPackHeaderWriter
///
/// Begin encoding headers in the first HEADERS frame.
///
- public static bool BeginEncodeHeaders(int statusCode, DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length)
+ public static HeaderWriteResult BeginEncodeHeaders(int statusCode, DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length)
{
length = 0;
@@ -35,12 +47,12 @@ public static bool BeginEncodeHeaders(int statusCode, DynamicHPackEncoder hpackE
if (!headersEnumerator.MoveNext())
{
- return true;
+ return HeaderWriteResult.Done;
}
- // We're ok with not throwing if no headers were encoded because we've already encoded the status.
+ // Since we've already encoded the status, we know we didn't start with an empty buffer. We don't need to increase it immediately because
// There is a small chance that the header will encode if there is no other content in the next HEADERS frame.
- var done = EncodeHeadersCore(hpackEncoder, headersEnumerator, buffer.Slice(length), throwIfNoneEncoded: false, out var headersLength);
+ var done = EncodeHeadersCore(hpackEncoder, headersEnumerator, buffer.Slice(length), canRequestLargerBuffer: false, out var headersLength);
length += headersLength;
return done;
}
@@ -48,7 +60,19 @@ public static bool BeginEncodeHeaders(int statusCode, DynamicHPackEncoder hpackE
///
/// Begin encoding headers in the first HEADERS frame.
///
- public static bool BeginEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length)
+ public static HeaderWriteResult BeginEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length) =>
+ BeginEncodeHeaders(hpackEncoder, headersEnumerator, buffer, iterateBeforeFirstElement: true, out length);
+
+ ///
+ /// Begin encoding headers in the first HEADERS frame without stepping the iterator.
+ ///
+ public static HeaderWriteResult RetryBeginEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length) =>
+ BeginEncodeHeaders(hpackEncoder, headersEnumerator, buffer, iterateBeforeFirstElement: false, out length);
+
+ ///
+ /// Begin encoding headers in the first HEADERS frame.
+ ///
+ private static HeaderWriteResult BeginEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, bool iterateBeforeFirstElement, out int length)
{
length = 0;
@@ -58,12 +82,12 @@ public static bool BeginEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2Hea
}
length += sizeUpdateLength;
- if (!headersEnumerator.MoveNext())
+ if (iterateBeforeFirstElement && !headersEnumerator.MoveNext())
{
- return true;
+ return HeaderWriteResult.Done;
}
- var done = EncodeHeadersCore(hpackEncoder, headersEnumerator, buffer.Slice(length), throwIfNoneEncoded: true, out var headersLength);
+ var done = EncodeHeadersCore(hpackEncoder, headersEnumerator, buffer.Slice(length), canRequestLargerBuffer: true, out var headersLength);
length += headersLength;
return done;
}
@@ -71,9 +95,9 @@ public static bool BeginEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2Hea
///
/// Continue encoding headers in the next HEADERS frame. The enumerator should already have a current value.
///
- public static bool ContinueEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length)
+ public static HeaderWriteResult ContinueEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length)
{
- return EncodeHeadersCore(hpackEncoder, headersEnumerator, buffer, throwIfNoneEncoded: true, out length);
+ return EncodeHeadersCore(hpackEncoder, headersEnumerator, buffer, canRequestLargerBuffer: true, out length);
}
private static bool EncodeStatusHeader(int statusCode, DynamicHPackEncoder hpackEncoder, Span buffer, out int length)
@@ -91,7 +115,7 @@ private static bool EncodeStatusHeader(int statusCode, DynamicHPackEncoder hpack
}
}
- private static bool EncodeHeadersCore(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, bool throwIfNoneEncoded, out int length)
+ private static HeaderWriteResult EncodeHeadersCore(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, bool canRequestLargerBuffer, out int length)
{
var currentLength = 0;
do
@@ -115,22 +139,21 @@ private static bool EncodeHeadersCore(DynamicHPackEncoder hpackEncoder, Http2Hea
out var headerLength))
{
// If the header wasn't written, and no headers have been written, then the header is too large.
- // Throw an error to avoid an infinite loop of attempting to write large header.
- if (currentLength == 0 && throwIfNoneEncoded)
+ // Request for a larger buffer to write large header.
+ if (currentLength == 0 && canRequestLargerBuffer)
{
- throw new HPackEncodingException(SR.net_http_hpack_encode_failure);
+ length = 0;
+ return HeaderWriteResult.BufferTooSmall;
}
-
length = currentLength;
- return false;
+ return HeaderWriteResult.MoreHeaders;
}
currentLength += headerLength;
}
while (headersEnumerator.MoveNext());
-
length = currentLength;
- return true;
+ return HeaderWriteResult.Done;
}
private static HeaderEncodingHint ResolveHeaderEncodingHint(int staticTableId, string name)
diff --git a/src/Servers/Kestrel/shared/test/PipeWriterHttp2FrameExtensions.cs b/src/Servers/Kestrel/shared/test/PipeWriterHttp2FrameExtensions.cs
index 84ead387bc89..4480a06271a4 100644
--- a/src/Servers/Kestrel/shared/test/PipeWriterHttp2FrameExtensions.cs
+++ b/src/Servers/Kestrel/shared/test/PipeWriterHttp2FrameExtensions.cs
@@ -10,6 +10,7 @@
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Http2HeadersEnumerator = Microsoft.AspNetCore.Server.Kestrel.Core.Tests.Http2HeadersEnumerator;
using HPackHeaderWriter = Microsoft.AspNetCore.Server.Kestrel.Core.Tests.HPackHeaderWriter;
+using HeaderWriteResult = Microsoft.AspNetCore.Server.Kestrel.Core.Tests.HeaderWriteResult;
namespace Microsoft.AspNetCore.InternalTesting;
@@ -36,7 +37,7 @@ public static void WriteStartStream(this PipeWriter writer, int streamId, Dynami
var done = HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, headers, buffer, out var length);
frame.PayloadLength = length;
- if (done)
+ if (done == HeaderWriteResult.Done)
{
frame.HeadersFlags = Http2HeadersFrameFlags.END_HEADERS;
}
@@ -49,14 +50,14 @@ public static void WriteStartStream(this PipeWriter writer, int streamId, Dynami
Http2FrameWriter.WriteHeader(frame, writer);
writer.Write(buffer.Slice(0, length));
- while (!done)
+ while (done != HeaderWriteResult.Done)
{
frame.PrepareContinuation(Http2ContinuationFrameFlags.NONE, streamId);
done = HPackHeaderWriter.ContinueEncodeHeaders(hpackEncoder, headers, buffer, out length);
frame.PayloadLength = length;
- if (done)
+ if (done == HeaderWriteResult.Done)
{
frame.ContinuationFlags = Http2ContinuationFrameFlags.END_HEADERS;
}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2StreamTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2StreamTests.cs
index 1e5fb54fa0de..8628af4117d9 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2StreamTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2StreamTests.cs
@@ -1,27 +1,18 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
using System.Buffers;
-using System.Collections.Generic;
using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Net.Http;
-using System.Net.Http.HPack;
using System.Runtime.ExceptionServices;
using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.InternalTesting;
using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-using Microsoft.AspNetCore.InternalTesting;
using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers;
-using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
@@ -2593,17 +2584,18 @@ await ExpectAsync(Http2FrameType.DATA,
}
[Fact]
- public async Task ResponseTrailers_TooLong_Throws()
+ public async Task ResponseTrailers_SingleLong_SplitsTrailersToContinuationFrames()
{
+ var trailerValue = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
await InitializeConnectionAsync(async context =>
{
await context.Response.WriteAsync("Hello World");
- context.Response.AppendTrailer("too_long", new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize));
+ context.Response.AppendTrailer("too_long", trailerValue);
});
await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
- var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ await ExpectAsync(Http2FrameType.HEADERS,
withLength: 32,
withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
withStreamId: 1);
@@ -2613,18 +2605,361 @@ await ExpectAsync(Http2FrameType.DATA,
withFlags: (byte)Http2DataFrameFlags.NONE,
withStreamId: 1);
- var goAway = await ExpectAsync(Http2FrameType.GOAWAY,
- withLength: 8,
+ var trailerFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.END_STREAM,
+ withStreamId: 1);
+
+ var trailierContinuation = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 13,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false).DefaultTimeout();
+
+ var buffer = new byte[trailerFrame.PayloadLength + trailierContinuation.PayloadLength];
+ trailerFrame.PayloadSequence.CopyTo(buffer);
+ trailierContinuation.PayloadSequence.CopyTo(buffer.AsSpan(trailerFrame.PayloadLength));
+ _hpackDecoder.Decode(buffer, endHeaders: true, handler: this);
+ Assert.Single(_decodedHeaders);
+ Assert.Equal(trailerValue, _decodedHeaders["too_long"]);
+ }
+
+ [Fact]
+ public async Task ResponseTrailers_ShortHeadersBeforeSingleLong_MultipleRequests_ShortHeadersInDynamicTable()
+ {
+ var trailerValue = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ await InitializeConnectionAsync(async context =>
+ {
+ await context.Response.WriteAsync("Hello World");
+ context.Response.AppendTrailer("a-key", "a-value");
+ context.Response.AppendTrailer("b-key", "b-value");
+ context.Response.AppendTrailer("too_long", trailerValue);
+ });
+
+ // Request 1
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+
+ await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await ExpectAsync(Http2FrameType.DATA,
+ withLength: 11,
withFlags: (byte)Http2DataFrameFlags.NONE,
- withStreamId: 0);
+ withStreamId: 1);
+
+ var request1TrailerFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 30,
+ withFlags: (byte)Http2HeadersFrameFlags.END_STREAM,
+ withStreamId: 1);
+
+ var request1TrailierContinuation1 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+
+ var request1TrailierContinuation2 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 13,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(request1TrailerFrame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Equal("a-value", _decodedHeaders["a-key"]);
+ Assert.Equal("b-value", _decodedHeaders["b-key"]);
+
+ _decodedHeaders.Clear();
+ _hpackDecoder.Decode(request1TrailierContinuation1.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Empty(_decodedHeaders);
+
+ _hpackDecoder.Decode(request1TrailierContinuation2.PayloadSequence, endHeaders: true, handler: this);
+ Assert.Equal(trailerValue, _decodedHeaders["too_long"]);
+
+ // Request 2
+ await StartStreamAsync(3, _browserRequestHeaders, endStream: true);
+
+ await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 2,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 3);
+
+ await ExpectAsync(Http2FrameType.DATA,
+ withLength: 11,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 3);
+
+ var request2TrailerFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 2,
+ withFlags: (byte)Http2HeadersFrameFlags.END_STREAM,
+ withStreamId: 3);
+
+ var request2TrailierContinuation1 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 3);
+
+ var request2TrailierContinuation2 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 13,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 3);
+
+ _hpackDecoder.Decode(request2TrailerFrame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Equal("a-value", _decodedHeaders["a-key"]);
+ Assert.Equal("b-value", _decodedHeaders["b-key"]);
+
+ _decodedHeaders.Clear();
+ _hpackDecoder.Decode(request2TrailierContinuation1.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Empty(_decodedHeaders);
+
+ _hpackDecoder.Decode(request2TrailierContinuation2.PayloadSequence, endHeaders: true, handler: this);
+ Assert.Equal(trailerValue, _decodedHeaders["too_long"]);
+
+ await StopConnectionAsync(expectedLastStreamId: 3, ignoreNonGoAwayFrames: false).DefaultTimeout();
+ }
+
+ [Fact]
+ public async Task ResponseTrailers_DoubleLong_SplitsTrailersToContinuationFrames()
+ {
+ var trailerValue = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ await InitializeConnectionAsync(async context =>
+ {
+ await context.Response.WriteAsync("Hello World");
+ context.Response.AppendTrailer("too_long", trailerValue);
+ context.Response.AppendTrailer("too_long2", trailerValue);
+ });
+
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+
+ await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await ExpectAsync(Http2FrameType.DATA,
+ withLength: 11,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 1);
+
+ var frame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.END_STREAM,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Empty(_decodedHeaders);
+
+ frame = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 13,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Equal(trailerValue, _decodedHeaders["too_long"]);
+ _decodedHeaders.Clear();
+
+ frame = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Empty(_decodedHeaders);
+
+ frame = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 14,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: true, handler: this);
+ Assert.Equal(trailerValue, _decodedHeaders["too_long2"]);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false).DefaultTimeout();
+ }
+
+ [Fact]
+ public async Task ResponseTrailers_ShortThenLongThenShort_SplitsTrailers()
+ {
+ var trailerValue = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ string shortValue = "testValue";
+ await InitializeConnectionAsync(async context =>
+ {
+ await context.Response.WriteAsync("Hello World");
+ context.Response.AppendTrailer("short", shortValue);
+ context.Response.AppendTrailer("long", trailerValue);
+ context.Response.AppendTrailer("short2", shortValue);
+ });
+
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+
+ await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await ExpectAsync(Http2FrameType.DATA,
+ withLength: 11,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 1);
+
+ var trailerFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 17,
+ withFlags: (byte)Http2HeadersFrameFlags.END_STREAM,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(trailerFrame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Single(_decodedHeaders);
+ Assert.Equal(shortValue, _decodedHeaders["short"]);
+ _decodedHeaders.Clear();
+
+ var trailierContinuation1 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(trailierContinuation1.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Empty(_decodedHeaders);
+
+ var trailierContinuation2 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 27,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(trailierContinuation2.PayloadSequence, endHeaders: true, handler: this);
+ Assert.Equal(trailerValue, _decodedHeaders["long"]);
+ Assert.Equal(shortValue, _decodedHeaders["short2"]);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false).DefaultTimeout();
+ }
+
+ [Fact]
+ public async Task LongResponseHeader_FollowedBy_LongResponseTrailer_SplitsTrailersToContinuationFrames()
+ {
+ var value = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ await InitializeConnectionAsync(async context =>
+ {
+ context.Response.Headers["too_long_header"] = value;
+ await context.Response.WriteAsync("Hello World");
+ context.Response.AppendTrailer("too_long_trailer", value);
+ });
+
+ // Stream 1
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+
+ // Response headers
+ var frame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Equal(2, _decodedHeaders.Count);
+ Assert.Equal("200", _decodedHeaders[":status"]);
+ Assert.Equal("Sat, 01 Jan 2000 00:00:00 GMT", _decodedHeaders["date"]);
+ _decodedHeaders.Clear();
+
+ frame = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Empty(_decodedHeaders);
+
+ frame = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 20,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: true, handler: this);
+ Assert.Single(_decodedHeaders);
+ Assert.Equal(value, _decodedHeaders["too_long_header"]);
+ _decodedHeaders.Clear();
+
+ // Data
+ await ExpectAsync(Http2FrameType.DATA,
+ withLength: 11,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 1);
+
+ // Trailers
+ frame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.END_STREAM,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Empty(_decodedHeaders);
+
+ frame = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 21,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
- VerifyGoAway(goAway, int.MaxValue, Http2ErrorCode.INTERNAL_ERROR);
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: true, handler: this);
+ Assert.Single(_decodedHeaders);
+ Assert.Equal(value, _decodedHeaders["too_long_trailer"]);
+ _decodedHeaders.Clear();
- _pair.Application.Output.Complete();
- await _connectionTask;
+ // Stream 3
+ await StartStreamAsync(3, _browserRequestHeaders, endStream: true);
- var message = Assert.Single(LogMessages, m => m.Exception is HPackEncodingException);
- Assert.Contains(SR.net_http_hpack_encode_failure, message.Exception.Message);
+ // Response headers
+ frame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 2,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 3);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Equal(2, _decodedHeaders.Count);
+ Assert.Equal("200", _decodedHeaders[":status"]);
+ Assert.Equal("Sat, 01 Jan 2000 00:00:00 GMT", _decodedHeaders["date"]);
+ _decodedHeaders.Clear();
+
+ frame = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 3);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Empty(_decodedHeaders);
+
+ frame = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 20,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 3);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: true, handler: this);
+ Assert.Single(_decodedHeaders);
+ Assert.Equal(value, _decodedHeaders["too_long_header"]);
+ _decodedHeaders.Clear();
+
+ // Data
+ await ExpectAsync(Http2FrameType.DATA,
+ withLength: 11,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 3);
+
+ // Trailers
+ frame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.END_STREAM,
+ withStreamId: 3);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: false, handler: this);
+ Assert.Empty(_decodedHeaders);
+
+ frame = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 21,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 3);
+
+ _hpackDecoder.Decode(frame.PayloadSequence, endHeaders: true, handler: this);
+ Assert.Single(_decodedHeaders);
+ Assert.Equal(value, _decodedHeaders["too_long_trailer"]);
+ _decodedHeaders.Clear();
+
+ await StopConnectionAsync(expectedLastStreamId: 3, ignoreNonGoAwayFrames: false).DefaultTimeout();
}
[Fact]
@@ -3183,13 +3518,237 @@ await ExpectAsync(Http2FrameType.DATA,
}
[Fact]
- public async Task ResponseWithHeadersTooLarge_AbortsConnection()
+ public async Task ResponseWithHeaderValueTooLarge_SplitsHeaderToContinuationFrames()
{
- var appFinished = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ await InitializeConnectionAsync(async context =>
+ {
+ context.Response.Headers.ETag = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ await context.Response.WriteAsync("Hello World");
+ });
+
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+ // Just the StatusCode gets written before aborting in the continuation frame
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ var headersFrame2 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ var headersFrame3 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 5,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: true);
+
+ var temp = new byte[headersFrame.PayloadSequence.Length + headersFrame2.PayloadSequence.Length + headersFrame3.PayloadSequence.Length];
+ headersFrame.PayloadSequence.CopyTo(temp.AsSpan());
+ headersFrame2.PayloadSequence.CopyTo(temp.AsSpan((int)headersFrame.PayloadSequence.Length));
+ headersFrame3.PayloadSequence.CopyTo(temp.AsSpan((int)headersFrame.PayloadSequence.Length + (int)headersFrame2.PayloadSequence.Length));
+
+ _hpackDecoder.Decode(temp, endHeaders: true, handler: this);
+ Assert.Equal((int)Http2PeerSettings.DefaultMaxFrameSize, _decodedHeaders[HeaderNames.ETag].Length);
+ }
+
+ [Fact]
+ public async Task TooLargeHeaderFollowedByContinuationHeaders_Split()
+ {
await InitializeConnectionAsync(async context =>
{
- context.Response.Headers["too_long"] = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ context.Response.Headers.ETag = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ context.Response.Headers.TE = new string('a', 30);
+ await context.Response.WriteAsync("Hello World");
+ });
+
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+
+ // Just the StatusCode gets written before aborting in the continuation frame
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ var headersFrame2 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ var headersFrame3 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 40,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: true);
+
+ var temp = new byte[headersFrame.PayloadSequence.Length + headersFrame2.PayloadSequence.Length + headersFrame3.PayloadSequence.Length];
+ headersFrame.PayloadSequence.CopyTo(temp.AsSpan());
+ headersFrame2.PayloadSequence.CopyTo(temp.AsSpan((int)headersFrame.PayloadSequence.Length));
+ headersFrame3.PayloadSequence.CopyTo(temp.AsSpan((int)headersFrame.PayloadSequence.Length + (int)headersFrame2.PayloadSequence.Length));
+
+ _hpackDecoder.Decode(temp, endHeaders: true, handler: this);
+ Assert.Equal((int)Http2PeerSettings.DefaultMaxFrameSize, _decodedHeaders[HeaderNames.ETag].Length);
+ Assert.Equal(30, _decodedHeaders[HeaderNames.TE].Length);
+ }
+
+ [Fact]
+ public async Task TwoTooLargeHeaderFollowedByContinuationHeaders_Split()
+ {
+ await InitializeConnectionAsync(async context =>
+ {
+ context.Response.Headers.ETag = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ context.Response.Headers.TE = new string('b', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ await context.Response.WriteAsync("Hello World");
+ });
+
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+
+ var frames = new Http2FrameWithPayload[5];
+ frames[0] = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ frames[1] = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ frames[2] = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 5,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ frames[3] = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ frames[4] = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 7,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: true);
+
+ var totalSize = frames.Sum(x => x.PayloadSequence.Length);
+ var temp = new byte[totalSize];
+ var destinationIndex = 0;
+ for (var i = 0; i < frames.Length; i++)
+ {
+ frames[i].PayloadSequence.CopyTo(temp.AsSpan(destinationIndex));
+ destinationIndex += (int)frames[i].PayloadSequence.Length;
+ }
+ _hpackDecoder.Decode(temp, endHeaders: true, handler: this);
+ Assert.Equal((int)Http2PeerSettings.DefaultMaxFrameSize, _decodedHeaders[HeaderNames.ETag].Length);
+ Assert.Equal((int)Http2PeerSettings.DefaultMaxFrameSize, _decodedHeaders[HeaderNames.TE].Length);
+ }
+
+ [Fact]
+ public async Task ClientRequestedLargerFrame_HeadersSplitByRequestedSize()
+ {
+ _clientSettings.MaxFrameSize = 17000;
+ _serviceContext.ServerOptions.Limits.Http2.MaxFrameSize = 17001;
+ await InitializeConnectionAsync(async context =>
+ {
+ context.Response.Headers.ETag = new string('a', 17002);
+ await context.Response.WriteAsync("Hello World");
+ }, expectedSettingsCount: 5);
+
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+
+ // Just the StatusCode gets written before aborting in the continuation frame
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ var headersFrame1 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 17000,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ var headersFrame2 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 8,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: true);
+ }
+
+ [Fact]
+ public async Task ResponseWithMultipleHeaderValueTooLargeForFrame_SplitsHeaderToContinuationFrames()
+ {
+ await InitializeConnectionAsync(async context =>
+ {
+ // This size makes it fit to a single header, but not next to the response status etc.
+ context.Response.Headers.ETag = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize - 20);
+ await context.Response.WriteAsync("Hello World");
+ });
+
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+
+ // Just the StatusCode gets written before aborting in the continuation frame
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ var headersFrame2 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16369,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: true);
+
+ var temp = new byte[headersFrame.PayloadSequence.Length + headersFrame2.PayloadSequence.Length];
+ headersFrame.PayloadSequence.CopyTo(temp.AsSpan());
+ headersFrame2.PayloadSequence.CopyTo(temp.AsSpan((int)headersFrame.PayloadSequence.Length));
+
+ _hpackDecoder.Decode(temp, endHeaders: true, handler: this);
+ Assert.Equal((int)Http2PeerSettings.DefaultMaxFrameSize - 20, _decodedHeaders[HeaderNames.ETag].Length);
+ }
+
+ [Fact]
+ public async Task ResponseWithHeaderNameTooLarge_SplitsHeaderToContinuationFrames()
+ {
+ var longHeaderName = new string('a', (int)Http2PeerSettings.DefaultMaxFrameSize);
+ var headerValue = "some value";
+ await InitializeConnectionAsync(async context =>
+ {
+ context.Response.Headers[longHeaderName] = headerValue;
+ await context.Response.WriteAsync("Hello World");
+ });
+
+ await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
+
+ // Just the StatusCode gets written before aborting in the continuation frame
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ var headersFrame2 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ var headersFrame3 = await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 15,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: true);
+
+ var temp = new byte[headersFrame.PayloadSequence.Length + headersFrame2.PayloadSequence.Length + headersFrame3.PayloadSequence.Length];
+ headersFrame.PayloadSequence.CopyTo(temp.AsSpan());
+ headersFrame2.PayloadSequence.CopyTo(temp.AsSpan((int)headersFrame.PayloadSequence.Length));
+ headersFrame3.PayloadSequence.CopyTo(temp.AsSpan((int)headersFrame.PayloadSequence.Length + (int)headersFrame2.PayloadSequence.Length));
+
+ _hpackDecoder.Decode(temp, endHeaders: true, handler: this);
+ Assert.Equal(headerValue, _decodedHeaders[longHeaderName]);
+ }
+
+ [Fact]
+ public async Task ResponseHeader_OneMegaByte_SplitsHeaderToContinuationFrames()
+ {
+ int frameSize = (int)Http2PeerSettings.DefaultMaxFrameSize;
+ int count = 64;
+ var headerValue = new string('a', frameSize * count); // 1 MB value
+ await InitializeConnectionAsync(async context =>
+ {
+ context.Response.Headers["my"] = headerValue;
await context.Response.WriteAsync("Hello World");
});
@@ -3200,11 +3759,21 @@ await ExpectAsync(Http2FrameType.HEADERS,
withLength: 32,
withFlags: (byte)Http2HeadersFrameFlags.NONE,
withStreamId: 1);
+ for (int i = 0; i < count; i++)
+ {
+ await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 16384,
+ withFlags: (byte)Http2HeadersFrameFlags.NONE,
+ withStreamId: 1);
+ }
- _pair.Application.Output.Complete();
+ // One more frame because of the header name + size of header value + size header name + 2 * H encoding
+ await ExpectAsync(Http2FrameType.CONTINUATION,
+ withLength: 8,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
- await WaitForConnectionErrorAsync(ignoreNonGoAwayFrames: false, expectedLastStreamId: int.MaxValue, Http2ErrorCode.INTERNAL_ERROR,
- SR.net_http_hpack_encode_failure);
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: true);
}
[Fact]
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs
index 70f47cf2e62b..c334ee588dab 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs
@@ -14,12 +14,12 @@
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.InternalTesting;
using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.FlowControl;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-using Microsoft.AspNetCore.InternalTesting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Primitives;
using Microsoft.Extensions.Time.Testing;
@@ -849,7 +849,7 @@ internal async Task SendHeadersAsync(int streamId, Http2HeadersFrameFlags
Http2FrameWriter.WriteHeader(frame, outputWriter);
await SendAsync(buffer.Span.Slice(0, length));
- return done;
+ return done == HeaderWriteResult.Done;
}
internal Task SendHeadersAsync(int streamId, Http2HeadersFrameFlags flags, IEnumerable> headers)
@@ -919,7 +919,7 @@ internal async Task SendContinuationAsync(int streamId, Http2ContinuationF
Http2FrameWriter.WriteHeader(frame, outputWriter);
await SendAsync(buffer.Span.Slice(0, length));
- return done;
+ return done == HeaderWriteResult.Done;
}
internal async Task SendContinuationAsync(int streamId, Http2ContinuationFrameFlags flags, byte[] payload)
@@ -947,7 +947,7 @@ internal async Task SendContinuationAsync(int streamId, Http2ContinuationF
Http2FrameWriter.WriteHeader(frame, outputWriter);
await SendAsync(buffer.Span.Slice(0, length));
- return done;
+ return done == HeaderWriteResult.Done;
}
internal Http2HeadersEnumerator GetHeadersEnumerator(IEnumerable> headers)
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http2/Http2RequestTests.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http2/Http2RequestTests.cs
index 2d58d859b81b..86af821432b6 100644
--- a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http2/Http2RequestTests.cs
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http2/Http2RequestTests.cs
@@ -89,6 +89,46 @@ public async Task GET_Metrics_HttpProtocolAndTlsSet()
}
}
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ public async Task GET_LargeResponseHeader_Success(bool largeValue, bool largeKey)
+ {
+ // Arrange
+ var longKey = "key-" + new string('$', largeKey ? 128 * 1024 : 1);
+ var longValue = "value-" + new string('!', largeValue ? 128 * 1024 : 1);
+ var builder = CreateHostBuilder(
+ c =>
+ {
+ c.Response.Headers["test"] = "abc";
+ c.Response.Headers[longKey] = longValue;
+ return Task.CompletedTask;
+ },
+ protocol: HttpProtocols.Http2,
+ plaintext: true);
+
+ using (var host = builder.Build())
+ {
+ await host.StartAsync();
+ var client = HttpHelpers.CreateClient(maxResponseHeadersLength: 1024);
+
+ // Act
+ var request1 = new HttpRequestMessage(HttpMethod.Get, $"http://127.0.0.1:{host.GetPort()}/");
+ request1.Version = HttpVersion.Version20;
+ request1.VersionPolicy = HttpVersionPolicy.RequestVersionExact;
+
+ var response = await client.SendAsync(request1, CancellationToken.None);
+ response.EnsureSuccessStatusCode();
+
+ // Assert
+ Assert.Equal("abc", response.Headers.GetValues("test").Single());
+ Assert.Equal(longValue, response.Headers.GetValues(longKey).Single());
+
+ await host.StopAsync();
+ }
+ }
+
[Fact]
public async Task GET_NoTLS_Http11RequestToHttp2Endpoint_400Result()
{
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpHelpers.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpHelpers.cs
index cc6f7bacb4f2..92bb131c4ed4 100644
--- a/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpHelpers.cs
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpHelpers.cs
@@ -35,7 +35,7 @@ public static HttpProtocolException GetProtocolException(this Exception ex)
throw new Exception($"Couldn't find {nameof(HttpProtocolException)}. Original error: {ex}");
}
- public static HttpMessageInvoker CreateClient(TimeSpan? idleTimeout = null, TimeSpan? expect100ContinueTimeout = null, bool includeClientCert = false)
+ public static HttpMessageInvoker CreateClient(TimeSpan? idleTimeout = null, TimeSpan? expect100ContinueTimeout = null, bool includeClientCert = false, int? maxResponseHeadersLength = null)
{
var handler = new SocketsHttpHandler();
handler.SslOptions = new System.Net.Security.SslClientAuthenticationOptions
@@ -55,6 +55,11 @@ public static HttpMessageInvoker CreateClient(TimeSpan? idleTimeout = null, Time
handler.PooledConnectionIdleTimeout = idleTimeout.Value;
}
+ if (maxResponseHeadersLength != null)
+ {
+ handler.MaxResponseHeadersLength = maxResponseHeadersLength.Value;
+ }
+
return new HttpMessageInvoker(handler);
}
From f36ba3968d6d8939cff608b7f81f8710e5d2ad0c Mon Sep 17 00:00:00 2001
From: Martin Costello
Date: Thu, 6 Jun 2024 17:05:16 +0100
Subject: [PATCH 018/257] Pass through CancellationToken when writing OpenAPI
response (#56096)
---
.../src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/OpenApi/src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs b/src/OpenApi/src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs
index 7bae09542251..b118422a29e2 100644
--- a/src/OpenApi/src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs
+++ b/src/OpenApi/src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs
@@ -50,8 +50,8 @@ public static IEndpointConventionBuilder MapOpenApi(this IEndpointRouteBuilder e
try
{
document.Serialize(new OpenApiJsonWriter(writer), documentOptions.OpenApiVersion);
- await context.Response.BodyWriter.WriteAsync(output.ToArray());
- await context.Response.BodyWriter.FlushAsync();
+ await context.Response.BodyWriter.WriteAsync(output.ToArray(), context.RequestAborted);
+ await context.Response.BodyWriter.FlushAsync(context.RequestAborted);
}
finally
{
From f91c99bab682d752bab8e206d6bd08e135b16575 Mon Sep 17 00:00:00 2001
From: Safia Abdalla
Date: Thu, 6 Jun 2024 11:15:38 -0700
Subject: [PATCH 019/257] Set content type for OpenAPI JSON document (#56097)
---
.../src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/OpenApi/src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs b/src/OpenApi/src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs
index b118422a29e2..ee105edddf6b 100644
--- a/src/OpenApi/src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs
+++ b/src/OpenApi/src/Extensions/OpenApiEndpointRouteBuilderExtensions.cs
@@ -50,6 +50,7 @@ public static IEndpointConventionBuilder MapOpenApi(this IEndpointRouteBuilder e
try
{
document.Serialize(new OpenApiJsonWriter(writer), documentOptions.OpenApiVersion);
+ context.Response.ContentType = "application/json;charset=utf-8";
await context.Response.BodyWriter.WriteAsync(output.ToArray(), context.RequestAborted);
await context.Response.BodyWriter.FlushAsync(context.RequestAborted);
}
From 10517269f40d53eb22cce6b4d520ed27ed1e1b9f Mon Sep 17 00:00:00 2001
From: Matt Mitchell
Date: Thu, 6 Jun 2024 15:52:09 -0700
Subject: [PATCH 020/257] Remove references to obsolete storage account
variables (#56100)
---
.azure/pipelines/blazor-daily-tests.yml | 1 -
.azure/pipelines/signalr-daily-tests.yml | 1 -
2 files changed, 2 deletions(-)
diff --git a/.azure/pipelines/blazor-daily-tests.yml b/.azure/pipelines/blazor-daily-tests.yml
index e044d000cf76..f91c27c21149 100644
--- a/.azure/pipelines/blazor-daily-tests.yml
+++ b/.azure/pipelines/blazor-daily-tests.yml
@@ -7,7 +7,6 @@
# We just need one Windows machine because all it does is trigger SauceLabs.
variables:
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- - group: DotNet-MSRC-Storage
- group: AzureDevOps-Artifact-Feeds-Pats
- name: SAUCE_CONNECT_DOWNLOAD_ON_INSTALL
value: true
diff --git a/.azure/pipelines/signalr-daily-tests.yml b/.azure/pipelines/signalr-daily-tests.yml
index e9df31d97df4..85a88a460790 100644
--- a/.azure/pipelines/signalr-daily-tests.yml
+++ b/.azure/pipelines/signalr-daily-tests.yml
@@ -6,7 +6,6 @@
variables:
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- - group: DotNet-MSRC-Storage
- group: AzureDevOps-Artifact-Feeds-Pats
- template: /eng/common/templates-official/variables/pool-providers.yml@self
From 1ed83e94ba6d3739035fda40f539545a9fceacc3 Mon Sep 17 00:00:00 2001
From: Andrew Casey
Date: Thu, 6 Jun 2024 20:04:33 -0700
Subject: [PATCH 021/257] Retry
CanSendAndReceiveUserMessagesFromMultipleConnectionsWithSameUser (#55955)
For #55954
---
eng/test-configuration.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/eng/test-configuration.json b/eng/test-configuration.json
index 9a395470461b..9d6e364c30d1 100644
--- a/eng/test-configuration.json
+++ b/eng/test-configuration.json
@@ -11,6 +11,7 @@
{"testName": {"contains": "POST_ServerAbort_ClientReceivesAbort"}},
{"testName": {"contains": "CanLaunchPhotinoWebViewAndClickButton"}},
{"testName": {"contains": "CheckInvalidHostingModelParameter"}},
+ {"testName": {"contains": "CanSendAndReceiveUserMessagesFromMultipleConnectionsWithSameUser"}},
{"testAssembly": {"contains": "IIS"}},
{"testAssembly": {"contains": "Template"}},
{"failureMessage": {"contains":"(Site is started but no worker process found)"}},
From f4c10ec0e17afee46729326e58af9cb235e4caf6 Mon Sep 17 00:00:00 2001
From: Paulo Morgado <470455+paulomorgado@users.noreply.github.com>
Date: Fri, 7 Jun 2024 19:06:43 +0100
Subject: [PATCH 022/257] Remove dot that is added to URL (#56075)
The dot is added to the URL:
And, when clicked, navigates to a non-existing URL.
As a side fix, `aspnet/https-trust-dev-cert.` should be added to `https://aka.ms/`.
---
src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs b/src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs
index baa0c085d0a1..35d5505ebe8b 100644
--- a/src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs
@@ -38,6 +38,6 @@ internal static partial class LoggerExtensions
[LoggerMessage(7, LogLevel.Error, "The certificate key file at '{CertificateKeyFilePath}' can not be found, contains malformed data or does not contain a PEM encoded key in PKCS8 format.", EventName = "MissingOrInvalidCertificateKeyFile")]
public static partial void FailedToLoadCertificateKey(this ILogger logger, string certificateKeyFilePath);
- [LoggerMessage(8, LogLevel.Warning, "The ASP.NET Core developer certificate is not trusted. For information about trusting the ASP.NET Core developer certificate, see https://aka.ms/aspnet/https-trust-dev-cert.", EventName = "DeveloperCertificateNotTrusted")]
+ [LoggerMessage(8, LogLevel.Warning, "The ASP.NET Core developer certificate is not trusted. For information about trusting the ASP.NET Core developer certificate, see https://aka.ms/aspnet/https-trust-dev-cert", EventName = "DeveloperCertificateNotTrusted")]
public static partial void DeveloperCertificateNotTrusted(this ILogger logger);
}
From b7738d273b5260b8f028b332a050b74d724ad0f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Ros?=
Date: Fri, 7 Jun 2024 11:58:59 -0700
Subject: [PATCH 023/257] Update sdk daily builds table url (#56085)
---
docs/DailyBuilds.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/DailyBuilds.md b/docs/DailyBuilds.md
index 3e6314157fd2..09121497f18b 100644
--- a/docs/DailyBuilds.md
+++ b/docs/DailyBuilds.md
@@ -4,7 +4,7 @@ Daily builds include the latest source code changes. They are not supported for
If you want to download the latest daily build and use it in a project, then you need to:
-* Obtain the latest [build of the .NET Core SDK](https://github.com/dotnet/installer#table).
+* Obtain the latest [build of the .NET Core SDK](https://github.com/dotnet/sdk/blob/main/documentation/package-table.md).
* Add a NuGet.Config to your project directory with the following content:
## .NET 8
From 65f0f6720ab3275a31b96e7e8e7218fadaff444f Mon Sep 17 00:00:00 2001
From: Hamidreza Hematyar
Date: Sat, 8 Jun 2024 02:38:13 +0330
Subject: [PATCH 024/257] Use constant values for CorsPolicy.cs and
CorsPolicyBuilder.cs (#54247)
---
.../CORS/src/Infrastructure/CorsConstants.cs | 10 +++++++
.../CORS/src/Infrastructure/CorsPolicy.cs | 6 ++---
.../src/Infrastructure/CorsPolicyBuilder.cs | 4 +--
.../CORS/src/PublicAPI.Unshipped.txt | 2 ++
.../CORS/test/UnitTests/CorsServiceTests.cs | 26 +++++++++----------
5 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/src/Middleware/CORS/src/Infrastructure/CorsConstants.cs b/src/Middleware/CORS/src/Infrastructure/CorsConstants.cs
index f4110b10de1f..c2debd17fdce 100644
--- a/src/Middleware/CORS/src/Infrastructure/CorsConstants.cs
+++ b/src/Middleware/CORS/src/Infrastructure/CorsConstants.cs
@@ -26,6 +26,16 @@ public static class CorsConstants
///
public static readonly string AnyOrigin = "*";
+ ///
+ /// The value for the Access-Control-Allow-Headers response header to allow all headers.
+ ///
+ public static readonly string AnyHeader = "*";
+
+ ///
+ /// The value for the Access-Control-Allow-Methods response header to allow all methods.
+ ///
+ public static readonly string AnyMethod = "*";
+
///
/// The Access-Control-Request-Method request header.
///
diff --git a/src/Middleware/CORS/src/Infrastructure/CorsPolicy.cs b/src/Middleware/CORS/src/Infrastructure/CorsPolicy.cs
index b79d8ad26597..eff658d6b402 100644
--- a/src/Middleware/CORS/src/Infrastructure/CorsPolicy.cs
+++ b/src/Middleware/CORS/src/Infrastructure/CorsPolicy.cs
@@ -30,7 +30,7 @@ public bool AllowAnyHeader
{
get
{
- if (Headers == null || Headers.Count != 1 || Headers[0] != "*")
+ if (Headers == null || Headers.Count != 1 || Headers[0] != CorsConstants.AnyHeader)
{
return false;
}
@@ -46,7 +46,7 @@ public bool AllowAnyMethod
{
get
{
- if (Methods == null || Methods.Count != 1 || Methods[0] != "*")
+ if (Methods == null || Methods.Count != 1 || Methods[0] != CorsConstants.AnyMethod)
{
return false;
}
@@ -62,7 +62,7 @@ public bool AllowAnyOrigin
{
get
{
- if (Origins == null || Origins.Count != 1 || Origins[0] != "*")
+ if (Origins == null || Origins.Count != 1 || Origins[0] != CorsConstants.AnyOrigin)
{
return false;
}
diff --git a/src/Middleware/CORS/src/Infrastructure/CorsPolicyBuilder.cs b/src/Middleware/CORS/src/Infrastructure/CorsPolicyBuilder.cs
index 878a36534d96..36e75ff5e5bc 100644
--- a/src/Middleware/CORS/src/Infrastructure/CorsPolicyBuilder.cs
+++ b/src/Middleware/CORS/src/Infrastructure/CorsPolicyBuilder.cs
@@ -171,7 +171,7 @@ public CorsPolicyBuilder AllowAnyOrigin()
public CorsPolicyBuilder AllowAnyMethod()
{
_policy.Methods.Clear();
- _policy.Methods.Add("*");
+ _policy.Methods.Add(CorsConstants.AnyMethod);
return this;
}
@@ -182,7 +182,7 @@ public CorsPolicyBuilder AllowAnyMethod()
public CorsPolicyBuilder AllowAnyHeader()
{
_policy.Headers.Clear();
- _policy.Headers.Add("*");
+ _policy.Headers.Add(CorsConstants.AnyHeader);
return this;
}
diff --git a/src/Middleware/CORS/src/PublicAPI.Unshipped.txt b/src/Middleware/CORS/src/PublicAPI.Unshipped.txt
index 7dc5c58110bf..91f8b182bd09 100644
--- a/src/Middleware/CORS/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/CORS/src/PublicAPI.Unshipped.txt
@@ -1 +1,3 @@
#nullable enable
+static readonly Microsoft.AspNetCore.Cors.Infrastructure.CorsConstants.AnyHeader -> string!
+static readonly Microsoft.AspNetCore.Cors.Infrastructure.CorsConstants.AnyMethod -> string!
diff --git a/src/Middleware/CORS/test/UnitTests/CorsServiceTests.cs b/src/Middleware/CORS/test/UnitTests/CorsServiceTests.cs
index 345a172a7951..aa01b159a3b6 100644
--- a/src/Middleware/CORS/test/UnitTests/CorsServiceTests.cs
+++ b/src/Middleware/CORS/test/UnitTests/CorsServiceTests.cs
@@ -339,7 +339,7 @@ public void EvaluatePolicy_CaseInsensitivePreflightRequest_OriginAllowed_Returns
var policy = new CorsPolicy();
policy.Origins.Add(CorsConstants.AnyOrigin);
policy.Origins.Add("http://example.com");
- policy.Methods.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
// Act
var result = corsService.EvaluatePolicy(requestContext, policy);
@@ -361,7 +361,7 @@ public void EvaluatePolicy_PreflightRequest_IsOriginAllowedReturnsTrue_ReturnsOr
{
IsOriginAllowed = origin => true
};
- policy.Methods.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
// Act
var result = corsService.EvaluatePolicy(requestContext, policy);
@@ -381,7 +381,7 @@ public void EvaluatePolicy_PreflightRequest_SupportsCredentials_AllowCredentials
SupportsCredentials = true
};
policy.Origins.Add("http://example.com");
- policy.Methods.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
// Act
var result = corsService.EvaluatePolicy(requestContext, policy);
@@ -401,7 +401,7 @@ public void EvaluatePolicy_PreflightRequest_NoPreflightMaxAge_NoPreflightMaxAgeS
PreflightMaxAge = null
};
policy.Origins.Add(CorsConstants.AnyOrigin);
- policy.Methods.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
// Act
var result = corsService.EvaluatePolicy(requestContext, policy);
@@ -421,7 +421,7 @@ public void EvaluatePolicy_PreflightRequest_PreflightMaxAge_PreflightMaxAgeSet()
PreflightMaxAge = TimeSpan.FromSeconds(10)
};
policy.Origins.Add(CorsConstants.AnyOrigin);
- policy.Methods.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
// Act
var result = corsService.EvaluatePolicy(requestContext, policy);
@@ -438,7 +438,7 @@ public void EvaluatePolicy_PreflightRequest_AnyMethod_ReturnsRequestMethod()
var requestContext = GetHttpContext(method: "OPTIONS", origin: "http://example.com", accessControlRequestMethod: "GET");
var policy = new CorsPolicy();
policy.Origins.Add(CorsConstants.AnyOrigin);
- policy.Methods.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
// Act
var result = corsService.EvaluatePolicy(requestContext, policy);
@@ -478,8 +478,8 @@ public void EvaluatePolicy_PreflightRequest_NoHeadersRequested_AllowedAllHeaders
var requestContext = GetHttpContext(method: "OPTIONS", origin: "http://example.com", accessControlRequestMethod: "PUT");
var policy = new CorsPolicy();
policy.Origins.Add(CorsConstants.AnyOrigin);
- policy.Methods.Add("*");
- policy.Headers.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
+ policy.Headers.Add(CorsConstants.AnyHeader);
// Act
var result = corsService.EvaluatePolicy(requestContext, policy);
@@ -501,8 +501,8 @@ public void EvaluatePolicy_PreflightRequest_AllowAllHeaders_ReflectsRequestHeade
accessControlRequestHeaders: new[] { "foo", "bar" });
var policy = new CorsPolicy();
policy.Origins.Add(CorsConstants.AnyOrigin);
- policy.Methods.Add("*");
- policy.Headers.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
+ policy.Headers.Add(CorsConstants.AnyHeader);
// Act
var result = corsService.EvaluatePolicy(requestContext, policy);
@@ -524,7 +524,7 @@ public void EvaluatePolicy_PreflightRequest_HeadersRequested_NotAllHeaderMatches
accessControlRequestHeaders: new[] { "match", "noMatch" });
var policy = new CorsPolicy();
policy.Origins.Add(CorsConstants.AnyOrigin);
- policy.Methods.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
policy.Headers.Add("match");
policy.Headers.Add("foo");
@@ -544,8 +544,8 @@ public void EvaluatePolicy_PreflightRequest_WithCredentials_ReflectsHeaders()
var httpContext = GetHttpContext(method: "OPTIONS", origin: "http://example.com", accessControlRequestMethod: "PUT");
var policy = new CorsPolicy();
policy.Origins.Add("http://example.com");
- policy.Methods.Add("*");
- policy.Headers.Add("*");
+ policy.Methods.Add(CorsConstants.AnyMethod);
+ policy.Headers.Add(CorsConstants.AnyHeader);
policy.SupportsCredentials = true;
// Act
From 60a8ba0b680c3b8f66317e014147ae93a46fbf32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Ros?=
Date: Fri, 7 Jun 2024 17:34:44 -0700
Subject: [PATCH 025/257] Update Components build and E2E testing instructions
(#56106)
---
src/Components/README.md | 65 ++++++++++++++++++++++++----------------
1 file changed, 39 insertions(+), 26 deletions(-)
diff --git a/src/Components/README.md b/src/Components/README.md
index eac392c2bbc2..cf2fccfb7893 100644
--- a/src/Components/README.md
+++ b/src/Components/README.md
@@ -29,42 +29,56 @@ The following contains a description of each sub-directory in the `Components` d
## Development Setup
-### Build
+**Note**: To build other specific projects from source, follow the instructions [on building the project](../../docs/BuildFromSource.md#step-3-build-the-repo).
-To build this specific project from source, follow the instructions [on building the project](../../docs/BuildFromSource.md#step-3-build-the-repo).
+### Building ASP.NET Core Components
-**Note:** You also need to run the preceding `build` command in the command line before building in VS to ensure that the Web.JS dependency is built.
+1. You'll need to install [Node](https://nodejs.org) on your machine.
-### A Guide to build Web.JS
+1. Ensure the repository is clean from any asset that could remain from previous version of the repository. This is recommended when switching branches, or after updating the working branch.
-Prior to building `src\Components\Web.JS\`
+```powershell
+git clean -xdff
+```
-1. You'll need to install [Node](https://nodejs.org) on your machine.
+You may need to kill some processes holding on files that are being deleted, like closing Visual Studio and other `msbuild` or `dotnet` processes. There may also be lingering headless `chrome` processes, but they are not included in this command. The following command may help you but be aware that this could also stop other important tasks:
+
+```powershell
+Get-Process dotnet, escape-node-job, msbuild, VBCSCompiler, node, vstest.console, Microsoft.CodeAnalysis.LanguageServer -ErrorAction Continue | Stop-Process;
+```
-2. You'll need to run the `restore` script locally to install the required dotnet dependencies and setup the repo. The `restore` script is located in the root of the repo.
+1. Use NPM to restore the required JavaScript modules. This doesn't require an Internet connection since the sources are read from a sub-module.
+
+```powershell
+npm ci --offline
+```
+
+1. You'll need to run the `restore` script locally to install the required dotnet dependencies and setup the repo. The `restore` script is located in the root of the repo.
```bash
./restore.sh
```
```powershell
-./restore.ps1
+./restore.cmd
```
-3. After the restore script has finished executing, activate the locally installed .NET by running the following command.
+1. Now you can build all the JavaScript assets required by the repository (including SignalR for instance) by running the following command:
-```bash
-source activate.sh
+```powershell
+npm run build
```
+1. Build the Components:
+
```powershell
-. ./activate.ps1
+./src/Components/build.cmd
```
-4. Now you can build `src\Components\Web.JS\` by running the following commands in the `src\Components\Web.JS` directory:
+2. Optionally, open the Components in Visual Studio:
```powershell
-dotnet build
+./src/Components/startvs.cmd
```
### Test
@@ -84,23 +98,22 @@ These tests are run in the CI as part of the [`aspnetcore-components-e2e`](https
#### How to run the E2E Tests
-To run the tests for this project, follow these steps (from the root directory):
+The E2E tests can be run and debugged directly from Visual Studio (as explained in the previous section). To run the tests from the command line,
+follow the previous build steps and then these commands:
-##### Windows
+1. Activate the locally installed .NET by running the following command.
+
+```bash
+source activate.sh
+```
```powershell
-./restore.cmd
-npm install --prefix ./src/Components/test/E2ETest
-. .\activate.ps1
-dotnet test ./src/Components/test/E2ETest
+. ./activate.ps1
```
-##### Linux / MacOS
+1. Start the tests.
-```shell
-./restore.sh
-npm install --prefix ./src/Components/test/E2ETest
-source ./activate.sh
+```powershell
dotnet test ./src/Components/test/E2ETest
```
@@ -123,4 +136,4 @@ dotnet test --no-build
## More Information
-For more information, see the [ASP.NET Core README](../../README.md).
+For more information, see the [ASP.NET Core README](https://github.com/dotnet/aspnetcore/blob/main/README.md).
From 206b0aeca39d5eb12e55ce4e35ef4c8b9bc63c86 Mon Sep 17 00:00:00 2001
From: Safia Abdalla
Date: Fri, 7 Jun 2024 19:04:45 -0700
Subject: [PATCH 026/257] Add support for OpenAPI schema transformers (#56093)
---
.../Microbenchmarks/TransformersBenchmark.cs | 29 +++
src/OpenApi/src/PublicAPI.Unshipped.txt | 11 ++
.../src/Services/OpenApiDocumentService.cs | 50 ++---
src/OpenApi/src/Services/OpenApiOptions.cs | 14 ++
.../Services/Schemas/OpenApiSchemaService.cs | 31 +++-
.../OpenApiSchemaTransformerContext.cs | 34 ++++
.../OpenApiDocumentServiceTestsBase.cs | 37 ++--
.../Transformers/SchemaTransformerTests.cs | 174 ++++++++++++++++++
8 files changed, 332 insertions(+), 48 deletions(-)
create mode 100644 src/OpenApi/src/Transformers/OpenApiSchemaTransformerContext.cs
create mode 100644 src/OpenApi/test/Transformers/SchemaTransformerTests.cs
diff --git a/src/OpenApi/perf/Microbenchmarks/TransformersBenchmark.cs b/src/OpenApi/perf/Microbenchmarks/TransformersBenchmark.cs
index 4dd02d9989d0..8b8fda46709a 100644
--- a/src/OpenApi/perf/Microbenchmarks/TransformersBenchmark.cs
+++ b/src/OpenApi/perf/Microbenchmarks/TransformersBenchmark.cs
@@ -4,6 +4,7 @@
using BenchmarkDotNet.Attributes;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Routing;
+using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
namespace Microsoft.AspNetCore.OpenApi.Microbenchmarks;
@@ -64,6 +65,28 @@ public void DocumentTransformerAsDelegate_Delegate()
_documentService = CreateDocumentService(_builder, _options);
}
+ [GlobalSetup(Target = nameof(SchemaTransformer))]
+ public void SchemaTransformer_Setup()
+ {
+ _builder.MapPost("/", (Todo todo) => todo);
+ for (var i = 0; i <= TransformerCount; i++)
+ {
+ _options.UseSchemaTransformer((schema, context, token) =>
+ {
+ if (context.Type == typeof(Todo) && context.ParameterDescription != null)
+ {
+ schema.Extensions["x-my-extension"] = new OpenApiString(context.ParameterDescription.Name);
+ }
+ else
+ {
+ schema.Extensions["x-my-extension"] = new OpenApiString("response");
+ }
+ return Task.CompletedTask;
+ });
+ }
+ _documentService = CreateDocumentService(_builder, _options);
+ }
+
[Benchmark]
public async Task OperationTransformerAsDelegate()
{
@@ -82,6 +105,12 @@ public async Task DocumentTransformerAsDelegate()
await _documentService.GetOpenApiDocumentAsync();
}
+ [Benchmark]
+ public async Task SchemaTransformer()
+ {
+ await _documentService.GetOpenApiDocumentAsync();
+ }
+
private class ActivatedTransformer : IOpenApiDocumentTransformer
{
public Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken)
diff --git a/src/OpenApi/src/PublicAPI.Unshipped.txt b/src/OpenApi/src/PublicAPI.Unshipped.txt
index f32c9da9334c..ddde07129563 100644
--- a/src/OpenApi/src/PublicAPI.Unshipped.txt
+++ b/src/OpenApi/src/PublicAPI.Unshipped.txt
@@ -11,9 +11,20 @@ Microsoft.AspNetCore.OpenApi.OpenApiOptions.OpenApiVersion.set -> void
Microsoft.AspNetCore.OpenApi.OpenApiOptions.ShouldInclude.get -> System.Func!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.ShouldInclude.set -> void
Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseOperationTransformer(System.Func! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
+Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseSchemaTransformer(System.Func! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseTransformer(Microsoft.AspNetCore.OpenApi.IOpenApiDocumentTransformer! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseTransformer(System.Func! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseTransformer() -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.ApplicationServices.init -> void
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.DocumentName.get -> string!
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.DocumentName.init -> void
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.OpenApiSchemaTransformerContext() -> void
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.ParameterDescription.get -> Microsoft.AspNetCore.Mvc.ApiExplorer.ApiParameterDescription?
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.ParameterDescription.init -> void
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.Type.get -> System.Type!
+Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.Type.init -> void
Microsoft.Extensions.DependencyInjection.OpenApiServiceCollectionExtensions
static Microsoft.AspNetCore.Builder.OpenApiEndpointRouteBuilderExtensions.MapOpenApi(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder! endpoints, string! pattern = "/openapi/{documentName}.json") -> Microsoft.AspNetCore.Builder.IEndpointConventionBuilder!
static Microsoft.Extensions.DependencyInjection.OpenApiServiceCollectionExtensions.AddOpenApi(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
diff --git a/src/OpenApi/src/Services/OpenApiDocumentService.cs b/src/OpenApi/src/Services/OpenApiDocumentService.cs
index 04402b16b459..05d4f7500970 100644
--- a/src/OpenApi/src/Services/OpenApiDocumentService.cs
+++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs
@@ -55,7 +55,7 @@ public async Task GetOpenApiDocumentAsync(CancellationToken can
var document = new OpenApiDocument
{
Info = GetOpenApiInfo(),
- Paths = GetOpenApiPaths(capturedTags),
+ Paths = await GetOpenApiPathsAsync(capturedTags, cancellationToken),
Tags = [.. capturedTags]
};
await ApplyTransformersAsync(document, cancellationToken);
@@ -99,7 +99,7 @@ internal OpenApiInfo GetOpenApiInfo()
/// the object to support filtering each
/// description instance into its appropriate document.
///
- private OpenApiPaths GetOpenApiPaths(HashSet capturedTags)
+ private async Task GetOpenApiPathsAsync(HashSet capturedTags, CancellationToken cancellationToken)
{
var descriptionsByPath = apiDescriptionGroupCollectionProvider.ApiDescriptionGroups.Items
.SelectMany(group => group.Items)
@@ -109,17 +109,17 @@ private OpenApiPaths GetOpenApiPaths(HashSet capturedTags)
foreach (var descriptions in descriptionsByPath)
{
Debug.Assert(descriptions.Key != null, "Relative path mapped to OpenApiPath key cannot be null.");
- paths.Add(descriptions.Key, new OpenApiPathItem { Operations = GetOperations(descriptions, capturedTags) });
+ paths.Add(descriptions.Key, new OpenApiPathItem { Operations = await GetOperationsAsync(descriptions, capturedTags, cancellationToken) });
}
return paths;
}
- private Dictionary GetOperations(IGrouping descriptions, HashSet capturedTags)
+ private async Task> GetOperationsAsync(IGrouping descriptions, HashSet capturedTags, CancellationToken cancellationToken)
{
var operations = new Dictionary();
foreach (var description in descriptions)
{
- var operation = GetOperation(description, capturedTags);
+ var operation = await GetOperationAsync(description, capturedTags, cancellationToken);
operation.Extensions.Add(OpenApiConstants.DescriptionId, new OpenApiString(description.ActionDescriptor.Id));
_operationTransformerContextCache.TryAdd(description.ActionDescriptor.Id, new OpenApiOperationTransformerContext
{
@@ -132,7 +132,7 @@ private Dictionary GetOperations(IGrouping capturedTags)
+ private async Task GetOperationAsync(ApiDescription description, HashSet capturedTags, CancellationToken cancellationToken)
{
var tags = GetTags(description);
if (tags != null)
@@ -147,9 +147,9 @@ private OpenApiOperation GetOperation(ApiDescription description, HashSet GetResponsesAsync(ApiDescription description, CancellationToken cancellationToken)
{
// OpenAPI requires that each operation have a response, usually a successful one.
// if there are no response types defined, we assume a successful 200 OK response
@@ -186,7 +186,7 @@ private OpenApiResponses GetResponses(ApiDescription description)
{
return new OpenApiResponses
{
- ["200"] = GetResponse(description, StatusCodes.Status200OK, _defaultApiResponseType)
+ ["200"] = await GetResponseAsync(description, StatusCodes.Status200OK, _defaultApiResponseType, cancellationToken)
};
}
@@ -200,12 +200,12 @@ private OpenApiResponses GetResponses(ApiDescription description)
var responseKey = responseType.IsDefaultResponse
? OpenApiConstants.DefaultOpenApiResponseKey
: responseType.StatusCode.ToString(CultureInfo.InvariantCulture);
- responses.Add(responseKey, GetResponse(description, responseType.StatusCode, responseType));
+ responses.Add(responseKey, await GetResponseAsync(description, responseType.StatusCode, responseType, cancellationToken));
}
return responses;
}
- private OpenApiResponse GetResponse(ApiDescription apiDescription, int statusCode, ApiResponseType apiResponseType)
+ private async Task GetResponseAsync(ApiDescription apiDescription, int statusCode, ApiResponseType apiResponseType, CancellationToken cancellationToken)
{
var description = ReasonPhrases.GetReasonPhrase(statusCode);
var response = new OpenApiResponse
@@ -222,7 +222,7 @@ private OpenApiResponse GetResponse(ApiDescription apiDescription, int statusCod
.Select(responseFormat => responseFormat.MediaType);
foreach (var contentType in apiResponseFormatContentTypes)
{
- var schema = apiResponseType.Type is { } type ? _componentService.GetOrCreateSchema(type) : new OpenApiSchema();
+ var schema = apiResponseType.Type is { } type ? await _componentService.GetOrCreateSchemaAsync(type, null, cancellationToken) : new OpenApiSchema();
response.Content[contentType] = new OpenApiMediaType { Schema = schema };
}
@@ -240,7 +240,7 @@ private OpenApiResponse GetResponse(ApiDescription apiDescription, int statusCod
return response;
}
- private List? GetParameters(ApiDescription description)
+ private async Task?> GetParametersAsync(ApiDescription description, CancellationToken cancellationToken)
{
List? parameters = null;
foreach (var parameter in description.ParameterDescriptions)
@@ -265,7 +265,7 @@ private OpenApiResponse GetResponse(ApiDescription apiDescription, int statusCod
// Per the OpenAPI specification, parameters that are sourced from the path
// are always required, regardless of the requiredness status of the parameter.
Required = parameter.Source == BindingSource.Path || parameter.IsRequired,
- Schema = _componentService.GetOrCreateSchema(parameter.Type, parameter),
+ Schema = await _componentService.GetOrCreateSchemaAsync(parameter.Type, parameter, cancellationToken),
};
parameters ??= [];
parameters.Add(openApiParameter);
@@ -273,24 +273,24 @@ private OpenApiResponse GetResponse(ApiDescription apiDescription, int statusCod
return parameters;
}
- private OpenApiRequestBody? GetRequestBody(ApiDescription description)
+ private async Task GetRequestBodyAsync(ApiDescription description, CancellationToken cancellationToken)
{
// Only one parameter can be bound from the body in each request.
if (description.TryGetBodyParameter(out var bodyParameter))
{
- return GetJsonRequestBody(description.SupportedRequestFormats, bodyParameter);
+ return await GetJsonRequestBody(description.SupportedRequestFormats, bodyParameter, cancellationToken);
}
// If there are no body parameters, check for form parameters.
// Note: Form parameters and body parameters cannot exist simultaneously
// in the same endpoint.
if (description.TryGetFormParameters(out var formParameters))
{
- return GetFormRequestBody(description.SupportedRequestFormats, formParameters);
+ return await GetFormRequestBody(description.SupportedRequestFormats, formParameters, cancellationToken);
}
return null;
}
- private OpenApiRequestBody GetFormRequestBody(IList supportedRequestFormats, IEnumerable formParameters)
+ private async Task GetFormRequestBody(IList supportedRequestFormats, IEnumerable formParameters, CancellationToken cancellationToken)
{
if (supportedRequestFormats.Count == 0)
{
@@ -325,7 +325,7 @@ private OpenApiRequestBody GetFormRequestBody(IList supportedR
if (parameter.All(parameter => parameter.ModelMetadata.ContainerType is null))
{
var description = parameter.Single();
- var parameterSchema = _componentService.GetOrCreateSchema(description.Type);
+ var parameterSchema = await _componentService.GetOrCreateSchemaAsync(description.Type, null, cancellationToken);
// Form files are keyed by their parameter name so we must capture the parameter name
// as a property in the schema.
if (description.Type == typeof(IFormFile) || description.Type == typeof(IFormFileCollection))
@@ -388,7 +388,7 @@ private OpenApiRequestBody GetFormRequestBody(IList supportedR
var propertySchema = new OpenApiSchema { Type = "object", Properties = new Dictionary() };
foreach (var description in parameter)
{
- propertySchema.Properties[description.Name] = _componentService.GetOrCreateSchema(description.Type);
+ propertySchema.Properties[description.Name] = await _componentService.GetOrCreateSchemaAsync(description.Type, null, cancellationToken);
}
schema.AllOf.Add(propertySchema);
}
@@ -396,7 +396,7 @@ private OpenApiRequestBody GetFormRequestBody(IList supportedR
{
foreach (var description in parameter)
{
- schema.Properties[description.Name] = _componentService.GetOrCreateSchema(description.Type);
+ schema.Properties[description.Name] = await _componentService.GetOrCreateSchemaAsync(description.Type, null, cancellationToken);
}
}
}
@@ -415,7 +415,7 @@ private OpenApiRequestBody GetFormRequestBody(IList supportedR
return requestBody;
}
- private OpenApiRequestBody GetJsonRequestBody(IList supportedRequestFormats, ApiParameterDescription bodyParameter)
+ private async Task GetJsonRequestBody(IList supportedRequestFormats, ApiParameterDescription bodyParameter, CancellationToken cancellationToken)
{
if (supportedRequestFormats.Count == 0)
{
@@ -442,7 +442,7 @@ private OpenApiRequestBody GetJsonRequestBody(IList supportedR
foreach (var requestForm in supportedRequestFormats)
{
var contentType = requestForm.MediaType;
- requestBody.Content[contentType] = new OpenApiMediaType { Schema = _componentService.GetOrCreateSchema(bodyParameter.Type) };
+ requestBody.Content[contentType] = new OpenApiMediaType { Schema = await _componentService.GetOrCreateSchemaAsync(bodyParameter.Type, bodyParameter, cancellationToken) };
}
return requestBody;
diff --git a/src/OpenApi/src/Services/OpenApiOptions.cs b/src/OpenApi/src/Services/OpenApiOptions.cs
index fba727315660..a9162196decd 100644
--- a/src/OpenApi/src/Services/OpenApiOptions.cs
+++ b/src/OpenApi/src/Services/OpenApiOptions.cs
@@ -14,6 +14,7 @@ namespace Microsoft.AspNetCore.OpenApi;
public sealed class OpenApiOptions
{
internal readonly List DocumentTransformers = [];
+ internal readonly List> SchemaTransformers = [];
///
/// Initializes a new instance of the class
@@ -89,4 +90,17 @@ public OpenApiOptions UseOperationTransformer(Func
+ /// Registers a given delegate as a schema transformer on the current instance.
+ ///
+ /// The delegate representing the schema transformer.
+ /// The instance for further customization.
+ public OpenApiOptions UseSchemaTransformer(Func transformer)
+ {
+ ArgumentNullException.ThrowIfNull(transformer, nameof(transformer));
+
+ SchemaTransformers.Add(transformer);
+ return this;
+ }
}
diff --git a/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
index 119634e4f9f0..1bdb8317a92a 100644
--- a/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
+++ b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.ComponentModel.DataAnnotations;
+using System.Diagnostics;
using System.IO.Pipelines;
using System.Text.Json;
using System.Text.Json.Nodes;
@@ -21,9 +22,14 @@ namespace Microsoft.AspNetCore.OpenApi;
/// an OpenAPI document. In particular, this is the API that is used to
/// interact with the JSON schemas that are managed by a given OpenAPI document.
///
-internal sealed class OpenApiSchemaService([ServiceKey] string documentName, IOptions jsonOptions, IServiceProvider serviceProvider)
+internal sealed class OpenApiSchemaService(
+ [ServiceKey] string documentName,
+ IOptions jsonOptions,
+ IServiceProvider serviceProvider,
+ IOptionsMonitor optionsMonitor)
{
private readonly OpenApiSchemaStore _schemaStore = serviceProvider.GetRequiredKeyedService(documentName);
+ private readonly OpenApiOptions _openApiOptions = optionsMonitor.Get(documentName);
private readonly JsonSerializerOptions _jsonSerializerOptions = jsonOptions.Value.SerializerOptions;
private readonly JsonSchemaMapperConfiguration _configuration = new()
{
@@ -57,7 +63,7 @@ internal sealed class OpenApiSchemaService([ServiceKey] string documentName, IOp
}
};
- internal OpenApiSchema GetOrCreateSchema(Type type, ApiParameterDescription? parameterDescription = null)
+ internal async Task GetOrCreateSchemaAsync(Type type, ApiParameterDescription? parameterDescription = null, CancellationToken cancellationToken = default)
{
var key = parameterDescription?.ParameterDescriptor is IParameterInfoParameterDescriptor parameterInfoDescription
&& parameterDescription.ModelMetadata.PropertyName is null
@@ -68,7 +74,26 @@ internal OpenApiSchema GetOrCreateSchema(Type type, ApiParameterDescription? par
schemaAsJsonObject.ApplyParameterInfo(parameterDescription);
}
var deserializedSchema = JsonSerializer.Deserialize(schemaAsJsonObject, OpenApiJsonSchemaContext.Default.OpenApiJsonSchema);
- return deserializedSchema != null ? deserializedSchema.Schema : new OpenApiSchema();
+ Debug.Assert(deserializedSchema != null, "The schema should have been deserialized successfully and materialize a non-null value.");
+ var schema = deserializedSchema.Schema;
+ await ApplySchemaTransformersAsync(schema, type, parameterDescription, cancellationToken);
+ return schema;
+ }
+
+ internal async Task ApplySchemaTransformersAsync(OpenApiSchema schema, Type type, ApiParameterDescription? parameterDescription = null, CancellationToken cancellationToken = default)
+ {
+ var context = new OpenApiSchemaTransformerContext
+ {
+ DocumentName = documentName,
+ Type = type,
+ ParameterDescription = parameterDescription,
+ ApplicationServices = serviceProvider
+ };
+ for (var i = 0; i < _openApiOptions.SchemaTransformers.Count; i++)
+ {
+ var transformer = _openApiOptions.SchemaTransformers[i];
+ await transformer(schema, context, cancellationToken);
+ }
}
private JsonObject CreateSchema(OpenApiSchemaKey key)
diff --git a/src/OpenApi/src/Transformers/OpenApiSchemaTransformerContext.cs b/src/OpenApi/src/Transformers/OpenApiSchemaTransformerContext.cs
new file mode 100644
index 000000000000..b915978ff35b
--- /dev/null
+++ b/src/OpenApi/src/Transformers/OpenApiSchemaTransformerContext.cs
@@ -0,0 +1,34 @@
+// 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.Mvc.ApiExplorer;
+using Microsoft.OpenApi.Models;
+
+namespace Microsoft.AspNetCore.OpenApi;
+
+///
+/// Represents the context in which an OpenAPI schema transformer is executed.
+///
+public sealed class OpenApiSchemaTransformerContext
+{
+ ///
+ /// Gets the name of the associated OpenAPI document.
+ ///
+ public required string DocumentName { get; init; }
+
+ ///
+ /// Gets the associated with the current .
+ ///
+ public required Type Type { get; init; }
+
+ ///
+ /// Gets the associated with the target schema.
+ /// Null when processing an OpenAPI schema for a response type.
+ ///
+ public required ApiParameterDescription? ParameterDescription { get; init; }
+
+ ///
+ /// Gets the application services associated with the current document the target schema is in.
+ ///
+ public required IServiceProvider ApplicationServices { get; init; }
+}
diff --git a/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs b/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs
index f6a2d749294e..9b72ee79e8df 100644
--- a/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs
+++ b/src/OpenApi/test/Services/OpenApiDocumentServiceTestsBase.cs
@@ -21,13 +21,13 @@
public abstract class OpenApiDocumentServiceTestBase
{
- public static async Task VerifyOpenApiDocument(IEndpointRouteBuilder builder, Action verifyOpenApiDocument)
- => await VerifyOpenApiDocument(builder, new OpenApiOptions(), verifyOpenApiDocument);
+ public static async Task VerifyOpenApiDocument(IEndpointRouteBuilder builder, Action verifyOpenApiDocument, CancellationToken cancellationToken = default)
+ => await VerifyOpenApiDocument(builder, new OpenApiOptions(), verifyOpenApiDocument, cancellationToken);
- public static async Task VerifyOpenApiDocument(IEndpointRouteBuilder builder, OpenApiOptions openApiOptions, Action verifyOpenApiDocument)
+ public static async Task VerifyOpenApiDocument(IEndpointRouteBuilder builder, OpenApiOptions openApiOptions, Action verifyOpenApiDocument, CancellationToken cancellationToken = default)
{
var documentService = CreateDocumentService(builder, openApiOptions);
- var document = await documentService.GetOpenApiDocumentAsync();
+ var document = await documentService.GetOpenApiDocumentAsync(cancellationToken);
verifyOpenApiDocument(document);
}
@@ -73,6 +73,8 @@ internal static OpenApiDocumentService CreateDocumentService(ActionDescriptor ac
var openApiOptions = new Mock>();
openApiOptions.Setup(o => o.Get(It.IsAny())).Returns(new OpenApiOptions());
+ var schemaService = new OpenApiSchemaService("Test", Options.Create(new Microsoft.AspNetCore.Http.Json.JsonOptions()), builder.ServiceProvider, openApiOptions.Object);
+ ((TestServiceProvider)builder.ServiceProvider).TestSchemaService = schemaService;
var documentService = new OpenApiDocumentService("Test", apiDescriptionGroupCollectionProvider, hostEnvironment, openApiOptions.Object, builder.ServiceProvider);
((TestServiceProvider)builder.ServiceProvider).TestDocumentService = documentService;
@@ -97,6 +99,8 @@ internal static OpenApiDocumentService CreateDocumentService(IEndpointRouteBuild
var apiDescriptionGroupCollectionProvider = CreateApiDescriptionGroupCollectionProvider(context.Results);
+ var schemaService = new OpenApiSchemaService("Test", Options.Create(new Microsoft.AspNetCore.Http.Json.JsonOptions()), builder.ServiceProvider, options.Object);
+ ((TestServiceProvider)builder.ServiceProvider).TestSchemaService = schemaService;
var documentService = new OpenApiDocumentService("Test", apiDescriptionGroupCollectionProvider, hostEnvironment, options.Object, builder.ServiceProvider);
((TestServiceProvider)builder.ServiceProvider).TestDocumentService = documentService;
@@ -214,33 +218,27 @@ private class TestServiceProvider : IServiceProvider, IKeyedServiceProvider
private IKeyedServiceProvider _serviceProvider;
internal OpenApiDocumentService TestDocumentService { get; set; }
internal OpenApiSchemaStore TestSchemaStoreService { get; } = new OpenApiSchemaStore();
- private OpenApiSchemaService _testSchemaService;
+ internal OpenApiSchemaService TestSchemaService { get; set; }
public void SetInternalServiceProvider(IServiceCollection serviceCollection)
{
serviceCollection.AddKeyedSingleton("Test");
+ serviceCollection.Configure("Test", options =>
+ {
+ options.DocumentName = "Test";
+ });
_serviceProvider = serviceCollection.BuildServiceProvider();
- _testSchemaService = new OpenApiSchemaService(
- "Test",
- Options.Create(new Microsoft.AspNetCore.Http.Json.JsonOptions()),
- _serviceProvider
- );
}
public object GetKeyedService(Type serviceType, object serviceKey)
{
-
if (serviceType == typeof(OpenApiDocumentService))
{
return TestDocumentService;
}
if (serviceType == typeof(OpenApiSchemaService))
{
- return _testSchemaService;
- }
- if (serviceType == typeof(OpenApiSchemaService))
- {
- return _testSchemaService;
+ return TestSchemaService;
}
if (serviceType == typeof(OpenApiSchemaStore))
{
@@ -258,12 +256,11 @@ public object GetRequiredKeyedService(Type serviceType, object serviceKey)
}
if (serviceType == typeof(OpenApiSchemaService))
{
- return _testSchemaService;
+ return TestSchemaService;
}
-
- if (serviceType == typeof(OpenApiSchemaService))
+ if (serviceType == typeof(OpenApiSchemaStore))
{
- return _testSchemaService;
+ return TestSchemaStoreService;
}
return _serviceProvider.GetRequiredKeyedService(serviceType, serviceKey);
diff --git a/src/OpenApi/test/Transformers/SchemaTransformerTests.cs b/src/OpenApi/test/Transformers/SchemaTransformerTests.cs
new file mode 100644
index 000000000000..841c4fd321e4
--- /dev/null
+++ b/src/OpenApi/test/Transformers/SchemaTransformerTests.cs
@@ -0,0 +1,174 @@
+// 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.Builder;
+using Microsoft.AspNetCore.OpenApi;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.OpenApi.Any;
+using Microsoft.OpenApi.Models;
+
+public class SchemaTransformerTests : OpenApiDocumentServiceTestBase
+{
+ [Fact]
+ public async Task SchemaTransformer_CanAccessTypeAndParameterDescriptionForParameter()
+ {
+ var builder = CreateBuilder();
+
+ builder.MapPost("/todo", (Todo todo) => { });
+
+ var options = new OpenApiOptions();
+ options.UseSchemaTransformer((schema, context, cancellationToken) =>
+ {
+ Assert.Equal(typeof(Todo), context.Type);
+ Assert.Equal("todo", context.ParameterDescription.Name);
+ return Task.CompletedTask;
+ });
+
+ await VerifyOpenApiDocument(builder, options, document => { });
+ }
+
+ [Fact]
+ public async Task SchemaTransformer_CanAccessTypeForResponse()
+ {
+ var builder = CreateBuilder();
+
+ builder.MapGet("/todo", () => new Todo(1, "Item1", false, DateTime.Now));
+
+ var options = new OpenApiOptions();
+ options.UseSchemaTransformer((schema, context, cancellationToken) =>
+ {
+ Assert.Equal(typeof(Todo), context.Type);
+ Assert.Null(context.ParameterDescription);
+ return Task.CompletedTask;
+ });
+
+ await VerifyOpenApiDocument(builder, options, document => { });
+ }
+
+ [Fact]
+ public async Task SchemaTransformer_CanAccessApplicationServicesAndDocumentName()
+ {
+ var builder = CreateBuilder();
+
+ builder.MapGet("/todo", () => new Todo(1, "Item1", false, DateTime.Now));
+
+ var options = new OpenApiOptions();
+ options.UseSchemaTransformer((schema, context, cancellationToken) =>
+ {
+ var service = context.ApplicationServices.GetKeyedService(context.DocumentName);
+ Assert.NotNull(service);
+ return Task.CompletedTask;
+ });
+
+ await VerifyOpenApiDocument(builder, options, document => { });
+ }
+
+ [Fact]
+ public async Task SchemaTransformer_RespectsCancellationToken()
+ {
+ var builder = CreateBuilder();
+
+ builder.MapGet("/todo", () => new Todo(1, "Item1", false, DateTime.Now));
+
+ var cts = new CancellationTokenSource();
+ cts.Cancel();
+
+ var options = new OpenApiOptions();
+ options.UseSchemaTransformer((schema, context, cancellationToken) =>
+ {
+ Assert.Equal(cts.Token, cancellationToken);
+ Assert.True(cancellationToken.IsCancellationRequested);
+ return Task.CompletedTask;
+ });
+
+ await VerifyOpenApiDocument(builder, options, document => { }, cts.Token);
+ }
+
+ [Fact]
+ public async Task SchemaTransformer_RunsInRegisteredOrder()
+ {
+ var builder = CreateBuilder();
+
+ builder.MapPost("/todo", (Todo todo) => { });
+
+ var options = new OpenApiOptions();
+ options.UseSchemaTransformer((schema, context, cancellationToken) =>
+ {
+ schema.Extensions["x-my-extension"] = new OpenApiString("1");
+ return Task.CompletedTask;
+ });
+ options.UseSchemaTransformer((schema, context, cancellationToken) =>
+ {
+ Assert.Equal("1", ((OpenApiString)schema.Extensions["x-my-extension"]).Value);
+ schema.Extensions["x-my-extension"] = new OpenApiString("2");
+ return Task.CompletedTask;
+ });
+
+ await VerifyOpenApiDocument(builder, options, document =>
+ {
+ var operation = Assert.Single(document.Paths.Values).Operations.Values.Single();
+ var schema = operation.RequestBody.Content["application/json"].Schema;
+ Assert.Equal("2", ((OpenApiString)schema.Extensions["x-my-extension"]).Value);
+ });
+ }
+
+ [Fact]
+ public async Task SchemaTransformer_OnTypeModifiesBothRequestAndResponse()
+ {
+ var builder = CreateBuilder();
+
+ builder.MapPost("/todo", (Todo todo) => { });
+ builder.MapGet("/todo", () => new Todo(1, "Item1", false, DateTime.Now));
+
+ var options = new OpenApiOptions();
+ options.UseSchemaTransformer((schema, context, cancellationToken) =>
+ {
+ if (context.Type == typeof(Todo))
+ {
+ schema.Extensions["x-my-extension"] = new OpenApiString("1");
+ }
+ return Task.CompletedTask;
+ });
+
+ await VerifyOpenApiDocument(builder, options, document =>
+ {
+ var path = Assert.Single(document.Paths.Values);
+ var postOperation = path.Operations[OperationType.Post];
+ var requestSchema = postOperation.RequestBody.Content["application/json"].Schema;
+ Assert.Equal("1", ((OpenApiString)requestSchema.Extensions["x-my-extension"]).Value);
+ var getOperation = path.Operations[OperationType.Get];
+ var responseSchema = getOperation.Responses["200"].Content["application/json"].Schema;
+ Assert.Equal("1", ((OpenApiString)responseSchema.Extensions["x-my-extension"]).Value);
+ });
+ }
+
+ [Fact]
+ public async Task SchemaTransformer_WithDescriptionOnlyModifiesParameter()
+ {
+ var builder = CreateBuilder();
+
+ builder.MapPost("/todo", (Todo todo) => { });
+ builder.MapGet("/todo", () => new Todo(1, "Item1", false, DateTime.Now));
+
+ var options = new OpenApiOptions();
+ options.UseSchemaTransformer((schema, context, cancellationToken) =>
+ {
+ if (context.Type == typeof(Todo) && context.ParameterDescription is not null)
+ {
+ schema.Extensions["x-my-extension"] = new OpenApiString(context.ParameterDescription.Name);
+ }
+ return Task.CompletedTask;
+ });
+
+ await VerifyOpenApiDocument(builder, options, document =>
+ {
+ var path = Assert.Single(document.Paths.Values);
+ var postOperation = path.Operations[OperationType.Post];
+ var requestSchema = postOperation.RequestBody.Content["application/json"].Schema;
+ Assert.Equal("todo", ((OpenApiString)requestSchema.Extensions["x-my-extension"]).Value);
+ var getOperation = path.Operations[OperationType.Get];
+ var responseSchema = getOperation.Responses["200"].Content["application/json"].Schema;
+ Assert.False(responseSchema.Extensions.TryGetValue("x-my-extension", out var _));
+ });
+ }
+}
From 3a2a9311d575d5f6db79a91a8300810e41c045b3 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Sun, 9 Jun 2024 12:58:59 -0700
Subject: [PATCH 027/257] Update .NET SDK to 9.0.100-preview.6.24302.3 (#56034)
---
global.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/global.json b/global.json
index a03505640dad..f69c8b161db9 100644
--- a/global.json
+++ b/global.json
@@ -1,9 +1,9 @@
{
"sdk": {
- "version": "9.0.100-preview.6.24277.1"
+ "version": "9.0.100-preview.6.24302.3"
},
"tools": {
- "dotnet": "9.0.100-preview.6.24277.1",
+ "dotnet": "9.0.100-preview.6.24302.3",
"runtimes": {
"dotnet/x86": [
"$(MicrosoftNETCoreBrowserDebugHostTransportVersion)"
From 7f2dfb0020ff29ab57df31e910f2b2d5ef48bf82 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Ros?=
Date: Sun, 9 Jun 2024 14:27:40 -0700
Subject: [PATCH 028/257] Fix Build From Source example (#56105)
---
docs/BuildFromSource.md | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/docs/BuildFromSource.md b/docs/BuildFromSource.md
index 99eff312c992..b4f15930027a 100644
--- a/docs/BuildFromSource.md
+++ b/docs/BuildFromSource.md
@@ -59,10 +59,13 @@ The steps you follow next depend on your preferred development environment:
./restore.cmd
```
-1. You'll typically focus on one project in the repo. You can use the `startvs.cmd` command to launch Visual Studio in a particular project area. For example, to launch Visual Studio in the `Components` project:
+1. You'll typically focus on one project in the repo. You can use the `startvs.cmd` command to launch Visual Studio in a particular project area. For example, to launch Visual Studio in the `src/Http` project, after you have built it with `./build.cmd`:
+
+ > :bulb: The `build.cmd` script will be local to the directory of the project you opened. For example, the script located in the `src/Http` directory. If you want to build the whole tree, use the `build.cmd` that is located in the `eng` directory.
```powershell
- cd src\Components
+ cd src/Http
+ ./build.cmd
./startvs.cmd
```
From df3fa0aa0493d266b22fb41c08ccc3433f76c0ee Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Mon, 10 Jun 2024 15:06:30 +0000
Subject: [PATCH 029/257] Update dependencies from
https://github.com/dotnet/source-build-externals build 20240603.2 (#56165)
[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 5039a14f48f6..b7856330e1de 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -368,9 +368,9 @@
745230568e52639e229dcc24c98fe0dbb4c1641d
-
+
https://github.com/dotnet/source-build-externals
- f1b44a365df0b8dbc38403ee8696adc25fbdd76a
+ 7db00527ef8fbbe61f67e9295beebddf187efff8
diff --git a/eng/Versions.props b/eng/Versions.props
index 4c1a5e7dfe92..2e59e828d253 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -165,7 +165,7 @@
9.0.0-beta.24272.5
9.0.0-beta.24272.5
- 9.0.0-alpha.1.24278.2
+ 9.0.0-alpha.1.24303.2
9.0.0-alpha.1.24304.1
From 26a1cee28f9e21a2bb441adb18f82846df4f0dd9 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Mon, 10 Jun 2024 15:18:06 +0000
Subject: [PATCH 030/257] Update dependencies from
https://github.com/dotnet/extensions build 20240608.1 (#56166)
[main] Update dependencies from dotnet/extensions
---
eng/Version.Details.xml | 8 ++++----
eng/Versions.props | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index b7856330e1de..ba9c1a26aef8 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -410,13 +410,13 @@
https://github.com/dotnet/arcade
2001d73c8ff942331a73300ba61fa6164805b231
-
+
https://github.com/dotnet/extensions
- 74a55056def261bb3b433ceb040dc4134a35f63e
+ c227151c582799fd22c5fe1f093846a2dd1eb00a
-
+
https://github.com/dotnet/extensions
- 74a55056def261bb3b433ceb040dc4134a35f63e
+ c227151c582799fd22c5fe1f093846a2dd1eb00a
https://github.com/nuget/nuget.client
diff --git a/eng/Versions.props b/eng/Versions.props
index 2e59e828d253..ef687c91ca9c 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -137,8 +137,8 @@
9.0.0-preview.5.24272.1
9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24301.1
- 9.0.0-preview.5.24301.1
+ 9.0.0-preview.5.24308.1
+ 9.0.0-preview.5.24308.1
9.0.0-preview.5.24271.1
9.0.0-preview.5.24271.1
From 7da8180c157b8106a2db59dd41849f2a990fb652 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Mon, 10 Jun 2024 15:25:59 +0000
Subject: [PATCH 031/257] Update dependencies from
https://github.com/dotnet/winforms build 20240607.1 (#56167)
[main] Update dependencies from dotnet/winforms
---
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 ba9c1a26aef8..5c3edfc67fb5 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -380,9 +380,9 @@
https://github.com/dotnet/runtime
745230568e52639e229dcc24c98fe0dbb4c1641d
-
+
https://github.com/dotnet/winforms
- 9f9d572dd4fdf6e55cf91548ab8ee18c8f003990
+ 25717b4f5d6f00097dc9bc328a3d4652ad71414c
https://github.com/dotnet/arcade
diff --git a/eng/Versions.props b/eng/Versions.props
index ef687c91ca9c..96e5c1a2ecab 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -171,7 +171,7 @@
2.1.0-beta.24208.1
- 9.0.0-preview.6.24302.1
+ 9.0.0-preview.6.24307.1
9.0.0-preview.24303.1
9.0.0-preview.24303.1
From f7d5104c2d09bef5070f0a4c3d449f8290e33025 Mon Sep 17 00:00:00 2001
From: Eric Erhardt
Date: Mon, 10 Jun 2024 16:34:23 -0500
Subject: [PATCH 032/257] Annotate SignalR client for native AOT (#56079)
Addresses the following problems:
0. Fix up some infrastructure around TrimmingAttributes to be cleaner.
- Don't need to condition when to include them. Just always include them if you need it, and the TFM checks will be done for you.
- Remove duplicate, standalone attribute files
1. HubConnection and ReflectionHelper's usage of finding IAsyncEnumerable interface
2. HubConnection's usage of MakeGenericMethod when using a streaming reader (IAsyncEnumerable or ChannelReader).
- The only idea I have here is to follow the same approach as we do in DependencyInjection and elsewhere, which is to check for `IsDynamicCodeSupported == false` && `IsValueType` and throw an exception. This enables people to get exceptions during F5, and not only after publishing.
---
eng/TrimmableProjects.props | 4 +
...NetCore.DataProtection.Abstractions.csproj | 3 +-
...Microsoft.AspNetCore.DataProtection.csproj | 3 +-
...spNetCore.DataProtection.Extensions.csproj | 3 +-
...t.Extensions.FileProviders.Embedded.csproj | 3 +-
...Extensions.Diagnostics.HealthChecks.csproj | 3 +-
.../Microsoft.Extensions.Identity.Core.csproj | 3 +-
...icrosoft.Extensions.Identity.Stores.csproj | 3 +-
...AspNetCore.Connections.Abstractions.csproj | 2 +-
.../DynamicallyAccessedMemberTypes.cs | 99 -------------------
.../DynamicallyAccessedMembersAttribute.cs | 50 ----------
src/Shared/TrimmingAttributes.cs | 42 ++++----
.../csharp/Client.Core/src/HubConnection.cs | 46 +++++++--
...soft.AspNetCore.SignalR.Client.Core.csproj | 4 +-
...Microsoft.AspNetCore.SignalR.Client.csproj | 1 +
....AspNetCore.Http.Connections.Client.csproj | 1 +
...t.AspNetCore.SignalR.Protocols.Json.csproj | 3 +
.../src/Protocol/JsonHubProtocol.cs | 20 ++--
src/SignalR/common/Shared/ReflectionHelper.cs | 32 +++---
19 files changed, 110 insertions(+), 215 deletions(-)
delete mode 100644 src/Shared/CodeAnalysis/DynamicallyAccessedMemberTypes.cs
delete mode 100644 src/Shared/CodeAnalysis/DynamicallyAccessedMembersAttribute.cs
diff --git a/eng/TrimmableProjects.props b/eng/TrimmableProjects.props
index aa4b06dc9e6d..3b28def7582c 100644
--- a/eng/TrimmableProjects.props
+++ b/eng/TrimmableProjects.props
@@ -85,8 +85,12 @@
+
+
+
+
diff --git a/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj b/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj
index 9c98f96d2db2..1fe6c9dd19ba 100644
--- a/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj
+++ b/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj
@@ -16,8 +16,7 @@ Microsoft.AspNetCore.DataProtection.IDataProtector
-
+
diff --git a/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj b/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj
index 8f674ca01208..ddf556d6668c 100644
--- a/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj
+++ b/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj
@@ -18,8 +18,7 @@
-
+
diff --git a/src/DataProtection/Extensions/src/Microsoft.AspNetCore.DataProtection.Extensions.csproj b/src/DataProtection/Extensions/src/Microsoft.AspNetCore.DataProtection.Extensions.csproj
index 4e0f462d5b01..5b44128f30b5 100644
--- a/src/DataProtection/Extensions/src/Microsoft.AspNetCore.DataProtection.Extensions.csproj
+++ b/src/DataProtection/Extensions/src/Microsoft.AspNetCore.DataProtection.Extensions.csproj
@@ -12,8 +12,7 @@
-
+
diff --git a/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj b/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj
index c08185cc6a01..590c4e980042 100644
--- a/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj
+++ b/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj
@@ -43,7 +43,6 @@
-
+
diff --git a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj
index 2037d145a6d0..e23ac6202aca 100644
--- a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj
+++ b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj
@@ -22,8 +22,7 @@ Microsoft.Extensions.Diagnostics.HealthChecks.IHealthChecksBuilder
-
+
diff --git a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj
index 350751c48f94..1174c460f250 100644
--- a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj
+++ b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj
@@ -15,8 +15,7 @@
-
+
diff --git a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj
index c4551bb2cd9b..5c0bc03e774c 100644
--- a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj
+++ b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj
@@ -15,8 +15,7 @@
-
+
diff --git a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj
index 0c1987f47275..25784a904c42 100644
--- a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj
+++ b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj
@@ -19,9 +19,9 @@
-
+
diff --git a/src/Shared/CodeAnalysis/DynamicallyAccessedMemberTypes.cs b/src/Shared/CodeAnalysis/DynamicallyAccessedMemberTypes.cs
deleted file mode 100644
index 1795f38b89fc..000000000000
--- a/src/Shared/CodeAnalysis/DynamicallyAccessedMemberTypes.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-#if !NET5_0_OR_GREATER
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace System.Diagnostics.CodeAnalysis;
-
-///
-/// Specifies the types of members that are dynamically accessed.
-///
-/// This enumeration has a attribute that allows a
-/// bitwise combination of its member values.
-///
-[Flags]
-internal enum DynamicallyAccessedMemberTypes
-{
- ///
- /// Specifies no members.
- ///
- None = 0,
-
- ///
- /// Specifies the default, parameterless public constructor.
- ///
- PublicParameterlessConstructor = 0x0001,
-
- ///
- /// Specifies all public constructors.
- ///
- PublicConstructors = 0x0002 | PublicParameterlessConstructor,
-
- ///
- /// Specifies all non-public constructors.
- ///
- NonPublicConstructors = 0x0004,
-
- ///
- /// Specifies all public methods.
- ///
- PublicMethods = 0x0008,
-
- ///
- /// Specifies all non-public methods.
- ///
- NonPublicMethods = 0x0010,
-
- ///
- /// Specifies all public fields.
- ///
- PublicFields = 0x0020,
-
- ///
- /// Specifies all non-public fields.
- ///
- NonPublicFields = 0x0040,
-
- ///
- /// Specifies all public nested types.
- ///
- PublicNestedTypes = 0x0080,
-
- ///
- /// Specifies all non-public nested types.
- ///
- NonPublicNestedTypes = 0x0100,
-
- ///
- /// Specifies all public properties.
- ///
- PublicProperties = 0x0200,
-
- ///
- /// Specifies all non-public properties.
- ///
- NonPublicProperties = 0x0400,
-
- ///
- /// Specifies all public events.
- ///
- PublicEvents = 0x0800,
-
- ///
- /// Specifies all non-public events.
- ///
- NonPublicEvents = 0x1000,
-
- ///
- /// Specifies all interfaces implemented by the type.
- ///
- Interfaces = 0x2000,
-
- ///
- /// Specifies all members.
- ///
- All = ~None
-}
-#endif
diff --git a/src/Shared/CodeAnalysis/DynamicallyAccessedMembersAttribute.cs b/src/Shared/CodeAnalysis/DynamicallyAccessedMembersAttribute.cs
deleted file mode 100644
index 486a314aac6e..000000000000
--- a/src/Shared/CodeAnalysis/DynamicallyAccessedMembersAttribute.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-#if !NET5_0_OR_GREATER
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace System.Diagnostics.CodeAnalysis;
-
-///
-/// Indicates that certain members on a specified are accessed dynamically,
-/// for example through .
-///
-///
-/// This allows tools to understand which members are being accessed during the execution
-/// of a program.
-///
-/// This attribute is valid on members whose type is or .
-///
-/// When this attribute is applied to a location of type , the assumption is
-/// that the string represents a fully qualified type name.
-///
-/// If the attribute is applied to a method it's treated as a special case and it implies
-/// the attribute should be applied to the "this" parameter of the method. As such the attribute
-/// should only be used on instance methods of types assignable to System.Type (or string, but no methods
-/// will use it there).
-///
-[AttributeUsage(
- AttributeTargets.Field | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter |
- AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Method,
- Inherited = false)]
-internal sealed class DynamicallyAccessedMembersAttribute : Attribute
-{
- ///
- /// Initializes a new instance of the class
- /// with the specified member types.
- ///
- /// The types of members dynamically accessed.
- public DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes memberTypes)
- {
- MemberTypes = memberTypes;
- }
-
- ///
- /// Gets the which specifies the type
- /// of members dynamically accessed.
- ///
- public DynamicallyAccessedMemberTypes MemberTypes { get; }
-}
-#endif
diff --git a/src/Shared/TrimmingAttributes.cs b/src/Shared/TrimmingAttributes.cs
index aeb701d47b74..75da0a2e15e4 100644
--- a/src/Shared/TrimmingAttributes.cs
+++ b/src/Shared/TrimmingAttributes.cs
@@ -5,71 +5,74 @@
namespace System.Diagnostics.CodeAnalysis;
+#if !NET7_0_OR_GREATER
///
-/// Indicates that the specified method requires dynamic access to code that is not referenced
-/// statically, for example through .
+/// Indicates that the specified method requires the ability to generate new code at runtime,
+/// for example through .
///
///
-/// This allows tools to understand which methods are unsafe to call when removing unreferenced
-/// code from an application.
+/// This allows tools to understand which methods are unsafe to call when compiling ahead of time.
///
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Class, Inherited = false)]
-internal sealed class RequiresUnreferencedCodeAttribute : Attribute
+internal sealed class RequiresDynamicCodeAttribute : Attribute
{
///
- /// Initializes a new instance of the class
+ /// Initializes a new instance of the class
/// with the specified message.
///
///
- /// A message that contains information about the usage of unreferenced code.
+ /// A message that contains information about the usage of dynamic code.
///
- public RequiresUnreferencedCodeAttribute(string message)
+ public RequiresDynamicCodeAttribute(string message)
{
Message = message;
}
///
- /// Gets a message that contains information about the usage of unreferenced code.
+ /// Gets a message that contains information about the usage of dynamic code.
///
public string Message { get; }
///
/// Gets or sets an optional URL that contains more information about the method,
- /// why it requires unreferenced code, and what options a consumer has to deal with it.
+ /// why it requires dynamic code, and what options a consumer has to deal with it.
///
public string? Url { get; set; }
}
+#endif
+#if !NET5_0_OR_GREATER
///
-/// Indicates that the specified method requires the ability to generate new code at runtime,
-/// for example through .
+/// Indicates that the specified method requires dynamic access to code that is not referenced
+/// statically, for example through .
///
///
-/// This allows tools to understand which methods are unsafe to call when compiling ahead of time.
+/// This allows tools to understand which methods are unsafe to call when removing unreferenced
+/// code from an application.
///
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Class, Inherited = false)]
-internal sealed class RequiresDynamicCodeAttribute : Attribute
+internal sealed class RequiresUnreferencedCodeAttribute : Attribute
{
///
- /// Initializes a new instance of the class
+ /// Initializes a new instance of the class
/// with the specified message.
///
///
- /// A message that contains information about the usage of dynamic code.
+ /// A message that contains information about the usage of unreferenced code.
///
- public RequiresDynamicCodeAttribute(string message)
+ public RequiresUnreferencedCodeAttribute(string message)
{
Message = message;
}
///
- /// Gets a message that contains information about the usage of dynamic code.
+ /// Gets a message that contains information about the usage of unreferenced code.
///
public string Message { get; }
///
/// Gets or sets an optional URL that contains more information about the method,
- /// why it requires dynamic code, and what options a consumer has to deal with it.
+ /// why it requires unreferenced code, and what options a consumer has to deal with it.
///
public string? Url { get; set; }
}
@@ -414,3 +417,4 @@ internal enum DynamicallyAccessedMemberTypes
///
All = ~None
}
+#endif
diff --git a/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs b/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs
index 6825679330f2..e111b803d794 100644
--- a/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs
+++ b/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs
@@ -825,19 +825,27 @@ private void LaunchStreams(ConnectionState connectionState, Dictionary(ConnectionState connectionState, string streamId, ChannelReader reader, CancellationTokenSource tokenSource)
{
diff --git a/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj b/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj
index f26bf49f0333..16c662419d25 100644
--- a/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj
+++ b/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj
@@ -5,6 +5,7 @@
$(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework);netstandard2.0;netstandard2.1
Microsoft.AspNetCore.SignalR.Client
enable
+ true
@@ -16,11 +17,10 @@
+
-
-
diff --git a/src/SignalR/clients/csharp/Client/src/Microsoft.AspNetCore.SignalR.Client.csproj b/src/SignalR/clients/csharp/Client/src/Microsoft.AspNetCore.SignalR.Client.csproj
index edeac1edd808..de0d7377e23b 100644
--- a/src/SignalR/clients/csharp/Client/src/Microsoft.AspNetCore.SignalR.Client.csproj
+++ b/src/SignalR/clients/csharp/Client/src/Microsoft.AspNetCore.SignalR.Client.csproj
@@ -4,6 +4,7 @@
Client for ASP.NET Core SignalR
$(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework);netstandard2.0
enable
+ true
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj b/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj
index e79a1fd7bdba..2a04e266f950 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj
@@ -4,6 +4,7 @@
Client for ASP.NET Core Connection Handlers
$(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework);netstandard2.0;netstandard2.1
enable
+ true
diff --git a/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj b/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj
index 0ee7265d3820..1070faf71fd8 100644
--- a/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj
+++ b/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj
@@ -8,9 +8,12 @@
Microsoft.AspNetCore.SignalR
true
enable
+ true
+
+
diff --git a/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs b/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs
index 16299dd504c3..35fdbf90f1a3 100644
--- a/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs
+++ b/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs
@@ -611,7 +611,7 @@ private void WriteCompletionMessage(CompletionMessage message, Utf8JsonWriter wr
}
else
{
- JsonSerializer.Serialize(writer, message.Result, _payloadSerializerOptions);
+ SerializeObject(writer, message.Result);
}
}
}
@@ -633,7 +633,7 @@ private void WriteStreamItemMessage(StreamItemMessage message, Utf8JsonWriter wr
}
else
{
- JsonSerializer.Serialize(writer, message.Item, _payloadSerializerOptions);
+ SerializeObject(writer, message.Item);
}
}
@@ -691,7 +691,7 @@ private void WriteArguments(object?[] arguments, Utf8JsonWriter writer)
}
else
{
- JsonSerializer.Serialize(writer, argument, _payloadSerializerOptions);
+ SerializeObject(writer, argument);
}
}
writer.WriteEndArray();
@@ -827,10 +827,7 @@ private static HubMessage BindInvocationMessage(string? invocationId, string tar
return BindType(ref reader, type);
}
- private object? BindType(ref Utf8JsonReader reader, Type type)
- {
- return JsonSerializer.Deserialize(ref reader, type, _payloadSerializerOptions);
- }
+ private object? BindType(ref Utf8JsonReader reader, Type type) => DeserializeObject(ref reader, type);
private object?[] BindTypes(ref Utf8JsonReader reader, IReadOnlyList paramTypes)
{
@@ -914,6 +911,15 @@ private static HubMessage ApplyHeaders(HubMessage message, Dictionary JsonSerializer.Serialize(writer, value, _payloadSerializerOptions);
+
+ [UnconditionalSuppressMessage("Trimming", "IL2026:RequiresUnreferencedCode", Justification = "See SerializeObject Justification above.")]
+ [UnconditionalSuppressMessage("AOT", "IL3050:RequiresDynamicCode", Justification = "See above.")]
+ private object? DeserializeObject(ref Utf8JsonReader reader, Type type) => JsonSerializer.Deserialize(ref reader, type, _payloadSerializerOptions);
+
internal static JsonSerializerOptions CreateDefaultSerializerSettings()
{
return new JsonSerializerOptions()
diff --git a/src/SignalR/common/Shared/ReflectionHelper.cs b/src/SignalR/common/Shared/ReflectionHelper.cs
index e310fa31b835..70351533572f 100644
--- a/src/SignalR/common/Shared/ReflectionHelper.cs
+++ b/src/SignalR/common/Shared/ReflectionHelper.cs
@@ -15,7 +15,7 @@ internal static class ReflectionHelper
{
// mustBeDirectType - Hub methods must use the base 'stream' type and not be a derived class that just implements the 'stream' type
// and 'stream' types from the client are allowed to inherit from accepted 'stream' types
- public static bool IsStreamingType([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] Type type, bool mustBeDirectType = false)
+ public static bool IsStreamingType(Type type, bool mustBeDirectType = false)
{
// TODO #2594 - add Streams here, to make sending files easy
@@ -47,26 +47,28 @@ public static bool TryGetStreamType(Type streamType, [NotNullWhen(true)] out Typ
return false;
}
- public static bool IsIAsyncEnumerable([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] Type type)
+ public static bool IsIAsyncEnumerable(Type type) => GetIAsyncEnumerableInterface(type) is not null;
+
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern",
+ Justification = "The 'IAsyncEnumerable<>' Type must exist and so trimmer kept it. In which case " +
+ "It also kept it on any type which implements it. The below call to GetInterfaces " +
+ "may return fewer results when trimmed but it will return 'IAsyncEnumerable<>' " +
+ "if the type implemented it, even after trimming.")]
+ public static Type? GetIAsyncEnumerableInterface(Type type)
{
- if (type.IsGenericType)
+ if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IAsyncEnumerable<>))
{
- if (type.GetGenericTypeDefinition() == typeof(IAsyncEnumerable<>))
- {
- return true;
- }
+ return type;
}
- return type.GetInterfaces().Any(t =>
+ foreach (Type typeToCheck in type.GetInterfaces())
{
- if (t.IsGenericType)
+ if (typeToCheck.IsGenericType && typeToCheck.GetGenericTypeDefinition() == typeof(IAsyncEnumerable<>))
{
- return t.GetGenericTypeDefinition() == typeof(IAsyncEnumerable<>);
+ return typeToCheck;
}
- else
- {
- return false;
- }
- });
+ }
+
+ return null;
}
}
From a3990b7bc5030ee7c8e0f850e9fccf79cae8a495 Mon Sep 17 00:00:00 2001
From: Stephen Halter
Date: Mon, 10 Jun 2024 15:05:09 -0700
Subject: [PATCH 033/257] Don't require latest runtime patch for Blazor
DevServer (#56123)
---
eng/Versions.props | 1 -
...soft.AspNetCore.Components.WebAssembly.DevServer.csproj | 2 +-
.../DevServer/src/blazor-devserver.runtimeconfig.json.in | 2 +-
.../sample/ConcurrencyLimiterSample.csproj | 5 -----
src/Mvc/perf/benchmarkapps/BasicApi/BasicApi.csproj | 7 -------
src/ProjectTemplates/GenerateContent.targets | 6 ------
src/SiteExtensions/Sdk/SiteExtension.targets | 2 --
7 files changed, 2 insertions(+), 23 deletions(-)
diff --git a/eng/Versions.props b/eng/Versions.props
index 96e5c1a2ecab..e7c7cb717fc1 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -334,7 +334,6 @@
$(XunitVersion)
2.4.3
4.0.5
- 6.0.0-preview.3.21167.1
1.6.13
1.6.13
diff --git a/src/Components/WebAssembly/DevServer/src/Microsoft.AspNetCore.Components.WebAssembly.DevServer.csproj b/src/Components/WebAssembly/DevServer/src/Microsoft.AspNetCore.Components.WebAssembly.DevServer.csproj
index 8267a699183b..2030028ff87f 100644
--- a/src/Components/WebAssembly/DevServer/src/Microsoft.AspNetCore.Components.WebAssembly.DevServer.csproj
+++ b/src/Components/WebAssembly/DevServer/src/Microsoft.AspNetCore.Components.WebAssembly.DevServer.csproj
@@ -37,7 +37,7 @@
<_RuntimeConfigProperties>
- SharedFxVersion=$(SharedFxVersion);
+ AspNetCoreMajorMinorVersion=$(AspNetCoreMajorMinorVersion);
<_RuntimeConfigPath>$(OutputPath)blazor-devserver.runtimeconfig.json
diff --git a/src/Components/WebAssembly/DevServer/src/blazor-devserver.runtimeconfig.json.in b/src/Components/WebAssembly/DevServer/src/blazor-devserver.runtimeconfig.json.in
index f8e3bd9f0df2..352baf2b524a 100644
--- a/src/Components/WebAssembly/DevServer/src/blazor-devserver.runtimeconfig.json.in
+++ b/src/Components/WebAssembly/DevServer/src/blazor-devserver.runtimeconfig.json.in
@@ -3,7 +3,7 @@
"tfm": "net9.0",
"framework": {
"name": "Microsoft.AspNetCore.App",
- "version": "${SharedFxVersion}"
+ "version": "${AspNetCoreMajorMinorVersion}.0"
},
"rollForwardOnNoCandidateFx": 2
}
diff --git a/src/Middleware/ConcurrencyLimiter/sample/ConcurrencyLimiterSample.csproj b/src/Middleware/ConcurrencyLimiter/sample/ConcurrencyLimiterSample.csproj
index 94dfd9b47f31..a7f5b4921686 100644
--- a/src/Middleware/ConcurrencyLimiter/sample/ConcurrencyLimiterSample.csproj
+++ b/src/Middleware/ConcurrencyLimiter/sample/ConcurrencyLimiterSample.csproj
@@ -9,9 +9,4 @@
-
-
-
-
-
diff --git a/src/Mvc/perf/benchmarkapps/BasicApi/BasicApi.csproj b/src/Mvc/perf/benchmarkapps/BasicApi/BasicApi.csproj
index b61abeb404b4..bc66454704e8 100644
--- a/src/Mvc/perf/benchmarkapps/BasicApi/BasicApi.csproj
+++ b/src/Mvc/perf/benchmarkapps/BasicApi/BasicApi.csproj
@@ -30,11 +30,4 @@
-
-
-
-
-
-
-
diff --git a/src/ProjectTemplates/GenerateContent.targets b/src/ProjectTemplates/GenerateContent.targets
index e7e822235e53..3c216eedf91f 100644
--- a/src/ProjectTemplates/GenerateContent.targets
+++ b/src/ProjectTemplates/GenerateContent.targets
@@ -4,12 +4,6 @@
<_GenerateContentPropertiesHashFile>$(IntermediateOutputPath)$(MSBuildProjectName).content.g.cache
-
-
-
- $(GeneratedContentProperties);
- MicrosoftAspNetCoreAppVersion=$(SharedFxVersion);
-
diff --git a/src/SiteExtensions/Sdk/SiteExtension.targets b/src/SiteExtensions/Sdk/SiteExtension.targets
index 2fa12f51e2a5..8c10d2e7ca08 100644
--- a/src/SiteExtensions/Sdk/SiteExtension.targets
+++ b/src/SiteExtensions/Sdk/SiteExtension.targets
@@ -85,7 +85,6 @@
HostingStartupPackageName=%(_HostingStartupPackageReference.Identity);
HostingStartupVersion=%(_HostingStartupPackageReference.Version);
RuntimeFrameworkVersion=$(HostingStartupRuntimeFrameworkVersion);
- MicrosoftAspNetCoreAppVersion=$(SharedFxVersion);
UseAppHost=false;
NoBuild=false;
RestoreAdditionalProjectSources=$(_RsRestoreSources)" />
@@ -97,7 +96,6 @@
HostingStartupPackageName=%(_HostingStartupPackageReference.Identity);
HostingStartupVersion=%(_HostingStartupPackageReference.Version);
RuntimeFrameworkVersion=$(HostingStartupRuntimeFrameworkVersion);
- MicrosoftAspNetCoreAppVersion=$(SharedFxVersion);
UseAppHost=false;
NoBuild=false;
IncludeMainProjectInDepsFile=false" />
From 7df092d1d13692097507fcfe2c1eecdb923daa08 Mon Sep 17 00:00:00 2001
From: joegoldman2 <147369450+joegoldman2@users.noreply.github.com>
Date: Tue, 11 Jun 2024 02:46:12 +0000
Subject: [PATCH 034/257] ASP0022 - Fix false positive for groups without using
intermediate variables (#56116)
Co-authored-by: James Newton-King
---
.../RouteHandlers/DetectAmbiguousRoutes.cs | 95 ++++++++++++-
.../DetectAmbiguousMappedRoutesTest.cs | 126 ++++++++++++++++--
2 files changed, 212 insertions(+), 9 deletions(-)
diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectAmbiguousRoutes.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectAmbiguousRoutes.cs
index 18ccea7deacc..23c644e28979 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectAmbiguousRoutes.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectAmbiguousRoutes.cs
@@ -173,9 +173,42 @@ public bool Equals(MapOperationGroupKey other)
ParentOperation != null &&
Equals(ParentOperation, other.ParentOperation) &&
Builder != null &&
- SymbolEqualityComparer.Default.Equals((Builder as ILocalReferenceOperation)?.Local, (other.Builder as ILocalReferenceOperation)?.Local) &&
+ AreBuildersEqual(Builder, other.Builder) &&
AmbiguousRoutePatternComparer.Instance.Equals(RoutePattern, other.RoutePattern) &&
HasMatchingHttpMethods(HttpMethods, other.HttpMethods);
+
+ static bool AreBuildersEqual(IOperation builder, IOperation? other)
+ {
+ if (builder is ILocalReferenceOperation local && other is ILocalReferenceOperation otherLocal)
+ {
+ // The builders are both local variables.
+ return SymbolEqualityComparer.Default.Equals(local.Local, otherLocal.Local);
+ }
+
+ if (builder is IParameterReferenceOperation parameter && other is IParameterReferenceOperation otherParameter)
+ {
+ // The builders are both parameter variables.
+ return SymbolEqualityComparer.Default.Equals(parameter.Parameter, otherParameter.Parameter);
+ }
+
+ if (builder is IInvocationOperation invocation && other is IInvocationOperation otherInvocation)
+ {
+ if (invocation.TargetMethod.Name == "MapGroup" &&
+ invocation.TargetMethod.Parameters.Length == 2 &&
+ SymbolEqualityComparer.Default.Equals(invocation.TargetMethod, otherInvocation.TargetMethod) &&
+ invocation.Arguments.Length == 2 &&
+ otherInvocation.Arguments.Length == 2)
+ {
+ // The builders are both method calls. Special case checking known MapGroup method.
+ // For example, two MapGroup calls with the same route are considered equal:
+ // builder.MapGroup("/v1").MapGet("account")
+ // builder.MapGroup("/v1").MapGet("account")
+ return AreArgumentsEqual(invocation.TargetMethod, invocation.Arguments, otherInvocation.Arguments);
+ }
+ }
+
+ return false;
+ }
}
private static bool HasMatchingHttpMethods(ImmutableArray httpMethods1, ImmutableArray httpMethods2)
@@ -199,6 +232,66 @@ private static bool HasMatchingHttpMethods(ImmutableArray httpMethods1,
return false;
}
+ private static bool AreArgumentsEqual(IMethodSymbol method, ImmutableArray arguments1, ImmutableArray arguments2)
+ {
+ for (var i = 0; i < method.Parameters.Length; i++)
+ {
+ var argument1 = GetParameterArgument(method.Parameters[i], arguments1);
+ var argument2 = GetParameterArgument(method.Parameters[i], arguments2);
+
+ if (argument1 is ILocalReferenceOperation local && argument2 is ILocalReferenceOperation otherLocal)
+ {
+ if (!SymbolEqualityComparer.Default.Equals(local.Local, otherLocal.Local))
+ {
+ return false;
+ }
+ }
+ else if (argument1 is IParameterReferenceOperation parameter && argument2 is IParameterReferenceOperation otherParameter)
+ {
+ if (!SymbolEqualityComparer.Default.Equals(parameter.Parameter, otherParameter.Parameter))
+ {
+ return false;
+ }
+ }
+ else if (argument1 is ILiteralOperation literal && argument2 is ILiteralOperation otherLiteral)
+ {
+ if (!Equals(literal.ConstantValue, otherLiteral.ConstantValue))
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ return true;
+
+ static IOperation? GetParameterArgument(IParameterSymbol parameter, ImmutableArray arguments)
+ {
+ for (var i = 0; i < arguments.Length; i++)
+ {
+ if (SymbolEqualityComparer.Default.Equals(arguments[i].Parameter, parameter))
+ {
+ return WalkDownConversion(arguments[i].Value);
+ }
+ }
+
+ return null;
+ }
+ }
+
+ private static IOperation WalkDownConversion(IOperation operation)
+ {
+ while (operation is IConversionOperation conversionOperation)
+ {
+ operation = conversionOperation.Operand;
+ }
+
+ return operation;
+ }
+
public override int GetHashCode()
{
return (ParentOperation?.GetHashCode() ?? 0) ^ AmbiguousRoutePatternComparer.Instance.GetHashCode(RoutePattern);
diff --git a/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DetectAmbiguousMappedRoutesTest.cs b/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DetectAmbiguousMappedRoutesTest.cs
index e6e76831f757..c676ab25c308 100644
--- a/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DetectAmbiguousMappedRoutesTest.cs
+++ b/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DetectAmbiguousMappedRoutesTest.cs
@@ -20,7 +20,8 @@ public async Task DuplicateRoutes_SameHttpMethod_HasDiagnostics()
void Hello() { }
";
- var expectedDiagnostics = new[] {
+ var expectedDiagnostics = new[]
+ {
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
};
@@ -43,7 +44,8 @@ public async Task DuplicateRoutes_SameHttpMethod_HasRequestDelegate_HasDiagnosti
void Hello() { }
";
- var expectedDiagnostics = new[] {
+ var expectedDiagnostics = new[]
+ {
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
};
@@ -71,7 +73,8 @@ void RegisterEndpoints(IEndpointRouteBuilder builder)
void Hello() { }
";
- var expectedDiagnostics = new[] {
+ var expectedDiagnostics = new[]
+ {
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
};
@@ -140,7 +143,8 @@ public async Task DuplicateRoutes_InsideSwitchStatement_HasDiagnostics()
void Hello() { }
";
- var expectedDiagnostics = new[] {
+ var expectedDiagnostics = new[]
+ {
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
};
@@ -254,7 +258,8 @@ public async Task DuplicateMapGetRoutes_DuplicatesInsideConditional_NoDiagnostic
void Hello() { }
";
- var expectedDiagnostics = new[] {
+ var expectedDiagnostics = new[]
+ {
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
};
@@ -361,6 +366,110 @@ void Hello() { }
await VerifyCS.VerifyAnalyzerAsync(source);
}
+ [Fact]
+ public async Task DuplicateRoutes_MultipleGroups_DirectInvocation_NoDiagnostics()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+var app = WebApplication.Create();
+app.MapGroup(""/group1"").MapGet(""/"", () => { });
+app.MapGroup(""/group2"").MapGet(""/"", () => { });
+";
+
+ // Act & Assert
+ await VerifyCS.VerifyAnalyzerAsync(source);
+ }
+
+ [Fact]
+ public async Task DuplicateRoutes_SingleGroup_DifferentBuilderVariable_DirectInvocation_NoDiagnostics()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+var app1 = WebApplication.Create();
+var app2 = app1;
+app1.MapGroup(""/group1"").MapGet(""/"", () => { });
+app2.MapGroup(""/group1"").MapGet(""/"", () => { });
+";
+
+ // Act & Assert
+ await VerifyCS.VerifyAnalyzerAsync(source);
+ }
+
+ [Fact]
+ public async Task DuplicateRoutes_SingleGroup_DirectInvocation_HasDiagnostics()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+var app = WebApplication.Create();
+app.MapGroup(""/group1"").MapGet({|#0:""/""|}, () => { });
+app.MapGroup(""/group1"").MapGet({|#1:""/""|}, () => { });
+";
+
+ // Act & Assert
+ var expectedDiagnostics = new[]
+ {
+ new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
+ new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
+ };
+
+ await VerifyCS.VerifyAnalyzerAsync(source, expectedDiagnostics);
+ }
+
+ [Fact]
+ public async Task DuplicateRoutes_SingleGroup_DirectInvocation_InMethod_HasDiagnostics()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Routing;
+var app = WebApplication.Create();
+void RegisterEndpoints(IEndpointRouteBuilder builder)
+{
+ builder.MapGroup(""/group1"").MapGet({|#0:""/""|}, () => { });
+ builder.MapGroup(""/group1"").MapGet({|#1:""/""|}, () => { });
+}
+
+RegisterEndpoints(app);
+
+void Hello() { }
+";
+
+ var expectedDiagnostics = new[]
+ {
+ new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
+ new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
+ };
+
+ // Act & Assert
+ await VerifyCS.VerifyAnalyzerAsync(source, expectedDiagnostics);
+ }
+
+ [Fact]
+ public async Task DuplicateRoutes_SingleGroup_RoutePattern_DirectInvocation_HasDiagnostics()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Routing.Patterns;
+var routePattern = RoutePatternFactory.Parse(""/group1"");
+var app = WebApplication.Create();
+app.MapGroup(routePattern).MapGet({|#0:""/""|}, () => { });
+app.MapGroup(routePattern).MapGet({|#1:""/""|}, () => { });
+";
+
+ // Act & Assert
+ var expectedDiagnostics = new[]
+ {
+ new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
+ new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
+ };
+
+ await VerifyCS.VerifyAnalyzerAsync(source, expectedDiagnostics);
+ }
+
[Fact]
public async Task DuplicateRoutes_EndpointsOnGroup_HasDiagnostics()
{
@@ -377,7 +486,8 @@ void Hello() { }
";
// Act & Assert
- var expectedDiagnostics = new[] {
+ var expectedDiagnostics = new[]
+ {
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
};
@@ -409,7 +519,8 @@ public async Task DuplicateRoutes_AllowedBuilderExtensionMethods_HasDiagnostics(
void Hello() { }
";
- var expectedDiagnostics = new[] {
+ var expectedDiagnostics = new[]
+ {
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(0),
new DiagnosticResult(DiagnosticDescriptors.AmbiguousRouteHandlerRoute).WithArguments("/").WithLocation(1)
};
@@ -440,4 +551,3 @@ void Hello() { }
await VerifyCS.VerifyAnalyzerAsync(source);
}
}
-
From 2b5d2b36a04f3a4a9bb20bbca38617d1cd6a3a1a Mon Sep 17 00:00:00 2001
From: Igor Velikorossov
Date: Tue, 11 Jun 2024 18:10:04 +1000
Subject: [PATCH 035/257] Unquarantine
HtmlGenerationWithCultureTest.CacheTagHelper_VaryByCultureComposesWithOtherVaryByOptions
(#55858)
Resolves #4907
---
.../test/Mvc.FunctionalTests/HtmlGenerationWithCultureTest.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/Mvc/test/Mvc.FunctionalTests/HtmlGenerationWithCultureTest.cs b/src/Mvc/test/Mvc.FunctionalTests/HtmlGenerationWithCultureTest.cs
index 474388dc01df..8cef176a1549 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/HtmlGenerationWithCultureTest.cs
+++ b/src/Mvc/test/Mvc.FunctionalTests/HtmlGenerationWithCultureTest.cs
@@ -127,7 +127,6 @@ void ReadValuesFromDocument()
}
[Fact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/4907")]
public async Task CacheTagHelper_VaryByCultureComposesWithOtherVaryByOptions()
{
// Arrange
From 0991dc1b3a275e83986c16f03e4d8c7c8e0ce169 Mon Sep 17 00:00:00 2001
From: Javier Calvarro Nelson
Date: Tue, 11 Jun 2024 20:26:37 +0200
Subject: [PATCH 036/257] [Infrastructure] Updated npm package cache 2024-06-11
(#56186)
---
package-lock.json | 2822 +++++++++++++++------------------
src/submodules/Node-Externals | 2 +-
2 files changed, 1246 insertions(+), 1578 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 5a95006858b1..a27e12d08bd6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -38,15 +38,6 @@
"npm": ">=9.3.1"
}
},
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha1-vZFUrsmYP3ezoDTsqgFcLkIB9s8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/@ampproject/remapping": {
"version": "2.3.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@ampproject/remapping/-/remapping-2.3.0.tgz",
@@ -61,31 +52,31 @@
}
},
"node_modules/@azure/msal-browser": {
- "version": "2.38.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@azure/msal-browser/-/msal-browser-2.38.3.tgz",
- "integrity": "sha1-LxMfqbeoqVRvyNNOXZnOTBiwQUc=",
+ "version": "2.39.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@azure/msal-browser/-/msal-browser-2.39.0.tgz",
+ "integrity": "sha1-aE/Tl0wmKLLf/QSkyEFqCUW0K2k=",
"dependencies": {
- "@azure/msal-common": "13.3.1"
+ "@azure/msal-common": "13.3.3"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@azure/msal-common": {
- "version": "13.3.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@azure/msal-common/-/msal-common-13.3.1.tgz",
- "integrity": "sha1-ASRlv5QNEjddxHOHt1TM+da5IYA=",
+ "version": "13.3.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@azure/msal-common/-/msal-common-13.3.3.tgz",
+ "integrity": "sha1-tJY8nloWTtiQsgS+ywNjA8z09qw=",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@babel/code-frame": {
- "version": "7.24.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/code-frame/-/code-frame-7.24.2.tgz",
- "integrity": "sha1-cYtLGYQYCaWLKbaM3oC8Xhqm2a4=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/code-frame/-/code-frame-7.24.7.tgz",
+ "integrity": "sha1-iC/Z4J6O4yTklr0EBAHG8EbvRGU=",
"dev": true,
"dependencies": {
- "@babel/highlight": "^7.24.2",
+ "@babel/highlight": "^7.24.7",
"picocolors": "^1.0.0"
},
"engines": {
@@ -93,30 +84,30 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/compat-data/-/compat-data-7.24.1.tgz",
- "integrity": "sha1-McH2ZDXyqcMpu1cWptYYbFFsN0I=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/compat-data/-/compat-data-7.24.7.tgz",
+ "integrity": "sha1-0ju+pQjDiDuoJR+0FkmCw26ld+0=",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.24.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/core/-/core-7.24.3.tgz",
- "integrity": "sha1-VohkJH6hD71O/wTdoeBfni6phcM=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/core/-/core-7.24.7.tgz",
+ "integrity": "sha1-tnZFAUHgtSo9Q7yR2oaqYI+VCsQ=",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.24.2",
- "@babel/generator": "^7.24.1",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.24.1",
- "@babel/parser": "^7.24.1",
- "@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.1",
- "@babel/types": "^7.24.0",
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.24.7",
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helpers": "^7.24.7",
+ "@babel/parser": "^7.24.7",
+ "@babel/template": "^7.24.7",
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -132,9 +123,9 @@
}
},
"node_modules/@babel/core/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -155,12 +146,12 @@
"dev": true
},
"node_modules/@babel/generator": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/generator/-/generator-7.24.1.tgz",
- "integrity": "sha1-5n4G9oVopOvxlNHGAUI1NE8EdtA=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/generator/-/generator-7.24.7.tgz",
+ "integrity": "sha1-FlTQHeIK1mtLTZnBNUcbxlTFXm0=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.24.0",
+ "@babel/types": "^7.24.7",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^2.5.1"
@@ -170,37 +161,38 @@
}
},
"node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.22.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
- "integrity": "sha1-5/BnN7GX1YCgHt912X4si+mdOII=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+ "integrity": "sha1-U3PHvINmsSoDO0vhrBOiBsZlaqs=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.22.5"
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.22.15",
- "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.22.15.tgz",
- "integrity": "sha1-VCaxCc861HuREg+DKNirG+iwuVY=",
+ "version": "7.24.7",
+ "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.24.7.tgz",
+ "integrity": "sha1-N9Zv6wEgJPJCK3Yrmyp8/ifH+6M=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.22.15"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.23.6",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
- "integrity": "sha1-TXkGmxbLzxRhKJ7M+72BUBrjmZE=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz",
+ "integrity": "sha1-TrbEqA1v/qwlq4zZohtd+kjVA6k=",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.23.5",
- "@babel/helper-validator-option": "^7.23.5",
+ "@babel/compat-data": "^7.24.7",
+ "@babel/helper-validator-option": "^7.24.7",
"browserslist": "^4.22.2",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
@@ -210,19 +202,19 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.24.1",
- "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.24.1.tgz",
- "integrity": "sha1-21i/VxN7YjuRbiSHSrcYjZPX9o8=",
- "dev": true,
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-member-expression-to-functions": "^7.23.0",
- "@babel/helper-optimise-call-expression": "^7.22.5",
- "@babel/helper-replace-supers": "^7.24.1",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
+ "version": "7.24.7",
+ "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.24.7.tgz",
+ "integrity": "sha1-Lq7TazocEcU734DVODiyk8UvWzs=",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-member-expression-to-functions": "^7.24.7",
+ "@babel/helper-optimise-call-expression": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
"semver": "^6.3.1"
},
"engines": {
@@ -233,12 +225,12 @@
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.22.15",
- "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.22.15.tgz",
- "integrity": "sha1-XukAk5FOoJY5sBxxHbDWd15Vi+E=",
+ "version": "7.24.7",
+ "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.24.7.tgz",
+ "integrity": "sha1-vk9DWoDcKwU8du60t9Ft0iz8ido=",
"dev": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-annotate-as-pure": "^7.24.7",
"regexpu-core": "^5.3.1",
"semver": "^6.3.1"
},
@@ -250,9 +242,9 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz",
- "integrity": "sha1-+txj8ML/PI0C7ZBdzqdHxbD7dP0=",
+ "version": "0.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+ "integrity": "sha1-GFlPeJw1lKyyTP20p/e30ui9kS0=",
"dev": true,
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.6",
@@ -266,9 +258,9 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -289,74 +281,79 @@
"dev": true
},
"node_modules/@babel/helper-environment-visitor": {
- "version": "7.22.20",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
- "integrity": "sha1-lhWdth00op26RUyVn1rkpkm6kWc=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
+ "integrity": "sha1-SzG6lVHR+QeBuoNJHdWc+bJp99k=",
"dev": true,
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
- "version": "7.23.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
- "integrity": "sha1-H5o829WyaYpnDDDSc1+a+V7VJ1k=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
+ "integrity": "sha1-dfHhcldC85rGWE7gsW2UUT2jjdI=",
"dev": true,
"dependencies": {
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.23.0"
+ "@babel/template": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
- "version": "7.22.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha1-wBoAfawFwIWRTo+2UrM521DYI7s=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
+ "integrity": "sha1-tO3hzeL9iUNjl/MNyTdu4GsPJe4=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.22.5"
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.23.0",
- "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.23.0.tgz",
- "integrity": "sha1-kmPojMXkHTnsGMmj4OztWaPn02Y=",
+ "version": "7.24.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.24.7.tgz",
+ "integrity": "sha1-Z2E9BoYVpw5O1RAQma/8ekHFIl8=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.23.0"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.24.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz",
- "integrity": "sha1-asR25tFox8I/87o89PeEHUasgSg=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+ "integrity": "sha1-8vmAOS3luEwzKPxx04vYG7uDBCs=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.24.0"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.23.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
- "integrity": "sha1-19EsPF0wr1s8D8qyptUhd3Pi0PE=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz",
+ "integrity": "sha1-MbbJopMGeUmNtltoWxaYv9bH2vg=",
"dev": true,
"dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-simple-access": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/helper-validator-identifier": "^7.22.20"
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-simple-access": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -366,35 +363,35 @@
}
},
"node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.22.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
- "integrity": "sha1-8hUxqcy/9kT90Va0B3wW/ww/YJ4=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
+ "integrity": "sha1-iwoEVskvazI9J8/QDR1mTnZpKg8=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.22.5"
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.24.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz",
- "integrity": "sha1-lFaBkxpS8Vzoef1bhs4trm09fyo=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
+ "integrity": "sha1-mMhP5v49DTrnv8Ol4WakaET+sqA=",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.22.20",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
- "integrity": "sha1-e2jhy0+pZNKZb9Bjcj+0jsqEmOA=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz",
+ "integrity": "sha1-s/DyA2KFInE4SdSUA/GkFEaL5Mc=",
"dev": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-wrap-function": "^7.22.20"
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-wrap-function": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -404,14 +401,14 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz",
- "integrity": "sha1-cIW9GdSgt+2PQFwe1zzLcPMjq8E=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz",
+ "integrity": "sha1-+TO37tgaHAJldA7ckUkc5RJQ92U=",
"dev": true,
"dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-member-expression-to-functions": "^7.23.0",
- "@babel/helper-optimise-call-expression": "^7.22.5"
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-member-expression-to-functions": "^7.24.7",
+ "@babel/helper-optimise-call-expression": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -421,103 +418,105 @@
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.22.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
- "integrity": "sha1-STg1fcfXgrgO1tuwOg+6PSKx1d4=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+ "integrity": "sha1-vK3o2jrsjtFrnElTt05Qa1G17bM=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.22.5"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.22.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
- "integrity": "sha1-AH8VJAtXUcU3xA53q7TonuqqiEc=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
+ "integrity": "sha1-X4+oO2ntXCetxWBE+L4rPqlmadk=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.22.5"
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-split-export-declaration": {
- "version": "7.22.6",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha1-MixhtzEMCZf+TDI5VWZ/GPzvuRw=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
+ "integrity": "sha1-g5SUNokOB/o9aHPGGpbju/aS2FY=",
"dev": true,
"dependencies": {
- "@babel/types": "^7.22.5"
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz",
- "integrity": "sha1-+Zw201k9uVQHBdBzmh8QteIMaW4=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz",
+ "integrity": "sha1-TS0PFIIO3juYB+pfw238jNfaB/I=",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.20",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
- "integrity": "sha1-xK4ALGHSh55yRYHZZmVYPbwdwOA=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+ "integrity": "sha1-dbiJz6+eNcKq9Czw1yyOkXGSUds=",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.23.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
- "integrity": "sha1-kHo/vUUjQmKFNl0SBsQjxMVSAwc=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz",
+ "integrity": "sha1-JMO7d8ekJdF0LuyPtDO1obOOYvY=",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-wrap-function": {
- "version": "7.22.20",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
- "integrity": "sha1-FTUrC5v7EPycdvefY0LADjQRpWk=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz",
+ "integrity": "sha1-UtiTr35C7cp8bSxnZFSYJjNqrh8=",
"dev": true,
"dependencies": {
- "@babel/helper-function-name": "^7.22.5",
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.22.19"
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/template": "^7.24.7",
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helpers/-/helpers-7.24.1.tgz",
- "integrity": "sha1-GD5EcUueujbDA45EJRZYex4KGpQ=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helpers/-/helpers-7.24.7.tgz",
+ "integrity": "sha1-qizNop9iGFrLXUL7SjobEIIQdBY=",
"dev": true,
"dependencies": {
- "@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.1",
- "@babel/types": "^7.24.0"
+ "@babel/template": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
- "version": "7.24.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/highlight/-/highlight-7.24.2.tgz",
- "integrity": "sha1-P1OVA+/IPTxZCAoQ5mNDBuA3DSY=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/highlight/-/highlight-7.24.7.tgz",
+ "integrity": "sha1-oFqx3xNLKGVYquDtQebF9zG/QJ0=",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.22.20",
+ "@babel/helper-validator-identifier": "^7.24.7",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0",
"picocolors": "^1.0.0"
@@ -527,9 +526,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/parser/-/parser-7.24.1.tgz",
- "integrity": "sha1-HkFtNic5P6sctbDy8XlqEArpEzo=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/parser/-/parser-7.24.7.tgz",
+ "integrity": "sha1-mlIm+S8MXI6tVQt1D1YI52bIzoU=",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -538,13 +537,29 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz",
+ "integrity": "sha1-/QWf0nsYTqK0x+ZGhoqaOBu8MFU=",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz",
- "integrity": "sha1-tkXZuowrxbevUPD+lJ+e2+sHyM8=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz",
+ "integrity": "sha1-RoCWykS7y+j8xXBXThLrGVDhgQc=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -554,14 +569,14 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.24.1",
- "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.24.1.tgz",
- "integrity": "sha1-2oJh8ml/D0GwhVuR06IKH7/ScdM=",
+ "version": "7.24.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.24.7.tgz",
+ "integrity": "sha1-5Oq91RCazDmbONeZmy72b8ICL4k=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
- "@babel/plugin-transform-optional-chaining": "^7.24.1"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -571,13 +586,13 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz",
- "integrity": "sha1-EYHZaFmEyR1le43fFPBIemurKYg=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz",
+ "integrity": "sha1-cbIbsChtWBDmOhU4qpAcWOhzdew=",
"dev": true,
"dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -674,12 +689,12 @@
}
},
"node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz",
- "integrity": "sha1-2zqtckFToA6qwRWj+4mN5UTjSXE=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
+ "integrity": "sha1-KgtAa1hxogqEEkBYaxMAziCIp3g=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -689,12 +704,12 @@
}
},
"node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz",
- "integrity": "sha1-xmuWbGO3FMTuxQj89XY7Hy04EJM=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
+ "integrity": "sha1-tPnqlaeeaRJIDEtiZzn4agdmJMo=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -728,12 +743,12 @@
}
},
"node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz",
- "integrity": "sha1-P2ygS4yEGBHbw8XF+DeTTg1ibBA=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
+ "integrity": "sha1-OaH6Sn49PX804qzGvlhbcY0w4C0=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -845,12 +860,12 @@
}
},
"node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz",
- "integrity": "sha1-s7zFHzltFfNZFoP5AjneFDwHaEQ=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz",
+ "integrity": "sha1-WNRYJxtNO2uyfuaslSWsuyWbrRw=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -876,12 +891,12 @@
}
},
"node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz",
- "integrity": "sha1-K/JjYXBgycxFvNv0krjMgFCCvyc=",
+ "version": "7.24.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.24.7.tgz",
+ "integrity": "sha1-T2iGwR5CO9afPOUdv0JCSl8nVRQ=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -891,14 +906,14 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.24.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz",
- "integrity": "sha1-j6euSBsQB2jMmELIYXgIxTUri4k=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz",
+ "integrity": "sha1-czClxQ4FGBylI1G4/QFkIADJbP0=",
"dev": true,
"dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-remap-async-to-generator": "^7.22.20",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-remap-async-to-generator": "^7.24.7",
"@babel/plugin-syntax-async-generators": "^7.8.4"
},
"engines": {
@@ -909,14 +924,14 @@
}
},
"node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.24.1",
- "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.24.1.tgz",
- "integrity": "sha1-DiIHA7ifIhaADOexxTywz1IcN/Q=",
+ "version": "7.24.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.24.7.tgz",
+ "integrity": "sha1-cqOvbEUdV1hCp+m1oChjQUNVvcw=",
"dev": true,
"dependencies": {
- "@babel/helper-module-imports": "^7.24.1",
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-remap-async-to-generator": "^7.22.20"
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-remap-async-to-generator": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -926,12 +941,12 @@
}
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz",
- "integrity": "sha1-HJR5niD81cTUWJUju8V7dpKXk4A=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+ "integrity": "sha1-pCUdmOoMDzmdr+GjWAHqukVbvx8=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -941,12 +956,12 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz",
- "integrity": "sha1-J68YPX9trYkFMSVsekUBnfdorB8=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz",
+ "integrity": "sha1-QgY+TeuFDHvXxV5ia/Tnq0jmzgI=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -956,13 +971,13 @@
}
},
"node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz",
- "integrity": "sha1-vL8a72umCFz93sn8jViHHPAR/Ck=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
+ "integrity": "sha1-JWh5RntXsLaMfd/Ft2WE85jNaDQ=",
"dev": true,
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.1",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -972,13 +987,13 @@
}
},
"node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz",
- "integrity": "sha1-TjfvzKHZ8vy5CNG66LVrS26eHLY=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+ "integrity": "sha1-yCAn67cBC8M8EW1LUET7v4wFSE0=",
"dev": true,
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.1",
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-class-static-block": "^7.14.5"
},
"engines": {
@@ -989,18 +1004,18 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz",
- "integrity": "sha1-W8j8Fg7ZY3gYS8EAQq9H9QiE3LE=",
- "dev": true,
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-replace-supers": "^7.24.1",
- "@babel/helper-split-export-declaration": "^7.22.6",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz",
+ "integrity": "sha1-SubvQ6EkkhNBOMHkWRP3xGxBtL8=",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
"globals": "^11.1.0"
},
"engines": {
@@ -1011,13 +1026,13 @@
}
},
"node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz",
- "integrity": "sha1-vH54f44CHsz7Z3r18TwpqZNO2Kc=",
+ "version": "7.24.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.24.7.tgz",
+ "integrity": "sha1-TKsyFOgLxx+uOFMjjRPQl7AExwc=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/template": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/template": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1027,12 +1042,12 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz",
- "integrity": "sha1-segkOvSgIGhBlzeGKSuMjdhEc0U=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz",
+ "integrity": "sha1-oJfyUpLe+25swW1jM6TPwePHLZ4=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1042,13 +1057,13 @@
}
},
"node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz",
- "integrity": "sha1-1WkT0vEnlcyZMIAbhMb4xHUTrBM=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+ "integrity": "sha1-X4v4poDyEWpyB+FiiKX5dK1Hp6A=",
"dev": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1058,12 +1073,12 @@
}
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz",
- "integrity": "sha1-U0enl/6CuNCXSdEOn1uDZlrbyog=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+ "integrity": "sha1-3SAQKJfJojJOWt//tn/zYQNZqO4=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1073,12 +1088,12 @@
}
},
"node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz",
- "integrity": "sha1-KlpJlZIBlw3Qml/KhWy2UeREOd0=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+ "integrity": "sha1-TYuV47risDdnMJGqCc0z/s1kGfQ=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3"
},
"engines": {
@@ -1089,13 +1104,13 @@
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz",
- "integrity": "sha1-ZlDr61vVwBLV9fkKJmE6CBYui6Q=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+ "integrity": "sha1-tinuImRfQSAkKX1SRbzkJcMfmw0=",
"dev": true,
"dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1105,12 +1120,12 @@
}
},
"node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz",
- "integrity": "sha1-8DNUH8A24++y3LWO7a/U9rgHis0=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
+ "integrity": "sha1-F21S2NjtUWrq5wE+6VVtVAxT8Zc=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3"
},
"engines": {
@@ -1121,13 +1136,13 @@
}
},
"node_modules/@babel/plugin-transform-for-of": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz",
- "integrity": "sha1-Z0SERrZ6tsCRNgzjcX59OlniAv0=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+ "integrity": "sha1-8lsz9y3x2L52OZ4bjz+dNm61vHA=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1137,14 +1152,14 @@
}
},
"node_modules/@babel/plugin-transform-function-name": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz",
- "integrity": "sha1-jLpvdzBibMTf5MovpRYhWgWSs2E=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz",
+ "integrity": "sha1-bYYB+//mZciURAq0RwvHId2RMdY=",
"dev": true,
"dependencies": {
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1154,12 +1169,12 @@
}
},
"node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz",
- "integrity": "sha1-COY2m2KrPop7YQiRUbFhGAyCmfc=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+ "integrity": "sha1-8+nDfAo3P+6G42iA1Fs2ZM7a9zo=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-json-strings": "^7.8.3"
},
"engines": {
@@ -1170,12 +1185,12 @@
}
},
"node_modules/@babel/plugin-transform-literals": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz",
- "integrity": "sha1-ChmCKXr4Pms8lJcmhgZ99YjFwJY=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz",
+ "integrity": "sha1-NrUFweZVFRqddgd5mpmI/FRn0Gw=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1185,12 +1200,12 @@
}
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz",
- "integrity": "sha1-cZ2K3tGqlLj7NOOnha6FGOJM+kA=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+ "integrity": "sha1-pY+27aFsncj5/xx7G6bet/RpTLA=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
},
"engines": {
@@ -1201,12 +1216,12 @@
}
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz",
- "integrity": "sha1-iW0jYByS9DeviwE3GtNL63XfRIk=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+ "integrity": "sha1-O0RU+w4wLhi6SUW6MkassSSDFd8=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1216,13 +1231,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz",
- "integrity": "sha1-ttgp7RUlhTaXfpx8xkN4FIcf+jk=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+ "integrity": "sha1-ZQkO1JPEqDSXajyhzed25sz/Mtc=",
"dev": true,
"dependencies": {
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1232,14 +1247,14 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz",
- "integrity": "sha1-5xuh0NaeBJoiv5Czhn4mOCPT8bk=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz",
+ "integrity": "sha1-n9X3/a3ukIWIaxg/GtE9GrJg9Ks=",
"dev": true,
"dependencies": {
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-simple-access": "^7.22.5"
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-simple-access": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1249,15 +1264,15 @@
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz",
- "integrity": "sha1-K5Ylo9TkRbq6yXiNrsOQlOaxHj4=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz",
+ "integrity": "sha1-+AEjFsUJj26N7m7NWOK8bwA9DOc=",
"dev": true,
"dependencies": {
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-validator-identifier": "^7.22.20"
+ "@babel/helper-hoist-variables": "^7.24.7",
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1267,13 +1282,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz",
- "integrity": "sha1-aSIMZmU6Gc8sCHK5x2K5pIuL6+8=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+ "integrity": "sha1-7dn0PsVJCZYg333yTnuhO1x278g=",
"dev": true,
"dependencies": {
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1283,13 +1298,13 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.22.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.22.5.tgz",
- "integrity": "sha1-Z/4Y7ozgLVfIVRheJ+PclZsumR8=",
+ "version": "7.24.7",
+ "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.24.7.tgz",
+ "integrity": "sha1-kELpuFa8azaIwMLkBg6eELFGCSM=",
"dev": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.5",
- "@babel/helper-plugin-utils": "^7.22.5"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1299,12 +1314,12 @@
}
},
"node_modules/@babel/plugin-transform-new-target": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz",
- "integrity": "sha1-KcWZiPo9AVfeHIcaKM2DCWNjzDQ=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+ "integrity": "sha1-Mf9UxOBVXMVJ1YFuSrOSQd+2qwA=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1314,12 +1329,12 @@
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz",
- "integrity": "sha1-DNSUu5fLB9QovWUWMsudQUBROYg=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
+ "integrity": "sha1-HeRTTFkK+VlvU9Z/UqkvEtuYQSA=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
},
"engines": {
@@ -1330,12 +1345,12 @@
}
},
"node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz",
- "integrity": "sha1-W8AZzls0NcHK3zchXlXkM9Z01Og=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+ "integrity": "sha1-vqYrU4yAYF2KD6ybQPSOl++n3mM=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
},
"engines": {
@@ -1346,15 +1361,15 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz",
- "integrity": "sha1-WjznPK8OeHGgLhwx6LRzCTryQf8=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
+ "integrity": "sha1-0Tork0Na64oZfhFSIcqyZrpuVdY=",
"dev": true,
"dependencies": {
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.24.1"
+ "@babel/plugin-transform-parameters": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1364,13 +1379,13 @@
}
},
"node_modules/@babel/plugin-transform-object-super": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz",
- "integrity": "sha1-5x1qsTSDzKie2VpHT1Qrv8IKBSA=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+ "integrity": "sha1-Zu6v94MLupRd2JibYypAwE7WJb4=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-replace-supers": "^7.24.1"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1380,12 +1395,12 @@
}
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz",
- "integrity": "sha1-kqPQ7+hHunIvGkUIZpsjE0Zp4to=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+ "integrity": "sha1-AOq9iD0N1qYMHFV1SHhZGbbnF7Q=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
},
"engines": {
@@ -1396,13 +1411,13 @@
}
},
"node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz",
- "integrity": "sha1-JuWIrL7c4as1GaxAzHSOOAxSkeY=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz",
+ "integrity": "sha1-uPaEioDPLamKiiBEKb7AR1bG1FQ=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
},
"engines": {
@@ -1413,12 +1428,12 @@
}
},
"node_modules/@babel/plugin-transform-parameters": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz",
- "integrity": "sha1-mDwV0RTaGQUGx1thbOsPgXr8xRA=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
+ "integrity": "sha1-WIHwriEBhADjIPx+uBflKdElS2g=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1428,13 +1443,13 @@
}
},
"node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz",
- "integrity": "sha1-oPqhrofv8Hfh5HpeyBw67zg9wVo=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
+ "integrity": "sha1-5jGHRrKucKWdAj1cwTRKK6enX14=",
"dev": true,
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.1",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1444,14 +1459,14 @@
}
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz",
- "integrity": "sha1-dWRD1AAnT4+3iWdClizBufJcH2o=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
+ "integrity": "sha1-TuxrxwEojB+rX3LmpLvJ1n+soGE=",
"dev": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-create-class-features-plugin": "^7.24.1",
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
},
"engines": {
@@ -1462,12 +1477,12 @@
}
},
"node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz",
- "integrity": "sha1-1qmuq5bwN0n07r6wtuqOkOyViCU=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+ "integrity": "sha1-8NLtg4DfvtlJxC1NeQJmUl1ju9w=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1477,12 +1492,12 @@
}
},
"node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz",
- "integrity": "sha1-Ylt1RbrlI2O9wfu9xyUrUEZAnIw=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+ "integrity": "sha1-AhVi3kU02LSxhRdZ/Xr04F0sR/g=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
+ "@babel/helper-plugin-utils": "^7.24.7",
"regenerator-transform": "^0.15.2"
},
"engines": {
@@ -1493,12 +1508,12 @@
}
},
"node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz",
- "integrity": "sha1-jecp9ey6r1z4O2feE7rTiiG+V8E=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+ "integrity": "sha1-gAN/5PvwMfwRJQIheP85OLs3Q6Q=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1508,12 +1523,12 @@
}
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz",
- "integrity": "sha1-upoJFEz1XTXsa5OjIlO+ytjuW1U=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
+ "integrity": "sha1-hUSMa5luEi+p4ol0YUCqqZ2mTnM=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1523,13 +1538,13 @@
}
},
"node_modules/@babel/plugin-transform-spread": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz",
- "integrity": "sha1-oaz5FSy/aQ5NoLoQeQs6x9Kys5E=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
+ "integrity": "sha1-6KOMD954guD7jxYDePdL2IXMe7M=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1539,12 +1554,12 @@
}
},
"node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz",
- "integrity": "sha1-8D5nKRLG4gPtjW4CcdnCET3AMbk=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
+ "integrity": "sha1-lq6A16flJR9le1zxjx6mv5JvX+s=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1554,12 +1569,12 @@
}
},
"node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz",
- "integrity": "sha1-FeIWaHOjDYYX4+LMrbhmQ9Mnqrc=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
+ "integrity": "sha1-oF3rtKkHKuj5hbz3fz8hVDTI+Mg=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1569,12 +1584,12 @@
}
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz",
- "integrity": "sha1-aDH3hkcIDewET36faAA9mUJPlMc=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz",
+ "integrity": "sha1-8HS+RmWA1H1uaydHOoQMn5ygj7A=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1584,15 +1599,15 @@
}
},
"node_modules/@babel/plugin-transform-typescript": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz",
- "integrity": "sha1-XAXii7dsff59bFvtmVEyT9LTqwc=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz",
+ "integrity": "sha1-sAaz4AlL8IE9UF4MVIVnnur0qIE=",
"dev": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-create-class-features-plugin": "^7.24.1",
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/plugin-syntax-typescript": "^7.24.1"
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-typescript": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1602,12 +1617,12 @@
}
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz",
- "integrity": "sha1-+z+hZnZUmsfHRJ25s0JhSYXCo6Q=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+ "integrity": "sha1-ICOoLO0ftJcWMKLgeXZFAsQUjg4=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1617,13 +1632,13 @@
}
},
"node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz",
- "integrity": "sha1-VnBP1NmdqB5enwwMk8q9kdvEiJ4=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+ "integrity": "sha1-kHOkzRO4bqccMmRllZCsCGYFu80=",
"dev": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1633,13 +1648,13 @@
}
},
"node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz",
- "integrity": "sha1-V8PBkdaPmYrEa3CDgMHOTRNTY4U=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
+ "integrity": "sha1-38PUpREnEICZsZgXwJY75qKt8Z8=",
"dev": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1649,13 +1664,13 @@
}
},
"node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz",
- "integrity": "sha1-weoXWwKvz/yc9XqcRlgyZiUWW38=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
+ "integrity": "sha1-1AcF1nUjgDpXbinGPO9uUWuFjtk=",
"dev": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.24.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1665,26 +1680,27 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.24.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/preset-env/-/preset-env-7.24.3.tgz",
- "integrity": "sha1-8/E4yET/7qw3JZeynFG1JZ6DI6M=",
- "dev": true,
- "dependencies": {
- "@babel/compat-data": "^7.24.1",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-validator-option": "^7.23.5",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/preset-env/-/preset-env-7.24.7.tgz",
+ "integrity": "sha1-/wZ7TjC6SnLyJfEvEjFz53uYfzc=",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.24.7",
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-validator-option": "^7.24.7",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-class-properties": "^7.12.13",
"@babel/plugin-syntax-class-static-block": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-import-assertions": "^7.24.1",
- "@babel/plugin-syntax-import-attributes": "^7.24.1",
+ "@babel/plugin-syntax-import-assertions": "^7.24.7",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
"@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",
@@ -1696,54 +1712,54 @@
"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
"@babel/plugin-syntax-top-level-await": "^7.14.5",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.24.1",
- "@babel/plugin-transform-async-generator-functions": "^7.24.3",
- "@babel/plugin-transform-async-to-generator": "^7.24.1",
- "@babel/plugin-transform-block-scoped-functions": "^7.24.1",
- "@babel/plugin-transform-block-scoping": "^7.24.1",
- "@babel/plugin-transform-class-properties": "^7.24.1",
- "@babel/plugin-transform-class-static-block": "^7.24.1",
- "@babel/plugin-transform-classes": "^7.24.1",
- "@babel/plugin-transform-computed-properties": "^7.24.1",
- "@babel/plugin-transform-destructuring": "^7.24.1",
- "@babel/plugin-transform-dotall-regex": "^7.24.1",
- "@babel/plugin-transform-duplicate-keys": "^7.24.1",
- "@babel/plugin-transform-dynamic-import": "^7.24.1",
- "@babel/plugin-transform-exponentiation-operator": "^7.24.1",
- "@babel/plugin-transform-export-namespace-from": "^7.24.1",
- "@babel/plugin-transform-for-of": "^7.24.1",
- "@babel/plugin-transform-function-name": "^7.24.1",
- "@babel/plugin-transform-json-strings": "^7.24.1",
- "@babel/plugin-transform-literals": "^7.24.1",
- "@babel/plugin-transform-logical-assignment-operators": "^7.24.1",
- "@babel/plugin-transform-member-expression-literals": "^7.24.1",
- "@babel/plugin-transform-modules-amd": "^7.24.1",
- "@babel/plugin-transform-modules-commonjs": "^7.24.1",
- "@babel/plugin-transform-modules-systemjs": "^7.24.1",
- "@babel/plugin-transform-modules-umd": "^7.24.1",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
- "@babel/plugin-transform-new-target": "^7.24.1",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1",
- "@babel/plugin-transform-numeric-separator": "^7.24.1",
- "@babel/plugin-transform-object-rest-spread": "^7.24.1",
- "@babel/plugin-transform-object-super": "^7.24.1",
- "@babel/plugin-transform-optional-catch-binding": "^7.24.1",
- "@babel/plugin-transform-optional-chaining": "^7.24.1",
- "@babel/plugin-transform-parameters": "^7.24.1",
- "@babel/plugin-transform-private-methods": "^7.24.1",
- "@babel/plugin-transform-private-property-in-object": "^7.24.1",
- "@babel/plugin-transform-property-literals": "^7.24.1",
- "@babel/plugin-transform-regenerator": "^7.24.1",
- "@babel/plugin-transform-reserved-words": "^7.24.1",
- "@babel/plugin-transform-shorthand-properties": "^7.24.1",
- "@babel/plugin-transform-spread": "^7.24.1",
- "@babel/plugin-transform-sticky-regex": "^7.24.1",
- "@babel/plugin-transform-template-literals": "^7.24.1",
- "@babel/plugin-transform-typeof-symbol": "^7.24.1",
- "@babel/plugin-transform-unicode-escapes": "^7.24.1",
- "@babel/plugin-transform-unicode-property-regex": "^7.24.1",
- "@babel/plugin-transform-unicode-regex": "^7.24.1",
- "@babel/plugin-transform-unicode-sets-regex": "^7.24.1",
+ "@babel/plugin-transform-arrow-functions": "^7.24.7",
+ "@babel/plugin-transform-async-generator-functions": "^7.24.7",
+ "@babel/plugin-transform-async-to-generator": "^7.24.7",
+ "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+ "@babel/plugin-transform-block-scoping": "^7.24.7",
+ "@babel/plugin-transform-class-properties": "^7.24.7",
+ "@babel/plugin-transform-class-static-block": "^7.24.7",
+ "@babel/plugin-transform-classes": "^7.24.7",
+ "@babel/plugin-transform-computed-properties": "^7.24.7",
+ "@babel/plugin-transform-destructuring": "^7.24.7",
+ "@babel/plugin-transform-dotall-regex": "^7.24.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+ "@babel/plugin-transform-dynamic-import": "^7.24.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+ "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+ "@babel/plugin-transform-for-of": "^7.24.7",
+ "@babel/plugin-transform-function-name": "^7.24.7",
+ "@babel/plugin-transform-json-strings": "^7.24.7",
+ "@babel/plugin-transform-literals": "^7.24.7",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+ "@babel/plugin-transform-modules-amd": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+ "@babel/plugin-transform-modules-systemjs": "^7.24.7",
+ "@babel/plugin-transform-modules-umd": "^7.24.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+ "@babel/plugin-transform-new-target": "^7.24.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+ "@babel/plugin-transform-numeric-separator": "^7.24.7",
+ "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+ "@babel/plugin-transform-object-super": "^7.24.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.7",
+ "@babel/plugin-transform-parameters": "^7.24.7",
+ "@babel/plugin-transform-private-methods": "^7.24.7",
+ "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+ "@babel/plugin-transform-property-literals": "^7.24.7",
+ "@babel/plugin-transform-regenerator": "^7.24.7",
+ "@babel/plugin-transform-reserved-words": "^7.24.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+ "@babel/plugin-transform-spread": "^7.24.7",
+ "@babel/plugin-transform-sticky-regex": "^7.24.7",
+ "@babel/plugin-transform-template-literals": "^7.24.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.24.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+ "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
"@babel/preset-modules": "0.1.6-no-external-plugins",
"babel-plugin-polyfill-corejs2": "^0.4.10",
"babel-plugin-polyfill-corejs3": "^0.10.4",
@@ -1773,16 +1789,16 @@
}
},
"node_modules/@babel/preset-typescript": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz",
- "integrity": "sha1-ib3xOjFJoXs7KiycYlR/BtuIRew=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz",
+ "integrity": "sha1-Zs2G6o+MAUhVZx1eqac3E5y7/vE=",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0",
- "@babel/helper-validator-option": "^7.23.5",
- "@babel/plugin-syntax-jsx": "^7.24.1",
- "@babel/plugin-transform-modules-commonjs": "^7.24.1",
- "@babel/plugin-transform-typescript": "^7.24.1"
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-validator-option": "^7.24.7",
+ "@babel/plugin-syntax-jsx": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+ "@babel/plugin-transform-typescript": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1798,9 +1814,9 @@
"dev": true
},
"node_modules/@babel/runtime": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/runtime/-/runtime-7.24.1.tgz",
- "integrity": "sha1-Qx+aeU0XO1NyDmmmRkq8bw4qXFc=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/runtime/-/runtime-7.24.7.tgz",
+ "integrity": "sha1-9PDVUw6NvfWbNFG5s+WUtroILhI=",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.14.0"
@@ -1810,33 +1826,33 @@
}
},
"node_modules/@babel/template": {
- "version": "7.24.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/template/-/template-7.24.0.tgz",
- "integrity": "sha1-xqUkqpOkoF1mqvMWVCWPrmnYfVA=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/template/-/template-7.24.7.tgz",
+ "integrity": "sha1-Au/O4xfQYJ0sBxF8tw74+xercxU=",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/parser": "^7.24.0",
- "@babel/types": "^7.24.0"
+ "@babel/code-frame": "^7.24.7",
+ "@babel/parser": "^7.24.7",
+ "@babel/types": "^7.24.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.24.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/traverse/-/traverse-7.24.1.tgz",
- "integrity": "sha1-1lw2rJ3RcoIXXR5KPEnVt5iPUww=",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.24.1",
- "@babel/generator": "^7.24.1",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.24.1",
- "@babel/types": "^7.24.0",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/traverse/-/traverse-7.24.7.tgz",
+ "integrity": "sha1-3iuQAWP6dBchujghY/5GqTbEDPU=",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.24.7",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-hoist-variables": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "@babel/parser": "^7.24.7",
+ "@babel/types": "^7.24.7",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -1845,9 +1861,9 @@
}
},
"node_modules/@babel/traverse/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -1868,13 +1884,13 @@
"dev": true
},
"node_modules/@babel/types": {
- "version": "7.24.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/types/-/types-7.24.0.tgz",
- "integrity": "sha1-O5UfQ1qS5zM+ugW3Vm/Sl5YOob8=",
+ "version": "7.24.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/types/-/types-7.24.7.tgz",
+ "integrity": "sha1-YCf+ErwapyTNMqsRP7fxmI8fZvI=",
"dev": true,
"dependencies": {
- "@babel/helper-string-parser": "^7.23.4",
- "@babel/helper-validator-identifier": "^7.22.20",
+ "@babel/helper-string-parser": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -1967,9 +1983,9 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.10.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
- "integrity": "sha1-VI9t5VaFfIu3O77nDDXcgqLnTWM=",
+ "version": "4.10.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@eslint-community/regexpp/-/regexpp-4.10.1.tgz",
+ "integrity": "sha1-NhRh5cs4Rdh05hcxwRz+3WZNg6A=",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -2005,9 +2021,9 @@
"dev": true
},
"node_modules/@eslint/eslintrc/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -2096,9 +2112,9 @@
}
},
"node_modules/@humanwhocodes/config-array/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -2132,9 +2148,9 @@
}
},
"node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
- "integrity": "sha1-2frgCi1ctA+Sz+ZLR610n7w4+Rc=",
+ "version": "2.0.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha1-Siho111taWPkI7z5C3/RvjQ0CdM=",
"dev": true
},
"node_modules/@isaacs/cliui": {
@@ -2477,9 +2493,9 @@
}
},
"node_modules/@jest/core/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/@jest/core/node_modules/supports-color": {
@@ -2703,26 +2719,11 @@
"node": ">=10"
}
},
- "node_modules/@jest/reporters/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/@jest/reporters/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -2742,12 +2743,6 @@
"node": ">=8"
}
},
- "node_modules/@jest/reporters/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/@jest/schemas": {
"version": "29.6.3",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/schemas/-/schemas-29.6.3.tgz",
@@ -3101,9 +3096,9 @@
}
},
"node_modules/@npmcli/fs": {
- "version": "3.1.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@npmcli/fs/-/fs-3.1.0.tgz",
- "integrity": "sha1-Iz1DolqR1ow6hjug2mo/AJJKFz4=",
+ "version": "3.1.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@npmcli/fs/-/fs-3.1.1.tgz",
+ "integrity": "sha1-Wc2qWtypXRNfwA8rtT9XcVdc5yY=",
"dev": true,
"dependencies": {
"semver": "^7.3.5"
@@ -3112,26 +3107,11 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/@npmcli/fs/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/@npmcli/fs/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -3139,12 +3119,6 @@
"node": ">=10"
}
},
- "node_modules/@npmcli/fs/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/@npmcli/git": {
"version": "4.1.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@npmcli/git/-/git-4.1.0.tgz",
@@ -3174,13 +3148,10 @@
}
},
"node_modules/@npmcli/git/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -3188,18 +3159,6 @@
"node": ">=10"
}
},
- "node_modules/@npmcli/git/node_modules/semver/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/@npmcli/git/node_modules/which": {
"version": "3.0.1",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/which/-/which-3.0.1.tgz",
@@ -3215,23 +3174,17 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/@npmcli/git/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/@npmcli/installed-package-contents": {
- "version": "2.0.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz",
- "integrity": "sha1-v9gX7M2ejfIAkZ5z9X+ePZ5PnjM=",
+ "version": "2.1.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz",
+ "integrity": "sha1-YwSOX25AlHo6iNy8tP2bdv3TfBc=",
"dev": true,
"dependencies": {
"npm-bundled": "^3.0.0",
"npm-normalize-package-bin": "^3.0.0"
},
"bin": {
- "installed-package-contents": "lib/index.js"
+ "installed-package-contents": "bin/index.js"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -3363,9 +3316,9 @@
}
},
"node_modules/@puppeteer/browsers": {
- "version": "2.2.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@puppeteer/browsers/-/browsers-2.2.0.tgz",
- "integrity": "sha1-JbXG0ck+uR5whuvJW3Z/57PuXsQ=",
+ "version": "2.2.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@puppeteer/browsers/-/browsers-2.2.3.tgz",
+ "integrity": "sha1-rWt5EpxQgl533auggmgPTa0LZ04=",
"dev": true,
"dependencies": {
"debug": "4.3.4",
@@ -3473,9 +3426,9 @@
}
},
"node_modules/@rollup/plugin-commonjs": {
- "version": "25.0.7",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz",
- "integrity": "sha1-FFzsdYmtlSFxrralhbvqvQ/TtM8=",
+ "version": "25.0.8",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz",
+ "integrity": "sha1-x35girESpma38qa+piXHMiT33TQ=",
"dev": true,
"dependencies": {
"@rollup/pluginutils": "^5.0.1",
@@ -3523,9 +3476,9 @@
}
},
"node_modules/@rollup/plugin-replace": {
- "version": "5.0.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz",
- "integrity": "sha1-M9VlPc5tA8sk75i+9/bSW1f6798=",
+ "version": "5.0.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz",
+ "integrity": "sha1-FQye6duAMdnkWAphoO3qrtPTdoc=",
"dev": true,
"dependencies": {
"@rollup/pluginutils": "^5.0.1",
@@ -3614,9 +3567,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz",
- "integrity": "sha1-uYeGwTBLT/jbOocxgLd4ZJtd/ys=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
+ "integrity": "sha1-u9DmFrIHjNLWivyYJNH62y8v/Sc=",
"cpu": [
"arm"
],
@@ -3627,9 +3580,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz",
- "integrity": "sha1-iDNnmvERcrG/GrfLO62E30yvDJ4=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz",
+ "integrity": "sha1-lyVe9jhMX3P0gAwN6R9fZRjiEgM=",
"cpu": [
"arm64"
],
@@ -3640,9 +3593,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz",
- "integrity": "sha1-7wLXPgqV1Abg60/WGlPV0Xd1ZZs=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz",
+ "integrity": "sha1-tt104RdRDf6UVBZGBnsFRbQv8JY=",
"cpu": [
"arm64"
],
@@ -3653,9 +3606,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz",
- "integrity": "sha1-POW5vPkrM0GlwcWKPmvM4OqedFU=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz",
+ "integrity": "sha1-4H123hzsmHZz5/PUjMuOEG1CwFw=",
"cpu": [
"x64"
],
@@ -3666,9 +3619,22 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz",
- "integrity": "sha1-PT0sAYvdjgN8a/7dUqz/8cl+S+Q=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz",
+ "integrity": "sha1-nxptIYtWDJ11GFr0uLtC+fJHNrg=",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz",
+ "integrity": "sha1-U2GLkub/tkLHtiDm5ShEZREzBUk=",
"cpu": [
"arm"
],
@@ -3679,9 +3645,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz",
- "integrity": "sha1-X8jMl4/zluqhNte/4FtbkTgGQUM=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz",
+ "integrity": "sha1-mae6XnGdTwU3YaaY97Uikc77pXc=",
"cpu": [
"arm64"
],
@@ -3692,9 +3658,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz",
- "integrity": "sha1-8q59e+1Bb/om1rlIrFdytSBwDu8=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz",
+ "integrity": "sha1-9T25mkXZvADOlNuKNe+nw8FEpYw=",
"cpu": [
"arm64"
],
@@ -3704,10 +3670,23 @@
"linux"
]
},
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz",
+ "integrity": "sha1-y7CDdAj+CBzjQ1zzcw4JD+uvyb8=",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz",
- "integrity": "sha1-MD1XoyjumlDIU4WTbzHPYjBtMLY=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz",
+ "integrity": "sha1-jtCcHRJiraTDjXkaKK4P6ii4DMk=",
"cpu": [
"riscv64"
],
@@ -3717,10 +3696,23 @@
"linux"
]
},
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz",
+ "integrity": "sha1-k4E408jgyW8CIlKihEHc+xev1+w=",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz",
- "integrity": "sha1-9nL2UI8JD8c/CLpA/3bCC1dCR3g=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz",
+ "integrity": "sha1-GnSBE3pUdAvuHe1K5XUkUPFV2UI=",
"cpu": [
"x64"
],
@@ -3731,9 +3723,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz",
- "integrity": "sha1-0vNLGxV/Pn8TklvKMogZKmZ1Wok=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz",
+ "integrity": "sha1-8Rhq/GAaxPT8JfrEyhXsvuOhh00=",
"cpu": [
"x64"
],
@@ -3744,9 +3736,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz",
- "integrity": "sha1-j/7MmArk2YmesvnErkcajVjS2ms=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz",
+ "integrity": "sha1-7WYD6TY2qWIDxpFb5BFyRcG9La8=",
"cpu": [
"arm64"
],
@@ -3757,9 +3749,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz",
- "integrity": "sha1-p1BYhPQVZi4Ig2W5IYsrA6iPxvI=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz",
+ "integrity": "sha1-FOC0BLHCXr5hV6Fe25xGlZunTFQ=",
"cpu": [
"ia32"
],
@@ -3770,9 +3762,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz",
- "integrity": "sha1-ar1523/40BpYhluiCmPP0j2eKhA=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz",
+ "integrity": "sha1-XWlNNFzja27PZXNJ4D64cpfmjaQ=",
"cpu": [
"x64"
],
@@ -3853,9 +3845,9 @@
}
},
"node_modules/@sigstore/sign/node_modules/minipass-fetch": {
- "version": "3.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass-fetch/-/minipass-fetch-3.0.4.tgz",
- "integrity": "sha1-TU2bnzQFOvbG5ZemS+jmbkK/Rbc=",
+ "version": "3.0.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha1-8Pl+QFgK/8SjXMShNJ8FrjbLHkw=",
"dev": true,
"dependencies": {
"minipass": "^7.0.3",
@@ -3870,9 +3862,9 @@
}
},
"node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha1-284DdA9QpHhrqZTB+5CIRNJ7A4w=",
+ "version": "7.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
"dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -3927,9 +3919,9 @@
}
},
"node_modules/@socket.io/component-emitter": {
- "version": "3.1.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
- "integrity": "sha1-lhFvKpEuDAKBc0WzwQdRBpkg1VM=",
+ "version": "3.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha1-gh+EQvQXXY8EZ7na8m46GOLQKvI=",
"dev": true
},
"node_modules/@szmarczak/http-timer": {
@@ -3959,9 +3951,9 @@
"dev": true
},
"node_modules/@tsconfig/node10": {
- "version": "1.0.9",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@tsconfig/node10/-/node10-1.0.9.tgz",
- "integrity": "sha1-30kH/AeohpImN7FeAtTOvEwAIbI=",
+ "version": "1.0.11",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@tsconfig/node10/-/node10-1.0.11.tgz",
+ "integrity": "sha1-buRkAGhfEw4ngSjHs4t+Ax/1svI=",
"dev": true
},
"node_modules/@tsconfig/node12": {
@@ -4014,9 +4006,9 @@
}
},
"node_modules/@tufjs/models/node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha1-puAMPeRMOlQr+q5wq/wiQgptqCU=",
+ "version": "9.0.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha1-jknHMdF0nL7AUFDuUUUUezJJalE=",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -4070,9 +4062,9 @@
}
},
"node_modules/@types/babel__traverse": {
- "version": "7.20.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/babel__traverse/-/babel__traverse-7.20.5.tgz",
- "integrity": "sha1-e3UCvgqoDMTvIpeIRrmD7ar81N0=",
+ "version": "7.20.6",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha1-jcnwrg8gLAjY1Nq2SJEsjWA44/c=",
"dev": true,
"dependencies": {
"@babel/types": "^7.20.7"
@@ -4111,9 +4103,9 @@
"dev": true
},
"node_modules/@types/eslint": {
- "version": "8.56.6",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/eslint/-/eslint-8.56.6.tgz",
- "integrity": "sha1-1dwWysAl0xPuEBEIulcU6hDrPtA=",
+ "version": "8.56.10",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/eslint/-/eslint-8.56.10.tgz",
+ "integrity": "sha1-6yNwpzvwSpAe66jyJZXH7g9+tY0=",
"dev": true,
"dependencies": {
"@types/estree": "*",
@@ -4226,9 +4218,9 @@
}
},
"node_modules/@types/node": {
- "version": "20.11.30",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/node/-/node-20.11.30.tgz",
- "integrity": "sha1-nDNGf8IxZ6NH5zg094j0ufOZ1m8=",
+ "version": "20.14.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/node/-/node-20.14.2.tgz",
+ "integrity": "sha1-pfTSvLS2qHv/yqcXcYxaDyCPShg=",
"dependencies": {
"undici-types": "~5.26.4"
}
@@ -4364,9 +4356,9 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -4380,18 +4372,6 @@
}
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ms/-/ms-2.1.2.tgz",
@@ -4399,13 +4379,10 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -4413,12 +4390,6 @@
"node": ">=10"
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/@typescript-eslint/parser": {
"version": "5.62.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/parser/-/parser-5.62.0.tgz",
@@ -4447,9 +4418,9 @@
}
},
"node_modules/@typescript-eslint/parser/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -4514,9 +4485,9 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -4577,9 +4548,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -4593,18 +4564,6 @@
}
}
},
- "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/@typescript-eslint/typescript-estree/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ms/-/ms-2.1.2.tgz",
@@ -4612,13 +4571,10 @@
"dev": true
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -4626,12 +4582,6 @@
"node": ">=10"
}
},
- "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/@typescript-eslint/utils": {
"version": "5.62.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/utils/-/utils-5.62.0.tgz",
@@ -4658,26 +4608,11 @@
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/@typescript-eslint/utils/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/@typescript-eslint/utils/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -4685,12 +4620,6 @@
"node": ">=10"
}
},
- "node_modules/@typescript-eslint/utils/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/@typescript-eslint/visitor-keys": {
"version": "5.62.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
@@ -5158,9 +5087,9 @@
}
},
"node_modules/agent-base/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -5239,15 +5168,15 @@
}
},
"node_modules/ajv-formats/node_modules/ajv": {
- "version": "8.12.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha1-0aBScyPiL1NWLFZ8AJkVd9++GdE=",
+ "version": "8.16.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ajv/-/ajv-8.16.0.tgz",
+ "integrity": "sha1-IuKpK5TwBffg+cnTllLvC49vDLQ=",
"dev": true,
"dependencies": {
- "fast-deep-equal": "^3.1.1",
+ "fast-deep-equal": "^3.1.3",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
+ "uri-js": "^4.4.1"
},
"funding": {
"type": "github",
@@ -5481,9 +5410,9 @@
}
},
"node_modules/ast-types/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/async": {
@@ -5654,13 +5583,13 @@
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.10",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz",
- "integrity": "sha1-J29BcQsDpk9kZ0M8q3LLwmU8OLE=",
+ "version": "0.4.11",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
+ "integrity": "sha1-MDIN/j/+GjNsFa/c2v1v1hWyXjM=",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.6.1",
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
"semver": "^6.3.1"
},
"peerDependencies": {
@@ -5681,12 +5610,12 @@
}
},
"node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.6.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz",
- "integrity": "sha1-TwjvTGLHp/ZqNe1MDXXjBQasxr4=",
+ "version": "0.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
+ "integrity": "sha1-rdxH4kDt0doQWOvaAwIfOCu6eF4=",
"dev": true,
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.1"
+ "@babel/helper-define-polyfill-provider": "^0.6.2"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -5738,42 +5667,51 @@
"dev": true
},
"node_modules/bare-events": {
- "version": "2.2.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-events/-/bare-events-2.2.2.tgz",
- "integrity": "sha1-qYpBhB+Ysu/n7MXFRogURpsBgHg=",
+ "version": "2.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-events/-/bare-events-2.3.1.tgz",
+ "integrity": "sha1-WvLuC+lXj4Hjwaqbw6aivPIjB84=",
"dev": true,
"optional": true
},
"node_modules/bare-fs": {
- "version": "2.2.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-fs/-/bare-fs-2.2.2.tgz",
- "integrity": "sha1-KGv1TMbxX2E77muybwxhx5+xTwY=",
+ "version": "2.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-fs/-/bare-fs-2.3.1.tgz",
+ "integrity": "sha1-zb1j2selUt+yuH0YyCIpjR79IT0=",
"dev": true,
"optional": true,
"dependencies": {
"bare-events": "^2.0.0",
- "bare-os": "^2.0.0",
"bare-path": "^2.0.0",
- "streamx": "^2.13.0"
+ "bare-stream": "^2.0.0"
}
},
"node_modules/bare-os": {
- "version": "2.2.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-os/-/bare-os-2.2.1.tgz",
- "integrity": "sha1-yUoljHpAjKZ2Y5nkRnUTbAlkkT0=",
+ "version": "2.3.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-os/-/bare-os-2.3.0.tgz",
+ "integrity": "sha1-cY5oCxOe//8GJKdCHAmOeiwtY9o=",
"dev": true,
"optional": true
},
"node_modules/bare-path": {
- "version": "2.1.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-path/-/bare-path-2.1.0.tgz",
- "integrity": "sha1-gw8X/TmEKBPKd9IR67q+I4qIy0w=",
+ "version": "2.1.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-path/-/bare-path-2.1.3.tgz",
+ "integrity": "sha1-WUEEyCnvZg5DtVieyNrvffbO2z4=",
"dev": true,
"optional": true,
"dependencies": {
"bare-os": "^2.1.0"
}
},
+ "node_modules/bare-stream": {
+ "version": "2.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-stream/-/bare-stream-2.1.2.tgz",
+ "integrity": "sha1-RqG+wKEJRmCK3jacFwF5cGuejhw=",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "streamx": "^2.18.0"
+ }
+ },
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/base64-js/-/base64-js-1.5.1.tgz",
@@ -6014,12 +5952,12 @@
}
},
"node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/braces/-/braces-3.0.2.tgz",
- "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=",
+ "version": "3.0.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha1-SQMy9AkZRSJy1VqEgK3AxEE1h4k=",
"dev": true,
"dependencies": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
@@ -6038,9 +5976,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.23.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/browserslist/-/browserslist-4.23.0.tgz",
- "integrity": "sha1-jzrMK75zr3ITOZQwiQ+GxjpWdKs=",
+ "version": "4.23.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/browserslist/-/browserslist-4.23.1.tgz",
+ "integrity": "sha1-zkrwU0s9N9tcGkypi5CA+YUEHpY=",
"dev": true,
"funding": [
{
@@ -6057,10 +5995,10 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001587",
- "electron-to-chromium": "^1.4.668",
+ "caniuse-lite": "^1.0.30001629",
+ "electron-to-chromium": "^1.4.796",
"node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
+ "update-browserslist-db": "^1.0.16"
},
"bin": {
"browserslist": "cli.js"
@@ -6161,55 +6099,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/builtins": {
- "version": "5.0.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/builtins/-/builtins-5.0.1.tgz",
- "integrity": "sha1-h/bbmrBFi+coVk+oHYdtjXRVL6k=",
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha1-iwvuuYYFrfGxKPpDhkA8AJ4CIaU=",
"dev": true,
- "dependencies": {
- "semver": "^7.0.0"
- }
- },
- "node_modules/builtins/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/builtins/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/builtins/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha1-iwvuuYYFrfGxKPpDhkA8AJ4CIaU=",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
+ "engines": {
+ "node": ">= 0.8"
}
},
"node_modules/cacache": {
@@ -6245,22 +6141,22 @@
}
},
"node_modules/cacache/node_modules/glob": {
- "version": "10.3.10",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob/-/glob-10.3.10.tgz",
- "integrity": "sha1-A1HruAn9GH/kIauWr4PTpwcV30s=",
+ "version": "10.4.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob/-/glob-10.4.1.tgz",
+ "integrity": "sha1-DPsBq2prQ4F3v+aljiV29u/pCcI=",
"dev": true,
"dependencies": {
"foreground-child": "^3.1.0",
- "jackspeak": "^2.3.5",
- "minimatch": "^9.0.1",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
- "path-scurry": "^1.10.1"
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "path-scurry": "^1.11.1"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=16 || 14 >=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -6276,9 +6172,9 @@
}
},
"node_modules/cacache/node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha1-puAMPeRMOlQr+q5wq/wiQgptqCU=",
+ "version": "9.0.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha1-jknHMdF0nL7AUFDuUUUUezJJalE=",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -6291,9 +6187,9 @@
}
},
"node_modules/cacache/node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha1-284DdA9QpHhrqZTB+5CIRNJ7A4w=",
+ "version": "7.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
"dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -6377,9 +6273,9 @@
}
},
"node_modules/camel-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/camelcase": {
@@ -6392,9 +6288,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001600",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz",
- "integrity": "sha1-k6PuF6Napqnwxu8bKrSVB9GrkHk=",
+ "version": "1.0.30001632",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz",
+ "integrity": "sha1-lkIHt8ulhRcBr7TIr68USNs4hLY=",
"dev": true,
"funding": [
{
@@ -6423,9 +6319,9 @@
}
},
"node_modules/capital-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/chalk": {
@@ -6463,9 +6359,9 @@
}
},
"node_modules/change-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/char-regex": {
@@ -6584,18 +6480,18 @@
}
},
"node_modules/chrome-trace-event": {
- "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",
- "integrity": "sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw=",
+ "version": "1.0.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha1-Bb/9f/koRlCTMUcIyTvfqb0fD1s=",
"dev": true,
"engines": {
"node": ">=6.0"
}
},
"node_modules/chromium-bidi": {
- "version": "0.5.13",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/chromium-bidi/-/chromium-bidi-0.5.13.tgz",
- "integrity": "sha1-4WUS13sWHy+S2pGkjqLsQYVmhUk=",
+ "version": "0.5.19",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/chromium-bidi/-/chromium-bidi-0.5.19.tgz",
+ "integrity": "sha1-5PSVG32bINZo1rOHg597e/LWnvQ=",
"dev": true,
"dependencies": {
"mitt": "3.0.1",
@@ -6622,9 +6518,9 @@
}
},
"node_modules/cjs-module-lexer": {
- "version": "1.2.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
- "integrity": "sha1-bDcKsZ+KM5TjGP5oJobsCsaE0Qc=",
+ "version": "1.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz",
+ "integrity": "sha1-xIU0Guj9mZyk7lry16HJrgHgCZw=",
"dev": true
},
"node_modules/clean-stack": {
@@ -6796,9 +6692,9 @@
}
},
"node_modules/compressing": {
- "version": "1.10.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/compressing/-/compressing-1.10.0.tgz",
- "integrity": "sha1-vKD3NHNrW7BcOhdv741g1/XzIto=",
+ "version": "1.10.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/compressing/-/compressing-1.10.1.tgz",
+ "integrity": "sha1-RvHK5tihhF6EqVUjm0GbrJHFZqM=",
"dev": true,
"dependencies": {
"@eggjs/yauzl": "^2.11.0",
@@ -6951,9 +6847,9 @@
}
},
"node_modules/constant-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/content-type": {
@@ -6981,9 +6877,9 @@
}
},
"node_modules/core-js": {
- "version": "3.36.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/core-js/-/core-js-3.36.1.tgz",
- "integrity": "sha1-yXpxYOvQCy3hnmL0u9NAarcg5Xg=",
+ "version": "3.37.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/core-js/-/core-js-3.37.1.tgz",
+ "integrity": "sha1-0hdR3bdWUYrFoA5NZkmd+YGmLbk=",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@@ -6991,9 +6887,9 @@
}
},
"node_modules/core-js-compat": {
- "version": "3.36.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/core-js-compat/-/core-js-compat-3.36.1.tgz",
- "integrity": "sha1-GBhpXXLJnCXWIdypTmiD4ZDOo8g=",
+ "version": "3.37.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/core-js-compat/-/core-js-compat-3.37.1.tgz",
+ "integrity": "sha1-yEQxDHhS9L30m40zlzC5fhf/Ce4=",
"dev": true,
"dependencies": {
"browserslist": "^4.23.0"
@@ -7330,9 +7226,9 @@
}
},
"node_modules/dedent": {
- "version": "1.5.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/dedent/-/dedent-1.5.1.tgz",
- "integrity": "sha1-Tz/JTItxHpuygA0YXNatIPKpCv8=",
+ "version": "1.5.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha1-ma7hnrm65VpnMncXtuhI0L93flo=",
"dev": true,
"peerDependencies": {
"babel-plugin-macros": "^3.1.0"
@@ -7541,9 +7437,9 @@
}
},
"node_modules/devtools-protocol": {
- "version": "0.0.1262051",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/devtools-protocol/-/devtools-protocol-0.0.1262051.tgz",
- "integrity": "sha1-ZwsfhFmyoTbgW9mo1U7AIS1UOjg=",
+ "version": "0.0.1286932",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/devtools-protocol/-/devtools-protocol-0.0.1286932.tgz",
+ "integrity": "sha1-IwNwcDRCb+CzkBJxPUtzOffbyBU=",
"dev": true
},
"node_modules/di": {
@@ -7629,9 +7525,9 @@
}
},
"node_modules/dot-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/dotnet-runtime": {
@@ -7673,9 +7569,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
- "version": "1.4.715",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz",
- "integrity": "sha1-uxa88qNTeWL8z6dGtcmMX3QE/0Y=",
+ "version": "1.4.798",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/electron-to-chromium/-/electron-to-chromium-1.4.798.tgz",
+ "integrity": "sha1-aj/Ksu3B5m44g0Zva0uJRDI8AWQ=",
"dev": true
},
"node_modules/emittery": {
@@ -7774,9 +7670,9 @@
}
},
"node_modules/engine.io/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -7859,9 +7755,9 @@
}
},
"node_modules/envinfo": {
- "version": "7.11.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/envinfo/-/envinfo-7.11.1.tgz",
- "integrity": "sha1-L/73dZEFcIGwEpqP2M9hGNoblOE=",
+ "version": "7.13.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/envinfo/-/envinfo-7.13.0.tgz",
+ "integrity": "sha1-gfu4Hl2jXXToFJQa6rfDJaYG+zE=",
"dev": true,
"bin": {
"envinfo": "dist/cli.js"
@@ -7919,9 +7815,9 @@
}
},
"node_modules/es-module-lexer": {
- "version": "1.4.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/es-module-lexer/-/es-module-lexer-1.4.2.tgz",
- "integrity": "sha1-uhpiJV/5tBAjqvm9CMAWpfGj/vM=",
+ "version": "1.5.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/es-module-lexer/-/es-module-lexer-1.5.3.tgz",
+ "integrity": "sha1-JZaUGd6cCx++VCeXiQI+ipp4hBI=",
"dev": true
},
"node_modules/es6-error": {
@@ -8077,9 +7973,9 @@
}
},
"node_modules/eslint-plugin-jsdoc/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -8105,18 +8001,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-plugin-jsdoc/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/eslint-plugin-jsdoc/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ms/-/ms-2.1.2.tgz",
@@ -8124,13 +8008,10 @@
"dev": true
},
"node_modules/eslint-plugin-jsdoc/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -8138,12 +8019,6 @@
"node": ">=10"
}
},
- "node_modules/eslint-plugin-jsdoc/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/eslint-plugin-prefer-arrow": {
"version": "1.2.3",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz",
@@ -8234,9 +8109,9 @@
"dev": true
},
"node_modules/eslint/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -8607,9 +8482,9 @@
}
},
"node_modules/extract-zip/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -8793,9 +8668,9 @@
}
},
"node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=",
+ "version": "7.1.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha1-RCZdPKwH4+p9wkdRY4BkN1SgUpI=",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
@@ -9004,9 +8879,9 @@
}
},
"node_modules/fp-ts": {
- "version": "2.16.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fp-ts/-/fp-ts-2.16.4.tgz",
- "integrity": "sha1-qraWNu5KTphJ23YuVJ9lxMuQ+IY=",
+ "version": "2.16.6",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fp-ts/-/fp-ts-2.16.6.tgz",
+ "integrity": "sha1-nWPFsqBjVdYnrpTDelz/2lxFXSQ=",
"dev": true
},
"node_modules/fs-constants": {
@@ -9040,9 +8915,9 @@
}
},
"node_modules/fs-minipass/node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha1-284DdA9QpHhrqZTB+5CIRNJ7A4w=",
+ "version": "7.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
"dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -9191,9 +9066,9 @@
}
},
"node_modules/get-uri/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -9303,26 +9178,11 @@
"node": ">=10.0"
}
},
- "node_modules/global-agent/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/global-agent/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -9330,12 +9190,6 @@
"node": ">=10"
}
},
- "node_modules/global-agent/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/globals/-/globals-11.12.0.tgz",
@@ -9346,12 +9200,13 @@
}
},
"node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha1-WFKIKlK4DcMBsGYCc+HtCC8LbM8=",
+ "version": "1.0.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha1-dDDtOpddl7+1m8zkH1yruvplEjY=",
"dev": true,
"dependencies": {
- "define-properties": "^1.1.3"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -9538,9 +9393,9 @@
}
},
"node_modules/header-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/hosted-git-info": {
@@ -9641,9 +9496,9 @@
}
},
"node_modules/http-proxy-agent/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -9689,9 +9544,9 @@
}
},
"node_modules/https-proxy-agent/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -9770,9 +9625,9 @@
}
},
"node_modules/ignore-walk": {
- "version": "6.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ignore-walk/-/ignore-walk-6.0.4.tgz",
- "integrity": "sha1-iZUL6UtPUiIl62OhPFa622ORkOk=",
+ "version": "6.0.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ignore-walk/-/ignore-walk-6.0.5.tgz",
+ "integrity": "sha1-741h6rfaFpB4cj0fgoM7NuIAsN0=",
"dev": true,
"dependencies": {
"minimatch": "^9.0.0"
@@ -9791,9 +9646,9 @@
}
},
"node_modules/ignore-walk/node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha1-puAMPeRMOlQr+q5wq/wiQgptqCU=",
+ "version": "9.0.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha1-jknHMdF0nL7AUFDuUUUUezJJalE=",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -10330,9 +10185,9 @@
}
},
"node_modules/istanbul-lib-source-maps/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -10366,9 +10221,9 @@
}
},
"node_modules/jackspeak": {
- "version": "2.3.6",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jackspeak/-/jackspeak-2.3.6.tgz",
- "integrity": "sha1-ZH7MRyI4ruSwasDkYazCGoxQXKg=",
+ "version": "3.4.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jackspeak/-/jackspeak-3.4.0.tgz",
+ "integrity": "sha1-p1dj/zatd47eahVtjuixJN5EW0o=",
"dev": true,
"dependencies": {
"@isaacs/cliui": "^8.0.2"
@@ -10578,9 +10433,9 @@
}
},
"node_modules/jest-circus/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/jest-circus/node_modules/supports-color": {
@@ -10880,9 +10735,9 @@
}
},
"node_modules/jest-config/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/jest-config/node_modules/supports-color": {
@@ -11104,9 +10959,9 @@
}
},
"node_modules/jest-each/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/jest-each/node_modules/supports-color": {
@@ -11323,9 +11178,9 @@
}
},
"node_modules/jest-jasmine2/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/jest-jasmine2/node_modules/supports-color": {
@@ -11395,9 +11250,9 @@
}
},
"node_modules/jest-leak-detector/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/jest-matcher-utils": {
@@ -11524,9 +11379,9 @@
}
},
"node_modules/jest-matcher-utils/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/jest-matcher-utils/node_modules/supports-color": {
@@ -11646,9 +11501,9 @@
}
},
"node_modules/jest-message-util/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/jest-message-util/node_modules/supports-color": {
@@ -12144,18 +11999,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-snapshot/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/jest-snapshot/node_modules/pretty-format": {
"version": "29.7.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/pretty-format/-/pretty-format-29.7.0.tgz",
@@ -12183,19 +12026,16 @@
}
},
"node_modules/jest-snapshot/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/jest-snapshot/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -12215,12 +12055,6 @@
"node": ">=8"
}
},
- "node_modules/jest-snapshot/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/jest-util": {
"version": "29.7.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-util/-/jest-util-29.7.0.tgz",
@@ -12422,9 +12256,9 @@
}
},
"node_modules/jest-validate/node_modules/react-is": {
- "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",
- "integrity": "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs=",
+ "version": "18.3.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=",
"dev": true
},
"node_modules/jest-validate/node_modules/supports-color": {
@@ -12647,9 +12481,9 @@
}
},
"node_modules/jsdom/node_modules/ws": {
- "version": "8.16.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ws/-/ws-8.16.0.tgz",
- "integrity": "sha1-0c13Tzb7wHFlBmpg5AMj6rZEb9Q=",
+ "version": "8.17.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ws/-/ws-8.17.0.tgz",
+ "integrity": "sha1-0UXRjsou0lqveRoYOQP3vl4pX+o=",
"dev": true,
"engines": {
"node": ">=10.0.0"
@@ -13339,9 +13173,9 @@
}
},
"node_modules/log4js/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -13390,9 +13224,9 @@
}
},
"node_modules/lower-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/lowercase-keys": {
@@ -13413,15 +13247,12 @@
}
},
"node_modules/magic-string": {
- "version": "0.30.8",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/magic-string/-/magic-string-0.30.8.tgz",
- "integrity": "sha1-FOhiQkbSvtunDVRiqpmsloGERhM=",
+ "version": "0.30.10",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/magic-string/-/magic-string-0.30.10.tgz",
+ "integrity": "sha1-Ej2cQaDLVkDIkrBB1M+zvQqks54=",
"dev": true,
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15"
- },
- "engines": {
- "node": ">=12"
}
},
"node_modules/make-dir": {
@@ -13439,26 +13270,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/make-dir/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/make-dir/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -13466,12 +13282,6 @@
"node": ">=10"
}
},
- "node_modules/make-dir/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/make-error": {
"version": "1.3.6",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/make-error/-/make-error-1.3.6.tgz",
@@ -13616,13 +13426,10 @@
}
},
"node_modules/make-fetch-happen/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -13630,18 +13437,6 @@
"node": ">=10"
}
},
- "node_modules/make-fetch-happen/node_modules/semver/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/make-fetch-happen/node_modules/ssri": {
"version": "9.0.1",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ssri/-/ssri-9.0.1.tgz",
@@ -13791,12 +13586,12 @@
}
},
"node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha1-vImZp8u/d83InxMvbkZwUbSQkMY=",
+ "version": "4.0.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/micromatch/-/micromatch-4.0.7.tgz",
+ "integrity": "sha1-M+gZDZ/kdKmJVSX1YY7uE21GwuU=",
"dev": true,
"dependencies": {
- "braces": "^3.0.2",
+ "braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
@@ -14194,9 +13989,9 @@
}
},
"node_modules/no-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/node-fetch": {
@@ -14282,18 +14077,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/node-gyp/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/node-gyp/node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/rimraf/-/rimraf-3.0.2.tgz",
@@ -14310,13 +14093,10 @@
}
},
"node_modules/node-gyp/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -14324,12 +14104,6 @@
"node": ">=10"
}
},
- "node_modules/node-gyp/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/node-int64": {
"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",
@@ -14372,26 +14146,11 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/normalize-package-data/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/normalize-package-data/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -14399,12 +14158,6 @@
"node": ">=10"
}
},
- "node_modules/normalize-package-data/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/normalize-path": {
"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",
@@ -14426,9 +14179,9 @@
}
},
"node_modules/npm-bundled": {
- "version": "3.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/npm-bundled/-/npm-bundled-3.0.0.tgz",
- "integrity": "sha1-fo4vi7JreUJlAoSRvmAyGiWjnbc=",
+ "version": "3.0.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/npm-bundled/-/npm-bundled-3.0.1.tgz",
+ "integrity": "sha1-zKc+FVYCN2liVLEBcNj4ba1i2iU=",
"dev": true,
"dependencies": {
"npm-normalize-package-bin": "^3.0.0"
@@ -14449,26 +14202,11 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/npm-install-checks/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/npm-install-checks/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -14476,12 +14214,6 @@
"node": ">=10"
}
},
- "node_modules/npm-install-checks/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/npm-normalize-package-bin": {
"version": "3.0.1",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
@@ -14506,26 +14238,11 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/npm-package-arg/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/npm-package-arg/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -14533,12 +14250,6 @@
"node": ">=10"
}
},
- "node_modules/npm-package-arg/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/npm-packlist": {
"version": "7.0.4",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/npm-packlist/-/npm-packlist-7.0.4.tgz",
@@ -14566,26 +14277,11 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/npm-pick-manifest/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/npm-pick-manifest/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -14593,12 +14289,6 @@
"node": ">=10"
}
},
- "node_modules/npm-pick-manifest/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/npm-registry-fetch": {
"version": "14.0.5",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz",
@@ -14653,9 +14343,9 @@
}
},
"node_modules/npm-registry-fetch/node_modules/minipass-fetch": {
- "version": "3.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass-fetch/-/minipass-fetch-3.0.4.tgz",
- "integrity": "sha1-TU2bnzQFOvbG5ZemS+jmbkK/Rbc=",
+ "version": "3.0.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha1-8Pl+QFgK/8SjXMShNJ8FrjbLHkw=",
"dev": true,
"dependencies": {
"minipass": "^7.0.3",
@@ -14670,9 +14360,9 @@
}
},
"node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha1-284DdA9QpHhrqZTB+5CIRNJ7A4w=",
+ "version": "7.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
"dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -14706,9 +14396,9 @@
}
},
"node_modules/nwsapi": {
- "version": "2.2.7",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/nwsapi/-/nwsapi-2.2.7.tgz",
- "integrity": "sha1-c44HB9MSjLdQ3dz+kORhBILfDzA=",
+ "version": "2.2.10",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/nwsapi/-/nwsapi-2.2.10.tgz",
+ "integrity": "sha1-C3emjiGgtIPbcLEfrQVZBuhnzag=",
"dev": true
},
"node_modules/object-assign": {
@@ -14805,17 +14495,17 @@
}
},
"node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha1-AHOX1E7Rhy/cbtMTYBkPgYFOLGQ=",
+ "version": "0.9.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha1-fqHBpdkddk+yghOciP4R4YKjpzQ=",
"dev": true,
"dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
@@ -14915,9 +14605,9 @@
}
},
"node_modules/pac-proxy-agent/node_modules/agent-base": {
- "version": "7.1.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha1-U2gCt2vAs0qlAZXrJEInbWE+NDQ=",
+ "version": "7.1.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha1-vb3tffsJa3UaKgh+7rlmRyWy4xc=",
"dev": true,
"dependencies": {
"debug": "^4.3.4"
@@ -14927,9 +14617,9 @@
}
},
"node_modules/pac-proxy-agent/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -14976,12 +14666,12 @@
"dev": true
},
"node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": {
- "version": "8.0.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
- "integrity": "sha1-WsvXvnuvGMRqPyk6hAEJpDCmQK0=",
+ "version": "8.0.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz",
+ "integrity": "sha1-ay2j13Nk/eYpLoELSWy3BEC5uJ0=",
"dev": true,
"dependencies": {
- "agent-base": "^7.0.2",
+ "agent-base": "^7.1.1",
"debug": "^4.3.4",
"socks": "^2.7.1"
},
@@ -15045,9 +14735,9 @@
}
},
"node_modules/param-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/parent-module": {
@@ -15112,9 +14802,9 @@
}
},
"node_modules/pascal-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/path-case": {
@@ -15128,9 +14818,9 @@
}
},
"node_modules/path-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/path-exists": {
@@ -15166,25 +14856,25 @@
"dev": true
},
"node_modules/path-scurry": {
- "version": "1.10.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/path-scurry/-/path-scurry-1.10.1.tgz",
- "integrity": "sha1-m6a/WqhQD+n9Z99PDZSDsrC/xpg=",
+ "version": "1.11.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI=",
"dev": true,
"dependencies": {
- "lru-cache": "^9.1.1 || ^10.0.0",
+ "lru-cache": "^10.2.0",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=16 || 14 >=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.2.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-10.2.0.tgz",
- "integrity": "sha1-C9RFylc2NGWQD00fm9jbNDpNlcM=",
+ "version": "10.2.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-10.2.2.tgz",
+ "integrity": "sha1-SCBrwRTBJSlAxBsltBr1tUWsqHg=",
"dev": true,
"engines": {
"node": "14 || >=16.14"
@@ -15205,9 +14895,9 @@
"integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
},
"node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw=",
+ "version": "1.0.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha1-qK1Xm1cZUvDl0liS3lRFvP4lqqE=",
"dev": true
},
"node_modules/picomatch": {
@@ -15458,9 +15148,9 @@
}
},
"node_modules/proxy-agent/node_modules/agent-base": {
- "version": "7.1.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha1-U2gCt2vAs0qlAZXrJEInbWE+NDQ=",
+ "version": "7.1.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha1-vb3tffsJa3UaKgh+7rlmRyWy4xc=",
"dev": true,
"dependencies": {
"debug": "^4.3.4"
@@ -15470,9 +15160,9 @@
}
},
"node_modules/proxy-agent/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -15528,12 +15218,12 @@
"dev": true
},
"node_modules/proxy-agent/node_modules/socks-proxy-agent": {
- "version": "8.0.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
- "integrity": "sha1-WsvXvnuvGMRqPyk6hAEJpDCmQK0=",
+ "version": "8.0.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz",
+ "integrity": "sha1-ay2j13Nk/eYpLoELSWy3BEC5uJ0=",
"dev": true,
"dependencies": {
- "agent-base": "^7.0.2",
+ "agent-base": "^7.1.1",
"debug": "^4.3.4",
"socks": "^2.7.1"
},
@@ -15576,16 +15266,16 @@
}
},
"node_modules/puppeteer": {
- "version": "22.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/puppeteer/-/puppeteer-22.6.0.tgz",
- "integrity": "sha1-HpFuG2vP/QDKBXZuf7qww8ihzNI=",
+ "version": "22.10.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/puppeteer/-/puppeteer-22.10.0.tgz",
+ "integrity": "sha1-ELf4++W9SZM/HzZV8YVzCGKQ/vw=",
"dev": true,
"hasInstallScript": true,
"dependencies": {
- "@puppeteer/browsers": "2.2.0",
+ "@puppeteer/browsers": "2.2.3",
"cosmiconfig": "9.0.0",
- "devtools-protocol": "0.0.1262051",
- "puppeteer-core": "22.6.0"
+ "devtools-protocol": "0.0.1286932",
+ "puppeteer-core": "22.10.0"
},
"bin": {
"puppeteer": "lib/esm/puppeteer/node/cli.js"
@@ -15633,9 +15323,9 @@
"dev": true
},
"node_modules/puppeteer-core/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -15766,25 +15456,25 @@
"dev": true
},
"node_modules/puppeteer/node_modules/puppeteer-core": {
- "version": "22.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/puppeteer-core/-/puppeteer-core-22.6.0.tgz",
- "integrity": "sha1-VEz57lyzJZ+edPc2TBPBMqBLtI8=",
+ "version": "22.10.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/puppeteer-core/-/puppeteer-core-22.10.0.tgz",
+ "integrity": "sha1-7vVzX5DtKeOxCBXRQrNDfgWTkoM=",
"dev": true,
"dependencies": {
- "@puppeteer/browsers": "2.2.0",
- "chromium-bidi": "0.5.13",
+ "@puppeteer/browsers": "2.2.3",
+ "chromium-bidi": "0.5.19",
"debug": "4.3.4",
- "devtools-protocol": "0.0.1262051",
- "ws": "8.16.0"
+ "devtools-protocol": "0.0.1286932",
+ "ws": "8.17.0"
},
"engines": {
"node": ">=18"
}
},
"node_modules/puppeteer/node_modules/ws": {
- "version": "8.16.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ws/-/ws-8.16.0.tgz",
- "integrity": "sha1-0c13Tzb7wHFlBmpg5AMj6rZEb9Q=",
+ "version": "8.17.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ws/-/ws-8.17.0.tgz",
+ "integrity": "sha1-0UXRjsou0lqveRoYOQP3vl4pX+o=",
"dev": true,
"engines": {
"node": ">=10.0.0"
@@ -15969,9 +15659,9 @@
}
},
"node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": {
- "version": "3.0.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-3.0.1.tgz",
- "integrity": "sha1-Arsp+12pC1REWBdJwizt01l8bLA=",
+ "version": "3.0.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+ "integrity": "sha1-tD016JwPO+a1+76dxsgkZ7MMKNo=",
"dev": true,
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -15987,40 +15677,40 @@
}
},
"node_modules/read-package-json/node_modules/glob": {
- "version": "10.3.10",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob/-/glob-10.3.10.tgz",
- "integrity": "sha1-A1HruAn9GH/kIauWr4PTpwcV30s=",
+ "version": "10.4.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob/-/glob-10.4.1.tgz",
+ "integrity": "sha1-DPsBq2prQ4F3v+aljiV29u/pCcI=",
"dev": true,
"dependencies": {
"foreground-child": "^3.1.0",
- "jackspeak": "^2.3.5",
- "minimatch": "^9.0.1",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
- "path-scurry": "^1.10.1"
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "path-scurry": "^1.11.1"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=16 || 14 >=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/read-package-json/node_modules/json-parse-even-better-errors": {
- "version": "3.0.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-3.0.1.tgz",
- "integrity": "sha1-Arsp+12pC1REWBdJwizt01l8bLA=",
+ "version": "3.0.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+ "integrity": "sha1-tD016JwPO+a1+76dxsgkZ7MMKNo=",
"dev": true,
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/read-package-json/node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha1-puAMPeRMOlQr+q5wq/wiQgptqCU=",
+ "version": "9.0.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha1-jknHMdF0nL7AUFDuUUUUezJJalE=",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -16032,6 +15722,15 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/read-package-json/node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -16303,9 +16002,9 @@
"dev": true
},
"node_modules/rimraf": {
- "version": "5.0.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/rimraf/-/rimraf-5.0.5.tgz",
- "integrity": "sha1-m+ZdLW5oNEfS6QE9or9FETmmHM8=",
+ "version": "5.0.7",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/rimraf/-/rimraf-5.0.7.tgz",
+ "integrity": "sha1-J73fIC59icsuA4FlY4DRc0qFSnQ=",
"dev": true,
"dependencies": {
"glob": "^10.3.7"
@@ -16314,7 +16013,7 @@
"rimraf": "dist/esm/bin.mjs"
},
"engines": {
- "node": ">=14"
+ "node": ">=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -16330,31 +16029,31 @@
}
},
"node_modules/rimraf/node_modules/glob": {
- "version": "10.3.10",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob/-/glob-10.3.10.tgz",
- "integrity": "sha1-A1HruAn9GH/kIauWr4PTpwcV30s=",
+ "version": "10.4.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob/-/glob-10.4.1.tgz",
+ "integrity": "sha1-DPsBq2prQ4F3v+aljiV29u/pCcI=",
"dev": true,
"dependencies": {
"foreground-child": "^3.1.0",
- "jackspeak": "^2.3.5",
- "minimatch": "^9.0.1",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
- "path-scurry": "^1.10.1"
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "path-scurry": "^1.11.1"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=16 || 14 >=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/rimraf/node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha1-puAMPeRMOlQr+q5wq/wiQgptqCU=",
+ "version": "9.0.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha1-jknHMdF0nL7AUFDuUUUUezJJalE=",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -16366,6 +16065,15 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/rimraf/node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/roarr": {
"version": "2.15.4",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/roarr/-/roarr-2.15.4.tgz",
@@ -16390,9 +16098,9 @@
"dev": true
},
"node_modules/rollup": {
- "version": "4.13.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/rollup/-/rollup-4.13.0.tgz",
- "integrity": "sha1-3SrhRLTNwuolQgR39o1JN6chI3o=",
+ "version": "4.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/rollup/-/rollup-4.18.0.tgz",
+ "integrity": "sha1-SX9g8MUwjkYCz0ETYzn7+H1fXdo=",
"dev": true,
"dependencies": {
"@types/estree": "1.0.5"
@@ -16405,19 +16113,22 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.13.0",
- "@rollup/rollup-android-arm64": "4.13.0",
- "@rollup/rollup-darwin-arm64": "4.13.0",
- "@rollup/rollup-darwin-x64": "4.13.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.13.0",
- "@rollup/rollup-linux-arm64-gnu": "4.13.0",
- "@rollup/rollup-linux-arm64-musl": "4.13.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.13.0",
- "@rollup/rollup-linux-x64-gnu": "4.13.0",
- "@rollup/rollup-linux-x64-musl": "4.13.0",
- "@rollup/rollup-win32-arm64-msvc": "4.13.0",
- "@rollup/rollup-win32-ia32-msvc": "4.13.0",
- "@rollup/rollup-win32-x64-msvc": "4.13.0",
+ "@rollup/rollup-android-arm-eabi": "4.18.0",
+ "@rollup/rollup-android-arm64": "4.18.0",
+ "@rollup/rollup-darwin-arm64": "4.18.0",
+ "@rollup/rollup-darwin-x64": "4.18.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.18.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.18.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.18.0",
+ "@rollup/rollup-linux-arm64-musl": "4.18.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.18.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.18.0",
+ "@rollup/rollup-linux-x64-gnu": "4.18.0",
+ "@rollup/rollup-linux-x64-musl": "4.18.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.18.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.18.0",
+ "@rollup/rollup-win32-x64-msvc": "4.18.0",
"fsevents": "~2.3.2"
}
},
@@ -16583,15 +16294,15 @@
}
},
"node_modules/schema-utils/node_modules/ajv": {
- "version": "8.12.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha1-0aBScyPiL1NWLFZ8AJkVd9++GdE=",
+ "version": "8.16.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ajv/-/ajv-8.16.0.tgz",
+ "integrity": "sha1-IuKpK5TwBffg+cnTllLvC49vDLQ=",
"dev": true,
"dependencies": {
- "fast-deep-equal": "^3.1.1",
+ "fast-deep-equal": "^3.1.3",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
+ "uri-js": "^4.4.1"
},
"funding": {
"type": "github",
@@ -16653,9 +16364,9 @@
}
},
"node_modules/selenium-standalone/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dependencies": {
"ms": "2.1.2"
},
@@ -16700,9 +16411,9 @@
}
},
"node_modules/sentence-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/serialize-error": {
@@ -16885,9 +16596,9 @@
}
},
"node_modules/sigstore/node_modules/minipass-fetch": {
- "version": "3.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass-fetch/-/minipass-fetch-3.0.4.tgz",
- "integrity": "sha1-TU2bnzQFOvbG5ZemS+jmbkK/Rbc=",
+ "version": "3.0.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha1-8Pl+QFgK/8SjXMShNJ8FrjbLHkw=",
"dev": true,
"dependencies": {
"minipass": "^7.0.3",
@@ -16902,9 +16613,9 @@
}
},
"node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha1-284DdA9QpHhrqZTB+5CIRNJ7A4w=",
+ "version": "7.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
"dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -16936,9 +16647,9 @@
}
},
"node_modules/smob": {
- "version": "1.4.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/smob/-/smob-1.4.1.tgz",
- "integrity": "sha1-ZicOffanUnZkgWxbV3oj8Xum9bU=",
+ "version": "1.5.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/smob/-/smob-1.5.0.tgz",
+ "integrity": "sha1-hdeaFAOr8SjSTT68HNxeGpVI06s=",
"dev": true
},
"node_modules/snake-case": {
@@ -16952,9 +16663,9 @@
}
},
"node_modules/snake-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/socket.io": {
@@ -16986,9 +16697,9 @@
}
},
"node_modules/socket.io-adapter/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -17043,9 +16754,9 @@
}
},
"node_modules/socket.io-parser/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -17066,9 +16777,9 @@
"dev": true
},
"node_modules/socket.io/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -17089,9 +16800,9 @@
"dev": true
},
"node_modules/socks": {
- "version": "2.8.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/socks/-/socks-2.8.1.tgz",
- "integrity": "sha1-IsfZ3XiCZJBDy6Dq+0muFE40V68=",
+ "version": "2.8.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/socks/-/socks-2.8.3.tgz",
+ "integrity": "sha1-Hr0PCcUrqVoJdQr+Pz+fckqADLU=",
"dev": true,
"dependencies": {
"ip-address": "^9.0.5",
@@ -17117,9 +16828,9 @@
}
},
"node_modules/socks-proxy-agent/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -17185,9 +16896,9 @@
}
},
"node_modules/spdx-license-ids": {
- "version": "3.0.17",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz",
- "integrity": "sha1-iH2oqnMhjlGh2RdQLXmGMWGpP5w=",
+ "version": "3.0.18",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
+ "integrity": "sha1-IqqSLc8vKIWmSUomHy2LdTRdAyY=",
"dev": true
},
"node_modules/split-on-first": {
@@ -17206,9 +16917,9 @@
"dev": true
},
"node_modules/ssri": {
- "version": "10.0.5",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ssri/-/ssri-10.0.5.tgz",
- "integrity": "sha1-5J781uNjhRlstRXToq1sPwJl74w=",
+ "version": "10.0.6",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha1-qKreLeYLorzoaI4/o0m60Fx9weU=",
"dev": true,
"dependencies": {
"minipass": "^7.0.3"
@@ -17218,9 +16929,9 @@
}
},
"node_modules/ssri/node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha1-284DdA9QpHhrqZTB+5CIRNJ7A4w=",
+ "version": "7.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
"dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -17280,9 +16991,9 @@
}
},
"node_modules/streamroller/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -17335,13 +17046,14 @@
}
},
"node_modules/streamx": {
- "version": "2.16.1",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/streamx/-/streamx-2.16.1.tgz",
- "integrity": "sha1-KzEb00gy8Iqmu01qgCl8nK74lhQ=",
+ "version": "2.18.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/streamx/-/streamx-2.18.0.tgz",
+ "integrity": "sha1-W8GlHrQSpmfr/c1ObPam/GVyGsc=",
"dev": true,
"dependencies": {
- "fast-fifo": "^1.1.0",
- "queue-tick": "^1.0.1"
+ "fast-fifo": "^1.3.2",
+ "queue-tick": "^1.0.1",
+ "text-decoder": "^1.1.0"
},
"optionalDependencies": {
"bare-events": "^2.2.0"
@@ -17588,9 +17300,9 @@
"dev": true
},
"node_modules/terser": {
- "version": "5.29.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/terser/-/terser-5.29.2.tgz",
- "integrity": "sha1-wX1XPOHaGzDyGod7/9VlXdhv2zU=",
+ "version": "5.31.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/terser/-/terser-5.31.1.tgz",
+ "integrity": "sha1-c13jyYfdZx6VGQ5rmM/i8H888NQ=",
"dev": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@@ -17739,6 +17451,15 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/text-decoder": {
+ "version": "1.1.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/text-decoder/-/text-decoder-1.1.0.tgz",
+ "integrity": "sha1-M3nnKPz004k+wa6jXowsrCFe8ZA=",
+ "dev": true,
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
+ },
"node_modules/text-table": {
"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",
@@ -17803,9 +17524,9 @@
}
},
"node_modules/tough-cookie": {
- "version": "4.1.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tough-cookie/-/tough-cookie-4.1.3.tgz",
- "integrity": "sha1-l7mtsHKLQigKo9gUtrmZsv8DGL8=",
+ "version": "4.1.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha1-lF8UYbRbWox2ghwz6knDrBksGzY=",
"dependencies": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
@@ -17849,9 +17570,9 @@
}
},
"node_modules/ts-jest": {
- "version": "29.1.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ts-jest/-/ts-jest-29.1.2.tgz",
- "integrity": "sha1-dhPYyBxDyMsxLGkEAnJX6BTEDgk=",
+ "version": "29.1.4",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ts-jest/-/ts-jest-29.1.4.tgz",
+ "integrity": "sha1-JvilXOMeTS73of1H3H+hJ+knk+8=",
"dev": true,
"dependencies": {
"bs-logger": "0.x",
@@ -17867,10 +17588,11 @@
"ts-jest": "cli.js"
},
"engines": {
- "node": "^16.10.0 || ^18.0.0 || >=20.0.0"
+ "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0"
},
"peerDependencies": {
"@babel/core": ">=7.0.0-beta.0 <8",
+ "@jest/transform": "^29.0.0",
"@jest/types": "^29.0.0",
"babel-jest": "^29.0.0",
"jest": "^29.0.0",
@@ -17880,6 +17602,9 @@
"@babel/core": {
"optional": true
},
+ "@jest/transform": {
+ "optional": true
+ },
"@jest/types": {
"optional": true
},
@@ -17891,26 +17616,11 @@
}
}
},
- "node_modules/ts-jest/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/ts-jest/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -17918,12 +17628,6 @@
"node": ">=10"
}
},
- "node_modules/ts-jest/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/ts-loader": {
"version": "8.4.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ts-loader/-/ts-loader-8.4.0.tgz",
@@ -18002,26 +17706,11 @@
"node": ">=8"
}
},
- "node_modules/ts-loader/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/ts-loader/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -18041,12 +17730,6 @@
"node": ">=8"
}
},
- "node_modules/ts-loader/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"node_modules/ts-node": {
"version": "10.9.2",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ts-node/-/ts-node-10.9.2.tgz",
@@ -18126,9 +17809,9 @@
}
},
"node_modules/tuf-js/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -18178,9 +17861,9 @@
}
},
"node_modules/tuf-js/node_modules/minipass-fetch": {
- "version": "3.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass-fetch/-/minipass-fetch-3.0.4.tgz",
- "integrity": "sha1-TU2bnzQFOvbG5ZemS+jmbkK/Rbc=",
+ "version": "3.0.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha1-8Pl+QFgK/8SjXMShNJ8FrjbLHkw=",
"dev": true,
"dependencies": {
"minipass": "^7.0.3",
@@ -18195,9 +17878,9 @@
}
},
"node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha1-284DdA9QpHhrqZTB+5CIRNJ7A4w=",
+ "version": "7.1.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=",
"dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -18265,9 +17948,9 @@
}
},
"node_modules/typescript": {
- "version": "5.4.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/typescript/-/typescript-5.4.3.tgz",
- "integrity": "sha1-XG/t1Mh77gHNelKKMBRVIfjg/v8=",
+ "version": "5.4.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha1-QszvLFcf29D2cYsdH15uXvAG9hE=",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -18278,9 +17961,9 @@
}
},
"node_modules/ua-parser-js": {
- "version": "0.7.37",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ua-parser-js/-/ua-parser-js-0.7.37.tgz",
- "integrity": "sha1-5GTmbawtM6ehJR19epnWFX7CeDI=",
+ "version": "0.7.38",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ua-parser-js/-/ua-parser-js-0.7.38.tgz",
+ "integrity": "sha1-9JfYpNwf7G6FTlyqSy+ZE0Iu8FQ=",
"dev": true,
"funding": [
{
@@ -18397,9 +18080,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.0.13",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
- "integrity": "sha1-PF5PXAg2Yb0472S2Mowm7WyCSMQ=",
+ "version": "1.0.16",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
+ "integrity": "sha1-9tSJ7ZD7LwfWd4TrP1PXiR9zY1Y=",
"dev": true,
"funding": [
{
@@ -18416,8 +18099,8 @@
}
],
"dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
+ "escalade": "^3.1.2",
+ "picocolors": "^1.0.1"
},
"bin": {
"update-browserslist-db": "cli.js"
@@ -18445,15 +18128,15 @@
}
},
"node_modules/upper-case-first/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/upper-case/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha1-cDrClCXns3zW/UVukkBNRtHz5K4=",
+ "version": "2.6.3",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=",
"dev": true
},
"node_modules/uri-js": {
@@ -18534,13 +18217,10 @@
}
},
"node_modules/validate-npm-package-name": {
- "version": "5.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz",
- "integrity": "sha1-8Wr9SDGOb5Ch7BATd/oDhM/IxxM=",
+ "version": "5.0.1",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
+ "integrity": "sha1-oxZXPptJ88zZDbtutSs/BsbWBOg=",
"dev": true,
- "dependencies": {
- "builtins": "^5.0.0"
- },
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
@@ -18826,9 +18506,9 @@
}
},
"node_modules/webpack/node_modules/enhanced-resolve": {
- "version": "5.16.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz",
- "integrity": "sha1-ZeyId4CDBWyzJIf6qa74LtCGR4c=",
+ "version": "5.17.0",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
+ "integrity": "sha1-0DdgN4ndlVW4mq7H63iEXEkIm8U=",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -18952,6 +18632,15 @@
"integrity": "sha1-WrENAkhxmJVINrY0n3T/+WHhD2c=",
"dev": true
},
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha1-0sRcbdT7zmIaZvE2y+Mor9BBCzQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -19332,7 +19021,7 @@
},
"src/JSInterop/Microsoft.JSInterop.JS/src": {
"name": "@microsoft/dotnet-js-interop",
- "version": "9.0.0-ci",
+ "version": "8.0.0-dev",
"license": "MIT",
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^6.15.0",
@@ -19567,9 +19256,9 @@
}
},
"src/JSInterop/Microsoft.JSInterop.JS/src/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz",
- "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=",
+ "version": "4.3.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha1-6DRE7Ouf7dSh2lbWca4kRqAabh4=",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -19618,18 +19307,6 @@
"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
- "src/JSInterop/Microsoft.JSInterop.JS/src/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"src/JSInterop/Microsoft.JSInterop.JS/src/node_modules/minimatch": {
"version": "9.0.3",
"resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-9.0.3.tgz",
@@ -19652,13 +19329,10 @@
"dev": true
},
"src/JSInterop/Microsoft.JSInterop.JS/src/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.0.tgz",
- "integrity": "sha1-Gkak20v/zM2Xt0O1AFyDJfI9Ti0=",
+ "version": "7.6.2",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha1-Hjs0dZ+Jbo8U1hNHMs55iusMbhM=",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -19676,12 +19350,6 @@
"spdx-license-ids": "^3.0.0"
}
},
- "src/JSInterop/Microsoft.JSInterop.JS/src/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
- "dev": true
- },
"src/ProjectTemplates/test/Templates.Tests": {
"name": "microsoft.aspnetcore.projecttemplates.tests",
"version": "0.0.1",
@@ -19765,9 +19433,9 @@
"dev": true
},
"src/SignalR/clients/ts/FunctionalTests/node_modules/typescript": {
- "version": "5.4.3",
- "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/typescript/-/typescript-5.4.3.tgz",
- "integrity": "sha1-XG/t1Mh77gHNelKKMBRVIfjg/v8=",
+ "version": "5.4.5",
+ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha1-QszvLFcf29D2cYsdH15uXvAG9hE=",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -19833,7 +19501,7 @@
},
"src/SignalR/clients/ts/signalr": {
"name": "@microsoft/signalr",
- "version": "9.0.0-ci",
+ "version": "5.0.0-dev",
"license": "MIT",
"dependencies": {
"abort-controller": "^3.0.0",
@@ -19845,7 +19513,7 @@
},
"src/SignalR/clients/ts/signalr-protocol-msgpack": {
"name": "@microsoft/signalr-protocol-msgpack",
- "version": "9.0.0-ci",
+ "version": "5.0.0-dev",
"license": "MIT",
"dependencies": {
"@microsoft/signalr": "*",
diff --git a/src/submodules/Node-Externals b/src/submodules/Node-Externals
index fb911deddbaf..f1c5c177aa6e 160000
--- a/src/submodules/Node-Externals
+++ b/src/submodules/Node-Externals
@@ -1 +1 @@
-Subproject commit fb911deddbaf7367146718374a403d393571f18a
+Subproject commit f1c5c177aa6e5d8c5784a93c7ca8002e46388acd
From fd73ff293d275b17dfe6afb125cb7ec5f4b859b0 Mon Sep 17 00:00:00 2001
From: Javier Calvarro Nelson
Date: Tue, 11 Jun 2024 21:48:14 +0200
Subject: [PATCH 037/257] [Infrastructure] Update the dependency management
script to automatically install vsts-npm-auth and provision a PAT (#56187)
* Automatically provision a token when running the script
* Install vsts-auth if not present
---
eng/scripts/update-npm-dependencies.ps1 | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/eng/scripts/update-npm-dependencies.ps1 b/eng/scripts/update-npm-dependencies.ps1
index 5a05b286bea5..c3aac4b4c0ec 100644
--- a/eng/scripts/update-npm-dependencies.ps1
+++ b/eng/scripts/update-npm-dependencies.ps1
@@ -17,6 +17,24 @@ if (-not $WhatIf) {
Remove-Item .\package-lock.json
}
+try {
+ Get-Command vsts-npm-auth -CommandType ExternalScript
+ Write-Host "vsts-npm-auth is already installed"
+}
+catch {
+ Write-Host "Installing vsts-npm-auth"
+ if (-not $WhatIf) {
+ npm install -g vsts-npm-auth
+ }
+}
+
+Write-Host "Provisioning a token for the NPM registry. You might be prompted to authenticate."
+if (-not $WhatIf) {
+ # This command provisions a PAT token for the VSTS NPM registry that lasts for 15 minutes, which is more than enough time to run npm install
+ # and ensure any missing package is mirrored.
+ vsts-npm-auth -E 15 -F -C .\.npmrc
+}
+
Write-Host "Running npm install"
if (-not $WhatIf) {
npm install --prefer-online --include optional
From ebd012900cb29dca7d9f252b97bba55181ca9b0a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Ros?=
Date: Tue, 11 Jun 2024 22:10:04 -0700
Subject: [PATCH 038/257] Fix bullet points in components README (#56192)
---
src/Components/README.md | 75 +++++++++++++++++++++-------------------
1 file changed, 40 insertions(+), 35 deletions(-)
diff --git a/src/Components/README.md b/src/Components/README.md
index cf2fccfb7893..e923f203ce74 100644
--- a/src/Components/README.md
+++ b/src/Components/README.md
@@ -37,49 +37,52 @@ The following contains a description of each sub-directory in the `Components` d
1. Ensure the repository is clean from any asset that could remain from previous version of the repository. This is recommended when switching branches, or after updating the working branch.
-```powershell
-git clean -xdff
-```
+ ```powershell
+ git clean -xdff
+ ```
-You may need to kill some processes holding on files that are being deleted, like closing Visual Studio and other `msbuild` or `dotnet` processes. There may also be lingering headless `chrome` processes, but they are not included in this command. The following command may help you but be aware that this could also stop other important tasks:
+ You may need to kill some processes holding on files that are being deleted, like closing Visual Studio and other `msbuild` or `dotnet` processes. There may also be lingering headless
+ `chrome` processes, but they are not included in this command. The following command may help you but be aware that this could also stop other important tasks:
-```powershell
-Get-Process dotnet, escape-node-job, msbuild, VBCSCompiler, node, vstest.console, Microsoft.CodeAnalysis.LanguageServer -ErrorAction Continue | Stop-Process;
-```
+ ```powershell
+ Get-Process dotnet, escape-node-job, msbuild, VBCSCompiler, node, vstest.console, Microsoft.CodeAnalysis.LanguageServer -ErrorAction Continue | Stop-Process;
+ ```
1. Use NPM to restore the required JavaScript modules. This doesn't require an Internet connection since the sources are read from a sub-module.
-```powershell
-npm ci --offline
-```
+ ```powershell
+ npm ci --offline
+ ```
1. You'll need to run the `restore` script locally to install the required dotnet dependencies and setup the repo. The `restore` script is located in the root of the repo.
+
+ ```bash
+ # Linux or Mac
+ ./restore.sh
+ ```
-```bash
-./restore.sh
-```
-
-```powershell
-./restore.cmd
-```
+ ```powershell
+ # Windows
+ ./restore.cmd
+ ```
1. Now you can build all the JavaScript assets required by the repository (including SignalR for instance) by running the following command:
-```powershell
-npm run build
-```
+ ```powershell
+ npm run build
+ ```
1. Build the Components:
-```powershell
-./src/Components/build.cmd
-```
+ ```powershell
+ ./src/Components/build.cmd
+ ```
2. Optionally, open the Components in Visual Studio:
-```powershell
-./src/Components/startvs.cmd
-```
+ ```powershell
+ ./src/Components/startvs.cmd
+ ```
### Test
@@ -103,19 +106,21 @@ follow the previous build steps and then these commands:
1. Activate the locally installed .NET by running the following command.
-```bash
-source activate.sh
-```
+ ```bash
+ # Linux or Mac
+ source activate.sh
+ ```
-```powershell
-. ./activate.ps1
-```
+ ```powershell
+ # Windows
+ . ./activate.ps1
+ ```
1. Start the tests.
-```powershell
-dotnet test ./src/Components/test/E2ETest
-```
+ ```powershell
+ dotnet test ./src/Components/test/E2ETest
+ ```
Note, you may wish to filter tests using the `--filter` command (ie. `dotnet test --filter ./src/Components/test/E2ETest`).
From 1bbf3116889240f5d2668bd42b7284e2999e2ee1 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Wed, 12 Jun 2024 10:19:32 +0000
Subject: [PATCH 039/257] [main] Update dependencies from dotnet/efcore,
dotnet/runtime (#55852)
[main] Update dependencies from dotnet/efcore, dotnet/runtime
- remove content-length when combined with chunked encoding
- Bump Azure.Identity from 1.10.3 to 1.11.3
Prompted by:
```
/Users/runner/work/1/s/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj : error NU1605: Warning As Error: Detected package downgrade: Azure.Identity from 1.11.3 to 1.10.3. Reference the package directly from the project to select a different version. [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj : error NU1605: Microsoft.AspNetCore.Identity.FunctionalTests -> Identity.DefaultUI.WebSite -> Microsoft.EntityFrameworkCore.SqlServer 9.0.0-preview.6.24303.4 -> Microsoft.Data.SqlClient 5.2.1 -> Azure.Identity (>= 1.11.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj : error NU1605: Microsoft.AspNetCore.Identity.FunctionalTests -> Identity.DefaultUI.WebSite -> Azure.Identity (>= 1.10.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/samples/IdentitySample.DefaultUI/IdentitySample.DefaultUI.csproj : error NU1605: Warning As Error: Detected package downgrade: Azure.Identity from 1.11.3 to 1.10.3. Reference the package directly from the project to select a different version. [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/samples/IdentitySample.DefaultUI/IdentitySample.DefaultUI.csproj : error NU1605: IdentitySample.DefaultUI -> Microsoft.EntityFrameworkCore.SqlServer 9.0.0-preview.6.24303.4 -> Microsoft.Data.SqlClient 5.2.1 -> Azure.Identity (>= 1.11.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/samples/IdentitySample.DefaultUI/IdentitySample.DefaultUI.csproj : error NU1605: IdentitySample.DefaultUI -> Azure.Identity (>= 1.10.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/testassets/Identity.DefaultUI.WebSite/Identity.DefaultUI.WebSite.csproj : error NU1605: Warning As Error: Detected package downgrade: Azure.Identity from 1.11.3 to 1.10.3. Reference the package directly from the project to select a different version. [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/testassets/Identity.DefaultUI.WebSite/Identity.DefaultUI.WebSite.csproj : error NU1605: Identity.DefaultUI.WebSite -> Microsoft.EntityFrameworkCore.SqlServer 9.0.0-preview.6.24303.4 -> Microsoft.Data.SqlClient 5.2.1 -> Azure.Identity (>= 1.11.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/testassets/Identity.DefaultUI.WebSite/Identity.DefaultUI.WebSite.csproj : error NU1605: Identity.DefaultUI.WebSite -> Azure.Identity (>= 1.10.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/samples/IdentitySample.Mvc/IdentitySample.Mvc.csproj : error NU1605: Warning As Error: Detected package downgrade: Azure.Identity from 1.11.3 to 1.10.3. Reference the package directly from the project to select a different version. [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/samples/IdentitySample.Mvc/IdentitySample.Mvc.csproj : error NU1605: IdentitySample.Mvc -> Microsoft.EntityFrameworkCore.SqlServer 9.0.0-preview.6.24303.4 -> Microsoft.Data.SqlClient 5.2.1 -> Azure.Identity (>= 1.11.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Identity/samples/IdentitySample.Mvc/IdentitySample.Mvc.csproj : error NU1605: IdentitySample.Mvc -> Azure.Identity (>= 1.10.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/DataProtection/samples/EntityFrameworkCoreSample/EntityFrameworkCoreSample.csproj : error NU1605: Warning As Error: Detected package downgrade: Azure.Identity from 1.11.3 to 1.10.3. Reference the package directly from the project to select a different version. [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/DataProtection/samples/EntityFrameworkCoreSample/EntityFrameworkCoreSample.csproj : error NU1605: EntityFrameworkCoreSample -> Microsoft.EntityFrameworkCore.SqlServer 9.0.0-preview.6.24303.4 -> Microsoft.Data.SqlClient 5.2.1 -> Azure.Identity (>= 1.11.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/DataProtection/samples/EntityFrameworkCoreSample/EntityFrameworkCoreSample.csproj : error NU1605: EntityFrameworkCoreSample -> Azure.Identity (>= 1.10.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Security/test/AuthSamples.FunctionalTests/AuthSamples.FunctionalTests.csproj : error NU1605: Warning As Error: Detected package downgrade: Azure.Identity from 1.11.3 to 1.10.3. Reference the package directly from the project to select a different version. [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Security/test/AuthSamples.FunctionalTests/AuthSamples.FunctionalTests.csproj : error NU1605: AuthSamples.FunctionalTests -> Identity.ExternalClaims -> Microsoft.EntityFrameworkCore.SqlServer 9.0.0-preview.6.24303.4 -> Microsoft.Data.SqlClient 5.2.1 -> Azure.Identity (>= 1.11.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Security/test/AuthSamples.FunctionalTests/AuthSamples.FunctionalTests.csproj : error NU1605: AuthSamples.FunctionalTests -> Identity.ExternalClaims -> Azure.Identity (>= 1.10.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Security/samples/Identity.ExternalClaims/Identity.ExternalClaims.csproj : error NU1605: Warning As Error: Detected package downgrade: Azure.Identity from 1.11.3 to 1.10.3. Reference the package directly from the project to select a different version. [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Security/samples/Identity.ExternalClaims/Identity.ExternalClaims.csproj : error NU1605: Identity.ExternalClaims -> Microsoft.EntityFrameworkCore.SqlServer 9.0.0-preview.6.24303.4 -> Microsoft.Data.SqlClient 5.2.1 -> Azure.Identity (>= 1.11.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
/Users/runner/work/1/s/src/Security/samples/Identity.ExternalClaims/Identity.ExternalClaims.csproj : error NU1605: Identity.ExternalClaims -> Azure.Identity (>= 1.10.3) [/Users/runner/work/1/s/.dotnet/sdk/9.0.100-preview.6.24277.1/NuGet.targets]
```
- Use ElementType property instead of private reflection
- Update SDK to 9.0.100-preview.6.24311.5
- Merge branch 'main' into darc-main-3556fbfd-cfa9-4f80-8b85-6de2ce7ba361
- Update SDK to a later version
---
eng/Version.Details.xml | 316 +++++++++---------
eng/Versions.props | 160 ++++-----
global.json | 4 +-
src/Hosting/TestHost/src/ClientHandler.cs | 6 +
.../JsonSchemaMapper.ReflectionHelpers.cs | 3 +-
5 files changed, 248 insertions(+), 241 deletions(-)
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 5c3edfc67fb5..d8b75f263acd 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -9,321 +9,321 @@
-->
-
+
https://github.com/dotnet/efcore
- e969995b2701f228815259941467104b6ee8dbee
+ 80e9dce280f69dd9e65c9018509eb562e6efb059
-
+
https://github.com/dotnet/efcore
- e969995b2701f228815259941467104b6ee8dbee
+ 80e9dce280f69dd9e65c9018509eb562e6efb059
-
+
https://github.com/dotnet/efcore
- e969995b2701f228815259941467104b6ee8dbee
+ 80e9dce280f69dd9e65c9018509eb562e6efb059
-
+
https://github.com/dotnet/efcore
- e969995b2701f228815259941467104b6ee8dbee
+ 80e9dce280f69dd9e65c9018509eb562e6efb059
-
+
https://github.com/dotnet/efcore
- e969995b2701f228815259941467104b6ee8dbee
+ 80e9dce280f69dd9e65c9018509eb562e6efb059
-
+
https://github.com/dotnet/efcore
- e969995b2701f228815259941467104b6ee8dbee
+ 80e9dce280f69dd9e65c9018509eb562e6efb059
-
+
https://github.com/dotnet/efcore
- e969995b2701f228815259941467104b6ee8dbee
+ 80e9dce280f69dd9e65c9018509eb562e6efb059
-
+
https://github.com/dotnet/efcore
- e969995b2701f228815259941467104b6ee8dbee
+ 80e9dce280f69dd9e65c9018509eb562e6efb059
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
https://github.com/dotnet/xdt
@@ -363,9 +363,9 @@
afa1eb6821f62183651ab017b2f5c3fbeb934904
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
@@ -376,9 +376,9 @@
-
+
https://github.com/dotnet/runtime
- 745230568e52639e229dcc24c98fe0dbb4c1641d
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
https://github.com/dotnet/winforms
diff --git a/eng/Versions.props b/eng/Versions.props
index e7c7cb717fc1..3c452cf9b06e 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -63,91 +63,91 @@
-->
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
- 9.0.0-preview.5.24272.1
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
9.0.0-preview.5.24308.1
9.0.0-preview.5.24308.1
- 9.0.0-preview.5.24271.1
- 9.0.0-preview.5.24271.1
- 9.0.0-preview.5.24271.1
- 9.0.0-preview.5.24271.1
- 9.0.0-preview.5.24271.1
- 9.0.0-preview.5.24271.1
- 9.0.0-preview.5.24271.1
- 9.0.0-preview.5.24271.1
+ 9.0.0-preview.6.24304.2
+ 9.0.0-preview.6.24304.2
+ 9.0.0-preview.6.24304.2
+ 9.0.0-preview.6.24304.2
+ 9.0.0-preview.6.24304.2
+ 9.0.0-preview.6.24304.2
+ 9.0.0-preview.6.24304.2
+ 9.0.0-preview.6.24304.2
4.11.0-1.24218.5
4.11.0-1.24218.5
@@ -288,7 +288,7 @@
$(MicrosoftAspNetCoreAzureAppServicesSiteExtension80Version)
$(MicrosoftAspNetCoreAzureAppServicesSiteExtension80Version)
- 1.10.3
+ 1.11.3
0.9.9
0.13.0
4.2.1
diff --git a/global.json b/global.json
index f69c8b161db9..9537239e827d 100644
--- a/global.json
+++ b/global.json
@@ -1,9 +1,9 @@
{
"sdk": {
- "version": "9.0.100-preview.6.24302.3"
+ "version": "9.0.100-preview.6.24311.23"
},
"tools": {
- "dotnet": "9.0.100-preview.6.24302.3",
+ "dotnet": "9.0.100-preview.6.24311.23",
"runtimes": {
"dotnet/x86": [
"$(MicrosoftNETCoreBrowserDebugHostTransportVersion)"
diff --git a/src/Hosting/TestHost/src/ClientHandler.cs b/src/Hosting/TestHost/src/ClientHandler.cs
index b6a4b5f5ec9d..90966b5d7f23 100644
--- a/src/Hosting/TestHost/src/ClientHandler.cs
+++ b/src/Hosting/TestHost/src/ClientHandler.cs
@@ -135,6 +135,12 @@ protected override async Task SendAsync(
canHaveBody = false;
}
}
+ else
+ {
+ // https://www.rfc-editor.org/rfc/rfc9112#section-6.2-2
+ // A sender MUST NOT send a Content-Length header field in any message that contains a Transfer-Encoding header field.
+ requestContent.Headers.Remove(HeaderNames.ContentLength);
+ }
foreach (var header in requestContent.Headers)
{
diff --git a/src/OpenApi/src/Schemas/JsonSchemaMapper/JsonSchemaMapper.ReflectionHelpers.cs b/src/OpenApi/src/Schemas/JsonSchemaMapper/JsonSchemaMapper.ReflectionHelpers.cs
index d2ba7cfb7788..f44ef3480b36 100644
--- a/src/OpenApi/src/Schemas/JsonSchemaMapper/JsonSchemaMapper.ReflectionHelpers.cs
+++ b/src/OpenApi/src/Schemas/JsonSchemaMapper/JsonSchemaMapper.ReflectionHelpers.cs
@@ -25,7 +25,8 @@ static partial class JsonSchemaMapper
private static Type GetElementType(JsonTypeInfo typeInfo)
{
Debug.Assert(typeInfo.Kind is JsonTypeInfoKind.Enumerable or JsonTypeInfoKind.Dictionary);
- return (Type)typeof(JsonTypeInfo).GetProperty("ElementType", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(typeInfo)!;
+ // Element type is non-null for enumerable and dictionary types
+ return typeInfo.ElementType!;
}
// The source generator currently doesn't populate attribute providers for properties
From 8efe5b099fad41fad86b7248d3f8f79a9cc0b410 Mon Sep 17 00:00:00 2001
From: William Godbe
Date: Wed, 12 Jun 2024 11:53:24 -0700
Subject: [PATCH 040/257] Exclude artifacts & .packages folders from CodeQL
scans (#56197)
---
.azure/pipelines/ci.yml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml
index 0025e83725d6..1b019b7343b6 100644
--- a/.azure/pipelines/ci.yml
+++ b/.azure/pipelines/ci.yml
@@ -114,6 +114,11 @@ variables:
- ${{ if in(variables['Build.Reason'], 'PullRequest') }}:
- name: _SignType
value: test
+# Exclude artifacts & .packages folders from CodeQL scans
+- name: LGTM_INDEX_FILTERS
+ value: |
+ exclude:.packages
+ exclude:artifacts
- template: /eng/common/templates-official/variables/pool-providers.yml@self
resources:
From f6d12dfa978b1a55c36a3fca36584e6dc20ab54f Mon Sep 17 00:00:00 2001
From: Brennan
Date: Wed, 12 Jun 2024 15:28:09 -0700
Subject: [PATCH 041/257] Update JDK (#56210)
---
global.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/global.json b/global.json
index 9537239e827d..76bd2462fd83 100644
--- a/global.json
+++ b/global.json
@@ -24,7 +24,7 @@
"xcopy-msbuild": "17.1.0"
},
"native-tools": {
- "jdk": "11.0.22"
+ "jdk": "11.0.23"
},
"msbuild-sdks": {
"Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24272.5",
From fc8f7a6394780461fb6e9b5b18008a257db9dad4 Mon Sep 17 00:00:00 2001
From: Brennan
Date: Thu, 13 Jun 2024 08:21:44 -0700
Subject: [PATCH 042/257] Use new System.Net.ServerSentEvents package in
SignalR (#56206)
---
eng/Dependencies.props | 1 +
eng/Version.Details.xml | 4 +
eng/Versions.props | 1 +
.../UnitTests/ServerSentEventsParserTests.cs | 215 ------------------
.../ServerSentEventsTransportTests.cs | 93 +++++++-
.../Internal/ServerSentEventsMessageParser.cs | 185 ---------------
.../Internal/ServerSentEventsTransport.Log.cs | 1 +
.../src/Internal/ServerSentEventsTransport.cs | 82 ++-----
....AspNetCore.Http.Connections.Client.csproj | 1 +
.../ServerSentEventsBenchmark.cs | 17 --
10 files changed, 107 insertions(+), 493 deletions(-)
delete mode 100644 src/SignalR/clients/csharp/Client/test/UnitTests/ServerSentEventsParserTests.cs
delete mode 100644 src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ServerSentEventsMessageParser.cs
diff --git a/eng/Dependencies.props b/eng/Dependencies.props
index eea85ba1bd4a..bd45447f355e 100644
--- a/eng/Dependencies.props
+++ b/eng/Dependencies.props
@@ -85,6 +85,7 @@ and are generated based on the last package release.
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index d8b75f263acd..c14039a249d4 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -218,6 +218,10 @@
https://github.com/dotnet/runtime
8fac5af2b11dc98fa0504f6fd06df790164ec958
+
+ https://github.com/dotnet/runtime
+ 8fac5af2b11dc98fa0504f6fd06df790164ec958
+
https://github.com/dotnet/runtime
8fac5af2b11dc98fa0504f6fd06df790164ec958
diff --git a/eng/Versions.props b/eng/Versions.props
index 3c452cf9b06e..4ab313e07231 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -116,6 +116,7 @@
9.0.0-preview.6.24307.2
9.0.0-preview.6.24307.2
9.0.0-preview.6.24307.2
+ 9.0.0-preview.6.24307.2
9.0.0-preview.6.24307.2
9.0.0-preview.6.24307.2
9.0.0-preview.6.24307.2
diff --git a/src/SignalR/clients/csharp/Client/test/UnitTests/ServerSentEventsParserTests.cs b/src/SignalR/clients/csharp/Client/test/UnitTests/ServerSentEventsParserTests.cs
deleted file mode 100644
index 996d6a2ad48e..000000000000
--- a/src/SignalR/clients/csharp/Client/test/UnitTests/ServerSentEventsParserTests.cs
+++ /dev/null
@@ -1,215 +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 System;
-using System.Buffers;
-using System.Collections.Generic;
-using System.IO.Pipelines;
-using System.Text;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http.Connections.Client.Internal;
-using Xunit;
-
-namespace Microsoft.AspNetCore.SignalR.Client.Tests;
-
-public class ServerSentEventsParserTests
-{
- [Theory]
- [InlineData("\r\n", "")]
- [InlineData("\r\n:\r\n", "")]
- [InlineData("\r\n:comment\r\n", "")]
- [InlineData("data: \r\r\n\n", "\r")]
- [InlineData(":comment\r\ndata: \r\r\n\r\n", "\r")]
- [InlineData("data: A\rB\r\n\r\n", "A\rB")]
- [InlineData("data: Hello, World\r\n\r\n", "Hello, World")]
- [InlineData("data: Hello, World\r\n\r\ndata: ", "Hello, World")]
- [InlineData("data: Hello, World\r\n\r\n:comment\r\ndata: ", "Hello, World")]
- [InlineData("data: Hello, World\r\n\r\n:comment", "Hello, World")]
- [InlineData("data: Hello, World\r\n\r\n:comment\r\n", "Hello, World")]
- [InlineData("data: Hello, World\r\n:comment\r\n\r\n", "Hello, World")]
- [InlineData("data: SGVsbG8sIFdvcmxk\r\n\r\n", "SGVsbG8sIFdvcmxk")]
- public void ParseSSEMessageSuccessCases(string encodedMessage, string expectedMessage)
- {
- var buffer = Encoding.UTF8.GetBytes(encodedMessage);
- var readableBuffer = new ReadOnlySequence(buffer);
- var parser = new ServerSentEventsMessageParser();
-
- var parseResult = parser.ParseMessage(readableBuffer, out var consumed, out var examined, out var message);
- Assert.Equal(ServerSentEventsMessageParser.ParseResult.Completed, parseResult);
- Assert.Equal(consumed, examined);
-
- var result = Encoding.UTF8.GetString(message);
- Assert.Equal(expectedMessage, result);
- }
-
- [Theory]
- [InlineData("data: T\r\nfoo: Hello, World\r\n\r\n", "Expected the message prefix 'data: '")]
- [InlineData("foo: T\r\ndata: Hello, World\r\n\r\n", "Expected the message prefix 'data: '")]
- [InlineData("food: T\r\ndata: Hello, World\r\n\r\n", "Expected the message prefix 'data: '")]
- [InlineData("data: T\r\ndata: Hello\n, World\r\n\r\n", "Expected the message prefix 'data: '")]
- public void ParseSSEMessageFailureCases(string encodedMessage, string expectedExceptionMessage)
- {
- var buffer = Encoding.UTF8.GetBytes(encodedMessage);
- var readableBuffer = new ReadOnlySequence(buffer);
- var parser = new ServerSentEventsMessageParser();
-
- var ex = Assert.Throws(() => { parser.ParseMessage(readableBuffer, out var consumed, out var examined, out var message); });
- Assert.Equal(expectedExceptionMessage, ex.Message);
- }
-
- [Theory]
- [InlineData("")]
- [InlineData(":")]
- [InlineData(":comment")]
- [InlineData(":comment\r\n")]
- [InlineData("data:")]
- [InlineData("data: \r")]
- [InlineData("data: T\r\nda")]
- [InlineData("data: T\r\ndata:")]
- [InlineData("data: T\r\ndata: Hello, World")]
- [InlineData("data: T\r\ndata: Hello, World\r")]
- [InlineData("data: T\r\ndata: Hello, World\n")]
- [InlineData("data: T\r\ndata: Hello, World\r\n")]
- [InlineData("data: B\r\ndata: SGVsbG8sIFd")]
- [InlineData(":\r\ndata:")]
- [InlineData("data: T\r\n:\r\n")]
- [InlineData("data: T\r\n:\r\ndata:")]
- [InlineData("data: T\r\ndata: Hello, World\r\n:comment")]
- public void ParseSSEMessageIncompleteParseResult(string encodedMessage)
- {
- var buffer = Encoding.UTF8.GetBytes(encodedMessage);
- var readableBuffer = new ReadOnlySequence(buffer);
- var parser = new ServerSentEventsMessageParser();
-
- var parseResult = parser.ParseMessage(readableBuffer, out var consumed, out var examined, out var message);
-
- Assert.Equal(ServerSentEventsMessageParser.ParseResult.Incomplete, parseResult);
- }
-
- [Theory]
- [InlineData(new[] { "d", "ata: Hello, World\r\n\r\n" }, "Hello, World")]
- [InlineData(new[] { "da", "ta: Hello, World\r\n\r\n" }, "Hello, World")]
- [InlineData(new[] { "dat", "a: Hello, World\r\n\r\n" }, "Hello, World")]
- [InlineData(new[] { "data", ": Hello, World\r\n\r\n" }, "Hello, World")]
- [InlineData(new[] { "data:", " Hello, World\r\n\r\n" }, "Hello, World")]
- [InlineData(new[] { "data: Hello, World", "\r\n\r\n" }, "Hello, World")]
- [InlineData(new[] { "data: Hello, World\r\n", "\r\n" }, "Hello, World")]
- [InlineData(new[] { "data: ", "Hello, World\r\n\r\n" }, "Hello, World")]
- [InlineData(new[] { "data: ", "Hello, World\n\n" }, "Hello, World")]
- [InlineData(new[] { "data: ", "Hello, World\r\n\n" }, "Hello, World")]
- [InlineData(new[] { ":", "comment", "\r\n", "d", "ata: Hello, World\r\n\r\n" }, "Hello, World")]
- [InlineData(new[] { ":comment", "\r\n", "data: Hello, World", "\r\n\r\n" }, "Hello, World")]
- [InlineData(new[] { "data: Hello, World\r\n", ":comment\r\n", "\r\n" }, "Hello, World")]
- public async Task ParseMessageAcrossMultipleReadsSuccess(string[] messageParts, string expectedMessage)
- {
- var parser = new ServerSentEventsMessageParser();
- var pipe = new Pipe();
-
- byte[] message = null;
- SequencePosition consumed = default, examined = default;
-
- for (var i = 0; i < messageParts.Length; i++)
- {
- var messagePart = messageParts[i];
- await pipe.Writer.WriteAsync(Encoding.UTF8.GetBytes(messagePart));
- var result = await pipe.Reader.ReadAsync();
-
- var parseResult = parser.ParseMessage(result.Buffer, out consumed, out examined, out message);
- pipe.Reader.AdvanceTo(consumed, examined);
-
- // parse result should be complete only after we parsed the last message part
- var expectedResult =
- i == messageParts.Length - 1
- ? ServerSentEventsMessageParser.ParseResult.Completed
- : ServerSentEventsMessageParser.ParseResult.Incomplete;
-
- Assert.Equal(expectedResult, parseResult);
- }
-
- Assert.Equal(consumed, examined);
-
- var resultMessage = Encoding.UTF8.GetString(message);
- Assert.Equal(expectedMessage, resultMessage);
- }
-
- [Theory]
- [InlineData("data: T\r\nf", "oo: Hello, World\r\n\r\n", "Expected the message prefix 'data: '")]
- [InlineData("foo", ": T\r\ndata: Hello, World\r\n\r\n", "Expected the message prefix 'data: '")]
- [InlineData("food:", " T\r\ndata: Hello, World\r\n\r\n", "Expected the message prefix 'data: '")]
- [InlineData("data: T\r\nda", "ta: Hello\n, World\r\n\r\n", "Expected the message prefix 'data: '")]
- public async Task ParseMessageAcrossMultipleReadsFailure(string encodedMessagePart1, string encodedMessagePart2, string expectedMessage)
- {
- var pipe = new Pipe();
-
- // Read the first part of the message
- await pipe.Writer.WriteAsync(Encoding.UTF8.GetBytes(encodedMessagePart1));
-
- var result = await pipe.Reader.ReadAsync();
- var parser = new ServerSentEventsMessageParser();
-
- var parseResult = parser.ParseMessage(result.Buffer, out var consumed, out var examined, out var buffer);
- Assert.Equal(ServerSentEventsMessageParser.ParseResult.Incomplete, parseResult);
-
- pipe.Reader.AdvanceTo(consumed, examined);
-
- // Send the rest of the data and parse the complete message
- await pipe.Writer.WriteAsync(Encoding.UTF8.GetBytes(encodedMessagePart2));
- result = await pipe.Reader.ReadAsync();
-
- var ex = Assert.Throws(() => parser.ParseMessage(result.Buffer, out consumed, out examined, out buffer));
- Assert.Equal(expectedMessage, ex.Message);
- }
-
- [Theory]
- [InlineData("data: foo\r\n\r\n", "data: bar\r\n\r\n")]
- public async Task ParseMultipleMessagesText(string message1, string message2)
- {
- var pipe = new Pipe();
-
- // Read the first part of the message
- await pipe.Writer.WriteAsync(Encoding.UTF8.GetBytes(message1 + message2));
-
- var result = await pipe.Reader.ReadAsync();
- var parser = new ServerSentEventsMessageParser();
-
- var parseResult = parser.ParseMessage(result.Buffer, out var consumed, out var examined, out var message);
- Assert.Equal(ServerSentEventsMessageParser.ParseResult.Completed, parseResult);
- Assert.Equal("foo", Encoding.UTF8.GetString(message));
- Assert.Equal(consumed, result.Buffer.GetPosition(message1.Length));
- pipe.Reader.AdvanceTo(consumed, examined);
- Assert.Equal(consumed, examined);
-
- parser.Reset();
-
- result = await pipe.Reader.ReadAsync();
- parseResult = parser.ParseMessage(result.Buffer, out consumed, out examined, out message);
- Assert.Equal(ServerSentEventsMessageParser.ParseResult.Completed, parseResult);
- Assert.Equal("bar", Encoding.UTF8.GetString(message));
- pipe.Reader.AdvanceTo(consumed, examined);
- }
-
- public static IEnumerable
diff --git a/src/SignalR/perf/Microbenchmarks/ServerSentEventsBenchmark.cs b/src/SignalR/perf/Microbenchmarks/ServerSentEventsBenchmark.cs
index 330621bd093a..86bd860c4bbb 100644
--- a/src/SignalR/perf/Microbenchmarks/ServerSentEventsBenchmark.cs
+++ b/src/SignalR/perf/Microbenchmarks/ServerSentEventsBenchmark.cs
@@ -12,8 +12,6 @@ namespace Microsoft.AspNetCore.SignalR.Microbenchmarks;
public class ServerSentEventsBenchmark
{
- private ServerSentEventsMessageParser _parser;
- private byte[] _sseFormattedData;
private ReadOnlySequence _rawData;
[Params(Message.NoArguments, Message.FewArguments, Message.ManyArguments, Message.LargeArguments)]
@@ -57,24 +55,9 @@ public void GlobalSetup()
break;
}
- _parser = new ServerSentEventsMessageParser();
_rawData = new ReadOnlySequence(protocol.GetMessageBytes(hubMessage));
var ms = new MemoryStream();
ServerSentEventsMessageFormatter.WriteMessageAsync(_rawData, ms, default).GetAwaiter().GetResult();
- _sseFormattedData = ms.ToArray();
- }
-
- [Benchmark]
- public void ReadSingleMessage()
- {
- var buffer = new ReadOnlySequence(_sseFormattedData);
-
- if (_parser.ParseMessage(buffer, out _, out _, out _) != ServerSentEventsMessageParser.ParseResult.Completed)
- {
- throw new InvalidOperationException("Parse failed!");
- }
-
- _parser.Reset();
}
[Benchmark]
From 0da8ea72b5434cbe8e1207d802f2270ca2f8ad4c Mon Sep 17 00:00:00 2001
From: William Godbe
Date: Thu, 13 Jun 2024 11:46:03 -0700
Subject: [PATCH 043/257] Update Node-Externals submodule (#56221)
---
src/submodules/Node-Externals | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/submodules/Node-Externals b/src/submodules/Node-Externals
index f1c5c177aa6e..a1b1b1bb0163 160000
--- a/src/submodules/Node-Externals
+++ b/src/submodules/Node-Externals
@@ -1 +1 @@
-Subproject commit f1c5c177aa6e5d8c5784a93c7ca8002e46388acd
+Subproject commit a1b1b1bb01630a6109adf5767d9a2770c6dc5639
From 4a3afe3b23e062ca120c08a2761b3ea7775a03f9 Mon Sep 17 00:00:00 2001
From: William Godbe
Date: Thu, 13 Jun 2024 11:50:17 -0700
Subject: [PATCH 044/257] Update global.json (#56211)
---
global.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/global.json b/global.json
index 76bd2462fd83..cc619c03c036 100644
--- a/global.json
+++ b/global.json
@@ -24,7 +24,7 @@
"xcopy-msbuild": "17.1.0"
},
"native-tools": {
- "jdk": "11.0.23"
+ "jdk": "11"
},
"msbuild-sdks": {
"Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24272.5",
From 482730a4c773ee4b3ae9525186d10999c89b556d Mon Sep 17 00:00:00 2001
From: Petter Hesselberg
Date: Fri, 14 Jun 2024 00:28:55 +0200
Subject: [PATCH 045/257] text fix: 'There' -> 'their' plus minor tweaks
(#56132)
---
src/DefaultBuilder/src/WebApplicationBuilder.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/DefaultBuilder/src/WebApplicationBuilder.cs b/src/DefaultBuilder/src/WebApplicationBuilder.cs
index c20410fe9cae..2cff4ae4ffb9 100644
--- a/src/DefaultBuilder/src/WebApplicationBuilder.cs
+++ b/src/DefaultBuilder/src/WebApplicationBuilder.cs
@@ -246,9 +246,9 @@ private static void SetDefaultContentRoot(WebApplicationOptions options, Configu
// Logic taken from https://github.com/dotnet/runtime/blob/dc5a6c8be1644915c14c4a464447b0d54e223a46/src/libraries/Microsoft.Extensions.Hosting/src/HostingHostBuilderExtensions.cs#L209-L227
// If we're running anywhere other than C:\Windows\system32, we default to using the CWD for the ContentRoot.
- // However, since many things like Windows services and MSIX installers have C:\Windows\system32 as there CWD which is not likely
- // to really be the home for things like appsettings.json, we skip changing the ContentRoot in that case. The non-"default" initial
- // value for ContentRoot is AppContext.BaseDirectory (e.g. the executable path) which probably makes more sense than the system32.
+ // However, since many things like Windows services and MSIX installers have C:\Windows\system32 as their CWD, which is not likely
+ // to be the home for things like appsettings.json, we skip changing the ContentRoot in that case. The non-"default" initial
+ // value for ContentRoot is AppContext.BaseDirectory (e.g. the executable path) which probably makes more sense than system32.
// In my testing, both Environment.CurrentDirectory and Environment.SystemDirectory return the path without
// any trailing directory separator characters. I'm not even sure the casing can ever be different from these APIs, but I think it makes sense to
@@ -472,7 +472,7 @@ private void ConfigureApplication(WebHostBuilderContext context, IApplicationBui
// Remove the route builder to clean up the properties, we're done adding routes to the pipeline
app.Properties.Remove(WebApplication.GlobalEndpointRouteBuilderKey);
- // reset route builder if it existed, this is needed for StartupFilters
+ // Reset route builder if it existed, this is needed for StartupFilters
if (priorRouteBuilder is not null)
{
app.Properties[EndpointRouteBuilderKey] = priorRouteBuilder;
From c16c78197d8d672d810dd18ca49df4be857adcb6 Mon Sep 17 00:00:00 2001
From: Safia Abdalla
Date: Thu, 13 Jun 2024 20:58:34 -0700
Subject: [PATCH 046/257] Add support for processing DefaultValueAttribute in
OpenApi schemas (#56219)
---
.../Extensions/JsonObjectSchemaExtensions.cs | 42 +++++++++++++++-
.../Services/Schemas/OpenApiSchemaService.cs | 9 +++-
...penApiComponentService.ParameterSchemas.cs | 15 ++++++
...nApiComponentService.RequestBodySchemas.cs | 48 +++++++++++++++++++
...OpenApiComponentService.ResponseSchemas.cs | 46 ++++++++++++++++++
src/OpenApi/test/SharedTypes.cs | 20 ++++++++
6 files changed, 177 insertions(+), 3 deletions(-)
diff --git a/src/OpenApi/src/Extensions/JsonObjectSchemaExtensions.cs b/src/OpenApi/src/Extensions/JsonObjectSchemaExtensions.cs
index 0fa07268e0a9..6b73c4d90df5 100644
--- a/src/OpenApi/src/Extensions/JsonObjectSchemaExtensions.cs
+++ b/src/OpenApi/src/Extensions/JsonObjectSchemaExtensions.cs
@@ -1,12 +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.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
+using System.Reflection;
+using System.Text.Json;
using System.Text.Json.Nodes;
+using System.Text.Json.Serialization.Metadata;
using JsonSchemaMapper;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
+using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Constraints;
using Microsoft.OpenApi.Models;
@@ -118,6 +123,29 @@ internal static void ApplyValidationAttributes(this JsonObject schema, IEnumerab
}
}
+ ///
+ /// Populate the default value into the current schema.
+ ///
+ /// The produced by the underlying schema generator.
+ /// An object representing the associated with the default value.
+ /// The associated with the target type.
+ internal static void ApplyDefaultValue(this JsonObject schema, object? defaultValue, JsonTypeInfo? jsonTypeInfo)
+ {
+ if (jsonTypeInfo is null)
+ {
+ return;
+ }
+
+ if (defaultValue is null)
+ {
+ schema[OpenApiSchemaKeywords.DefaultKeyword] = null;
+ }
+ else
+ {
+ schema[OpenApiSchemaKeywords.DefaultKeyword] = JsonSerializer.SerializeToNode(defaultValue, jsonTypeInfo);
+ }
+ }
+
///
/// Applies the primitive types and formats to the schema based on the type.
///
@@ -228,7 +256,8 @@ internal static void ApplyRouteConstraints(this JsonObject schema, IEnumerable
/// The produced by the underlying schema generator.
/// The associated with the .
- internal static void ApplyParameterInfo(this JsonObject schema, ApiParameterDescription parameterDescription)
+ /// The associated with the .
+ internal static void ApplyParameterInfo(this JsonObject schema, ApiParameterDescription parameterDescription, JsonTypeInfo? jsonTypeInfo)
{
// This is special handling for parameters that are not bound from the body but represented in a complex type.
// For example:
@@ -251,6 +280,17 @@ internal static void ApplyParameterInfo(this JsonObject schema, ApiParameterDesc
{
var attributes = validations.OfType();
schema.ApplyValidationAttributes(attributes);
+ if (parameterDescription.ParameterDescriptor is IParameterInfoParameterDescriptor { ParameterInfo: { } parameterInfo })
+ {
+ if (parameterInfo.HasDefaultValue)
+ {
+ schema.ApplyDefaultValue(parameterInfo.DefaultValue, jsonTypeInfo);
+ }
+ else if (parameterInfo.GetCustomAttributes().LastOrDefault() is { } defaultValueAttribute)
+ {
+ schema.ApplyDefaultValue(defaultValueAttribute.Value, jsonTypeInfo);
+ }
+ }
}
// Route constraints are only defined on parameters that are sourced from the path. Since
// they are encoded in the route template, and not in the type information based to the underlying
diff --git a/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
index 1bdb8317a92a..8fae4a984baa 100644
--- a/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
+++ b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
@@ -1,9 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics;
using System.IO.Pipelines;
+using System.Linq;
using System.Text.Json;
using System.Text.Json.Nodes;
using JsonSchemaMapper;
@@ -59,7 +61,10 @@ internal sealed class OpenApiSchemaService(
{
schema.ApplyValidationAttributes(validationAttributes);
}
-
+ if (context.GetCustomAttributes(typeof(DefaultValueAttribute)).LastOrDefault() is DefaultValueAttribute defaultValueAttribute)
+ {
+ schema.ApplyDefaultValue(defaultValueAttribute.Value, context.TypeInfo);
+ }
}
};
@@ -71,7 +76,7 @@ internal async Task GetOrCreateSchemaAsync(Type type, ApiParamete
var schemaAsJsonObject = _schemaStore.GetOrAdd(key, CreateSchema);
if (parameterDescription is not null)
{
- schemaAsJsonObject.ApplyParameterInfo(parameterDescription);
+ schemaAsJsonObject.ApplyParameterInfo(parameterDescription, _jsonSerializerOptions.GetTypeInfo(type));
}
var deserializedSchema = JsonSerializer.Deserialize(schemaAsJsonObject, OpenApiJsonSchemaContext.Default.OpenApiJsonSchema);
Debug.Assert(deserializedSchema != null, "The schema should have been deserialized successfully and materialize a non-null value.");
diff --git a/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ParameterSchemas.cs b/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ParameterSchemas.cs
index e891d425f171..6b1635256767 100644
--- a/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ParameterSchemas.cs
+++ b/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ParameterSchemas.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.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
@@ -145,6 +146,7 @@ await VerifyOpenApiDocument(builder, document =>
});
}
+#nullable enable
public static object[][] RouteParametersWithDefaultValues =>
[
[(int id = 2) => { }, (IOpenApiAny defaultValue) => Assert.Equal(2, ((OpenApiInteger)defaultValue).Value)],
@@ -154,6 +156,18 @@ await VerifyOpenApiDocument(builder, document =>
[(TaskStatus status = TaskStatus.Canceled) => { }, (IOpenApiAny defaultValue) => Assert.Equal(6, ((OpenApiInteger)defaultValue).Value)],
// Default value for enums is serialized as string when a converter is registered.
[(Status status = Status.Pending) => { }, (IOpenApiAny defaultValue) => Assert.Equal("Pending", ((OpenApiString)defaultValue).Value)],
+ [([DefaultValue(2)] int id) => { }, (IOpenApiAny defaultValue) => Assert.Equal(2, ((OpenApiInteger)defaultValue).Value)],
+ [([DefaultValue(3f)] float id) => { }, (IOpenApiAny defaultValue) => Assert.Equal(3, ((OpenApiInteger)defaultValue).Value)],
+ [([DefaultValue("test")] string id) => { }, (IOpenApiAny defaultValue) => Assert.Equal("test", ((OpenApiString)defaultValue).Value)],
+ [([DefaultValue(true)] bool id) => { }, (IOpenApiAny defaultValue) => Assert.True(((OpenApiBoolean)defaultValue).Value)],
+ [([DefaultValue(TaskStatus.Canceled)] TaskStatus status) => { }, (IOpenApiAny defaultValue) => Assert.Equal(6, ((OpenApiInteger)defaultValue).Value)],
+ [([DefaultValue(Status.Pending)] Status status) => { }, (IOpenApiAny defaultValue) => Assert.Equal("Pending", ((OpenApiString)defaultValue).Value)],
+ [([DefaultValue(null)] int? id) => { }, (IOpenApiAny defaultValue) => Assert.True(defaultValue is OpenApiNull)],
+ [([DefaultValue(2)] int? id) => { }, (IOpenApiAny defaultValue) => Assert.Equal(2, ((OpenApiInteger)defaultValue).Value)],
+ [([DefaultValue(null)] string? id) => { }, (IOpenApiAny defaultValue) => Assert.True(defaultValue is OpenApiNull)],
+ [([DefaultValue("foo")] string? id) => { }, (IOpenApiAny defaultValue) => Assert.Equal("foo", ((OpenApiString)defaultValue).Value)],
+ [([DefaultValue(null)] TaskStatus? status) => { }, (IOpenApiAny defaultValue) => Assert.True(defaultValue is OpenApiNull)],
+ [([DefaultValue(TaskStatus.Canceled)] TaskStatus? status) => { }, (IOpenApiAny defaultValue) => Assert.Equal(6, ((OpenApiInteger)defaultValue).Value)],
];
[Theory]
@@ -175,6 +189,7 @@ await VerifyOpenApiDocument(builder, document =>
assert(openApiDefault);
});
}
+#nullable restore
[Fact]
public async Task GetOpenApiParameters_HandlesEnumParameterWithoutConverter()
diff --git a/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.RequestBodySchemas.cs b/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.RequestBodySchemas.cs
index a46882ea6c88..d25808ece8e4 100644
--- a/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.RequestBodySchemas.cs
+++ b/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.RequestBodySchemas.cs
@@ -4,6 +4,7 @@
using System.IO.Pipelines;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
public partial class OpenApiComponentServiceTests : OpenApiDocumentServiceTestBase
@@ -54,6 +55,53 @@ await VerifyOpenApiDocument(builder, document =>
});
}
+ [Fact]
+ public async Task GetOpenApiRequestBody_GeneratesSchemaForPoco_WithValidationAttributes()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ // Act
+ builder.MapPost("/", (ProjectBoard todo) => { });
+
+ // Assert
+ await VerifyOpenApiDocument(builder, document =>
+ {
+ var operation = document.Paths["/"].Operations[OperationType.Post];
+ var requestBody = operation.RequestBody;
+
+ Assert.NotNull(requestBody);
+ var content = Assert.Single(requestBody.Content);
+ Assert.Equal("application/json", content.Key);
+ Assert.NotNull(content.Value.Schema);
+ Assert.Equal("object", content.Value.Schema.Type);
+ Assert.Collection(content.Value.Schema.Properties,
+ property =>
+ {
+ Assert.Equal("id", property.Key);
+ Assert.Equal("integer", property.Value.Type);
+ Assert.Equal(1, property.Value.Minimum);
+ Assert.Equal(100, property.Value.Maximum);
+ Assert.True(property.Value.Default is OpenApiNull);
+ },
+ property =>
+ {
+ Assert.Equal("name", property.Key);
+ Assert.Equal("string", property.Value.Type);
+ Assert.Equal(5, property.Value.MinLength);
+ Assert.True(property.Value.Default is OpenApiNull);
+ },
+ property =>
+ {
+ Assert.Equal("isPrivate", property.Key);
+ Assert.Equal("boolean", property.Value.Type);
+ var defaultValue = Assert.IsAssignableFrom(property.Value.Default);
+ Assert.True(defaultValue.Value);
+ });
+
+ });
+ }
+
[Fact]
public async Task GetOpenApiRequestBody_GeneratesSchemaForFileTypes()
{
diff --git a/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ResponseSchemas.cs b/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ResponseSchemas.cs
index c9edafae041d..a028780e25ad 100644
--- a/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ResponseSchemas.cs
+++ b/src/OpenApi/test/Services/OpenApiSchemaService/OpenApiComponentService.ResponseSchemas.cs
@@ -3,6 +3,7 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
+using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
public partial class OpenApiComponentServiceTests : OpenApiDocumentServiceTestBase
@@ -90,6 +91,51 @@ await VerifyOpenApiDocument(builder, document =>
});
}
+ [Fact]
+ public async Task GetOpenApiResponse_GeneratesSchemaForPoco_WithValidationAttributes()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ // Act
+ builder.MapGet("/", () => new ProjectBoard { Id = 2, Name = "Test", IsPrivate = false });
+
+ // Assert
+ await VerifyOpenApiDocument(builder, document =>
+ {
+ var operation = document.Paths["/"].Operations[OperationType.Get];
+ var response = operation.Responses["200"];
+
+ Assert.NotNull(response);
+ var content = Assert.Single(response.Content);
+ Assert.Equal("application/json", content.Key);
+ Assert.NotNull(content.Value.Schema);
+ Assert.Equal("object", content.Value.Schema.Type);
+ Assert.Collection(content.Value.Schema.Properties,
+ property =>
+ {
+ Assert.Equal("id", property.Key);
+ Assert.Equal("integer", property.Value.Type);
+ Assert.Equal(1, property.Value.Minimum);
+ Assert.Equal(100, property.Value.Maximum);
+ },
+ property =>
+ {
+ Assert.Equal("name", property.Key);
+ Assert.Equal("string", property.Value.Type);
+ Assert.Equal(5, property.Value.MinLength);
+ },
+ property =>
+ {
+ Assert.Equal("isPrivate", property.Key);
+ Assert.Equal("boolean", property.Value.Type);
+ var defaultValue = Assert.IsAssignableFrom(property.Value.Default);
+ Assert.True(defaultValue.Value);
+ });
+
+ });
+ }
+
[Fact]
public async Task GetOpenApiResponse_HandlesNullablePocoResponse()
{
diff --git a/src/OpenApi/test/SharedTypes.cs b/src/OpenApi/test/SharedTypes.cs
index edf8f45c29b5..2ecd7d73e2a5 100644
--- a/src/OpenApi/test/SharedTypes.cs
+++ b/src/OpenApi/test/SharedTypes.cs
@@ -4,6 +4,9 @@
// This file contains shared types that are used across tests, sample apps,
// and benchmark apps.
+using System.ComponentModel;
+using System.ComponentModel.DataAnnotations;
+using System.Diagnostics.CodeAnalysis;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Http;
@@ -72,3 +75,20 @@ internal class PaginatedItems(int pageIndex, int pageSize, long totalItems, i
public int TotalPages { get; set; } = totalPages;
public IEnumerable Items { get; set; } = items;
}
+
+#nullable enable
+internal class ProjectBoard
+{
+ [Range(1, 100)]
+ [DefaultValue(null)]
+ public int Id { get; set; }
+
+ [MinLength(5)]
+ [DefaultValue(null)]
+ [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Used in tests.")]
+ public string? Name { get; set; }
+
+ [DefaultValue(true)]
+ public required bool IsPrivate { get; set; }
+}
+#nullable restore
From a6fe7f803533844f8b5dbb33efc0cd535202b22f Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
<42748379+dotnet-maestro[bot]@users.noreply.github.com>
Date: Fri, 14 Jun 2024 13:58:27 +0800
Subject: [PATCH 047/257] [main] Update dependencies from dotnet/xdt (#56191)
* Update dependencies from https://github.com/dotnet/xdt build 20240610.1
Microsoft.SourceBuild.Intermediate.xdt , Microsoft.Web.Xdt
From Version 9.0.0-preview.24303.1 -> To Version 9.0.0-preview.24310.1
* Update dependencies from https://github.com/dotnet/xdt build 20240610.1
Microsoft.SourceBuild.Intermediate.xdt , Microsoft.Web.Xdt
From Version 9.0.0-preview.24303.1 -> To Version 9.0.0-preview.24310.1
* Update dependencies from https://github.com/dotnet/xdt build 20240610.1
Microsoft.SourceBuild.Intermediate.xdt , Microsoft.Web.Xdt
From Version 9.0.0-preview.24303.1 -> To Version 9.0.0-preview.24310.1
---------
Co-authored-by: dotnet-maestro[bot]
---
eng/Version.Details.xml | 8 ++++----
eng/Versions.props | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index c14039a249d4..8502f2c7f58c 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -329,14 +329,14 @@
https://github.com/dotnet/runtime
8fac5af2b11dc98fa0504f6fd06df790164ec958
-
+
https://github.com/dotnet/xdt
- b1d534fe8831bbf62dc4356a7e611befee6ece33
+ 3081f87e9bf53c96a5b692f1de4bd530c4447080
-
+
https://github.com/dotnet/xdt
- b1d534fe8831bbf62dc4356a7e611befee6ece33
+ 3081f87e9bf53c96a5b692f1de4bd530c4447080
diff --git a/eng/Versions.props b/eng/Versions.props
index 4ab313e07231..a4c4c1d98879 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -174,8 +174,8 @@
9.0.0-preview.6.24307.1
- 9.0.0-preview.24303.1
- 9.0.0-preview.24303.1
+ 9.0.0-preview.24310.1
+ 9.0.0-preview.24310.1
+
PKV004
diff --git a/src/Framework/App.Runtime/src/CompatibilitySuppressions.xml b/src/Framework/App.Runtime/src/CompatibilitySuppressions.xml
index addf7e253000..044b90f8b6da 100644
--- a/src/Framework/App.Runtime/src/CompatibilitySuppressions.xml
+++ b/src/Framework/App.Runtime/src/CompatibilitySuppressions.xml
@@ -1,5 +1,5 @@
-
+
PKV0001
diff --git a/src/Http/Routing/src/Matching/NegotiationMatcherPolicy.cs b/src/Http/Routing/src/Matching/NegotiationMatcherPolicy.cs
index f14c9a041c30..c6670eace440 100644
--- a/src/Http/Routing/src/Matching/NegotiationMatcherPolicy.cs
+++ b/src/Http/Routing/src/Matching/NegotiationMatcherPolicy.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.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Primitives;
using Microsoft.Net.Http.Headers;
@@ -236,7 +235,7 @@ public IReadOnlyList GetEdges(IReadOnlyList endpoints)
{
var endpoint = endpoints[i];
var metadata = GetMetadataValue(endpoint) ?? DefaultNegotiationValue;
- if (!edges.TryGetValue(metadata, out var endpointsForType))
+ if (!edges.TryGetValue(metadata, out var _))
{
edges.Add(metadata, []);
}
@@ -286,7 +285,7 @@ public IReadOnlyList GetEdges(IReadOnlyList endpoints)
{
result[index] = new PolicyNodeEdge(
// Metadata quality is 0 for the edges that don't have metadata as we prefer serving from the endpoints that have metadata
- new NegotiationEdgeKey(kvp.Key, kvp.Value.Select(e => GetMetadataQuality(e) ?? 0).ToArray()),
+ new NegotiationEdgeKey(kvp.Key, CalculateEndpointQualities(kvp.Value)),
kvp.Value);
index++;
}
@@ -294,6 +293,16 @@ public IReadOnlyList GetEdges(IReadOnlyList endpoints)
return result;
}
+ private double[] CalculateEndpointQualities(List values)
+ {
+ var result = new double[values.Count];
+ for (var i = 0; i < values.Count; i++)
+ {
+ result[i] = GetMetadataQuality(values[i]) ?? 0;
+ }
+ return result;
+ }
+
internal class NegotiationEdgeKey
{
public NegotiationEdgeKey(string negotiationValue, double[] endpointsQuality)
@@ -326,7 +335,7 @@ PolicyJumpTable INodeBuilderPolicy.BuildJumpTable(int exitDestination, IReadOnly
{
var e = edges[i];
var key = (NegotiationEdgeKey)e.State;
- destinations[i] = (negotiationValue: key.NegotiationValue, quality: key.EndpointsQuality.Max(), destination: e.Destination);
+ destinations[i] = (negotiationValue: key.NegotiationValue, quality: Max(key.EndpointsQuality), destination: e.Destination);
}
// If any edge matches all negotiation values, then treat that as the 'exit'. This will
@@ -347,6 +356,22 @@ PolicyJumpTable INodeBuilderPolicy.BuildJumpTable(int exitDestination, IReadOnly
return CreateTable(exitDestination, destinations, noNegotiationHeaderDestination);
}
+ private static double Max(double[] endpointsQuality)
+ {
+ if (endpointsQuality.Length == 0)
+ {
+ throw new InvalidOperationException("No quality values found.");
+ }
+
+ var result = endpointsQuality[0];
+ for (var i = 1; i < endpointsQuality.Length; i++)
+ {
+ result = Math.Max(result, endpointsQuality[i]);
+ }
+
+ return result;
+ }
+
private protected abstract NegotiationPolicyJumpTable CreateTable(int exitDestination, (string negotiationValue, double quality, int destination)[] destinations, int noNegotiationHeaderDestination);
private sealed class NegotiationMetadataEndpointComparer : EndpointMetadataComparer
diff --git a/src/Http/WebUtilities/src/PublicAPI.Unshipped.txt b/src/Http/WebUtilities/src/PublicAPI.Unshipped.txt
index 7dc5c58110bf..1edfae904adf 100644
--- a/src/Http/WebUtilities/src/PublicAPI.Unshipped.txt
+++ b/src/Http/WebUtilities/src/PublicAPI.Unshipped.txt
@@ -1 +1,2 @@
#nullable enable
+static Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode(System.ReadOnlySpan input, System.Span output) -> int
diff --git a/src/Mvc/Mvc.Core/src/Builder/ControllerActionEndpointConventionBuilder.cs b/src/Mvc/Mvc.Core/src/Builder/ControllerActionEndpointConventionBuilder.cs
index d231cac8c3a0..8a59a8b1204d 100644
--- a/src/Mvc/Mvc.Core/src/Builder/ControllerActionEndpointConventionBuilder.cs
+++ b/src/Mvc/Mvc.Core/src/Builder/ControllerActionEndpointConventionBuilder.cs
@@ -23,6 +23,8 @@ internal ControllerActionEndpointConventionBuilder(object @lock, List Items { get; set; } = [];
+
///
/// Adds the specified convention to the builder. Conventions are used to customize instances.
///
diff --git a/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs b/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs
index 8156d0b7157b..581dca9503a7 100644
--- a/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs
+++ b/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs
@@ -17,6 +17,8 @@ namespace Microsoft.AspNetCore.Builder;
///
public static class ControllerEndpointRouteBuilderExtensions
{
+ internal const string EndpointRouteBuilderKey = "__EndpointRouteBuilder";
+
///
/// Adds endpoints for controller actions to the without specifying any routes.
///
@@ -28,7 +30,13 @@ public static ControllerActionEndpointConventionBuilder MapControllers(this IEnd
EnsureControllerServices(endpoints);
- return GetOrCreateDataSource(endpoints).DefaultBuilder;
+ var result = GetOrCreateDataSource(endpoints).DefaultBuilder;
+ if (!result.Items.ContainsKey(EndpointRouteBuilderKey))
+ {
+ result.Items[EndpointRouteBuilderKey] = endpoints;
+ }
+
+ return result;
}
///
@@ -46,6 +54,11 @@ public static ControllerActionEndpointConventionBuilder MapDefaultControllerRout
EnsureControllerServices(endpoints);
var dataSource = GetOrCreateDataSource(endpoints);
+ if (!dataSource.DefaultBuilder.Items.ContainsKey(EndpointRouteBuilderKey))
+ {
+ dataSource.DefaultBuilder.Items[EndpointRouteBuilderKey] = endpoints;
+ }
+
return dataSource.AddRoute(
"default",
"{controller=Home}/{action=Index}/{id?}",
@@ -90,6 +103,11 @@ public static ControllerActionEndpointConventionBuilder MapControllerRoute(
EnsureControllerServices(endpoints);
var dataSource = GetOrCreateDataSource(endpoints);
+ if (!dataSource.DefaultBuilder.Items.ContainsKey(EndpointRouteBuilderKey))
+ {
+ dataSource.DefaultBuilder.Items[EndpointRouteBuilderKey] = endpoints;
+ }
+
return dataSource.AddRoute(
name,
pattern,
diff --git a/src/Mvc/Mvc.Razor/src/TagHelpers/UrlResolutionTagHelper.cs b/src/Mvc/Mvc.Razor/src/TagHelpers/UrlResolutionTagHelper.cs
index b20c3b5c6300..98a5f90de666 100644
--- a/src/Mvc/Mvc.Razor/src/TagHelpers/UrlResolutionTagHelper.cs
+++ b/src/Mvc/Mvc.Razor/src/TagHelpers/UrlResolutionTagHelper.cs
@@ -4,7 +4,9 @@
using System.Buffers;
using System.Diagnostics.CodeAnalysis;
using System.Text.Encodings.Web;
+using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Html;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
@@ -221,6 +223,8 @@ protected bool TryResolveUrl([StringSyntax(StringSyntaxAttribute.Uri, UriKind.Re
return false;
}
+ trimmedUrl = GetVersionedResourceUrl(trimmedUrl);
+
var urlHelper = UrlHelperFactory.GetUrlHelper(ViewContext);
resolvedUrl = urlHelper.Content(trimmedUrl);
@@ -244,6 +248,8 @@ protected bool TryResolveUrl([StringSyntax(StringSyntaxAttribute.Uri, UriKind.Re
return false;
}
+ trimmedUrl = GetVersionedResourceUrl(trimmedUrl);
+
var urlHelper = UrlHelperFactory.GetUrlHelper(ViewContext);
var appRelativeUrl = urlHelper.Content(trimmedUrl);
var postTildeSlashUrlValue = trimmedUrl.Substring(2);
@@ -299,6 +305,41 @@ private static bool TryCreateTrimmedString(string input, [NotNullWhen(true)] out
return true;
}
+ private string GetVersionedResourceUrl(string value)
+ {
+ var assetCollection = GetAssetCollection();
+ if (assetCollection != null)
+ {
+ var (key, remainder) = ExtractKeyAndRest(value);
+
+ var src = assetCollection[key];
+ if (!string.Equals(src, key, StringComparison.Ordinal))
+ {
+ return $"~/{src}{value[remainder..]}";
+ }
+ }
+
+ return value;
+
+ static (string key, int rest) ExtractKeyAndRest(string value)
+ {
+ var lastNonWhitespaceChar = value.AsSpan().TrimEnd().LastIndexOfAnyExcept(ValidAttributeWhitespaceChars);
+ var keyEnd = lastNonWhitespaceChar > -1 ? lastNonWhitespaceChar + 1 : value.Length;
+ var key = value.AsSpan();
+ if (key.StartsWith("~/", StringComparison.Ordinal))
+ {
+ key = value.AsSpan()[2..keyEnd].Trim();
+ }
+
+ return (key.ToString(), keyEnd);
+ }
+ }
+
+ private ResourceAssetCollection? GetAssetCollection()
+ {
+ return ViewContext.HttpContext.GetEndpoint()?.Metadata.GetMetadata();
+ }
+
private sealed class EncodeFirstSegmentContent : IHtmlContent
{
private readonly string _firstSegment;
diff --git a/src/Mvc/Mvc.Razor/test/TagHelpers/UrlResolutionTagHelperTest.cs b/src/Mvc/Mvc.Razor/test/TagHelpers/UrlResolutionTagHelperTest.cs
index a6e2a92b5529..94c2fe3bfdc0 100644
--- a/src/Mvc/Mvc.Razor/test/TagHelpers/UrlResolutionTagHelperTest.cs
+++ b/src/Mvc/Mvc.Razor/test/TagHelpers/UrlResolutionTagHelperTest.cs
@@ -1,7 +1,9 @@
// 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;
using Microsoft.AspNetCore.Html;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.WebEncoders.Testing;
@@ -36,6 +38,29 @@ public static TheoryData ResolvableUrlData
}
}
+ public static TheoryData ResolvableUrlVersionData
+ {
+ get
+ {
+ // url, expectedHref
+ return new TheoryData
+ {
+ { "~/home/index.html", "/approot/home/index.fingerprint.html" },
+ { "~/home/index.html\r\n", "/approot/home/index.fingerprint.html" },
+ { " ~/home/index.html", "/approot/home/index.fingerprint.html" },
+ { "\u000C~/home/index.html\r\n", "/approot/home/index.fingerprint.html" },
+ { "\t ~/home/index.html\n", "/approot/home/index.fingerprint.html" },
+ { "\r\n~/home/index.html\u000C\t", "/approot/home/index.fingerprint.html" },
+ { "\r~/home/index.html\t", "/approot/home/index.fingerprint.html" },
+ { "\n~/home/index.html\u202F", "/approot/home/index.fingerprint.html\u202F" },
+ {
+ "~/home/index.html ~/secondValue/index.html",
+ "/approot/home/index.html ~/secondValue/index.html"
+ },
+ };
+ }
+ }
+
[Fact]
public void Process_DoesNothingIfTagNameIsNull()
{
@@ -85,7 +110,10 @@ public void Process_ResolvesTildeSlashValues(string url, string expectedHref)
urlHelperFactory
.Setup(f => f.GetUrlHelper(It.IsAny()))
.Returns(urlHelperMock.Object);
- var tagHelper = new UrlResolutionTagHelper(urlHelperFactory.Object, new HtmlTestEncoder());
+ var tagHelper = new UrlResolutionTagHelper(urlHelperFactory.Object, new HtmlTestEncoder())
+ {
+ ViewContext = new Rendering.ViewContext { HttpContext = new DefaultHttpContext() }
+ };
var context = new TagHelperContext(
tagName: "a",
@@ -142,7 +170,10 @@ public void Process_ResolvesTildeSlashValues_InHtmlString(string url, string exp
urlHelperFactory
.Setup(f => f.GetUrlHelper(It.IsAny()))
.Returns(urlHelperMock.Object);
- var tagHelper = new UrlResolutionTagHelper(urlHelperFactory.Object, new HtmlTestEncoder());
+ var tagHelper = new UrlResolutionTagHelper(urlHelperFactory.Object, new HtmlTestEncoder())
+ {
+ ViewContext = new Rendering.ViewContext { HttpContext = new DefaultHttpContext() }
+ };
var context = new TagHelperContext(
tagName: "a",
@@ -333,7 +364,10 @@ public void Process_ThrowsWhenEncodingNeededAndIUrlHelperActsUnexpectedly()
urlHelperFactory
.Setup(f => f.GetUrlHelper(It.IsAny()))
.Returns(urlHelperMock.Object);
- var tagHelper = new UrlResolutionTagHelper(urlHelperFactory.Object, new HtmlTestEncoder());
+ var tagHelper = new UrlResolutionTagHelper(urlHelperFactory.Object, new HtmlTestEncoder())
+ {
+ ViewContext = new Rendering.ViewContext { HttpContext = new DefaultHttpContext() }
+ };
var context = new TagHelperContext(
tagName: "a",
@@ -347,4 +381,55 @@ public void Process_ThrowsWhenEncodingNeededAndIUrlHelperActsUnexpectedly()
() => tagHelper.Process(context, tagHelperOutput));
Assert.Equal(expectedExceptionMessage, exception.Message, StringComparer.Ordinal);
}
+
+ [Theory]
+ [MemberData(nameof(ResolvableUrlVersionData))]
+ public void Process_ResolvesVersionedUrls_WhenResourceCollectionIsAvailable(string url, string expectedHref)
+ {
+ // Arrange
+ var tagHelperOutput = new TagHelperOutput(
+ tagName: "a",
+ attributes: new TagHelperAttributeList
+ {
+ { "href", url }
+ },
+ getChildContentAsync: (useCachedResult, encoder) => Task.FromResult(null));
+ var urlHelperMock = new Mock();
+ urlHelperMock
+ .Setup(urlHelper => urlHelper.Content(It.IsAny()))
+ .Returns(new Func(value => "/approot" + value.Substring(1)));
+ var urlHelperFactory = new Mock();
+ urlHelperFactory
+ .Setup(f => f.GetUrlHelper(It.IsAny()))
+ .Returns(urlHelperMock.Object);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.SetEndpoint(new Endpoint(
+ (context) => Task.CompletedTask,
+ new EndpointMetadataCollection(
+ [new ResourceAssetCollection([new("home/index.fingerprint.html", [new ResourceAssetProperty("label", "home/index.html")])])]),
+ "Test"));
+
+ var tagHelper = new UrlResolutionTagHelper(urlHelperFactory.Object, new HtmlTestEncoder())
+ {
+ ViewContext = new Rendering.ViewContext { HttpContext = httpContext }
+ };
+
+ var context = new TagHelperContext(
+ tagName: "a",
+ allAttributes: new TagHelperAttributeList(
+ Enumerable.Empty()),
+ items: new Dictionary
public static class RazorPagesEndpointRouteBuilderExtensions
{
+ internal const string EndpointRouteBuilderKey = "__EndpointRouteBuilder";
+
///
/// Adds endpoints for Razor Pages to the .
///
@@ -28,7 +30,12 @@ public static PageActionEndpointConventionBuilder MapRazorPages(this IEndpointRo
EnsureRazorPagesServices(endpoints);
- return GetOrCreateDataSource(endpoints).DefaultBuilder;
+ var builder = GetOrCreateDataSource(endpoints).DefaultBuilder;
+ if (!builder.Items.ContainsKey(EndpointRouteBuilderKey))
+ {
+ builder.Items[EndpointRouteBuilderKey] = endpoints;
+ }
+ return builder;
}
///
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceFactory.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceFactory.cs
index b882f1029f42..b1e0b718bdd7 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceFactory.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceFactory.cs
@@ -24,6 +24,10 @@ public PageActionEndpointDataSourceFactory(
public PageActionEndpointDataSource Create(OrderedEndpointsSequenceProvider orderProvider)
{
- return new PageActionEndpointDataSource(_dataSourceIdProvider, _actions, _endpointFactory, orderProvider);
+ return new PageActionEndpointDataSource(
+ _dataSourceIdProvider,
+ _actions,
+ _endpointFactory,
+ orderProvider);
}
}
diff --git a/src/Mvc/Mvc.RazorPages/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.RazorPages/src/PublicAPI.Unshipped.txt
index 7dc5c58110bf..3dc85b737c41 100644
--- a/src/Mvc/Mvc.RazorPages/src/PublicAPI.Unshipped.txt
+++ b/src/Mvc/Mvc.RazorPages/src/PublicAPI.Unshipped.txt
@@ -1 +1,3 @@
#nullable enable
+Microsoft.AspNetCore.Builder.PageActionEndpointConventionBuilderResourceCollectionExtensions
+static Microsoft.AspNetCore.Builder.PageActionEndpointConventionBuilderResourceCollectionExtensions.WithStaticAssets(this Microsoft.AspNetCore.Builder.PageActionEndpointConventionBuilder! builder, string? manifestPath = null) -> Microsoft.AspNetCore.Builder.PageActionEndpointConventionBuilder!
diff --git a/src/Mvc/Mvc.RazorPages/test/Builder/PageActionEndpointConventionBuilderResourceCollectionExtensionsTest.cs b/src/Mvc/Mvc.RazorPages/test/Builder/PageActionEndpointConventionBuilderResourceCollectionExtensionsTest.cs
new file mode 100644
index 000000000000..c2837e8d6d29
--- /dev/null
+++ b/src/Mvc/Mvc.RazorPages/test/Builder/PageActionEndpointConventionBuilderResourceCollectionExtensionsTest.cs
@@ -0,0 +1,287 @@
+// 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;
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.AspNetCore.Mvc.Razor.Compilation;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.AspNetCore.Razor.Hosting;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.FileProviders;
+
+namespace Microsoft.AspNetCore.Builder;
+
+public class PageActionEndpointConventionBuilderResourceCollectionExtensionsTest
+{
+ [Fact]
+ public void WithStaticAssets_AddsEmptyResourceCollection_ToEndpoints_NoStaticAssetsMapped()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ var builder = endpointBuilder.MapRazorPages();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.First().Endpoints, e =>
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(0, list.Count);
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsEmptyResourceCollection_ToEndpoints_NoMatchingStaticAssetsMapped()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = endpointBuilder.MapRazorPages();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.Skip(1).First().Endpoints, e =>
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(0, list.Count);
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsResourceCollection_ToEndpoints_NamedManifest()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = endpointBuilder.MapRazorPages();
+
+ // Act
+ builder.WithStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.Skip(1).First().Endpoints, e =>
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("named.css", list[0].Url);
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsResourceCollection_ToEndpoints_DefaultManifest()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+ var builder = endpointBuilder.MapRazorPages();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.Skip(1).First().Endpoints, e =>
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("default.css", list[0].Url);
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsDefaultResourceCollectionToEndpoints_WhenNoManifestProvided_EvenIfManyAvailable()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+ endpointBuilder.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = endpointBuilder.MapRazorPages();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.Skip(2).First().Endpoints, e =>
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("default.css", list[0].Url);
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsMatchingResourceCollectionToEndpoints_WhenExplicitManifestProvided_EvenIfManyAvailable()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+ endpointBuilder.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = endpointBuilder.MapRazorPages();
+
+ // Act
+ builder.WithStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.Skip(2).First().Endpoints, e =>
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("named.css", list[0].Url);
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsCollectionFromGroup_WhenMappedInsideAnEndpointGroup()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+
+ var group = endpointBuilder.MapGroup("/group");
+ group.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = group.MapRazorPages();
+
+ // Act
+ builder.WithStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+
+ // Assert
+ var groupEndpoints = Assert.IsAssignableFrom(group).DataSources;
+ Assert.All(groupEndpoints.Skip(1).First().Endpoints, e =>
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("named.css", list[0].Url);
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsEmptyCollectionFromGroup_WhenMappingNotFound_InsideGroup()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+
+ var group = endpointBuilder.MapGroup("/group");
+ group.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = group.MapRazorPages();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ var groupEndpoints = Assert.IsAssignableFrom(group).DataSources;
+ Assert.All(groupEndpoints.Skip(1).First().Endpoints, e =>
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(0, list.Count);
+ });
+ }
+
+ private class TestEndpointRouteBuilder : IEndpointRouteBuilder
+ {
+ private readonly ApplicationBuilder _applicationBuilder;
+
+ public TestEndpointRouteBuilder()
+ {
+ _applicationBuilder = new ApplicationBuilder(ServiceProvider);
+ }
+
+ public IServiceProvider ServiceProvider { get; } = CreateServiceProvider();
+
+ private static IServiceProvider CreateServiceProvider()
+ {
+ var collection = new ServiceCollection();
+ collection.AddSingleton(new ConfigurationBuilder().Build());
+ collection.AddSingleton(new TestWebHostEnvironment());
+ collection.AddSingleton(new ApplicationPartManager());
+ collection.AddSingleton(new DiagnosticListener("Microsoft.AspNetCore"));
+ collection.AddSingleton(new TestDiagnosticSource());
+ collection.AddLogging();
+ collection.AddOptions();
+ collection.AddMvc()
+ .ConfigureApplicationPartManager(apm =>
+ {
+ apm.FeatureProviders.Clear();
+ apm.FeatureProviders.Add(new TestRazorPagesFeatureProvider());
+ });
+ return collection.BuildServiceProvider();
+ }
+
+ public ICollection DataSources { get; } = [];
+
+ public IApplicationBuilder CreateApplicationBuilder()
+ {
+ return _applicationBuilder.New();
+ }
+
+ private class TestRazorPagesFeatureProvider : IApplicationFeatureProvider
+ {
+ public void PopulateFeature(IEnumerable parts, ViewsFeature feature)
+ {
+ feature.ViewDescriptors.Clear();
+ feature.ViewDescriptors.Add(new CompiledViewDescriptor(TestRazorCompiledItem.CreateForPage(typeof(Index), "/Pages/Index.cshtml")));
+ }
+ }
+
+ [Route("/")]
+ private class Index : PageBase
+ {
+ public object Model { get; set; }
+
+ public override Task ExecuteAsync()
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ private class TestWebHostEnvironment : IWebHostEnvironment
+ {
+ public string ApplicationName { get; set; } = "TestApplication";
+ public string EnvironmentName { get; set; } = "TestEnvironment";
+ public string WebRootPath { get; set; } = "";
+ public IFileProvider WebRootFileProvider { get => ContentRootFileProvider; set { } }
+ public string ContentRootPath { get; set; } = Directory.GetCurrentDirectory();
+ public IFileProvider ContentRootFileProvider { get; set; } = CreateTestFileProvider();
+
+ private static TestFileProvider CreateTestFileProvider()
+ {
+ var provider = new TestFileProvider();
+ provider.AddFile("site.css", "body { color: red; }");
+ return provider;
+ }
+ }
+
+ private class TestDiagnosticSource : DiagnosticSource
+ {
+ public override bool IsEnabled(string name)
+ {
+ return false;
+ }
+
+ public override void Write(string name, object value) { }
+ }
+ }
+}
+
diff --git a/src/Mvc/Mvc.RazorPages/test/Microsoft.AspNetCore.Mvc.RazorPages.Test.csproj b/src/Mvc/Mvc.RazorPages/test/Microsoft.AspNetCore.Mvc.RazorPages.Test.csproj
index ea72cc610342..c9e51798bea6 100644
--- a/src/Mvc/Mvc.RazorPages/test/Microsoft.AspNetCore.Mvc.RazorPages.Test.csproj
+++ b/src/Mvc/Mvc.RazorPages/test/Microsoft.AspNetCore.Mvc.RazorPages.Test.csproj
@@ -1,4 +1,4 @@
-
+
$(DefaultNetCoreTargetFramework)
@@ -8,8 +8,14 @@
+
+
+
+
+
+
diff --git a/src/Mvc/Mvc.RazorPages/test/TestApplication.staticwebassets.endpoints.json b/src/Mvc/Mvc.RazorPages/test/TestApplication.staticwebassets.endpoints.json
new file mode 100644
index 000000000000..586241880352
--- /dev/null
+++ b/src/Mvc/Mvc.RazorPages/test/TestApplication.staticwebassets.endpoints.json
@@ -0,0 +1,17 @@
+{
+ "Version": 1,
+ "Endpoints": [
+ {
+ "Route": "default.css",
+ "AssetFile": "default.css",
+ "Selectors": [],
+ "EndpointProperties": [],
+ "ResponseHeaders": [
+ {
+ "Name": "ETag",
+ "Value": "\"Fake\""
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Mvc/Mvc.RazorPages/test/TestManifests/Test.staticwebassets.endpoints.json b/src/Mvc/Mvc.RazorPages/test/TestManifests/Test.staticwebassets.endpoints.json
new file mode 100644
index 000000000000..77815b7c379c
--- /dev/null
+++ b/src/Mvc/Mvc.RazorPages/test/TestManifests/Test.staticwebassets.endpoints.json
@@ -0,0 +1,17 @@
+{
+ "Version": 1,
+ "Endpoints": [
+ {
+ "Route": "named.css",
+ "AssetFile": "named.css",
+ "Selectors": [],
+ "EndpointProperties": [],
+ "ResponseHeaders": [
+ {
+ "Name": "ETag",
+ "Value": "\"Fake\""
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Mvc/Mvc.TagHelpers/src/ImageTagHelper.cs b/src/Mvc/Mvc.TagHelpers/src/ImageTagHelper.cs
index 9cdd30d32e13..6c590e7cffee 100644
--- a/src/Mvc/Mvc.TagHelpers/src/ImageTagHelper.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/ImageTagHelper.cs
@@ -123,8 +123,9 @@ public override void Process(TagHelperContext context, TagHelperOutput output)
// pipeline have touched the value. If the value is already encoded this ImageTagHelper may
// not function properly.
Src = output.Attributes[SrcAttributeName].Value as string;
+ var src = GetVersionedResourceUrl(Src);
- output.Attributes.SetAttribute(SrcAttributeName, FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, Src));
+ output.Attributes.SetAttribute(SrcAttributeName, src);
}
}
@@ -135,4 +136,24 @@ private void EnsureFileVersionProvider()
FileVersionProvider = ViewContext.HttpContext.RequestServices.GetRequiredService();
}
}
+
+ private string GetVersionedResourceUrl(string url)
+ {
+ if (AppendVersion == true)
+ {
+ var pathBase = ViewContext.HttpContext.Request.PathBase;
+ if (ResourceCollectionUtilities.TryResolveFromAssetCollection(ViewContext, url, out var resolvedUrl))
+ {
+ url = resolvedUrl;
+ return url;
+ }
+
+ if (url != null)
+ {
+ url = FileVersionProvider.AddFileVersionToPath(pathBase, url);
+ }
+ }
+
+ return url;
+ }
}
diff --git a/src/Mvc/Mvc.TagHelpers/src/LinkTagHelper.cs b/src/Mvc/Mvc.TagHelpers/src/LinkTagHelper.cs
index f7950deae6d6..5177990cf149 100644
--- a/src/Mvc/Mvc.TagHelpers/src/LinkTagHelper.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/LinkTagHelper.cs
@@ -276,11 +276,12 @@ public override void Process(TagHelperContext context, TagHelperOutput output)
if (Href != null)
{
+ var href = GetVersionedResourceUrl(Href);
var index = output.Attributes.IndexOfName(HrefAttributeName);
var existingAttribute = output.Attributes[index];
output.Attributes[index] = new TagHelperAttribute(
existingAttribute.Name,
- FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, Href),
+ href,
existingAttribute.ValueStyle);
}
}
@@ -452,7 +453,7 @@ private void AppendFallbackHrefs(TagHelperContent builder, IReadOnlyList
var valueToWrite = fallbackHrefs[i];
if (AppendVersion == true)
{
- valueToWrite = FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, fallbackHrefs[i]);
+ valueToWrite = GetVersionedResourceUrl(fallbackHrefs[i]);
}
// Must HTML-encode the href attribute value to ensure the written element is valid. Must also
@@ -520,11 +521,7 @@ private void BuildLinkTag(string href, TagHelperAttributeList attributes, TagHel
private void AppendVersionedHref(string hrefName, string hrefValue, TagHelperContent builder)
{
- if (AppendVersion == true)
- {
- hrefValue = FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, hrefValue);
- }
-
+ hrefValue = GetVersionedResourceUrl(hrefValue);
builder
.AppendHtml(hrefName)
.AppendHtml("=\"")
@@ -532,6 +529,27 @@ private void AppendVersionedHref(string hrefName, string hrefValue, TagHelperCon
.AppendHtml("\" ");
}
+ private string GetVersionedResourceUrl(string url)
+ {
+ if (AppendVersion == true)
+ {
+ var pathBase = ViewContext.HttpContext.Request.PathBase;
+
+ if (ResourceCollectionUtilities.TryResolveFromAssetCollection(ViewContext, url, out var resolvedUrl))
+ {
+ url = resolvedUrl;
+ return url;
+ }
+
+ if (url != null)
+ {
+ url = FileVersionProvider.AddFileVersionToPath(pathBase, url);
+ }
+ }
+
+ return url;
+ }
+
private enum Mode
{
///
diff --git a/src/Mvc/Mvc.TagHelpers/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.TagHelpers/src/PublicAPI.Unshipped.txt
index 7dc5c58110bf..1c4ffad9ba5e 100644
--- a/src/Mvc/Mvc.TagHelpers/src/PublicAPI.Unshipped.txt
+++ b/src/Mvc/Mvc.TagHelpers/src/PublicAPI.Unshipped.txt
@@ -1 +1,5 @@
#nullable enable
+~Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper.ImportMap.get -> Microsoft.AspNetCore.Components.ImportMapDefinition
+~Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper.ImportMap.set -> void
+~Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper.Type.get -> string
+~Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper.Type.set -> void
diff --git a/src/Mvc/Mvc.TagHelpers/src/ResourceCollectionUtilities.cs b/src/Mvc/Mvc.TagHelpers/src/ResourceCollectionUtilities.cs
new file mode 100644
index 000000000000..20559efe9571
--- /dev/null
+++ b/src/Mvc/Mvc.TagHelpers/src/ResourceCollectionUtilities.cs
@@ -0,0 +1,62 @@
+// 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;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.Rendering;
+
+namespace Microsoft.AspNetCore.Mvc.TagHelpers;
+
+internal static class ResourceCollectionUtilities
+{
+ internal static bool TryResolveFromAssetCollection(ViewContext viewContext, string url, out string resolvedUrl)
+ {
+ var pathBase = viewContext.HttpContext.Request.PathBase;
+ var assetCollection = viewContext.HttpContext.GetEndpoint()?.Metadata.GetMetadata();
+ if (assetCollection != null)
+ {
+ var value = url.StartsWith('/') ? url[1..] : url;
+ if (assetCollection.IsContentSpecificUrl(value))
+ {
+ resolvedUrl = url;
+ return true;
+ }
+
+ var src = assetCollection[value];
+ if (!string.Equals(src, value, StringComparison.Ordinal))
+ {
+ resolvedUrl = url.StartsWith('/') ? $"/{src}" : src;
+ return true;
+ }
+
+ if (pathBase.HasValue && url.StartsWith(pathBase, StringComparison.OrdinalIgnoreCase))
+ {
+ var length = pathBase.Value.EndsWith('/') ? pathBase.Value.Length : pathBase.Value.Length + 1;
+ var relativePath = url[length..];
+ if (assetCollection.IsContentSpecificUrl(relativePath))
+ {
+ resolvedUrl = url;
+ return true;
+ }
+
+ src = assetCollection[relativePath];
+ if (!string.Equals(src, relativePath, StringComparison.Ordinal))
+ {
+ if (pathBase.Value.EndsWith('/'))
+ {
+ resolvedUrl = $"{pathBase}{src}";
+ return true;
+ }
+ else
+ {
+ resolvedUrl = $"{pathBase}/{src}";
+ return true;
+ }
+ }
+ }
+ }
+
+ resolvedUrl = null;
+ return false;
+ }
+}
diff --git a/src/Mvc/Mvc.TagHelpers/src/ScriptTagHelper.cs b/src/Mvc/Mvc.TagHelpers/src/ScriptTagHelper.cs
index 3fdaa8410a31..88da4462a9ad 100644
--- a/src/Mvc/Mvc.TagHelpers/src/ScriptTagHelper.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/ScriptTagHelper.cs
@@ -3,8 +3,10 @@
using System.Diagnostics;
using System.Text.Encodings.Web;
+using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Html;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
using Microsoft.AspNetCore.Mvc.Routing;
@@ -28,6 +30,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers;
[HtmlTargetElement("script", Attributes = FallbackSrcExcludeAttributeName)]
[HtmlTargetElement("script", Attributes = FallbackTestExpressionAttributeName)]
[HtmlTargetElement("script", Attributes = AppendVersionAttributeName)]
+[HtmlTargetElement("script", Attributes = TypeAttributeName)]
+[HtmlTargetElement("script", Attributes = ImportMapAttributeName)]
public class ScriptTagHelper : UrlResolutionTagHelper
{
private const string SrcIncludeAttributeName = "asp-src-include";
@@ -40,6 +44,9 @@ public class ScriptTagHelper : UrlResolutionTagHelper
private const string SrcAttributeName = "src";
private const string IntegrityAttributeName = "integrity";
private const string AppendVersionAttributeName = "asp-append-version";
+ private const string TypeAttributeName = "type";
+ private const string ImportMapAttributeName = "asp-importmap";
+
private static readonly Func Compare = (a, b) => a - b;
private StringWriter _stringWriter;
@@ -115,6 +122,12 @@ public ScriptTagHelper(
[HtmlAttributeName(SrcAttributeName)]
public string Src { get; set; }
+ ///
+ /// Type of the script.
+ ///
+ [HtmlAttributeName(TypeAttributeName)]
+ public string Type { get; set; }
+
///
/// A comma separated list of globbed file patterns of JavaScript scripts to load.
/// The glob patterns are assessed relative to the application's 'webroot' setting.
@@ -174,6 +187,16 @@ public ScriptTagHelper(
[HtmlAttributeName(FallbackTestExpressionAttributeName)]
public string FallbackTestExpression { get; set; }
+ ///
+ /// The to use for the document.
+ ///
+ ///
+ /// If this is not set and the type value is "importmap",
+ /// the import map will be retrieved by default from the current .
+ ///
+ [HtmlAttributeName(ImportMapAttributeName)]
+ public ImportMapDefinition ImportMap { get; set; }
+
///
/// Gets the for the application.
///
@@ -217,6 +240,25 @@ public override void Process(TagHelperContext context, TagHelperOutput output)
ArgumentNullException.ThrowIfNull(context);
ArgumentNullException.ThrowIfNull(output);
+ if (string.Equals(Type, "importmap", StringComparison.OrdinalIgnoreCase))
+ {
+ // This is an importmap script, we'll write out the import map and
+ // stop processing.
+ var importMap = ImportMap ?? ViewContext.HttpContext.GetEndpoint()?.Metadata.GetMetadata();
+ if (importMap == null)
+ {
+ // No importmap found, nothing to do.
+ output.SuppressOutput();
+ return;
+ }
+
+ output.TagName = "script";
+ output.TagMode = TagMode.StartTagAndEndTag;
+ output.Attributes.SetAttribute("type", "importmap");
+ output.Content.SetHtmlContent(importMap.ToString());
+ return;
+ }
+
// Pass through attribute that is also a well-known HTML attribute.
if (Src != null)
{
@@ -240,14 +282,14 @@ public override void Process(TagHelperContext context, TagHelperOutput output)
if (AppendVersion == true)
{
EnsureFileVersionProvider();
-
+ var versionedSrc = GetVersionedSrc(Src);
if (Src != null)
{
var index = output.Attributes.IndexOfName(SrcAttributeName);
var existingAttribute = output.Attributes[index];
output.Attributes[index] = new TagHelperAttribute(
existingAttribute.Name,
- FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, Src),
+ versionedSrc,
existingAttribute.ValueStyle);
}
}
@@ -366,7 +408,17 @@ private string GetVersionedSrc(string srcValue)
{
if (AppendVersion == true)
{
- srcValue = FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, srcValue);
+ var pathBase = ViewContext.HttpContext.Request.PathBase;
+ if (ResourceCollectionUtilities.TryResolveFromAssetCollection(ViewContext, srcValue, out var resolvedUrl))
+ {
+ srcValue = resolvedUrl;
+ return srcValue;
+ }
+
+ if (srcValue != null)
+ {
+ srcValue = FileVersionProvider.AddFileVersionToPath(pathBase, srcValue);
+ }
}
return srcValue;
diff --git a/src/Mvc/Mvc.TagHelpers/test/ImageTagHelperTest.cs b/src/Mvc/Mvc.TagHelpers/test/ImageTagHelperTest.cs
index a31fbac04ce7..b4af99e52609 100644
--- a/src/Mvc/Mvc.TagHelpers/test/ImageTagHelperTest.cs
+++ b/src/Mvc/Mvc.TagHelpers/test/ImageTagHelperTest.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text;
+using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Http;
@@ -160,6 +161,69 @@ public void RendersImageTag_AddsFileVersion()
Assert.Equal("/images/test-image.png?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", srcAttribute.Value);
}
+ [Theory]
+ [InlineData("~/images/test-image.png", "/bar", "/bar/images/test-image.fingerprint.png")]
+ [InlineData("/images/test-image.png", null, "/images/test-image.fingerprint.png")]
+ [InlineData("images/test-image.png", null, "images/test-image.fingerprint.png")]
+ public void RendersImageTag_AddsFileVersion_WithStaticAssets(string src, string pathBase, string expectedValue)
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("Alt image text") },
+ { "src", src },
+ { "asp-append-version", "true" }
+ });
+ var output = MakeImageTagHelperOutput(attributes: new TagHelperAttributeList
+ {
+ { "alt", new HtmlString("Alt image text") },
+ });
+ var hostingEnvironment = MakeHostingEnvironment();
+ var viewContext = MakeViewContext();
+
+ var urlHelperFactory = MakeUrlHelperFactory(value =>
+ {
+ if (value.StartsWith("~/", StringComparison.Ordinal))
+ {
+ return pathBase == null ? value.Replace("~/", string.Empty) : value.Replace("~/", pathBase + "/");
+ }
+ return value;
+ });
+
+ var helper = GetHelper(urlHelperFactory: urlHelperFactory);
+ helper.ViewContext = viewContext;
+ helper.ViewContext.HttpContext = new DefaultHttpContext();
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ if (pathBase != null)
+ {
+ helper.ViewContext.HttpContext.Request.PathBase = new PathString(pathBase);
+ }
+ helper.Src = src;
+ helper.AppendVersion = true;
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.True(output.Content.GetContent().Length == 0);
+ Assert.Equal("img", output.TagName);
+ Assert.Equal(2, output.Attributes.Count);
+ var srcAttribute = Assert.Single(output.Attributes, attr => attr.Name.Equals("src"));
+ Assert.Equal(expectedValue, srcAttribute.Value);
+ }
+
+ private Endpoint CreateEndpoint()
+ {
+ return new Endpoint(
+ (context) => Task.CompletedTask,
+ new EndpointMetadataCollection(
+ [new ResourceAssetCollection([
+ new("images/test-image.fingerprint.png", [new ResourceAssetProperty("label", "images/test-image.png")]),
+ ])]),
+ "Test");
+ }
+
[Fact]
public void RendersImageTag_DoesNotAddFileVersion()
{
@@ -226,7 +290,7 @@ public void RendersImageTag_AddsFileVersion_WithRequestPathBase()
private static ViewContext MakeViewContext(string requestPathBase = null)
{
- var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
+ var actionContext = new ActionContext(new DefaultHttpContext(), new AspNetCore.Routing.RouteData(), new ActionDescriptor());
if (requestPathBase != null)
{
actionContext.HttpContext.Request.PathBase = new Http.PathString(requestPathBase);
@@ -314,13 +378,13 @@ private static IWebHostEnvironment MakeHostingEnvironment()
return hostingEnvironment.Object;
}
- private static IUrlHelperFactory MakeUrlHelperFactory()
+ private static IUrlHelperFactory MakeUrlHelperFactory(Func contentAction = null)
{
var urlHelper = new Mock();
-
+ contentAction ??= (url) => url;
urlHelper
.Setup(helper => helper.Content(It.IsAny()))
- .Returns(new Func(url => url));
+ .Returns(new Func(contentAction));
var urlHelperFactory = new Mock();
urlHelperFactory
diff --git a/src/Mvc/Mvc.TagHelpers/test/LinkTagHelperTest.cs b/src/Mvc/Mvc.TagHelpers/test/LinkTagHelperTest.cs
index 8b04fa7e6835..0ce563ec4fe4 100644
--- a/src/Mvc/Mvc.TagHelpers/test/LinkTagHelperTest.cs
+++ b/src/Mvc/Mvc.TagHelpers/test/LinkTagHelperTest.cs
@@ -3,9 +3,11 @@
using System.Globalization;
using System.Text;
+using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.InternalTesting;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
@@ -14,8 +16,6 @@
using Microsoft.AspNetCore.Mvc.ViewEngines;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
-using Microsoft.AspNetCore.Routing;
-using Microsoft.AspNetCore.InternalTesting;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Primitives;
@@ -725,6 +725,82 @@ public void RendersLinkTags_WithFileVersion()
Assert.Equal("/css/site.css?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", output.Attributes["href"].Value);
}
+ [Theory]
+ [InlineData("~/css/site.css", "/css/site.fingerprint.css")]
+ [InlineData("/css/site.css", "/css/site.fingerprint.css")]
+ [InlineData("css/site.css", "css/site.fingerprint.css")]
+ public void RendersLinkTag_WithFileVersion_UsingResourceCollection(string href, string expected)
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ { "rel", new HtmlString("stylesheet") },
+ { "href", href },
+ { "asp-append-version", "true" }
+ });
+ var output = MakeTagHelperOutput("link", attributes: new TagHelperAttributeList
+ {
+ { "rel", new HtmlString("stylesheet") },
+ });
+
+ var helper = GetHelper(urlHelperFactory: MakeUrlHelperFactory(value =>
+ value.StartsWith("~/", StringComparison.Ordinal) ? value[1..] : value));
+
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ helper.Href = href;
+ helper.AppendVersion = true;
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("link", output.TagName);
+ Assert.Equal(expected, output.Attributes["href"].Value);
+ }
+
+ [Theory]
+ [InlineData("~/css/site.css")]
+ [InlineData("/approot/css/site.css")]
+ public void RenderLinkTags_PathBase_WithFileVersion_UsingResourceCollection(string href)
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ { "rel", new HtmlString("stylesheet") },
+ { "href", href },
+ { "asp-append-version", "true" }
+ });
+ var output = MakeTagHelperOutput("link", attributes: new TagHelperAttributeList
+ {
+ { "rel", new HtmlString("stylesheet") },
+ });
+
+ var urlHelperFactory = MakeUrlHelperFactory(value =>
+ {
+ if (value.StartsWith("~/", StringComparison.Ordinal))
+ {
+ return value.Replace("~/", "/approot/");
+ }
+
+ return value;
+ });
+
+ var helper = GetHelper(urlHelperFactory: urlHelperFactory);
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ helper.ViewContext.HttpContext.Request.PathBase = "/approot";
+ helper.Href = href;
+ helper.AppendVersion = true;
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("link", output.TagName);
+ Assert.Equal("/approot/css/site.fingerprint.css", output.Attributes["href"].Value);
+ }
+
[Fact]
public void RendersLinkTags_WithFileVersion_AndRequestPathBase()
{
@@ -809,6 +885,61 @@ public void RenderLinkTags_FallbackHref_WithFileVersion()
Assert.Equal(expectedPostElement, output.PostElement.GetContent());
}
+ [Fact]
+ public void RenderLinkTags_FallbackHref_WithFileVersion_WithStaticAssets()
+ {
+ // Arrange
+ var expectedPostElement = Environment.NewLine +
+ "";
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ { "asp-append-version", "true" },
+ { "asp-fallback-href-include", "**/fallback.css" },
+ { "asp-fallback-test-class", "hidden" },
+ { "asp-fallback-test-property", "visibility" },
+ { "asp-fallback-test-value", "hidden" },
+ { "href", "/css/site.css" },
+ { "rel", new HtmlString("stylesheet") },
+ });
+ var output = MakeTagHelperOutput(
+ "link",
+ attributes: new TagHelperAttributeList
+ {
+ { "rel", new HtmlString("stylesheet") },
+ });
+ var globbingUrlBuilder = new Mock(
+ new TestFileProvider(),
+ Mock.Of(),
+ PathString.Empty);
+ globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/fallback.css", null))
+ .Returns(new[] { "/fallback.css" });
+
+ var helper = GetHelper();
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ helper.AppendVersion = true;
+ helper.Href = "/css/site.css";
+ helper.FallbackHrefInclude = "**/fallback.css";
+ helper.FallbackTestClass = "hidden";
+ helper.FallbackTestProperty = "visibility";
+ helper.FallbackTestValue = "hidden";
+ helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("link", output.TagName);
+ Assert.Equal("/css/site.fingerprint.css", output.Attributes["href"].Value);
+ Assert.Equal(expectedPostElement, output.PostElement.GetContent());
+ }
+
[Fact]
public void RenderLinkTags_FallbackHref_WithFileVersion_EncodesAsExpected()
{
@@ -922,6 +1053,48 @@ public void RendersLinkTags_GlobbedHref_WithFileVersion()
content);
}
+ [Fact]
+ public void RendersLinkTags_GlobbedHref_WithFileVersion_WithStaticAssets()
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ { "rel", new HtmlString("stylesheet") },
+ { "href", "/css/site.css" },
+ { "asp-href-include", "**/*.css" },
+ { "asp-append-version", "true" },
+ });
+ var output = MakeTagHelperOutput("link", attributes: new TagHelperAttributeList
+ {
+ { "rel", new HtmlString("stylesheet") },
+ });
+ var globbingUrlBuilder = new Mock(
+ new TestFileProvider(),
+ Mock.Of(),
+ PathString.Empty);
+ globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "**/*.css", null))
+ .Returns(new[] { "/base.css" });
+
+ var helper = GetHelper();
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
+ helper.Href = "/css/site.css";
+ helper.HrefInclude = "**/*.css";
+ helper.AppendVersion = true;
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("link", output.TagName);
+ Assert.Equal("/css/site.fingerprint.css", output.Attributes["href"].Value);
+ var content = HtmlContentUtilities.HtmlContentToString(output.PostElement, new HtmlTestEncoder());
+ Assert.Equal(
+ "",
+ content);
+ }
+
private static LinkTagHelper GetHelper(
IWebHostEnvironment hostingEnvironment = null,
IUrlHelperFactory urlHelperFactory = null,
@@ -948,7 +1121,7 @@ private static LinkTagHelper GetHelper(
private static ViewContext MakeViewContext(string requestPathBase = null)
{
- var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
+ var actionContext = new ActionContext(new DefaultHttpContext(), new AspNetCore.Routing.RouteData(), new ActionDescriptor());
if (requestPathBase != null)
{
actionContext.HttpContext.Request.PathBase = new PathString(requestPathBase);
@@ -1015,13 +1188,27 @@ private static IWebHostEnvironment MakeHostingEnvironment()
return hostingEnvironment.Object;
}
- private static IUrlHelperFactory MakeUrlHelperFactory()
+ private Endpoint CreateEndpoint()
+ {
+ return new Endpoint(
+ (context) => Task.CompletedTask,
+ new EndpointMetadataCollection(
+ [new ResourceAssetCollection([
+ new("css/site.fingerprint.css", [new ResourceAssetProperty("label", "css/site.css")]),
+ new("base.fingerprint.css", [new ResourceAssetProperty("label", "base.css")]),
+ new("fallback.fingerprint.css", [new ResourceAssetProperty("label", "fallback.css")]),
+ ])]),
+ "Test");
+ }
+
+ private static IUrlHelperFactory MakeUrlHelperFactory(Func content = null)
{
var urlHelper = new Mock();
+ content ??= (url) => url;
urlHelper
.Setup(helper => helper.Content(It.IsAny()))
- .Returns(new Func(url => url));
+ .Returns(new Func(content));
var urlHelperFactory = new Mock();
urlHelperFactory
.Setup(f => f.GetUrlHelper(It.IsAny()))
diff --git a/src/Mvc/Mvc.TagHelpers/test/ScriptTagHelperTest.cs b/src/Mvc/Mvc.TagHelpers/test/ScriptTagHelperTest.cs
index ccee2f22d48a..e6877cf7e8b3 100644
--- a/src/Mvc/Mvc.TagHelpers/test/ScriptTagHelperTest.cs
+++ b/src/Mvc/Mvc.TagHelpers/test/ScriptTagHelperTest.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text;
+using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Http;
@@ -13,7 +14,6 @@
using Microsoft.AspNetCore.Mvc.ViewEngines;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
-using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging;
@@ -638,6 +638,176 @@ public void RenderScriptTags_WithFileVersion()
Assert.Equal("/js/site.js?v=f4OxZX_x_FO5LcGBSKHWXfwtSx-j1ncoSt3SABJtkGk", output.Attributes["src"].Value);
}
+ [Theory]
+ [InlineData("~/js/site.js", "/js/site.fingerprint.js")]
+ [InlineData("/js/site.js", "/js/site.fingerprint.js")]
+ [InlineData("js/site.js", "js/site.fingerprint.js")]
+ public void RenderScriptTags_WithFileVersion_UsingResourceCollection(string src, string expected)
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ new TagHelperAttribute("src", src),
+ new TagHelperAttribute("asp-append-version", "true")
+ });
+ var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
+
+ var helper = GetHelper(urlHelperFactory: MakeUrlHelperFactory(value =>
+ value.StartsWith("~/", StringComparison.Ordinal) ? value[1..] : value));
+
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ helper.Src = src;
+ helper.AppendVersion = true;
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("script", output.TagName);
+ Assert.Equal(expected, output.Attributes["src"].Value);
+ }
+
+ [Theory]
+ [InlineData("~/js/site.js")]
+ [InlineData("/approot/js/site.js")]
+ public void RenderScriptTags_PathBase_WithFileVersion_UsingResourceCollection(string path)
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ new TagHelperAttribute("src", path),
+ new TagHelperAttribute("asp-append-version", "true")
+ });
+ var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
+
+ var urlHelperFactory = MakeUrlHelperFactory(value =>
+ {
+ if (value.StartsWith("~/", StringComparison.Ordinal))
+ {
+ return value.Replace("~/", "/approot/");
+ }
+
+ return value;
+ });
+
+ var helper = GetHelper(urlHelperFactory: urlHelperFactory);
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ helper.ViewContext.HttpContext.Request.PathBase = "/approot";
+ helper.Src = path;
+ helper.AppendVersion = true;
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("script", output.TagName);
+ Assert.Equal("/approot/js/site.fingerprint.js", output.Attributes["src"].Value);
+ }
+
+ [Fact]
+ public void ScriptTagHelper_RendersProvided_ImportMap()
+ {
+ // Arrange
+ var importMap = new ImportMapDefinition(
+ new Dictionary
+ {
+ { "jquery", "https://code.jquery.com/jquery-3.5.1.min.js" },
+ { "bootstrap", "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" }
+ },
+ new Dictionary>
+ {
+ ["development"] = new Dictionary
+ {
+ { "jquery", "https://code.jquery.com/jquery-3.5.1.js" },
+ { "bootstrap", "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.js" }
+ }.AsReadOnly()
+ },
+ new Dictionary
+ {
+ { "https://code.jquery.com/jquery-3.5.1.js", "sha384-jquery" },
+ { "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.js", "sha256-bootstrap" }
+ });
+
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ new TagHelperAttribute("type", "importmap"),
+ new TagHelperAttribute("asp-importmap", importMap)
+ });
+ var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
+
+ var helper = GetHelper();
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ helper.Type = "importmap";
+ helper.ImportMap = importMap;
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("script", output.TagName);
+ Assert.Equal(importMap.ToJson(), output.Content.GetContent());
+ }
+
+ [Fact]
+ public void ScriptTagHelper_RendersImportMap_FromEndpoint()
+ {
+ // Arrange
+ var importMap = new ImportMapDefinition(
+ new Dictionary
+ {
+ { "jquery", "https://code.jquery.com/jquery-3.5.1.min.js" },
+ { "bootstrap", "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" }
+ },
+ new Dictionary>
+ {
+ ["development"] = new Dictionary
+ {
+ { "jquery", "https://code.jquery.com/jquery-3.5.1.js" },
+ { "bootstrap", "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.js" }
+ }.AsReadOnly()
+ },
+ new Dictionary
+ {
+ { "https://code.jquery.com/jquery-3.5.1.js", "sha384-jquery" },
+ { "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.js", "sha256-bootstrap" }
+ });
+
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ new TagHelperAttribute("type", "importmap"),
+ });
+ var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
+
+ var helper = GetHelper();
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint(importMap));
+ helper.Type = "importmap";
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("script", output.TagName);
+ Assert.Equal(importMap.ToJson(), output.Content.GetContent());
+ }
+
+ private Endpoint CreateEndpoint(ImportMapDefinition importMap = null)
+ {
+ return new Endpoint(
+ (context) => Task.CompletedTask,
+ new EndpointMetadataCollection(
+ [new ResourceAssetCollection([
+ new("js/site.fingerprint.js", [new ResourceAssetProperty("label", "js/site.js")]),
+ new("common.fingerprint.js", [new ResourceAssetProperty("label", "common.js")]),
+ new("fallback.fingerprint.js", [new ResourceAssetProperty("label", "fallback.js")]),
+ ]),
+ importMap ?? new ImportMapDefinition(null, null, null)]),
+ "Test");
+ }
+
[Fact]
public void RenderScriptTags_WithFileVersion_AndRequestPathBase()
{
@@ -694,6 +864,38 @@ public void RenderScriptTags_FallbackSrc_WithFileVersion()
"]]\"));", output.PostElement.GetContent());
}
+ [Fact]
+ public void RenderScriptTags_FallbackSrc_AppendVersion_WithStaticAssets()
+ {
+ // Arrange
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ new TagHelperAttribute("src", "/js/site.js"),
+ new TagHelperAttribute("asp-fallback-src-include", "fallback.js"),
+ new TagHelperAttribute("asp-fallback-test", "isavailable()"),
+ new TagHelperAttribute("asp-append-version", "true")
+ });
+ var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
+
+ var helper = GetHelper();
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ helper.FallbackSrc = "fallback.js";
+ helper.FallbackTestExpression = "isavailable()";
+ helper.AppendVersion = true;
+ helper.Src = "/js/site.js";
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("script", output.TagName);
+ Assert.Equal("/js/site.fingerprint.js", output.Attributes["src"].Value);
+ Assert.Equal(Environment.NewLine + "]]\"));", output.PostElement.GetContent());
+ }
+
[Fact]
public void RenderScriptTags_FallbackSrc_WithFileVersion_EncodesAsExpected()
{
@@ -784,6 +986,45 @@ public void RenderScriptTags_GlobbedSrc_WithFileVersion()
Assert.Equal(expectedContent, content);
}
+ [Fact]
+ public void RenderScriptTags_GlobbedSrc_WithFileVersion_WithStaticAssets()
+ {
+ // Arrange
+ var expectedContent = "" +
+ "";
+ var context = MakeTagHelperContext(
+ attributes: new TagHelperAttributeList
+ {
+ new TagHelperAttribute("src", "/js/site.js"),
+ new TagHelperAttribute("asp-src-include", "*.js"),
+ new TagHelperAttribute("asp-append-version", "true")
+ });
+ var output = MakeTagHelperOutput("script", attributes: new TagHelperAttributeList());
+ var globbingUrlBuilder = new Mock(
+ new TestFileProvider(),
+ Mock.Of(),
+ PathString.Empty);
+ globbingUrlBuilder.Setup(g => g.BuildUrlList(null, "*.js", null))
+ .Returns(new[] { "/common.js" });
+
+ var helper = GetHelper();
+ helper.ViewContext.HttpContext.SetEndpoint(CreateEndpoint());
+ helper.GlobbingUrlBuilder = globbingUrlBuilder.Object;
+ helper.SrcInclude = "*.js";
+ helper.AppendVersion = true;
+ helper.Src = "/js/site.js";
+
+ // Act
+ helper.Process(context, output);
+
+ // Assert
+ Assert.Equal("script", output.TagName);
+ Assert.Equal("/js/site.fingerprint.js", output.Attributes["src"].Value);
+ var content = HtmlContentUtilities.HtmlContentToString(output, new HtmlTestEncoder());
+ Assert.Equal(expectedContent, content);
+ }
+
private static ScriptTagHelper GetHelper(
IWebHostEnvironment hostingEnvironment = null,
IUrlHelperFactory urlHelperFactory = null,
@@ -823,10 +1064,10 @@ private TagHelperContext MakeTagHelperContext(
private static ViewContext MakeViewContext(string requestPathBase = null)
{
- var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
+ var actionContext = new ActionContext(new DefaultHttpContext(), new AspNetCore.Routing.RouteData(), new ActionDescriptor());
if (requestPathBase != null)
{
- actionContext.HttpContext.Request.PathBase = new Http.PathString(requestPathBase);
+ actionContext.HttpContext.Request.PathBase = new PathString(requestPathBase);
}
var metadataProvider = new EmptyModelMetadataProvider();
@@ -876,13 +1117,13 @@ private static IWebHostEnvironment MakeHostingEnvironment()
return hostingEnvironment.Object;
}
- private static IUrlHelperFactory MakeUrlHelperFactory()
+ private static IUrlHelperFactory MakeUrlHelperFactory(Func urlResolver = null)
{
var urlHelper = new Mock();
-
+ urlResolver ??= (url) => url;
urlHelper
.Setup(helper => helper.Content(It.IsAny()))
- .Returns(new Func(url => url));
+ .Returns(new Func(urlResolver));
var urlHelperFactory = new Mock();
urlHelperFactory
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Builder/ControllerActionEndpointConventionBuilderResourceCollectionExtensions.cs b/src/Mvc/Mvc.ViewFeatures/src/Builder/ControllerActionEndpointConventionBuilderResourceCollectionExtensions.cs
new file mode 100644
index 000000000000..9e1d1b7234d6
--- /dev/null
+++ b/src/Mvc/Mvc.ViewFeatures/src/Builder/ControllerActionEndpointConventionBuilderResourceCollectionExtensions.cs
@@ -0,0 +1,61 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Linq;
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.Endpoints;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Routing;
+using static Microsoft.AspNetCore.Builder.ControllerEndpointRouteBuilderExtensions;
+
+namespace Microsoft.AspNetCore.Builder;
+
+///
+/// Extensions for .
+///
+public static class ControllerActionEndpointConventionBuilderResourceCollectionExtensions
+{
+ private const string ResourceCollectionResolverKey = "__ResourceCollectionResolver";
+
+ ///
+ /// Adds a metadata instance to the endpoints.
+ ///
+ /// The .
+ /// The manifest associated with the assets.
+ ///
+ public static ControllerActionEndpointConventionBuilder WithStaticAssets(
+ this ControllerActionEndpointConventionBuilder builder,
+ string manifestPath = null)
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ if (builder.Items.TryGetValue(EndpointRouteBuilderKey, out var endpointBuilder))
+ {
+ var (resolver, registered) = builder.Items.TryGetValue(ResourceCollectionResolverKey, out var value)
+ ? ((ResourceCollectionResolver)value, true)
+ : (new ResourceCollectionResolver((IEndpointRouteBuilder)endpointBuilder), false);
+
+ resolver.ManifestName = manifestPath;
+ if (!registered)
+ {
+ builder.Items[ResourceCollectionResolverKey] = resolver;
+ builder.Add(endpointBuilder =>
+ {
+ // Do not add metadata to API controllers
+ if (endpointBuilder.Metadata.OfType().Any())
+ {
+ return;
+ }
+
+ var collection = resolver.ResolveResourceCollection();
+ var importMap = resolver.ResolveImportMap();
+
+ endpointBuilder.Metadata.Add(collection);
+ endpointBuilder.Metadata.Add(importMap);
+ });
+ }
+ }
+
+ return builder;
+ }
+}
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj b/src/Mvc/Mvc.ViewFeatures/src/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj
index c6af4f42a00d..24dd476f1022 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj
+++ b/src/Mvc/Mvc.ViewFeatures/src/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj
@@ -15,6 +15,7 @@
true
false
disable
+ $(DefineConstants);MVC_VIEWFEATURES
@@ -31,6 +32,7 @@
+
diff --git a/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Unshipped.txt
index 7dc5c58110bf..db29399a5c9e 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Unshipped.txt
+++ b/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Unshipped.txt
@@ -1 +1,3 @@
#nullable enable
+Microsoft.AspNetCore.Builder.ControllerActionEndpointConventionBuilderResourceCollectionExtensions
+~static Microsoft.AspNetCore.Builder.ControllerActionEndpointConventionBuilderResourceCollectionExtensions.WithStaticAssets(this Microsoft.AspNetCore.Builder.ControllerActionEndpointConventionBuilder builder, string manifestPath = null) -> Microsoft.AspNetCore.Builder.ControllerActionEndpointConventionBuilder
diff --git a/src/Mvc/Mvc.ViewFeatures/test/Builder/ControllerActionEndpointConventionBuilderResourceCollectionExtensionsTest.cs b/src/Mvc/Mvc.ViewFeatures/test/Builder/ControllerActionEndpointConventionBuilderResourceCollectionExtensionsTest.cs
new file mode 100644
index 000000000000..84806020d64f
--- /dev/null
+++ b/src/Mvc/Mvc.ViewFeatures/test/Builder/ControllerActionEndpointConventionBuilderResourceCollectionExtensionsTest.cs
@@ -0,0 +1,362 @@
+// 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;
+using System.Reflection;
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.AspNetCore.Mvc.Controllers;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.FileProviders;
+
+namespace Microsoft.AspNetCore.Builder;
+
+public class ControllerActionEndpointConventionBuilderResourceCollectionExtensionsTest
+{
+ [Fact]
+ public void WithStaticAssets_AddsEmptyResourceCollection_ToEndpoints_NoStaticAssetsMapped()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ var builder = endpointBuilder.MapControllers();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.First().Endpoints, e =>
+ {
+ var apiController = e.Metadata.GetMetadata();
+ if (apiController != null)
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.Null(metadata);
+ }
+ else
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(0, list.Count);
+ }
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsEmptyResourceCollection_ToEndpoints_NoMatchingStaticAssetsMapped()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = endpointBuilder.MapControllers();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.Skip(1).First().Endpoints, e =>
+ {
+ var apiController = e.Metadata.GetMetadata();
+ if (apiController != null)
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.Null(metadata);
+ }
+ else
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(0, list.Count);
+ }
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsResourceCollection_ToEndpoints_NamedManifest()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = endpointBuilder.MapControllers();
+
+ // Act
+ builder.WithStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+
+ // Assert
+ var endpoints = endpointBuilder.DataSources.Skip(1).First().Endpoints;
+ Assert.All(endpoints, e =>
+ {
+ var apiController = e.Metadata.GetMetadata();
+ if (apiController != null)
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.Null(metadata);
+ }
+ else
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("named.css", list[0].Url);
+ }
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsResourceCollection_ToEndpoints_DefaultManifest()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+ var builder = endpointBuilder.MapControllers();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.Skip(1).First().Endpoints, e =>
+ {
+ var apiController = e.Metadata.GetMetadata();
+ if (apiController != null)
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.Null(metadata);
+ }
+ else
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("default.css", list[0].Url);
+ }
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsDefaultResourceCollectionToEndpoints_WhenNoManifestProvided_EvenIfManyAvailable()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+ endpointBuilder.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = endpointBuilder.MapControllers();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.Skip(2).First().Endpoints, e =>
+ {
+ var apiController = e.Metadata.GetMetadata();
+ if (apiController != null)
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.Null(metadata);
+ }
+ else
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("default.css", list[0].Url);
+ }
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsMatchingResourceCollectionToEndpoints_WhenExplicitManifestProvided_EvenIfManyAvailable()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+ endpointBuilder.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = endpointBuilder.MapControllers();
+
+ // Act
+ builder.WithStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+
+ // Assert
+ Assert.All(endpointBuilder.DataSources.Skip(2).First().Endpoints, e =>
+ {
+ var apiController = e.Metadata.GetMetadata();
+ if (apiController != null)
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.Null(metadata);
+ }
+ else
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("named.css", list[0].Url);
+ }
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsCollectionFromGroup_WhenMappedInsideAnEndpointGroup()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+
+ var group = endpointBuilder.MapGroup("/group");
+ group.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = group.MapControllers();
+
+ // Act
+ builder.WithStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+
+ // Assert
+ var groupEndpoints = Assert.IsAssignableFrom(group).DataSources;
+ Assert.All(groupEndpoints.Skip(1).First().Endpoints, e =>
+ {
+ var apiController = e.Metadata.GetMetadata();
+ if (apiController != null)
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.Null(metadata);
+ }
+ else
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(1, list.Count);
+ Assert.Equal("named.css", list[0].Url);
+ }
+ });
+ }
+
+ [Fact]
+ public void WithStaticAssets_AddsEmptyCollectionFromGroup_WhenMappingNotFound_InsideGroup()
+ {
+ // Arrange
+ var endpointBuilder = new TestEndpointRouteBuilder();
+ endpointBuilder.MapStaticAssets();
+
+ var group = endpointBuilder.MapGroup("/group");
+ group.MapStaticAssets("TestManifests/Test.staticwebassets.endpoints.json");
+ var builder = group.MapControllers();
+
+ // Act
+ builder.WithStaticAssets();
+
+ // Assert
+ var groupEndpoints = Assert.IsAssignableFrom(group).DataSources;
+ Assert.All(groupEndpoints.Skip(1).First().Endpoints, e =>
+ {
+ var apiController = e.Metadata.GetMetadata();
+ if (apiController != null)
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.Null(metadata);
+ }
+ else
+ {
+ var metadata = e.Metadata.GetMetadata();
+ Assert.NotNull(metadata);
+ var list = Assert.IsAssignableFrom>(metadata);
+ Assert.Equal(0, list.Count);
+ }
+ });
+ }
+
+ private class TestEndpointRouteBuilder : IEndpointRouteBuilder
+ {
+ private readonly ApplicationBuilder _applicationBuilder;
+
+ public TestEndpointRouteBuilder()
+ {
+ _applicationBuilder = new ApplicationBuilder(ServiceProvider);
+ }
+
+ public IServiceProvider ServiceProvider { get; } = CreateServiceProvider();
+
+ private static IServiceProvider CreateServiceProvider()
+ {
+ var collection = new ServiceCollection();
+ collection.AddSingleton(new ConfigurationBuilder().Build());
+ collection.AddSingleton(new TestWebHostEnvironment());
+ collection.AddSingleton(new ApplicationPartManager());
+ collection.AddSingleton(new DiagnosticListener("Microsoft.AspNetCore"));
+ collection.AddSingleton(new TestDiagnosticSource());
+ collection.AddLogging();
+ collection.AddOptions();
+ collection.AddMvcCore()
+ .ConfigureApplicationPartManager(apm =>
+ {
+ apm.FeatureProviders.Clear();
+ apm.FeatureProviders.Add(new TestControllerFeatureProvider());
+ });
+ return collection.BuildServiceProvider();
+ }
+
+ public ICollection DataSources { get; } = [];
+
+ public IApplicationBuilder CreateApplicationBuilder()
+ {
+ return _applicationBuilder.New();
+ }
+
+ private class TestControllerFeatureProvider : IApplicationFeatureProvider
+ {
+ public void PopulateFeature(IEnumerable parts, ControllerFeature feature)
+ {
+ feature.Controllers.Clear();
+ feature.Controllers.Add(typeof(TestController).GetTypeInfo());
+ feature.Controllers.Add(typeof(MyApiController).GetTypeInfo());
+ }
+ }
+
+ private class TestController : Controller
+ {
+ [HttpGet("/")]
+ public void Index() { }
+ }
+
+ [ApiController]
+ private class MyApiController : ControllerBase
+ {
+ [HttpGet("other")]
+ public void Index() { }
+ }
+
+ private class TestWebHostEnvironment : IWebHostEnvironment
+ {
+ public string ApplicationName { get; set; } = "TestApplication";
+ public string EnvironmentName { get; set; } = "TestEnvironment";
+ public string WebRootPath { get; set; } = "";
+ public IFileProvider WebRootFileProvider { get => ContentRootFileProvider; set { } }
+ public string ContentRootPath { get; set; } = Directory.GetCurrentDirectory();
+ public IFileProvider ContentRootFileProvider { get; set; } = CreateTestFileProvider();
+
+ private static TestFileProvider CreateTestFileProvider()
+ {
+ var provider = new TestFileProvider();
+ provider.AddFile("site.css", "body { color: red; }");
+ return provider;
+ }
+ }
+
+ private class TestDiagnosticSource : DiagnosticSource
+ {
+ public override bool IsEnabled(string name)
+ {
+ return false;
+ }
+
+ public override void Write(string name, object value) { }
+ }
+ }
+}
diff --git a/src/Mvc/Mvc.ViewFeatures/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test.csproj b/src/Mvc/Mvc.ViewFeatures/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test.csproj
index 2957fc97c638..1231fc4ce0b1 100644
--- a/src/Mvc/Mvc.ViewFeatures/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test.csproj
+++ b/src/Mvc/Mvc.ViewFeatures/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test.csproj
@@ -4,6 +4,16 @@
$(DefaultNetCoreTargetFramework)
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Mvc/Mvc.ViewFeatures/test/TestApplication.staticwebassets.endpoints.json b/src/Mvc/Mvc.ViewFeatures/test/TestApplication.staticwebassets.endpoints.json
new file mode 100644
index 000000000000..586241880352
--- /dev/null
+++ b/src/Mvc/Mvc.ViewFeatures/test/TestApplication.staticwebassets.endpoints.json
@@ -0,0 +1,17 @@
+{
+ "Version": 1,
+ "Endpoints": [
+ {
+ "Route": "default.css",
+ "AssetFile": "default.css",
+ "Selectors": [],
+ "EndpointProperties": [],
+ "ResponseHeaders": [
+ {
+ "Name": "ETag",
+ "Value": "\"Fake\""
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Mvc/Mvc.ViewFeatures/test/TestManifests/Test.staticwebassets.endpoints.json b/src/Mvc/Mvc.ViewFeatures/test/TestManifests/Test.staticwebassets.endpoints.json
new file mode 100644
index 000000000000..77815b7c379c
--- /dev/null
+++ b/src/Mvc/Mvc.ViewFeatures/test/TestManifests/Test.staticwebassets.endpoints.json
@@ -0,0 +1,17 @@
+{
+ "Version": 1,
+ "Endpoints": [
+ {
+ "Route": "named.css",
+ "AssetFile": "named.css",
+ "Selectors": [],
+ "EndpointProperties": [],
+ "ResponseHeaders": [
+ {
+ "Name": "ETag",
+ "Value": "\"Fake\""
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/App.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/App.razor
index 0a2cdaa5391c..caa3e2244442 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/App.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/App.razor
@@ -6,10 +6,11 @@
@*#if (SampleContent)
-
+
##endif*@
-
-
+
+
+
@*#if (SampleContent)
##endif*@
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Pages/Shared/_Layout.cshtml b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Pages/Shared/_Layout.cshtml
index 0ad799723ae6..8fc776a1fd58 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Pages/Shared/_Layout.cshtml
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Pages/Shared/_Layout.cshtml
@@ -4,6 +4,7 @@
@ViewData["Title"] - Company.WebApplication1
+
@@ -53,4 +54,4 @@
@await RenderSectionAsync("Scripts", required: false)