From b34d553e442d28a5c095c095f34d77b5516e2355 Mon Sep 17 00:00:00 2001 From: Stanley Cheung Date: Fri, 19 Jul 2024 18:39:01 -0700 Subject: [PATCH 01/48] Bump version on master to 2.66.0-dev (#2491) --- build/version.props | 4 ++-- src/Grpc.Core.Api/VersionInfo.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/version.props b/build/version.props index b2a2e580f..75373120d 100644 --- a/build/version.props +++ b/build/version.props @@ -2,13 +2,13 @@ - 2.65.0-dev + 2.66.0-dev 2.0.0.0 - 2.65.0.0 + 2.66.0.0 diff --git a/src/Grpc.Core.Api/VersionInfo.cs b/src/Grpc.Core.Api/VersionInfo.cs index f46f3d040..d4b472b99 100644 --- a/src/Grpc.Core.Api/VersionInfo.cs +++ b/src/Grpc.Core.Api/VersionInfo.cs @@ -36,10 +36,10 @@ public static class VersionInfo /// /// Current AssemblyFileVersion of gRPC C# assemblies /// - public const string CurrentAssemblyFileVersion = "2.65.0.0"; + public const string CurrentAssemblyFileVersion = "2.66.0.0"; /// /// Current version of gRPC C# /// - public const string CurrentVersion = "2.65.0-dev"; + public const string CurrentVersion = "2.66.0-dev"; } From 540e87bf70aff8bbe395e4c7d499a8dd64e89551 Mon Sep 17 00:00:00 2001 From: Mayuki Sawatari Date: Tue, 30 Jul 2024 12:21:36 +0900 Subject: [PATCH 02/48] Fix failure to create GrpcChannel under Wine compatibility layer (including Steam Proton and Apple Game Porting Toolkit) (#2496) --- src/Grpc.Net.Client/Internal/Native.cs | 37 ++++++++++++++++---------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/Grpc.Net.Client/Internal/Native.cs b/src/Grpc.Net.Client/Internal/Native.cs index c113030d9..90dd74fb1 100644 --- a/src/Grpc.Net.Client/Internal/Native.cs +++ b/src/Grpc.Net.Client/Internal/Native.cs @@ -64,21 +64,30 @@ internal static bool IsUwp(string frameworkDescription, Version version) } else { - var bufferSize = 0U; - var result = GetCurrentApplicationUserModelId(ref bufferSize, Array.Empty()); - switch (result) + try { - case 15703: // APPMODEL_ERROR_NO_APPLICATION - return false; - case 0: // ERROR_SUCCESS - case 122: // ERROR_INSUFFICIENT_BUFFER - // Success is actually insufficient buffer as we're really only looking for - // not NO_APPLICATION and we're not actually giving a buffer here. The - // API will always return NO_APPLICATION if we're not running under a - // WinRT process, no matter what size the buffer is. - return true; - default: - throw new InvalidOperationException($"Failed to get AppModelId, result was {result}."); + var bufferSize = 0U; + var result = GetCurrentApplicationUserModelId(ref bufferSize, Array.Empty()); + switch (result) + { + case 15703: // APPMODEL_ERROR_NO_APPLICATION + return false; + case 0: // ERROR_SUCCESS + case 122: // ERROR_INSUFFICIENT_BUFFER + // Success is actually insufficient buffer as we're really only looking for + // not NO_APPLICATION and we're not actually giving a buffer here. The + // API will always return NO_APPLICATION if we're not running under a + // WinRT process, no matter what size the buffer is. + return true; + default: + throw new InvalidOperationException($"Failed to get AppModelId, result was {result}."); + } + } + catch (EntryPointNotFoundException) + { + // Wine compatibility layers such as Steam Deck/Steam OS Proton and the Apple Game Porting Toolkit + // return Windows 8 or later as the OS version, but does not implement the GetCurrentApplicationUserModelId API. + return false; } } } From cd875d90974565a5e46b34c5cbcdeb515b2e638e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Tue, 13 Aug 2024 21:08:04 -0700 Subject: [PATCH 03/48] Update .NET 9 SDK and resolve warnings (#2502) Co-authored-by: James Newton-King --- .gitignore | 1 - Directory.Packages.props | 14 ++-- examples/Certifier/Client/Program.cs | 2 +- examples/Container/Frontend/Frontend.csproj | 5 +- examples/Container/deploy.ps1 | 6 +- global.json | 2 +- grpcweb_interoptests.sh | 12 +-- .../Grpc.AspNetCore.Microbenchmarks.csproj | 1 - perf/benchmarkapps/GrpcClient/Program.cs | 7 +- .../Balancer/ConnectionTests.cs | 4 + .../Grpc.AspNetCore.FunctionalTests.csproj | 3 +- ...pNetCore.Server.ClientFactory.Tests.csproj | 2 +- .../Grpc.AspNetCore.Server.Tests.csproj | 4 +- .../GrpcProtocolHelpersTests.cs | 15 +++- .../HttpContextServerCallContextTests.cs | 4 +- .../Grpc.Net.Client.Tests.csproj | 2 +- .../Grpc.Net.ClientFactory.Tests.csproj | 2 +- test/Shared/Logging/BeginScopeContext.cs | 14 ++++ test/Shared/Logging/ITestSink.cs | 29 +++++++ test/Shared/Logging/LogLevelAttribute.cs | 20 +++++ test/Shared/Logging/TestLogger.cs | 78 +++++++++++++++++++ test/Shared/Logging/TestLoggerFactory.cs | 32 ++++++++ test/Shared/Logging/TestLoggerProvider.cs | 26 +++++++ test/Shared/Logging/TestLoggerT.cs | 39 ++++++++++ test/Shared/Logging/TestSink.cs | 67 ++++++++++++++++ test/Shared/Logging/WriteContext.cs | 39 ++++++++++ testassets/FunctionalTestsWebsite/Startup.cs | 4 +- testassets/README.md | 8 +- testassets/Shared/InteropClient.cs | 4 + 29 files changed, 400 insertions(+), 46 deletions(-) create mode 100644 test/Shared/Logging/BeginScopeContext.cs create mode 100644 test/Shared/Logging/ITestSink.cs create mode 100644 test/Shared/Logging/LogLevelAttribute.cs create mode 100644 test/Shared/Logging/TestLogger.cs create mode 100644 test/Shared/Logging/TestLoggerFactory.cs create mode 100644 test/Shared/Logging/TestLoggerProvider.cs create mode 100644 test/Shared/Logging/TestLoggerT.cs create mode 100644 test/Shared/Logging/TestSink.cs create mode 100644 test/Shared/Logging/WriteContext.cs diff --git a/.gitignore b/.gitignore index e285430cb..fd2a2ba46 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,6 @@ launchSettings.json BenchmarkDotNet.Artifacts/ BDN.Generated/ binaries/ -global.json .vscode/ *.binlog build/feed diff --git a/Directory.Packages.props b/Directory.Packages.props index 0977689f4..f8e0a7a8e 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -4,7 +4,7 @@ 9.0.0-preview.5.24306.11 8.0.6 7.0.5 - 6.0.11 + 6.0.33 2.63.0 1.6.0 1.8.1 @@ -57,21 +57,20 @@ - + - + - + - - + @@ -80,10 +79,9 @@ - - + diff --git a/examples/Certifier/Client/Program.cs b/examples/Certifier/Client/Program.cs index 0435a7b64..846ad92ae 100644 --- a/examples/Certifier/Client/Program.cs +++ b/examples/Certifier/Client/Program.cs @@ -73,7 +73,7 @@ static HttpClientHandler CreateHttpHandler(bool includeClientCertificate) // Load client certificate var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location); var certPath = Path.Combine(basePath!, "Certs", "client.pfx"); - var clientCertificate = new X509Certificate2(certPath, "1111"); + var clientCertificate = X509CertificateLoader.LoadPkcs12FromFile(certPath, "1111"); handler.ClientCertificates.Add(clientCertificate); } diff --git a/examples/Container/Frontend/Frontend.csproj b/examples/Container/Frontend/Frontend.csproj index cd0fc7b99..73a9dd89a 100644 --- a/examples/Container/Frontend/Frontend.csproj +++ b/examples/Container/Frontend/Frontend.csproj @@ -1,7 +1,10 @@ - + net9.0 + + + $(NoWarn);CS0618 diff --git a/examples/Container/deploy.ps1 b/examples/Container/deploy.ps1 index 299a9dd85..141db2a89 100644 --- a/examples/Container/deploy.ps1 +++ b/examples/Container/deploy.ps1 @@ -1,8 +1,8 @@ -docker-compose -f .\docker-compose.yml build container-frontend -docker-compose -f .\docker-compose.yml build container-backend +docker compose -f .\docker-compose.yml build container-frontend +docker compose -f .\docker-compose.yml build container-backend kubectl delete -f .\Kubernetes\deploy-backend.yml kubectl apply -f .\Kubernetes\deploy-backend.yml kubectl delete -f .\Kubernetes\deploy-frontend.yml -kubectl apply -f .\Kubernetes\deploy-frontend.yml \ No newline at end of file +kubectl apply -f .\Kubernetes\deploy-frontend.yml diff --git a/global.json b/global.json index 334b825de..67d91a4f9 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "9.0.100-preview.5.24305.3", + "version": "9.0.100-preview.7.24407.12", "rollForward": "latestFeature" } } diff --git a/grpcweb_interoptests.sh b/grpcweb_interoptests.sh index e24d41b2e..eb7fd89c7 100755 --- a/grpcweb_interoptests.sh +++ b/grpcweb_interoptests.sh @@ -17,11 +17,11 @@ set -ex echo "Starting gRPC-Web interop test containers" -docker-compose -f docker-compose.yml build grpcweb-server -docker-compose -f docker-compose.yml build grpcweb-client +docker compose -f docker-compose.yml build grpcweb-server +docker compose -f docker-compose.yml build grpcweb-client -docker-compose -f docker-compose.yml up -d grpcweb-server -docker-compose -f docker-compose.yml up -d grpcweb-client +docker compose -f docker-compose.yml up -d grpcweb-server +docker compose -f docker-compose.yml up -d grpcweb-client sleep 5 @@ -34,6 +34,6 @@ cd ../../.. echo "Remove all containers" -docker-compose down +docker compose down -echo "gRPC-Web interop tests finished" \ No newline at end of file +echo "gRPC-Web interop tests finished" diff --git a/perf/Grpc.AspNetCore.Microbenchmarks/Grpc.AspNetCore.Microbenchmarks.csproj b/perf/Grpc.AspNetCore.Microbenchmarks/Grpc.AspNetCore.Microbenchmarks.csproj index d4107b395..22c7d13f7 100644 --- a/perf/Grpc.AspNetCore.Microbenchmarks/Grpc.AspNetCore.Microbenchmarks.csproj +++ b/perf/Grpc.AspNetCore.Microbenchmarks/Grpc.AspNetCore.Microbenchmarks.csproj @@ -25,7 +25,6 @@ - diff --git a/perf/benchmarkapps/GrpcClient/Program.cs b/perf/benchmarkapps/GrpcClient/Program.cs index 8c277b140..9517079bb 100644 --- a/perf/benchmarkapps/GrpcClient/Program.cs +++ b/perf/benchmarkapps/GrpcClient/Program.cs @@ -476,11 +476,8 @@ private static ChannelBase CreateChannel(string target) { var basePath = Path.GetDirectoryName(AppContext.BaseDirectory); var certPath = Path.Combine(basePath!, "Certs", "client.pfx"); - var clientCertificate = new X509Certificate2(certPath, "1111"); - httpClientHandler.SslOptions.ClientCertificates = new X509CertificateCollection - { - clientCertificate - }; + var clientCertificates = X509CertificateLoader.LoadPkcs12CollectionFromFile(certPath, "1111"); + httpClientHandler.SslOptions.ClientCertificates = clientCertificates; } #if NET5_0_OR_GREATER if (!string.IsNullOrEmpty(_options.UdsFileName)) diff --git a/test/FunctionalTests/Balancer/ConnectionTests.cs b/test/FunctionalTests/Balancer/ConnectionTests.cs index 72cb7dbdf..9476b5126 100644 --- a/test/FunctionalTests/Balancer/ConnectionTests.cs +++ b/test/FunctionalTests/Balancer/ConnectionTests.cs @@ -432,7 +432,11 @@ Task UnaryMethod(HelloRequest request, ServerCallContext context) // even after specifying the correct host override. var basePath = Path.GetDirectoryName(typeof(InProcessTestServer).Assembly.Location); var certPath = Path.Combine(basePath!, "localhost.pfx"); +#if NET9_0_OR_GREATER + var cert = X509CertificateLoader.LoadPkcs12FromFile(certPath, "11111"); +#else var cert = new X509Certificate2(certPath, "11111"); +#endif // Arrange using var endpoint1 = BalancerHelpers.CreateGrpcEndpoint(UnaryMethod, nameof(UnaryMethod), HttpProtocols.Http1AndHttp2, isHttps: true, certificate: cert); diff --git a/test/FunctionalTests/Grpc.AspNetCore.FunctionalTests.csproj b/test/FunctionalTests/Grpc.AspNetCore.FunctionalTests.csproj index 764ecff82..91868df0f 100644 --- a/test/FunctionalTests/Grpc.AspNetCore.FunctionalTests.csproj +++ b/test/FunctionalTests/Grpc.AspNetCore.FunctionalTests.csproj @@ -27,6 +27,7 @@ + @@ -37,8 +38,6 @@ - - PreserveNewest diff --git a/test/Grpc.AspNetCore.Server.ClientFactory.Tests/Grpc.AspNetCore.Server.ClientFactory.Tests.csproj b/test/Grpc.AspNetCore.Server.ClientFactory.Tests/Grpc.AspNetCore.Server.ClientFactory.Tests.csproj index 23b0efbc1..3c5fe497b 100644 --- a/test/Grpc.AspNetCore.Server.ClientFactory.Tests/Grpc.AspNetCore.Server.ClientFactory.Tests.csproj +++ b/test/Grpc.AspNetCore.Server.ClientFactory.Tests/Grpc.AspNetCore.Server.ClientFactory.Tests.csproj @@ -20,13 +20,13 @@ + - diff --git a/test/Grpc.AspNetCore.Server.Tests/Grpc.AspNetCore.Server.Tests.csproj b/test/Grpc.AspNetCore.Server.Tests/Grpc.AspNetCore.Server.Tests.csproj index 90d3b6664..3c52d8c27 100644 --- a/test/Grpc.AspNetCore.Server.Tests/Grpc.AspNetCore.Server.Tests.csproj +++ b/test/Grpc.AspNetCore.Server.Tests/Grpc.AspNetCore.Server.Tests.csproj @@ -27,6 +27,7 @@ + @@ -36,9 +37,6 @@ - - - diff --git a/test/Grpc.AspNetCore.Server.Tests/GrpcProtocolHelpersTests.cs b/test/Grpc.AspNetCore.Server.Tests/GrpcProtocolHelpersTests.cs index 7273ceafc..6fd6339a9 100644 --- a/test/Grpc.AspNetCore.Server.Tests/GrpcProtocolHelpersTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/GrpcProtocolHelpersTests.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -30,7 +30,7 @@ public class GrpcProtocolHelpersTests public void CreateAuthContext_CertWithAlternativeNames_UseAlternativeNamesAsPeerIdentity() { // Arrange - X509Certificate2 certificate = new X509Certificate2(TestHelpers.ResolvePath(@"Certs/outlookcom.crt")); + var certificate = LoadCertificate(TestHelpers.ResolvePath(@"Certs/outlookcom.crt")); // Act var authContext = GrpcProtocolHelpers.CreateAuthContext(certificate); @@ -57,7 +57,7 @@ public void CreateAuthContext_CertWithAlternativeNames_UseAlternativeNamesAsPeer public void CreateAuthContext_CertWithCommonName_UseCommonNameAsPeerIdentity() { // Arrange - var certificate = new X509Certificate2(TestHelpers.ResolvePath(@"Certs/client.crt")); + var certificate = LoadCertificate(TestHelpers.ResolvePath(@"Certs/client.crt")); // Act var authContext = GrpcProtocolHelpers.CreateAuthContext(certificate); @@ -99,4 +99,13 @@ public void TryDecodeTimeout_WithVariousUnits_ShouldMatchExpected(string timeout Assert.AreEqual(expectedSuccesfullyDecoded, successfullyDecoded); Assert.AreEqual(expectedTimespan, timeSpan); } + + public static X509Certificate2 LoadCertificate(string path) + { +#if NET9_0_OR_GREATER + return X509CertificateLoader.LoadCertificateFromFile(path); +#else + return new X509Certificate2(path); +#endif + } } diff --git a/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs b/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs index 2730119bb..63f357cff 100644 --- a/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -537,7 +537,7 @@ public void AuthContext_HasClientCertificate_Authenticated() { // Arrange var httpContext = new DefaultHttpContext(); - var certificate = new X509Certificate2(TestHelpers.ResolvePath(@"Certs/client.crt")); + var certificate = GrpcProtocolHelpersTests.LoadCertificate(TestHelpers.ResolvePath(@"Certs/client.crt")); httpContext.Connection.ClientCertificate = certificate; var serverCallContext = CreateServerCallContext(httpContext); diff --git a/test/Grpc.Net.Client.Tests/Grpc.Net.Client.Tests.csproj b/test/Grpc.Net.Client.Tests/Grpc.Net.Client.Tests.csproj index a04c10f08..d83170b49 100644 --- a/test/Grpc.Net.Client.Tests/Grpc.Net.Client.Tests.csproj +++ b/test/Grpc.Net.Client.Tests/Grpc.Net.Client.Tests.csproj @@ -32,6 +32,7 @@ + @@ -40,7 +41,6 @@ - diff --git a/test/Grpc.Net.ClientFactory.Tests/Grpc.Net.ClientFactory.Tests.csproj b/test/Grpc.Net.ClientFactory.Tests/Grpc.Net.ClientFactory.Tests.csproj index d134fd140..bdd09a4c2 100644 --- a/test/Grpc.Net.ClientFactory.Tests/Grpc.Net.ClientFactory.Tests.csproj +++ b/test/Grpc.Net.ClientFactory.Tests/Grpc.Net.ClientFactory.Tests.csproj @@ -23,12 +23,12 @@ + - diff --git a/test/Shared/Logging/BeginScopeContext.cs b/test/Shared/Logging/BeginScopeContext.cs new file mode 100644 index 000000000..5e93ee511 --- /dev/null +++ b/test/Shared/Logging/BeginScopeContext.cs @@ -0,0 +1,14 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable disable + +// Copied with permission from https://github.com/dotnet/aspnetcore/tree/08b60af1bca8cffff8ba0a72164fb7505ffe114d/src/Testing/src/Logging +namespace Microsoft.Extensions.Logging.Testing; + +public class BeginScopeContext +{ + public object Scope { get; set; } + + public string LoggerName { get; set; } +} diff --git a/test/Shared/Logging/ITestSink.cs b/test/Shared/Logging/ITestSink.cs new file mode 100644 index 000000000..546795f14 --- /dev/null +++ b/test/Shared/Logging/ITestSink.cs @@ -0,0 +1,29 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable disable + +using System; +using System.Collections.Concurrent; + +// Copied with permission from https://github.com/dotnet/aspnetcore/tree/08b60af1bca8cffff8ba0a72164fb7505ffe114d/src/Testing/src/Logging +namespace Microsoft.Extensions.Logging.Testing; + +public interface ITestSink +{ + event Action MessageLogged; + + event Action ScopeStarted; + + Func WriteEnabled { get; set; } + + Func BeginEnabled { get; set; } + + IProducerConsumerCollection Scopes { get; set; } + + IProducerConsumerCollection Writes { get; set; } + + void Write(WriteContext context); + + void Begin(BeginScopeContext context); +} diff --git a/test/Shared/Logging/LogLevelAttribute.cs b/test/Shared/Logging/LogLevelAttribute.cs new file mode 100644 index 000000000..65d90d30d --- /dev/null +++ b/test/Shared/Logging/LogLevelAttribute.cs @@ -0,0 +1,20 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable disable + +using System; + +// Copied with permission from https://github.com/dotnet/aspnetcore/tree/08b60af1bca8cffff8ba0a72164fb7505ffe114d/src/Testing/src/Logging +namespace Microsoft.Extensions.Logging.Testing; + +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false)] +public class LogLevelAttribute : Attribute +{ + public LogLevelAttribute(LogLevel logLevel) + { + LogLevel = logLevel; + } + + public LogLevel LogLevel { get; } +} diff --git a/test/Shared/Logging/TestLogger.cs b/test/Shared/Logging/TestLogger.cs new file mode 100644 index 000000000..70efb0a1c --- /dev/null +++ b/test/Shared/Logging/TestLogger.cs @@ -0,0 +1,78 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable disable + +using System; + +// Copied with permission from https://github.com/dotnet/aspnetcore/tree/08b60af1bca8cffff8ba0a72164fb7505ffe114d/src/Testing/src/Logging +namespace Microsoft.Extensions.Logging.Testing; + +public class TestLogger : ILogger +{ + private object _scope; + private readonly ITestSink _sink; + private readonly string _name; + private readonly Func _filter; + + public TestLogger(string name, ITestSink sink, bool enabled) + : this(name, sink, _ => enabled) + { + } + + public TestLogger(string name, ITestSink sink, Func filter) + { + _sink = sink; + _name = name; + _filter = filter; + } + + public string Name { get; set; } + + public IDisposable BeginScope(TState state) + { + _scope = state; + + _sink.Begin(new BeginScopeContext() + { + LoggerName = _name, + Scope = state, + }); + + return TestDisposable.Instance; + } + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + if (!IsEnabled(logLevel)) + { + return; + } + + _sink.Write(new WriteContext() + { + LogLevel = logLevel, + EventId = eventId, + State = state, + Exception = exception, + Formatter = (s, e) => formatter((TState)s, e), + LoggerName = _name, + Scope = _scope + }); + } + + public bool IsEnabled(LogLevel logLevel) + { + return logLevel != LogLevel.None && _filter(logLevel); + } + + private sealed class TestDisposable : IDisposable + { + public static readonly TestDisposable Instance = new TestDisposable(); + + public void Dispose() + { + // intentionally does nothing + } + } +} diff --git a/test/Shared/Logging/TestLoggerFactory.cs b/test/Shared/Logging/TestLoggerFactory.cs new file mode 100644 index 000000000..f22b44600 --- /dev/null +++ b/test/Shared/Logging/TestLoggerFactory.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable disable + +// Copied with permission from https://github.com/dotnet/aspnetcore/tree/08b60af1bca8cffff8ba0a72164fb7505ffe114d/src/Testing/src/Logging +namespace Microsoft.Extensions.Logging.Testing; + +public class TestLoggerFactory : ILoggerFactory +{ + private readonly ITestSink _sink; + private readonly bool _enabled; + + public TestLoggerFactory(ITestSink sink, bool enabled) + { + _sink = sink; + _enabled = enabled; + } + + public ILogger CreateLogger(string name) + { + return new TestLogger(name, _sink, _enabled); + } + + public void AddProvider(ILoggerProvider provider) + { + } + + public void Dispose() + { + } +} diff --git a/test/Shared/Logging/TestLoggerProvider.cs b/test/Shared/Logging/TestLoggerProvider.cs new file mode 100644 index 000000000..b3d10ea01 --- /dev/null +++ b/test/Shared/Logging/TestLoggerProvider.cs @@ -0,0 +1,26 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable disable + +// Copied with permission from https://github.com/dotnet/aspnetcore/tree/08b60af1bca8cffff8ba0a72164fb7505ffe114d/src/Testing/src/Logging +namespace Microsoft.Extensions.Logging.Testing; + +public class TestLoggerProvider : ILoggerProvider +{ + private readonly ITestSink _sink; + + public TestLoggerProvider(ITestSink sink) + { + _sink = sink; + } + + public ILogger CreateLogger(string categoryName) + { + return new TestLogger(categoryName, _sink, enabled: true); + } + + public void Dispose() + { + } +} diff --git a/test/Shared/Logging/TestLoggerT.cs b/test/Shared/Logging/TestLoggerT.cs new file mode 100644 index 000000000..f7b3fe8cb --- /dev/null +++ b/test/Shared/Logging/TestLoggerT.cs @@ -0,0 +1,39 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable disable + +using System; + +// Copied with permission from https://github.com/dotnet/aspnetcore/tree/08b60af1bca8cffff8ba0a72164fb7505ffe114d/src/Testing/src/Logging +namespace Microsoft.Extensions.Logging.Testing; + +public class TestLogger : ILogger +{ + private readonly ILogger _logger; + + public TestLogger(TestLoggerFactory factory) + { + _logger = factory.CreateLogger(); + } + + public IDisposable BeginScope(TState state) + { + return _logger.BeginScope(state); + } + + public bool IsEnabled(LogLevel logLevel) + { + return _logger.IsEnabled(logLevel); + } + + public void Log( + LogLevel logLevel, + EventId eventId, + TState state, + Exception exception, + Func formatter) + { + _logger.Log(logLevel, eventId, state, exception, formatter); + } +} diff --git a/test/Shared/Logging/TestSink.cs b/test/Shared/Logging/TestSink.cs new file mode 100644 index 000000000..7d85e63b3 --- /dev/null +++ b/test/Shared/Logging/TestSink.cs @@ -0,0 +1,67 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable disable + +using System; +using System.Collections.Concurrent; + +// Copied with permission from https://github.com/dotnet/aspnetcore/tree/08b60af1bca8cffff8ba0a72164fb7505ffe114d/src/Testing/src/Logging +namespace Microsoft.Extensions.Logging.Testing; + +public class TestSink : ITestSink +{ + private ConcurrentQueue _scopes; + private ConcurrentQueue _writes; + + public TestSink( + Func writeEnabled = null, + Func beginEnabled = null) + { + WriteEnabled = writeEnabled; + BeginEnabled = beginEnabled; + + _scopes = new ConcurrentQueue(); + _writes = new ConcurrentQueue(); + } + + public Func WriteEnabled { get; set; } + + public Func BeginEnabled { get; set; } + + public IProducerConsumerCollection Scopes { get => _scopes; set => _scopes = new ConcurrentQueue(value); } + + public IProducerConsumerCollection Writes { get => _writes; set => _writes = new ConcurrentQueue(value); } + + public event Action MessageLogged; + + public event Action ScopeStarted; + + public void Write(WriteContext context) + { + if (WriteEnabled == null || WriteEnabled(context)) + { + _writes.Enqueue(context); + } + MessageLogged?.Invoke(context); + } + + public void Begin(BeginScopeContext context) + { + if (BeginEnabled == null || BeginEnabled(context)) + { + _scopes.Enqueue(context); + } + ScopeStarted?.Invoke(context); + } + + public static bool EnableWithTypeName(WriteContext context) + { + return context.LoggerName.Equals(typeof(T).FullName); + } + + public static bool EnableWithTypeName(BeginScopeContext context) + { + return context.LoggerName.Equals(typeof(T).FullName); + } +} diff --git a/test/Shared/Logging/WriteContext.cs b/test/Shared/Logging/WriteContext.cs new file mode 100644 index 000000000..f3b9770bd --- /dev/null +++ b/test/Shared/Logging/WriteContext.cs @@ -0,0 +1,39 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable disable + +using System; + +// Copied with permission from https://github.com/dotnet/aspnetcore/tree/08b60af1bca8cffff8ba0a72164fb7505ffe114d/src/Testing/src/Logging +namespace Microsoft.Extensions.Logging.Testing; + +public class WriteContext +{ + public LogLevel LogLevel { get; set; } + + public EventId EventId { get; set; } + + public object State { get; set; } + + public Exception Exception { get; set; } + + public Func Formatter { get; set; } + + public object Scope { get; set; } + + public string LoggerName { get; set; } + + public string Message + { + get + { + return Formatter(State, Exception); + } + } + + public override string ToString() + { + return $"{LogLevel} {LoggerName}: {Message}"; + } +} diff --git a/testassets/FunctionalTestsWebsite/Startup.cs b/testassets/FunctionalTestsWebsite/Startup.cs index 624356cef..bb950fd17 100644 --- a/testassets/FunctionalTestsWebsite/Startup.cs +++ b/testassets/FunctionalTestsWebsite/Startup.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -229,5 +229,5 @@ private string GenerateJwtToken() } private readonly JwtSecurityTokenHandler JwtTokenHandler = new JwtSecurityTokenHandler(); - private readonly SymmetricSecurityKey SecurityKey = new SymmetricSecurityKey(Guid.NewGuid().ToByteArray()); + private readonly SymmetricSecurityKey SecurityKey = new SymmetricSecurityKey(new byte[256]); } diff --git a/testassets/README.md b/testassets/README.md index f2a293552..1ad0c80e2 100644 --- a/testassets/README.md +++ b/testassets/README.md @@ -22,8 +22,8 @@ ASP.NET Core app that hosts `InteropTestsGrpcWebClient`. Start the website by running it in Docker. Execute in the root of repository: ``` -docker-compose -f docker-compose.yml build grpcweb-client -docker-compose -f docker-compose.yml up grpcweb-client +docker compose -f docker-compose.yml build grpcweb-client +docker compose -f docker-compose.yml up grpcweb-client ``` gRPC-Web interop client is hosted at `http://localhost:8081`. @@ -45,8 +45,8 @@ ASP.NET Core app that hosts gRPC interop service. It is called by `InteropTestsC Start the website by running it in Docker. Execute in the root of repository: ``` -docker-compose -f docker-compose.yml build grpcweb-server -docker-compose -f docker-compose.yml up grpcweb-server +docker compose -f docker-compose.yml build grpcweb-server +docker compose -f docker-compose.yml up grpcweb-server ``` gRPC interop services are hosted at `http://localhost:8080`. diff --git a/testassets/Shared/InteropClient.cs b/testassets/Shared/InteropClient.cs index fa1cc0f31..3feccd70a 100644 --- a/testassets/Shared/InteropClient.cs +++ b/testassets/Shared/InteropClient.cs @@ -186,7 +186,11 @@ private HttpClientHandler CreateHttpClientHandler() { var pem = File.ReadAllText("Certs/ca.pem"); var certData = GetBytesFromPem(pem, "CERTIFICATE"); +#if NET9_0_OR_GREATER + var cert = X509CertificateLoader.LoadCertificate(certData!); +#else var cert = new X509Certificate2(certData!); +#endif httpClientHandler.ClientCertificates.Add(cert); } From a156ca9955b58e0b6d3dac17e66775217b13b63f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:20:29 +0800 Subject: [PATCH 04/48] Bump braces from 3.0.2 to 3.0.3 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2504) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../Tests/package-lock.json | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json index 4e02d8464..77248031a 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json @@ -1335,11 +1335,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1889,9 +1889,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5200,11 +5200,11 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browserslist": { @@ -5579,9 +5579,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "requires": { "to-regex-range": "^5.0.1" } From a732f517ea1d3d80b018895356aedc5a1307a73e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:20:47 +0800 Subject: [PATCH 05/48] Bump axios from 1.6.2 to 1.7.4 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2505) Bumps [axios](https://github.com/axios/axios) from 1.6.2 to 1.7.4. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.6.2...v1.7.4) --- updated-dependencies: - dependency-name: axios dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../Tests/package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json index 77248031a..60353ad09 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json @@ -1196,11 +1196,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -5096,11 +5096,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } From 74ee5f0ebfc44beb3fbf0a95bdd73c699c008cc9 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 15 Aug 2024 08:23:06 +0800 Subject: [PATCH 06/48] Update puppeteer (#2507) --- docker-compose.yml | 1 - examples/Container/docker-compose.yml | 1 - .../Tests/custom-environment.js | 13 +- .../Tests/package-lock.json | 5364 ++++------------- .../Tests/package.json | 6 +- 5 files changed, 1314 insertions(+), 4071 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2ad73174b..8049e72b8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3' services: grpcweb-server: build: diff --git a/examples/Container/docker-compose.yml b/examples/Container/docker-compose.yml index d37e6a055..2c18cadca 100644 --- a/examples/Container/docker-compose.yml +++ b/examples/Container/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3' services: container-frontend: build: diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/custom-environment.js b/testassets/InteropTestsGrpcWebWebsite/Tests/custom-environment.js index fe7278fb9..f8d4ddb38 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/custom-environment.js +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/custom-environment.js @@ -1,4 +1,8 @@ const JestPuppeteerEnvironment = require("jest-environment-puppeteer").TestEnvironment; + +// expect-puppeteer requires jest's expect to be on the global object. +// If the global object isn't populated then there is a null reference error in expect-puppeteer. +global.expect = require('expect').expect; const expect = require('expect-puppeteer').expect; class CustomEnvironment extends JestPuppeteerEnvironment { @@ -6,15 +10,20 @@ class CustomEnvironment extends JestPuppeteerEnvironment { async setup() { await super.setup(); + // Workaround puppeteer bug: https://github.com/argos-ci/jest-puppeteer/issues/586 + if (this.global.context.isIncognito === undefined) { + this.global.context.isIncognito = () => false; + } + console.log('Calling gRPC-Web client app'); var page = this.global.page; await page.goto('http://localhost:8081', { waitUntil: 'networkidle0' }); - // Wait for Blazor to finish loading + // Wait for Blazor to finish loading. await expect(page).toMatchTextContent('gRPC-Web interop tests'); - // Get test names + // Get test names. this.global.__GRPC_WEB_TEST_NAMES__ = await page.evaluate(() => getTestNames('GrpcWeb')); this.global.__GRPC_WEB_TEXT_TEST_NAMES__ = await page.evaluate(() => getTestNames('GrpcWebText')); } diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json index 60353ad09..01e4f5068 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json @@ -1,134 +1,71 @@ { "name": "grpc-web_interop_tests", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "grpc-web_interop_tests", "version": "1.0.0", "dependencies": { - "jest": "^29.5.0", - "jest-puppeteer": "^8.0.6", - "puppeteer": "^19.9.0" + "expect-puppeteer": "^10.0.0", + "jest": "^29.7.0", + "jest-puppeteer": "^10.0.1", + "puppeteer": "^23.0.2" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -138,19 +75,14 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -158,158 +90,114 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { - "@babel/types": "^7.21.4" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "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-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -380,9 +268,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -423,6 +314,34 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -446,11 +365,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -525,6 +444,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", @@ -540,11 +473,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -554,32 +487,29 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@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.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -587,12 +517,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -641,15 +571,15 @@ } }, "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -657,36 +587,36 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -703,83 +633,83 @@ } }, "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -787,13 +717,13 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -812,22 +742,22 @@ } }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -836,12 +766,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -850,13 +780,13 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -864,21 +794,21 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -889,11 +819,11 @@ } }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -905,86 +835,84 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, "node_modules/@puppeteer/browsers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.4.1.tgz", - "integrity": "sha512-4IICvy1McAkT/HyNZHIs7sp8ngBX1dmO0TPQ+FWq9ATQMqI8p+Ulm5A3kS2wYDh5HDHHkYrrETOu6rlj64VuTw==", - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", + "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", + "dependencies": { + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" }, "engines": { - "node": ">=14.1.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">=10" } }, "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -1000,30 +928,35 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dependencies": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1033,105 +966,103 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" - }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz", + "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==", + "dependencies": { + "undici-types": "~6.13.0" + } }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "optional": true, "dependencies": { "@types/node": "*" } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ansi-escapes": { @@ -1190,6 +1121,17 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1205,15 +1147,20 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + }, "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -1240,10 +1187,25 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -1255,33 +1217,36 @@ } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@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.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -1296,6 +1261,47 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", + "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", + "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", + "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "optional": true, + "dependencies": { + "streamx": "^2.18.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1315,14 +1321,12 @@ } ] }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "engines": { + "node": ">=10.0.0" } }, "node_modules/brace-expansion": { @@ -1346,9 +1350,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -1357,13 +1361,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -1433,9 +1441,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001478", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz", - "integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==", + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "funding": [ { "type": "opencollective", @@ -1474,26 +1482,23 @@ "node": ">=10" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/chromium-bidi": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.6.tgz", - "integrity": "sha512-TQOkWRaLI/IWvoP8XC+7jO4uHTIiAUiklXU1T0qszlUFEai9LgKXIBXy3pOS3EnQZ3bQtMbKUPkug0fTAEHCSw==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.4.tgz", + "integrity": "sha512-8zoq6ogmhQQkAKZVKO2ObFTl4uOkqoX1PlKQX3hZQ5E9cbUotcAb7h4pTNVAGGv8Z36PF3CtdOriEp/Rz82JqQ==", "dependencies": { - "mitt": "3.0.0" + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" }, "peerDependencies": { "devtools-protocol": "*" } }, "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ { "type": "github", @@ -1505,9 +1510,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/cliui": { "version": "8.0.1", @@ -1532,9 +1537,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" }, "node_modules/color-convert": { "version": "2.0.1", @@ -1582,13 +1587,13 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dependencies": { - "import-fresh": "^3.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", + "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "engines": { @@ -1596,6 +1601,14 @@ }, "funding": { "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cosmiconfig/node_modules/argparse": { @@ -1614,12 +1627,24 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dependencies": { - "node-fetch": "2.6.7" + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/cross-spawn": { @@ -1647,10 +1672,18 @@ "node": ">=0.8" } }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "engines": { + "node": ">= 14" + } + }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -1664,9 +1697,17 @@ } }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deepmerge": { "version": "4.3.1", @@ -1676,6 +1717,19 @@ "node": ">=0.10.0" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1693,22 +1747,22 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1107588", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz", - "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==" + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==" }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/electron-to-chromium": { - "version": "1.4.363", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.363.tgz", - "integrity": "sha512-ReX5qgmSU7ybhzMuMdlJAdYnRhT90UB3k9M05O5nF5WH3wR5wgdJjXw0uDeFyKNhmglmQiOxkAbzrP0hMKM59g==" + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz", + "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==" }, "node_modules/emittery": { "version": "0.13.1", @@ -1734,6 +1788,14 @@ "once": "^1.4.0" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1743,9 +1805,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -1758,6 +1820,26 @@ "node": ">=8" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1770,6 +1852,22 @@ "node": ">=4" } }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -1812,26 +1910,26 @@ } }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect-puppeteer": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-8.0.5.tgz", - "integrity": "sha512-PtJ/HKYdt/SqoGIWYninAENrSRxRSDb+5I78Pke73+Nxp/nzX05yUU2B+ULUro7wPG4VdD5caKi8UN2NPkpvBA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-10.0.0.tgz", + "integrity": "sha512-E7sE6nVdEbrnpDOBMmcLgyqLJKt876AlBg1A+gsu5R8cWx+SLafreOgJAgzXg5Qko7Tk0cW5oZdRbHQLU738dg==", "engines": { - "node": ">=14.0.0" + "node": ">=16" } }, "node_modules/extract-zip": { @@ -1867,6 +1965,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1979,11 +2082,6 @@ "node": ">= 6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", @@ -1992,15 +2090,28 @@ "node": ">=0.10.0" } }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -2011,9 +2122,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -2050,10 +2164,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2119,17 +2248,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2138,6 +2256,17 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -2154,16 +2283,28 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -2217,9 +2358,9 @@ } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -2246,6 +2387,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2261,17 +2403,37 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2326,39 +2488,50 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { @@ -2375,9 +2548,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -2387,14 +2560,14 @@ } }, "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -2412,11 +2585,12 @@ } }, "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -2424,27 +2598,27 @@ } }, "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -2454,21 +2628,20 @@ } }, "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -2487,30 +2660,30 @@ } }, "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -2531,40 +2704,40 @@ } }, "node_modules/jest-dev-server": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-8.0.5.tgz", - "integrity": "sha512-pgf6R6r9z9Cf+9wGEXV24hIPYPPBPpJtETJm4O1hWtnaSiDshOsgQNOLB3EmoZIq+fAfZuLsuaxETf33GhJNGg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-10.0.0.tgz", + "integrity": "sha512-FtyBBDxrAIfTX3hyKSOwj5KU6Z7fFLew5pQYOFpwyf+qpPpULL8aYxtsFkbkAwcs+Mb7qhcNbVLeiWsLOd7CKw==", "dependencies": { "chalk": "^4.1.2", "cwd": "^0.10.0", "find-process": "^1.4.7", "prompts": "^2.4.2", - "spawnd": "^8.0.5", + "spawnd": "^10.0.0", "tree-kill": "^1.2.2", - "wait-on": "^7.0.1" + "wait-on": "^7.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=16" } }, "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dependencies": { "detect-newline": "^3.0.0" }, @@ -2573,73 +2746,73 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-puppeteer": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-8.0.6.tgz", - "integrity": "sha512-mhmpVMK9Mnzr4DVAGhGA5yQGmlLv7ty5JW/A8jSz0Dlpbk0sGoyOzwjzgd/4wUAuOx2B3o7BLHbKYpzmGS4UIA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-10.0.1.tgz", + "integrity": "sha512-FxMzVRyqieQqSy5CPWiwdK5t9dkRHid5eoRTVa8RtYeXLlpW6lU0dAmxEfPkdnDVCiPUhC2APeKOXq0J72bgag==", "dependencies": { "chalk": "^4.1.2", - "cosmiconfig": "^8.1.0", - "deepmerge": "^4.3.0", - "jest-dev-server": "^8.0.5", - "jest-environment-node": "^29.5.0" + "cosmiconfig": "^8.3.6", + "deepmerge": "^4.3.1", + "jest-dev-server": "^10.0.0", + "jest-environment-node": "^29.7.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=16" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -2651,43 +2824,43 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -2696,13 +2869,13 @@ } }, "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2725,39 +2898,39 @@ } }, "node_modules/jest-puppeteer": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-8.0.6.tgz", - "integrity": "sha512-3ZakfoyYfTEtHRWWXZGi14706LGxtP0nVVvoPGry3x4YEV+tyaspGJ295JSgaE3Abxub0p2F1OKVxVo9Oy0fMA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-10.0.1.tgz", + "integrity": "sha512-FzC35XbqeuQEt1smXh1EOqhJaRkWqJkyWDMfGkcZ8C59QHXeJ7F/iOmiNqYi6l/OsycUuOPCk+IkjfGfS9YbrQ==", "dependencies": { - "expect-puppeteer": "^8.0.5", - "jest-environment-puppeteer": "^8.0.6" + "expect-puppeteer": "^10.0.0", + "jest-environment-puppeteer": "^10.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=16" }, "peerDependencies": { "puppeteer": ">=19" } }, "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -2767,41 +2940,41 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -2810,30 +2983,30 @@ } }, "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -2842,56 +3015,39 @@ } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -2899,17 +3055,12 @@ "node": ">=10" } }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -2921,16 +3072,16 @@ } }, "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2948,17 +3099,17 @@ } }, "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -2966,12 +3117,12 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -2994,13 +3145,13 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -3022,6 +3173,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -3049,6 +3205,17 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -3095,19 +3262,30 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -3122,11 +3300,11 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -3180,14 +3358,9 @@ } }, "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" }, "node_modules/ms": { "version": "2.1.2", @@ -3199,23 +3372,12 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">= 0.4.0" } }, "node_modules/node-int64": { @@ -3224,9 +3386,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -3324,6 +3486,36 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3403,9 +3595,9 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -3419,9 +3611,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "engines": { "node": ">= 6" } @@ -3438,11 +3630,11 @@ } }, "node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -3481,6 +3673,32 @@ "node": ">= 6" } }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -3496,41 +3714,62 @@ } }, "node_modules/puppeteer": { - "version": "19.9.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.9.0.tgz", - "integrity": "sha512-JDx8WwGlkdQYTaa3OMYDF+uFWimiwNnacg5FGEC5J6+VxDsLK30wHKU/Db2LqEhtAoIu4RwS+BRH4zRPlCsFpA==", + "version": "23.0.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.0.2.tgz", + "integrity": "sha512-I/l1P8s8brcLG+oW9AwF8hUaOSGGJcGKMflXRgULUH0S3ABptlLI9ZKjqWDo8ipY6v789ZKd+bNKtcCwpTh5Ww==", "hasInstallScript": true, "dependencies": { - "@puppeteer/browsers": "0.4.1", - "cosmiconfig": "8.1.3", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "puppeteer-core": "19.9.0" + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.4", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1312386", + "puppeteer-core": "23.0.2" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" } }, "node_modules/puppeteer-core": { - "version": "19.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.9.0.tgz", - "integrity": "sha512-IJYfCE0oFpi5dTvNFqOwo8Dey6zzx7hANy7z6K2bjpCux9oPOSOIubq40awNhaHlfi8soYtgU4qabnzMXB7xBQ==", + "version": "23.0.2", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.0.2.tgz", + "integrity": "sha512-MvOHn+g1TYkAR2oVd/bf/YWXKqFTJmkhyyurYgxkrjh8rBOL1ZH5VyOsLJi0bLO7/yoipAmk1gFZEx9HUJnaoA==", + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.4", + "debug": "^4.3.6", + "devtools-protocol": "0.0.1312386", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/puppeteer/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dependencies": { - "@puppeteer/browsers": "0.4.1", - "chromium-bidi": "0.4.6", - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.1107588", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "proxy-from-env": "1.1.0", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.13.0" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">=14.14.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" }, "peerDependencies": { - "typescript": ">= 4.7.4" + "typescript": ">=4.9.5" }, "peerDependenciesMeta": { "typescript": { @@ -3538,10 +3777,21 @@ } } }, + "node_modules/puppeteer/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "funding": [ { "type": "individual", @@ -3553,23 +3803,15 @@ } ] }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/require-directory": { "version": "2.1.1", @@ -3580,11 +3822,11 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3642,25 +3884,6 @@ "tslib": "^2.1.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3706,6 +3929,41 @@ "node": ">=8" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3724,15 +3982,26 @@ } }, "node_modules/spawnd": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-8.0.5.tgz", - "integrity": "sha512-D+crPxX9sSXzF4o/3RjtNcc+PT+CQuSrLsq0VP1SQDy6ka3rD2wUmzkxhD1XlNEcNX0zccQEmPJI2xBYcdpR7Q==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-10.0.0.tgz", + "integrity": "sha512-6GKcakMTryb5b1SWCvdubCDHEsR2k+5VZUD5G19umZRarkvj1RyCGyizcqhjewI7cqZo8fTVD8HpnDZbVOLMtg==", "dependencies": { - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "tree-kill": "^1.2.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16" + } + }, + "node_modules/spawnd/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sprintf-js": { @@ -3751,12 +4020,17 @@ "node": ">=10" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", "dependencies": { - "safe-buffer": "~5.2.0" + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" } }, "node_modules/string-length": { @@ -3845,29 +4119,26 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" } }, "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "node_modules/test-exclude": { @@ -3883,6 +4154,14 @@ "node": ">=8" } }, + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -3912,11 +4191,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -3926,9 +4200,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/type-detect": { "version": "4.0.8", @@ -3958,10 +4232,23 @@ "through": "^2.3.8" } }, + "node_modules/undici-types": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -3970,42 +4257,41 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" - } + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" }, "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, "node_modules/wait-on": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", @@ -4032,20 +4318,6 @@ "makeerror": "1.0.12" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4094,9 +4366,9 @@ } }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, @@ -4127,9 +4399,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -4170,3050 +4442,14 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==" - }, - "@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - } - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", - "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "requires": { - "@babel/types": "^7.21.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" - }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==" - }, - "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@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.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" - }, - "@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", - "requires": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", - "requires": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0" - } - }, - "@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", - "requires": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" - } - }, - "@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", - "requires": { - "jest-get-type": "^29.4.3" - } - }, - "@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", - "requires": { - "@jest/types": "^29.5.0", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" - } - }, - "@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", - "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" - } - }, - "@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - } - }, - "@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "requires": { - "@sinclair/typebox": "^0.25.16" - } - }, - "@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", - "requires": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", - "requires": { - "@jest/test-result": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - } - }, - "@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "requires": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - } - } - }, - "@puppeteer/browsers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.4.1.tgz", - "integrity": "sha512-4IICvy1McAkT/HyNZHIs7sp8ngBX1dmO0TPQ+FWq9ATQMqI8p+Ulm5A3kS2wYDh5HDHHkYrrETOu6rlj64VuTw==", - "requires": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - } - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "requires": { - "@hapi/hoek": "^9.0.0" + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } - }, - "@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "requires": { - "@sinonjs/commons": "^2.0.0" - } - }, - "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" - }, - "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - }, - "@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", - "requires": { - "@jest/transform": "^29.5.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", - "requires": { - "babel-plugin-jest-hoist": "^29.5.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-lite": { - "version": "1.0.30001478", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz", - "integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chromium-bidi": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.6.tgz", - "integrity": "sha512-TQOkWRaLI/IWvoP8XC+7jO4uHTIiAUiklXU1T0qszlUFEai9LgKXIBXy3pOS3EnQZ3bQtMbKUPkug0fTAEHCSw==", - "requires": { - "mitt": "3.0.0" - } - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "requires": { - "node-fetch": "2.6.7" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", - "requires": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - }, - "devtools-protocol": { - "version": "0.0.1107588", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz", - "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==" - }, - "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==" - }, - "electron-to-chromium": { - "version": "1.4.363", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.363.tgz", - "integrity": "sha512-ReX5qgmSU7ybhzMuMdlJAdYnRhT90UB3k9M05O5nF5WH3wR5wgdJjXw0uDeFyKNhmglmQiOxkAbzrP0hMKM59g==" - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", - "requires": { - "os-homedir": "^1.0.1" - } - }, - "expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", - "requires": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" - } - }, - "expect-puppeteer": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-8.0.5.tgz", - "integrity": "sha512-PtJ/HKYdt/SqoGIWYninAENrSRxRSDb+5I78Pke73+Nxp/nzX05yUU2B+ULUro7wPG4VdD5caKi8UN2NPkpvBA==" - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "requires": { - "bser": "2.1.1" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "requires": { - "pend": "~1.2.0" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-file-up": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", - "requires": { - "fs-exists-sync": "^0.1.0", - "resolve-dir": "^0.1.0" - } - }, - "find-pkg": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", - "requires": { - "find-file-up": "^0.1.2" - } - }, - "find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", - "requires": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", - "requires": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - } - }, - "jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", - "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", - "requires": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-dev-server": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-8.0.5.tgz", - "integrity": "sha512-pgf6R6r9z9Cf+9wGEXV24hIPYPPBPpJtETJm4O1hWtnaSiDshOsgQNOLB3EmoZIq+fAfZuLsuaxETf33GhJNGg==", - "requires": { - "chalk": "^4.1.2", - "cwd": "^0.10.0", - "find-process": "^1.4.7", - "prompts": "^2.4.2", - "spawnd": "^8.0.5", - "tree-kill": "^1.2.2", - "wait-on": "^7.0.1" - } - }, - "jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - } - }, - "jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", - "requires": { - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" - } - }, - "jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", - "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" - } - }, - "jest-environment-puppeteer": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-8.0.6.tgz", - "integrity": "sha512-mhmpVMK9Mnzr4DVAGhGA5yQGmlLv7ty5JW/A8jSz0Dlpbk0sGoyOzwjzgd/4wUAuOx2B3o7BLHbKYpzmGS4UIA==", - "requires": { - "chalk": "^4.1.2", - "cosmiconfig": "^8.1.0", - "deepmerge": "^4.3.0", - "jest-dev-server": "^8.0.5", - "jest-environment-node": "^29.5.0" - } - }, - "jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==" - }, - "jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", - "requires": { - "@jest/types": "^29.5.0", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", - "requires": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - } - }, - "jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - } - }, - "jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-util": "^29.5.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "requires": {} - }, - "jest-puppeteer": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-8.0.6.tgz", - "integrity": "sha512-3ZakfoyYfTEtHRWWXZGi14706LGxtP0nVVvoPGry3x4YEV+tyaspGJ295JSgaE3Abxub0p2F1OKVxVo9Oy0fMA==", - "requires": { - "expect-puppeteer": "^8.0.5", - "jest-environment-puppeteer": "^8.0.6" - } - }, - "jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==" - }, - "jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", - "requires": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" - } - }, - "jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", - "requires": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", - "requires": { - "@jest/types": "^29.5.0", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "leven": "^3.1.0", - "pretty-format": "^29.5.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - } - } - }, - "jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", - "requires": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.5.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "requires": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "requires": { - "tmpl": "1.0.5" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "requires": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "puppeteer": { - "version": "19.9.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.9.0.tgz", - "integrity": "sha512-JDx8WwGlkdQYTaa3OMYDF+uFWimiwNnacg5FGEC5J6+VxDsLK30wHKU/Db2LqEhtAoIu4RwS+BRH4zRPlCsFpA==", - "requires": { - "@puppeteer/browsers": "0.4.1", - "cosmiconfig": "8.1.3", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "puppeteer-core": "19.9.0" - } - }, - "puppeteer-core": { - "version": "19.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.9.0.tgz", - "integrity": "sha512-IJYfCE0oFpi5dTvNFqOwo8Dey6zzx7hANy7z6K2bjpCux9oPOSOIubq40awNhaHlfi8soYtgU4qabnzMXB7xBQ==", - "requires": { - "@puppeteer/browsers": "0.4.1", - "chromium-bidi": "0.4.6", - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.1107588", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "proxy-from-env": "1.1.0", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.13.0" - } - }, - "pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==" - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==" - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spawnd": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-8.0.5.tgz", - "integrity": "sha512-D+crPxX9sSXzF4o/3RjtNcc+PT+CQuSrLsq0VP1SQDy6ka3rD2wUmzkxhD1XlNEcNX0zccQEmPJI2xBYcdpR7Q==", - "requires": { - "signal-exit": "^3.0.7", - "tree-kill": "^1.2.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "requires": { - "escape-string-regexp": "^2.0.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - } - } - }, - "wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", - "requires": { - "axios": "^1.6.1", - "joi": "^17.11.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "rxjs": "^7.8.1" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "requires": {} - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/package.json b/testassets/InteropTestsGrpcWebWebsite/Tests/package.json index 96b9fc9af..9160dc1ee 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/package.json +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/package.json @@ -6,8 +6,8 @@ "test": "jest test" }, "dependencies": { - "puppeteer": "^19.9.0", - "jest": "^29.5.0", - "jest-puppeteer": "^8.0.6" + "jest": "^29.7.0", + "jest-puppeteer": "^10.0.1", + "puppeteer": "^23.0.2" } } From c397bc7804824100c983052f4a6e7e291ddf1c06 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 16 Aug 2024 17:13:23 +0800 Subject: [PATCH 07/48] Remove internal_ci flag from interop test script (#2509) --- kokoro/interop.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kokoro/interop.sh b/kokoro/interop.sh index 2370617ca..88a1459dd 100755 --- a/kokoro/interop.sh +++ b/kokoro/interop.sh @@ -27,4 +27,4 @@ cd ../grpc source tools/internal_ci/helper_scripts/prepare_build_linux_rc -tools/run_tests/run_interop_tests.py -l aspnetcore c++ -s aspnetcore c++ --use_docker --internal_ci -t -j 8 +tools/run_tests/run_interop_tests.py -l aspnetcore c++ -s aspnetcore c++ --use_docker -t -j 8 From dd4adce098a94f5e7a7ede19262f85a72c9797ca Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Wed, 21 Aug 2024 04:36:36 +0800 Subject: [PATCH 08/48] Fix Google auth interop test (#2512) * Downgrade Google auth * Suppress warning * 1.57.0 * Update to latest and improve test --- testassets/Shared/InteropClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testassets/Shared/InteropClient.cs b/testassets/Shared/InteropClient.cs index 3feccd70a..4c996e68c 100644 --- a/testassets/Shared/InteropClient.cs +++ b/testassets/Shared/InteropClient.cs @@ -245,7 +245,7 @@ private async Task CreateCredentialsAsync(bool? useTestCaOve if (options.TestCase == "compute_engine_creds") { var googleCredential = await GoogleCredential.GetApplicationDefaultAsync(); - Assert.IsFalse(googleCredential.IsCreateScopedRequired); + Assert.IsTrue(googleCredential.UnderlyingCredential is ComputeCredential); credentials = ChannelCredentials.Create(credentials, googleCredential.ToCallCredentials()); } #else From 26227c3e7a2f5d4469ae06a4999f1a4f2800d351 Mon Sep 17 00:00:00 2001 From: apolcyn Date: Tue, 20 Aug 2024 19:06:52 -0700 Subject: [PATCH 09/48] [testing] improve sanity check in jwt_token_creds interop test (#2513) --- testassets/Shared/InteropClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testassets/Shared/InteropClient.cs b/testassets/Shared/InteropClient.cs index 4c996e68c..34e98184d 100644 --- a/testassets/Shared/InteropClient.cs +++ b/testassets/Shared/InteropClient.cs @@ -238,7 +238,7 @@ private async Task CreateCredentialsAsync(bool? useTestCaOve if (options.TestCase == "jwt_token_creds") { var googleCredential = await GoogleCredential.GetApplicationDefaultAsync(); - Assert.IsTrue(googleCredential.IsCreateScopedRequired); + Assert.IsFalse(googleCredential.UnderlyingCredential is ComputeCredential); credentials = ChannelCredentials.Create(credentials, googleCredential.ToCallCredentials()); } From e9cc7e15796d39f1d2656178f56a45c09147d0fe Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 22 Aug 2024 07:53:14 +0800 Subject: [PATCH 10/48] Add HTTP version configuration to GrpcChannelOptions (#2514) Co-authored-by: Andrew Casey --- perf/benchmarkapps/GrpcClient/Program.cs | 25 ++---- src/Grpc.Net.Client.Web/GrpcWebHandler.cs | 22 +++-- src/Grpc.Net.Client/GrpcChannel.cs | 8 ++ src/Grpc.Net.Client/GrpcChannelOptions.cs | 31 ++++++- src/Grpc.Net.Client/Internal/GrpcCall.cs | 4 +- .../Balancer/ConnectionTests.cs | 13 ++- .../Balancer/PickFirstBalancerTests.cs | 15 ---- .../Client/ClientFactoryTests.cs | 21 ++--- .../Infrastructure/GrpcHttpHelper.cs | 5 +- .../Web/Client/ConnectionTests.cs | 86 +++++++++++++------ .../Web/GrpcWebFunctionalTestBase.cs | 4 +- .../GrpcWebHandlerTests.cs | 31 ++++++- testassets/Shared/InteropClient.cs | 31 ++----- 13 files changed, 175 insertions(+), 121 deletions(-) diff --git a/perf/benchmarkapps/GrpcClient/Program.cs b/perf/benchmarkapps/GrpcClient/Program.cs index 9517079bb..88275c5f9 100644 --- a/perf/benchmarkapps/GrpcClient/Program.cs +++ b/perf/benchmarkapps/GrpcClient/Program.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -497,13 +497,14 @@ private static ChannelBase CreateChannel(string target) HttpMessageHandler httpMessageHandler = httpClientHandler; + Version? versionOverride = null; if (_options.Protocol == "h3") { // Stop gRPC channel from creating TCP socket. httpClientHandler.ConnectCallback = (context, cancellationToken) => throw new InvalidOperationException("Should never be called for H3."); // Force H3 on all requests. - httpMessageHandler = new Http3DelegatingHandler(httpMessageHandler); + versionOverride = new Version(3, 0); } return GrpcChannel.ForAddress(address, new GrpcChannelOptions @@ -513,7 +514,8 @@ private static ChannelBase CreateChannel(string target) #else HttpClient = new HttpClient(httpMessageHandler), #endif - LoggerFactory = _loggerFactory + LoggerFactory = _loggerFactory, + HttpVersion = versionOverride }); } } @@ -759,21 +761,4 @@ private static bool IsCallCountExceeded() { return _options.CallCount != null && _callsStarted > _options.CallCount; } - - private class Http3DelegatingHandler : DelegatingHandler - { - private static readonly Version Http3Version = new Version(3, 0); - - public Http3DelegatingHandler(HttpMessageHandler innerHandler) - { - InnerHandler = innerHandler; - } - - protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - request.Version = Http3Version; - request.VersionPolicy = HttpVersionPolicy.RequestVersionExact; - return base.SendAsync(request, cancellationToken); - } - } } diff --git a/src/Grpc.Net.Client.Web/GrpcWebHandler.cs b/src/Grpc.Net.Client.Web/GrpcWebHandler.cs index a4d4ac821..136f73e83 100644 --- a/src/Grpc.Net.Client.Web/GrpcWebHandler.cs +++ b/src/Grpc.Net.Client.Web/GrpcWebHandler.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -44,6 +44,11 @@ public sealed class GrpcWebHandler : DelegatingHandler /// be overridden. /// /// +#if NET5_0_OR_GREATER + [Obsolete("HttpVersion is obsolete and will be removed in a future release. Use GrpcChannelOptions.HttpVersion and GrpcChannelOptions.HttpVersionPolicy instead.")] +#else + [Obsolete("HttpVersion is obsolete and will be removed in a future release. Use GrpcChannelOptions.HttpVersion instead.")] +#endif public Version? HttpVersion { get; set; } /// @@ -136,22 +141,27 @@ private async Task SendAsyncCore(HttpRequestMessage request // https://github.com/mono/mono/issues/18718 request.SetOption(WebAssemblyEnableStreamingResponseKey, true); +#pragma warning disable CS0618 // Type or member is obsolete if (HttpVersion != null) { // This doesn't guarantee that the specified version is used. Some handlers will ignore it. // For example, version in the browser always negotiated by the browser and HttpClient // uses what the browser has negotiated. request.Version = HttpVersion; +#if NET5_0_OR_GREATER + request.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher; +#endif } +#pragma warning restore CS0618 // Type or member is obsolete #if NET5_0_OR_GREATER else if (request.RequestUri?.Scheme == Uri.UriSchemeHttps - && request.VersionPolicy == HttpVersionPolicy.RequestVersionOrHigher + && request.VersionPolicy == HttpVersionPolicy.RequestVersionExact && request.Version == System.Net.HttpVersion.Version20) { - // If no explicit HttpVersion is set and the request is using TLS then default to HTTP/1.1. - // HTTP/1.1 together with HttpVersionPolicy.RequestVersionOrHigher it will be compatible - // with all endpoints. - request.Version = System.Net.HttpVersion.Version11; + // If no explicit HttpVersion is set and the request is using TLS then change the version policy + // to allow for HTTP/1.1. HttpVersionPolicy.RequestVersionOrLower it will be compatible + // with HTTP/1.1 and HTTP/2. + request.VersionPolicy = HttpVersionPolicy.RequestVersionOrLower; } #endif #if NETSTANDARD2_0 diff --git a/src/Grpc.Net.Client/GrpcChannel.cs b/src/Grpc.Net.Client/GrpcChannel.cs index e84459040..e046854a1 100644 --- a/src/Grpc.Net.Client/GrpcChannel.cs +++ b/src/Grpc.Net.Client/GrpcChannel.cs @@ -79,6 +79,10 @@ public sealed class GrpcChannel : ChannelBase, IDisposable internal Dictionary CompressionProviders { get; } internal string MessageAcceptEncoding { get; } internal bool Disposed { get; private set; } + internal Version HttpVersion { get; } +#if NET5_0_OR_GREATER + internal HttpVersionPolicy HttpVersionPolicy { get; } +#endif #if SUPPORT_LOAD_BALANCING // Load balancing @@ -175,6 +179,10 @@ internal GrpcChannel(Uri address, GrpcChannelOptions channelOptions) : base(addr RetryThrottling = serviceConfig.RetryThrottling != null ? CreateChannelRetryThrottling(serviceConfig.RetryThrottling) : null; _serviceConfigMethods = CreateServiceConfigMethods(serviceConfig); } + HttpVersion = channelOptions.HttpVersion ?? GrpcProtocolConstants.Http2Version; +#if NET5_0_OR_GREATER + HttpVersionPolicy = channelOptions.HttpVersionPolicy ?? HttpVersionPolicy.RequestVersionExact; +#endif // Non-HTTP addresses (e.g. dns:///custom-hostname) usually specify a path instead of an authority. // Only log about a path being present if HTTP or HTTPS. diff --git a/src/Grpc.Net.Client/GrpcChannelOptions.cs b/src/Grpc.Net.Client/GrpcChannelOptions.cs index f08fc7773..b7adebe86 100644 --- a/src/Grpc.Net.Client/GrpcChannelOptions.cs +++ b/src/Grpc.Net.Client/GrpcChannelOptions.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -287,6 +287,35 @@ public TimeSpan InitialReconnectBackoff /// public IServiceProvider? ServiceProvider { get; set; } + /// + /// Gets or sets the HTTP version to use when making gRPC calls. + /// + /// When a is specified the value will be set on + /// as gRPC calls are made. Changing this property allows the HTTP version of gRPC calls to + /// be overridden. + /// + /// + /// A null value doesn't override the HTTP version of gRPC calls. Defaults to 2.0. + /// + /// + public Version? HttpVersion { get; set; } + +#if NET5_0_OR_GREATER + /// + /// Gets or sets the HTTP policy to use when making gRPC calls. + /// + /// When a is specified the value will be set on + /// as gRPC calls are made. The policy determines how is interpreted when + /// the final HTTP version is negotiated with the server. Changing this property allows the HTTP + /// version of gRPC calls to be overridden. + /// + /// + /// A null value doesn't override the HTTP policy of gRPC calls. Defaults to . + /// + /// + public HttpVersionPolicy? HttpVersionPolicy { get; set; } +#endif + internal T ResolveService(T defaultValue) { return (T?)ServiceProvider?.GetService(typeof(T)) ?? defaultValue; diff --git a/src/Grpc.Net.Client/Internal/GrpcCall.cs b/src/Grpc.Net.Client/Internal/GrpcCall.cs index 36f126a43..3e4653575 100644 --- a/src/Grpc.Net.Client/Internal/GrpcCall.cs +++ b/src/Grpc.Net.Client/Internal/GrpcCall.cs @@ -957,9 +957,9 @@ private void SetWriter(HttpRequestMessage message, HttpContentClientStreamWriter private HttpRequestMessage CreateHttpRequestMessage(TimeSpan? timeout) { var message = new HttpRequestMessage(HttpMethod.Post, _grpcMethodInfo.CallUri); - message.Version = GrpcProtocolConstants.Http2Version; + message.Version = Channel.HttpVersion; #if NET5_0_OR_GREATER - message.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher; + message.VersionPolicy = Channel.HttpVersionPolicy; #endif // Set raw headers on request using name/values. Typed headers allocate additional objects. diff --git a/test/FunctionalTests/Balancer/ConnectionTests.cs b/test/FunctionalTests/Balancer/ConnectionTests.cs index 9476b5126..952a1b49d 100644 --- a/test/FunctionalTests/Balancer/ConnectionTests.cs +++ b/test/FunctionalTests/Balancer/ConnectionTests.cs @@ -322,7 +322,7 @@ async Task UnaryMethod(HelloRequest request, ServerCallContext conte var client = TestClientFactory.Create(channel, endpoint1.Method); // Act - grpcWebHandler.HttpVersion = new Version(1, 1); + SetHandlerHttpVersion(grpcWebHandler, new Version(1, 1)); var http11CallTasks = new List>(); for (int i = 0; i < 10; i++) { @@ -352,7 +352,7 @@ await TestHelpers.AssertIsTrueRetryAsync(() => } // Act - grpcWebHandler.HttpVersion = new Version(2, 0); + SetHandlerHttpVersion(grpcWebHandler, new Version(2, 0)); var http2CallTasks = new List>(); for (int i = 0; i < 10; i++) { @@ -389,7 +389,7 @@ await TestHelpers.AssertIsTrueRetryAsync(() => return activeStreams.Count == 10; }, "Wait for HTTP/2 connection to end."); - grpcWebHandler.HttpVersion = new Version(1, 1); + SetHandlerHttpVersion(grpcWebHandler, new Version(1, 1)); await Task.Delay(1000); @@ -412,6 +412,13 @@ await TestHelpers.AssertIsTrueRetryAsync(() => Assert.AreEqual(new DnsEndPoint("127.0.0.1", endpoint2.Address.Port), activeStreams[0].EndPoint); } + private static void SetHandlerHttpVersion(GrpcWebHandler handler, Version version) + { +#pragma warning disable CS0618 // Type or member is obsolete + handler.HttpVersion = version; +#pragma warning restore CS0618 // Type or member is obsolete + } + #if NET7_0_OR_GREATER [Test] public async Task Active_UnaryCall_HostOverride_Success() diff --git a/test/FunctionalTests/Balancer/PickFirstBalancerTests.cs b/test/FunctionalTests/Balancer/PickFirstBalancerTests.cs index 23c542491..fe820fe4a 100644 --- a/test/FunctionalTests/Balancer/PickFirstBalancerTests.cs +++ b/test/FunctionalTests/Balancer/PickFirstBalancerTests.cs @@ -47,21 +47,6 @@ namespace Grpc.AspNetCore.FunctionalTests.Balancer; [TestFixture] public class PickFirstBalancerTests : FunctionalTestBase { - private GrpcChannel CreateGrpcWebChannel(TestServerEndpointName endpointName, Version? version) - { - var grpcWebHandler = new GrpcWebHandler(GrpcWebMode.GrpcWeb); - grpcWebHandler.HttpVersion = version; - - var httpClient = Fixture.CreateClient(endpointName, grpcWebHandler); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions - { - HttpClient = httpClient, - LoggerFactory = LoggerFactory - }); - - return channel; - } - [Test] public async Task UnaryCall_CallAfterConnectionTimeout_Success() { diff --git a/test/FunctionalTests/Client/ClientFactoryTests.cs b/test/FunctionalTests/Client/ClientFactoryTests.cs index 59f0991c8..bcfc500aa 100644 --- a/test/FunctionalTests/Client/ClientFactoryTests.cs +++ b/test/FunctionalTests/Client/ClientFactoryTests.cs @@ -104,7 +104,11 @@ Task UnaryCall(HelloRequest request, ServerCallContext context) { return TestClientFactory.Create(invoker, method); }) - .AddHttpMessageHandler(() => new Http3Handler()) + .ConfigureChannel(options => + { + options.HttpVersion = HttpVersion.Version30; + options.HttpVersionPolicy = HttpVersionPolicy.RequestVersionExact; + }) .ConfigurePrimaryHttpMessageHandler(() => { return new SocketsHttpHandler @@ -125,20 +129,5 @@ Task UnaryCall(HelloRequest request, ServerCallContext context) // Assert Assert.AreEqual("Hello world", response1.Message); } - - private class Http3Handler : DelegatingHandler - { - public Http3Handler() { } - public Http3Handler(HttpMessageHandler innerHandler) : base(innerHandler) { } - - protected override Task SendAsync( - HttpRequestMessage request, CancellationToken cancellationToken) - { - request.Version = HttpVersion.Version30; - request.VersionPolicy = HttpVersionPolicy.RequestVersionExact; - - return base.SendAsync(request, cancellationToken); - } - } #endif } diff --git a/test/FunctionalTests/Infrastructure/GrpcHttpHelper.cs b/test/FunctionalTests/Infrastructure/GrpcHttpHelper.cs index bfcfe9c41..f631e498b 100644 --- a/test/FunctionalTests/Infrastructure/GrpcHttpHelper.cs +++ b/test/FunctionalTests/Infrastructure/GrpcHttpHelper.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -16,7 +16,6 @@ #endregion - namespace Grpc.AspNetCore.FunctionalTests.Infrastructure; public static class GrpcHttpHelper @@ -26,7 +25,7 @@ public static HttpRequestMessage Create(string url, HttpMethod? method = null) var request = new HttpRequestMessage(method ?? HttpMethod.Post, url); request.Version = new Version(2, 0); #if NET5_0_OR_GREATER - request.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher; + request.VersionPolicy = HttpVersionPolicy.RequestVersionExact; #endif return request; diff --git a/test/FunctionalTests/Web/Client/ConnectionTests.cs b/test/FunctionalTests/Web/Client/ConnectionTests.cs index 84135c57b..f544f029e 100644 --- a/test/FunctionalTests/Web/Client/ConnectionTests.cs +++ b/test/FunctionalTests/Web/Client/ConnectionTests.cs @@ -16,6 +16,7 @@ #endregion +using System.Net.Http; using Grpc.AspNetCore.FunctionalTests.Infrastructure; using Grpc.Core; using Grpc.Gateway.Testing; @@ -31,51 +32,80 @@ public class ConnectionTests : FunctionalTestBase private HttpClient CreateGrpcWebClient(TestServerEndpointName endpointName, Version? version) { GrpcWebHandler grpcWebHandler = new GrpcWebHandler(GrpcWebMode.GrpcWeb); +#pragma warning disable CS0618 // Type or member is obsolete grpcWebHandler.HttpVersion = version; +#pragma warning restore CS0618 // Type or member is obsolete return Fixture.CreateClient(endpointName, grpcWebHandler); } - private GrpcChannel CreateGrpcWebChannel(TestServerEndpointName endpointName, Version? version) + private GrpcChannel CreateGrpcWebChannel(TestServerEndpointName endpointName, Version? version, bool setVersionOnHandler) { - var httpClient = CreateGrpcWebClient(endpointName, version); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions + var options = new GrpcChannelOptions { - HttpClient = httpClient, LoggerFactory = LoggerFactory - }); - - return channel; + }; + if (setVersionOnHandler) + { + options.HttpClient = CreateGrpcWebClient(endpointName, version: null); + if (version != null) + { + options.HttpVersion = version; + options.HttpVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher; + } + return GrpcChannel.ForAddress(options.HttpClient.BaseAddress!, options); + } + else + { + options.HttpClient = CreateGrpcWebClient(endpointName, version); + return GrpcChannel.ForAddress(options.HttpClient.BaseAddress!, options); + } } - [TestCase(TestServerEndpointName.Http1, "2.0", false)] - [TestCase(TestServerEndpointName.Http1, "1.1", true)] - [TestCase(TestServerEndpointName.Http1, null, false)] - [TestCase(TestServerEndpointName.Http2, "2.0", true)] - [TestCase(TestServerEndpointName.Http2, "1.1", false)] - [TestCase(TestServerEndpointName.Http2, null, true)] + private static IEnumerable ConnectionTestData() + { + yield return new TestCaseData(TestServerEndpointName.Http1, "2.0", false); + yield return new TestCaseData(TestServerEndpointName.Http1, "1.1", true); + yield return new TestCaseData(TestServerEndpointName.Http1, null, false); + yield return new TestCaseData(TestServerEndpointName.Http2, "2.0", true); + yield return new TestCaseData(TestServerEndpointName.Http2, "1.1", false); + yield return new TestCaseData(TestServerEndpointName.Http2, null, true); #if NET5_0_OR_GREATER - // Specifing HTTP/2 doesn't work when the server is using TLS with HTTP/1.1 - // Caused by using HttpVersionPolicy.RequestVersionOrHigher setting - [TestCase(TestServerEndpointName.Http1WithTls, "2.0", false)] + // Specifing HTTP/2 doesn't work when the server is using TLS with HTTP/1.1 + // Caused by using HttpVersionPolicy.RequestVersionOrHigher setting + yield return new TestCaseData(TestServerEndpointName.Http1WithTls, "2.0", false); #else - [TestCase(TestServerEndpointName.Http1WithTls, "2.0", true)] + yield return new TestCaseData(TestServerEndpointName.Http1WithTls, "2.0", true); #endif - [TestCase(TestServerEndpointName.Http1WithTls, "1.1", true)] - [TestCase(TestServerEndpointName.Http1WithTls, null, true)] - [TestCase(TestServerEndpointName.Http2WithTls, "2.0", true)] + yield return new TestCaseData(TestServerEndpointName.Http1WithTls, "1.1", true); + yield return new TestCaseData(TestServerEndpointName.Http1WithTls, null, true); + yield return new TestCaseData(TestServerEndpointName.Http2WithTls, "2.0", true); #if NET5_0_OR_GREATER - // Specifing HTTP/1.1 does work when the server is using TLS with HTTP/2 - // Caused by using HttpVersionPolicy.RequestVersionOrHigher setting - [TestCase(TestServerEndpointName.Http2WithTls, "1.1", true)] + // Specifing HTTP/1.1 does work when the server is using TLS with HTTP/2 + // Caused by using HttpVersionPolicy.RequestVersionOrHigher setting + yield return new TestCaseData(TestServerEndpointName.Http2WithTls, "1.1", true); #else - [TestCase(TestServerEndpointName.Http2WithTls, "1.1", false)] + yield return new TestCaseData(TestServerEndpointName.Http2WithTls, "1.1", false); #endif - [TestCase(TestServerEndpointName.Http2WithTls, null, true)] + yield return new TestCaseData(TestServerEndpointName.Http2WithTls, null, true); #if NET7_0_OR_GREATER - [TestCase(TestServerEndpointName.Http3WithTls, null, true)] + yield return new TestCaseData(TestServerEndpointName.Http3WithTls, null, true); #endif - public async Task SendValidRequest_WithConnectionOptions(TestServerEndpointName endpointName, string? version, bool success) + } + + [TestCaseSource(nameof(ConnectionTestData))] + public async Task SendValidRequest_WithConnectionOptionsOnHandler(TestServerEndpointName endpointName, string? version, bool success) + { + await SendRequestWithConnectionOptionsCore(endpointName, version, success, setVersionOnHandler: true); + } + + [TestCaseSource(nameof(ConnectionTestData))] + public async Task SendValidRequest_WithConnectionOptionsOnChannel(TestServerEndpointName endpointName, string? version, bool success) + { + await SendRequestWithConnectionOptionsCore(endpointName, version, success, setVersionOnHandler: false); + } + + private async Task SendRequestWithConnectionOptionsCore(TestServerEndpointName endpointName, string? version, bool success, bool setVersionOnHandler) { #if NET6_0_OR_GREATER if (endpointName == TestServerEndpointName.Http3WithTls && @@ -92,7 +122,7 @@ public async Task SendValidRequest_WithConnectionOptions(TestServerEndpointName // Arrage Version.TryParse(version, out var v); - var channel = CreateGrpcWebChannel(endpointName, v); + var channel = CreateGrpcWebChannel(endpointName, v, setVersionOnHandler); var client = new EchoService.EchoServiceClient(channel); diff --git a/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs b/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs index 5fa37fd20..4e6cabc5e 100644 --- a/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs +++ b/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -88,7 +88,9 @@ protected HttpClient CreateGrpcWebClient() var mode = GrpcTestMode == GrpcTestMode.GrpcWeb ? GrpcWebMode.GrpcWeb : GrpcWebMode.GrpcWebText; grpcWebHandler = new GrpcWebHandler(mode) { +#pragma warning disable CS0618 // Type or member is obsolete HttpVersion = protocol +#pragma warning restore CS0618 // Type or member is obsolete }; } diff --git a/test/Grpc.Net.Client.Web.Tests/GrpcWebHandlerTests.cs b/test/Grpc.Net.Client.Web.Tests/GrpcWebHandlerTests.cs index 237bf591f..895cc77b1 100644 --- a/test/Grpc.Net.Client.Web.Tests/GrpcWebHandlerTests.cs +++ b/test/Grpc.Net.Client.Web.Tests/GrpcWebHandlerTests.cs @@ -54,8 +54,9 @@ public async Task HttpVersion_Unset_HttpRequestMessageVersionUnchanged() Assert.AreEqual(GrpcWebProtocolConstants.Http2Version, response.Version); } +#pragma warning disable CS0618 // Type or member is obsolete [Test] - public async Task HttpVersion_Set_HttpRequestMessageVersionChanged() + public async Task HttpVersion_SetOnHandler_HttpRequestMessageVersionChanged() { // Arrange var request = new HttpRequestMessage @@ -81,6 +82,34 @@ public async Task HttpVersion_Set_HttpRequestMessageVersionChanged() Assert.AreEqual(HttpVersion.Version11, testHttpHandler.Request!.Version); Assert.AreEqual(GrpcWebProtocolConstants.Http2Version, response.Version); } +#pragma warning restore CS0618 // Type or member is obsolete + + [Test] + public async Task HttpVersion_SetOnMessage_HttpRequestMessageVersionChanged() + { + // Arrange + var request = new HttpRequestMessage + { + Version = HttpVersion.Version11, + Content = new ByteArrayContent(Array.Empty()) + { + Headers = { ContentType = new MediaTypeHeaderValue("application/grpc") } + } + }; + var testHttpHandler = new TestHttpHandler(); + var grpcWebHandler = new GrpcWebHandler(GrpcWebMode.GrpcWeb) + { + InnerHandler = testHttpHandler + }; + var messageInvoker = new HttpMessageInvoker(grpcWebHandler); + + // Act + var response = await messageInvoker.SendAsync(request, CancellationToken.None); + + // Assert + Assert.AreEqual(HttpVersion.Version11, testHttpHandler.Request!.Version); + Assert.AreEqual(GrpcWebProtocolConstants.Http2Version, response.Version); + } [Test] public async Task GrpcWebMode_GrpcWebText_AcceptHeaderAdded() diff --git a/testassets/Shared/InteropClient.cs b/testassets/Shared/InteropClient.cs index 34e98184d..8ea989dc6 100644 --- a/testassets/Shared/InteropClient.cs +++ b/testassets/Shared/InteropClient.cs @@ -120,18 +120,17 @@ private async Task HttpClientCreateChannel() httpMessageHandler = CreateWinHttpHandler(); } + Version? versionOverride = null; if (!string.IsNullOrEmpty(options.GrpcWebMode) && !string.Equals(options.GrpcWebMode, "None", StringComparison.OrdinalIgnoreCase)) { var mode = (GrpcWebMode)Enum.Parse(typeof(GrpcWebMode), options.GrpcWebMode); - httpMessageHandler = new GrpcWebHandler(mode, httpMessageHandler) - { - HttpVersion = new Version(1, 1) - }; + httpMessageHandler = new GrpcWebHandler(mode, httpMessageHandler); + versionOverride = new Version(1, 1); } if (options.UseHttp3) { #if NET6_0_OR_GREATER - httpMessageHandler = new Http3DelegatingHandler(httpMessageHandler); + versionOverride = new Version(3, 0); #else throw new Exception("HTTP/3 requires .NET 6 or later."); #endif @@ -141,31 +140,13 @@ private async Task HttpClientCreateChannel() { Credentials = credentials, HttpHandler = httpMessageHandler, - LoggerFactory = loggerFactory + LoggerFactory = loggerFactory, + HttpVersion = versionOverride }); return new GrpcChannelWrapper(channel); } -#if NET6_0_OR_GREATER - private class Http3DelegatingHandler : DelegatingHandler - { - private static readonly Version Http3Version = new Version(3, 0); - - public Http3DelegatingHandler(HttpMessageHandler innerHandler) - { - InnerHandler = innerHandler; - } - - protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - request.Version = Http3Version; - request.VersionPolicy = HttpVersionPolicy.RequestVersionExact; - return base.SendAsync(request, cancellationToken); - } - } -#endif - private static WinHttpHandler CreateWinHttpHandler() { #pragma warning disable CA1416 // Validate platform compatibility From bf41c89ace4a4ce4d9868c35f06cef4d48031584 Mon Sep 17 00:00:00 2001 From: apolcyn Date: Thu, 5 Sep 2024 16:03:01 -0700 Subject: [PATCH 11/48] Bump grpc.tools version to 2.66 (#2523) --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index f8e0a7a8e..10504653f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -33,7 +33,7 @@ - + From 30255261ad1c64ba43fb140944e78c049318e8ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 07:28:04 +0800 Subject: [PATCH 12/48] Bump webpack from 5.76.0 to 5.94.0 in /examples/Browser/Server/wwwroot (#2522) Bumps [webpack](https://github.com/webpack/webpack) from 5.76.0 to 5.94.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.76.0...v5.94.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../Browser/Server/wwwroot/package-lock.json | 810 +++++++++--------- examples/Browser/Server/wwwroot/package.json | 2 +- 2 files changed, 391 insertions(+), 421 deletions(-) diff --git a/examples/Browser/Server/wwwroot/package-lock.json b/examples/Browser/Server/wwwroot/package-lock.json index cea9138d9..cc1dbebae 100644 --- a/examples/Browser/Server/wwwroot/package-lock.json +++ b/examples/Browser/Server/wwwroot/package-lock.json @@ -11,7 +11,7 @@ "@grpc/proto-loader": "^0.3.0", "google-protobuf": "^3.6.1", "grpc-web": "^1.0.0", - "webpack": "^5.76.0", + "webpack": "^5.94.0", "webpack-cli": "^5.0.1" } }, @@ -40,61 +40,61 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@protobufjs/aspromise": { @@ -161,36 +161,16 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/lodash": { @@ -212,148 +192,148 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -414,9 +394,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -425,10 +405,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -460,9 +440,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -472,13 +452,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -494,9 +478,9 @@ "dev": true }, "node_modules/caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true, "funding": [ { @@ -506,6 +490,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -562,15 +550,15 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -593,15 +581,15 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -712,9 +700,9 @@ "dev": true }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/grpc-web": { @@ -913,9 +901,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/p-limit": { @@ -979,9 +967,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/pkg-dir": { @@ -1029,9 +1017,9 @@ "dev": true }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -1117,9 +1105,9 @@ ] }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -1135,9 +1123,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -1232,13 +1220,13 @@ } }, "node_modules/terser": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -1250,16 +1238,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -1290,9 +1278,9 @@ "dev": true }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -1302,14 +1290,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -1325,9 +1317,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -1338,34 +1330,33 @@ } }, "node_modules/webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -1502,52 +1493,52 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@protobufjs/aspromise": { @@ -1614,36 +1605,16 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", "dev": true }, - "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/lodash": { @@ -1665,148 +1636,148 @@ "dev": true }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -1844,15 +1815,15 @@ "dev": true }, "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "requires": {} }, @@ -1876,15 +1847,15 @@ "requires": {} }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "buffer-from": { @@ -1894,9 +1865,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true }, "chrome-trace-event": { @@ -1943,15 +1914,15 @@ } }, "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -1965,15 +1936,15 @@ "dev": true }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "eslint-scope": { @@ -2062,9 +2033,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "grpc-web": { @@ -2218,9 +2189,9 @@ "dev": true }, "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "p-limit": { @@ -2266,9 +2237,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "pkg-dir": { @@ -2310,9 +2281,9 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "randombytes": { @@ -2366,9 +2337,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -2377,9 +2348,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -2447,28 +2418,28 @@ "dev": true }, "terser": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" } }, "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" } }, "tslib": { @@ -2478,13 +2449,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -2497,9 +2468,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -2507,34 +2478,33 @@ } }, "webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" } }, diff --git a/examples/Browser/Server/wwwroot/package.json b/examples/Browser/Server/wwwroot/package.json index 045b7db16..b12649e29 100644 --- a/examples/Browser/Server/wwwroot/package.json +++ b/examples/Browser/Server/wwwroot/package.json @@ -6,7 +6,7 @@ "@grpc/proto-loader": "^0.3.0", "google-protobuf": "^3.6.1", "grpc-web": "^1.0.0", - "webpack": "^5.76.0", + "webpack": "^5.94.0", "webpack-cli": "^5.0.1" } } From b3429b90615f55995b6763f4bf92b5cb9193b067 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 07:51:42 +0800 Subject: [PATCH 13/48] Bump elliptic from 6.5.4 to 6.5.7 in /examples/Spar/Server/ClientApp (#2525) Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.5.7. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.5.7) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/Spar/Server/ClientApp/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/Spar/Server/ClientApp/package-lock.json b/examples/Spar/Server/ClientApp/package-lock.json index 2599149c8..8e0c650ae 100644 --- a/examples/Spar/Server/ClientApp/package-lock.json +++ b/examples/Spar/Server/ClientApp/package-lock.json @@ -3779,9 +3779,9 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "dependencies": { "bn.js": "^4.11.9", @@ -12284,9 +12284,9 @@ "dev": true }, "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "requires": { "bn.js": "^4.11.9", From 439a3b80b562d63c84c9bf4474a774a20a408e2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 07:52:06 +0800 Subject: [PATCH 14/48] Bump micromatch from 4.0.7 to 4.0.8 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2524) Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.7 to 4.0.8. - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8) --- updated-dependencies: - dependency-name: micromatch dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../InteropTestsGrpcWebWebsite/Tests/package-lock.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json index 01e4f5068..be28a0d87 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json @@ -8,7 +8,6 @@ "name": "grpc-web_interop_tests", "version": "1.0.0", "dependencies": { - "expect-puppeteer": "^10.0.0", "jest": "^29.7.0", "jest-puppeteer": "^10.0.1", "puppeteer": "^23.0.2" @@ -3300,9 +3299,9 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" From 5322d6b81364c506f00ae85d4d98cf6abaa787e4 Mon Sep 17 00:00:00 2001 From: Varorbc Date: Sat, 7 Sep 2024 14:08:07 +0800 Subject: [PATCH 15/48] precompile condition clean (#2528) --- .../GrpcAspNetCoreServer/Program.cs | 11 +---- .../GrpcAspNetCoreServer/Startup.cs | 12 +---- .../benchmarkapps/GrpcClient/ClientOptions.cs | 6 +-- .../GrpcClient/NamedPipeConnectionFactory.cs | 6 +-- perf/benchmarkapps/GrpcClient/Program.cs | 11 +---- .../UnixDomainSocketConnectionFactory.cs | 6 +-- .../GrpcEndpointRouteBuilderExtensions.cs | 6 +-- .../GrpcMethodMetadata.cs | 9 +--- .../IGrpcServiceActivator.cs | 8 +-- .../InterceptorCollection.cs | 12 +---- .../InterceptorRegistration.cs | 12 +---- .../ClientStreamingServerCallHandler.cs | 6 +-- .../DuplexStreamingServerCallHandler.cs | 6 +-- .../CallHandlers/ServerCallHandlerBase.cs | 11 +---- .../ServerStreamingServerCallHandler.cs | 6 +-- .../CallHandlers/UnaryServerCallHandler.cs | 8 +-- .../Internal/DefaultGrpcServiceActivator.cs | 8 +-- .../Internal/GrpcProtocolConstants.cs | 49 +------------------ .../Internal/GrpcServiceOptionsSetup.cs | 5 +- .../Internal/HttpContextServerCallContext.cs | 2 - .../Internal/HttpContextStreamWriter.cs | 2 - .../Internal/PipeExtensions.cs | 4 -- .../Internal/ServerCallHandlerFactory.cs | 8 +-- .../Model/IServiceMethodProvider.cs | 8 +-- .../Internal/BinderServiceModelProvider.cs | 8 +-- .../Model/Internal/ProviderServiceBinder.cs | 6 +-- .../Model/Internal/ServiceRouteBuilder.cs | 8 +-- .../Model/ServiceMethodProviderContext.cs | 8 +-- .../Internal/GrpcWebProtocolConstants.cs | 7 +-- src/Shared/Server/BindMethodFinder.cs | 4 +- .../ClientStreamingServerMethodInvoker.cs | 8 +-- .../DuplexStreamingServerMethodInvoker.cs | 8 +-- src/Shared/Server/ServerMethodInvokerBase.cs | 8 +-- .../ServerStreamingServerMethodInvoker.cs | 8 +-- src/Shared/Server/UnaryServerMethodInvoker.cs | 8 +-- .../Balancer/BalancerHelpers.cs | 4 -- .../Balancer/RoundRobinBalancerTests.cs | 2 - .../Client/CompressionTests.cs | 4 +- .../FunctionalTests/Client/ConnectionTests.cs | 10 ---- test/FunctionalTests/Client/HedgingTests.cs | 2 - test/FunctionalTests/Client/RetryTests.cs | 2 - test/FunctionalTests/Client/StreamingTests.cs | 2 - test/FunctionalTests/Client/TelemetryTests.cs | 17 +------ test/FunctionalTests/Client/UnaryTests.cs | 2 - .../Infrastructure/GrpcHttpHelper.cs | 2 - .../Infrastructure/GrpcTestFixture.cs | 26 +--------- .../Infrastructure/TestServerEndpointName.cs | 6 +-- .../UnixDomainSocketConnectionFactory.cs | 4 +- .../Server/CompressionTests.cs | 25 +--------- .../TestServer/Helpers/GrpcTestFixture.cs | 6 --- .../Web/Client/ConnectionTests.cs | 10 ---- .../Web/GrpcWebFunctionalTestBase.cs | 4 -- .../CallHandlerTests.cs | 21 -------- .../GrpcServicesExtensionsTests.cs | 7 +-- .../HttpContextServerCallContextTests.cs | 4 -- test/Shared/MessageHelpers.cs | 12 ++--- 56 files changed, 62 insertions(+), 413 deletions(-) diff --git a/perf/benchmarkapps/GrpcAspNetCoreServer/Program.cs b/perf/benchmarkapps/GrpcAspNetCoreServer/Program.cs index 9fd395c26..f729a660f 100644 --- a/perf/benchmarkapps/GrpcAspNetCoreServer/Program.cs +++ b/perf/benchmarkapps/GrpcAspNetCoreServer/Program.cs @@ -120,13 +120,8 @@ public static IHostBuilder CreateHostBuilder(string[] args) { Console.WriteLine($"Console Logging enabled with level '{logLevel}'"); - loggerFactory -#if NET5_0_OR_GREATER - .AddSimpleConsole(o => o.TimestampFormat = "ss.ffff ") -#else - .AddConsole(o => o.TimestampFormat = "ss.ffff ") -#endif - .SetMinimumLevel(logLevel); + loggerFactory.AddSimpleConsole(o => o.TimestampFormat = "ss.ffff ") + .SetMinimumLevel(logLevel); } }) .UseDefaultServiceProvider((context, options) => @@ -163,7 +158,6 @@ private static void ConfigureListenOptions(ListenOptions listenOptions, IConfigu } }); } -#if NET6_0_OR_GREATER else if (protocol.Equals("h3", StringComparison.OrdinalIgnoreCase)) { listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3; @@ -177,7 +171,6 @@ private static void ConfigureListenOptions(ListenOptions listenOptions, IConfigu } }); } -#endif else if (protocol.Equals("h2c", StringComparison.OrdinalIgnoreCase)) { listenOptions.Protocols = HttpProtocols.Http2; diff --git a/perf/benchmarkapps/GrpcAspNetCoreServer/Startup.cs b/perf/benchmarkapps/GrpcAspNetCoreServer/Startup.cs index bf590136e..cb9ba210a 100644 --- a/perf/benchmarkapps/GrpcAspNetCoreServer/Startup.cs +++ b/perf/benchmarkapps/GrpcAspNetCoreServer/Startup.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -21,9 +21,7 @@ using Grpc.Shared; using Grpc.Testing; using Grpc.Tests.Shared; -#if NET5_0_OR_GREATER using Microsoft.AspNetCore.Authentication.Certificate; -#endif using Newtonsoft.Json; namespace GrpcAspNetCoreServer; @@ -41,10 +39,8 @@ public void ConfigureServices(IServiceCollection services) { services.AddGrpc(o => { -#if NET5_0_OR_GREATER // Small performance benefit to not add catch-all routes to handle UNIMPLEMENTED for unknown services o.IgnoreUnknownServices = true; -#endif }); services.Configure(c => { @@ -54,7 +50,6 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddControllers(); -#if NET5_0_OR_GREATER bool.TryParse(_config["enableCertAuth"], out var enableCertAuth); if (enableCertAuth) { @@ -67,7 +62,6 @@ public void ConfigureServices(IServiceCollection services) options.AllowedCertificateTypes = CertificateTypes.All; }); } -#endif } public void Configure(IApplicationBuilder app, IHostApplicationLifetime applicationLifetime) @@ -83,14 +77,12 @@ public void Configure(IApplicationBuilder app, IHostApplicationLifetime applicat app.UseRouting(); -#if NET5_0_OR_GREATER bool.TryParse(_config["enableCertAuth"], out var enableCertAuth); if (enableCertAuth) { app.UseAuthentication(); app.UseAuthorization(); } -#endif #if GRPC_WEB bool.TryParse(_config["enableGrpcWeb"], out var enableGrpcWeb); @@ -139,12 +131,10 @@ public void Configure(IApplicationBuilder app, IHostApplicationLifetime applicat private void ConfigureAuthorization(IEndpointConventionBuilder builder) { -#if NET5_0_OR_GREATER bool.TryParse(_config["enableCertAuth"], out var enableCertAuth); if (enableCertAuth) { builder.RequireAuthorization(); } -#endif } } diff --git a/perf/benchmarkapps/GrpcClient/ClientOptions.cs b/perf/benchmarkapps/GrpcClient/ClientOptions.cs index 425338661..44ed9f882 100644 --- a/perf/benchmarkapps/GrpcClient/ClientOptions.cs +++ b/perf/benchmarkapps/GrpcClient/ClientOptions.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -23,10 +23,8 @@ namespace GrpcClient; public class ClientOptions { public Uri? Url { get; set; } -#if NET5_0_OR_GREATER public string? UdsFileName { get; set; } public string? NamedPipeName { get; set; } -#endif public int Connections { get; set; } public int Warmup { get; set; } public int Duration { get; set; } @@ -41,4 +39,4 @@ public class ClientOptions public GrpcClientType GrpcClientType { get; set; } public int Streams { get; set; } public int Deadline { get; set; } -} \ No newline at end of file +} diff --git a/perf/benchmarkapps/GrpcClient/NamedPipeConnectionFactory.cs b/perf/benchmarkapps/GrpcClient/NamedPipeConnectionFactory.cs index ea261cf39..0839ea507 100644 --- a/perf/benchmarkapps/GrpcClient/NamedPipeConnectionFactory.cs +++ b/perf/benchmarkapps/GrpcClient/NamedPipeConnectionFactory.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -19,8 +19,6 @@ using System.IO.Pipes; using System.Security.Principal; -#if NET5_0_OR_GREATER - namespace GrpcClient; public class NamedPipeConnectionFactory @@ -56,5 +54,3 @@ public async ValueTask ConnectAsync(SocketsHttpConnectionContext _, } } } - -#endif diff --git a/perf/benchmarkapps/GrpcClient/Program.cs b/perf/benchmarkapps/GrpcClient/Program.cs index 88275c5f9..7e86b3a4b 100644 --- a/perf/benchmarkapps/GrpcClient/Program.cs +++ b/perf/benchmarkapps/GrpcClient/Program.cs @@ -465,10 +465,6 @@ private static ChannelBase CreateChannel(string target) var address = useTls ? "https://" : "http://"; address += target; -#if NETCOREAPP3_1 - AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); -#endif - var httpClientHandler = new SocketsHttpHandler(); httpClientHandler.UseProxy = false; httpClientHandler.AllowAutoRedirect = false; @@ -479,7 +475,7 @@ private static ChannelBase CreateChannel(string target) var clientCertificates = X509CertificateLoader.LoadPkcs12CollectionFromFile(certPath, "1111"); httpClientHandler.SslOptions.ClientCertificates = clientCertificates; } -#if NET5_0_OR_GREATER + if (!string.IsNullOrEmpty(_options.UdsFileName)) { var connectionFactory = new UnixDomainSocketConnectionFactory(new UnixDomainSocketEndPoint(ResolveUdsPath(_options.UdsFileName))); @@ -490,7 +486,6 @@ private static ChannelBase CreateChannel(string target) var connectionFactory = new NamedPipeConnectionFactory(_options.NamedPipeName); httpClientHandler.ConnectCallback = connectionFactory.ConnectAsync; } -#endif httpClientHandler.SslOptions.RemoteCertificateValidationCallback = (object sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) => true; @@ -509,11 +504,7 @@ private static ChannelBase CreateChannel(string target) return GrpcChannel.ForAddress(address, new GrpcChannelOptions { -#if NET5_0_OR_GREATER HttpHandler = httpMessageHandler, -#else - HttpClient = new HttpClient(httpMessageHandler), -#endif LoggerFactory = _loggerFactory, HttpVersion = versionOverride }); diff --git a/perf/benchmarkapps/GrpcClient/UnixDomainSocketConnectionFactory.cs b/perf/benchmarkapps/GrpcClient/UnixDomainSocketConnectionFactory.cs index 3d1548336..e4e39b2b1 100644 --- a/perf/benchmarkapps/GrpcClient/UnixDomainSocketConnectionFactory.cs +++ b/perf/benchmarkapps/GrpcClient/UnixDomainSocketConnectionFactory.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -19,8 +19,6 @@ using System.Net; using System.Net.Sockets; -#if NET5_0_OR_GREATER - namespace GrpcClient; public class UnixDomainSocketConnectionFactory @@ -48,5 +46,3 @@ public async ValueTask ConnectAsync(SocketsHttpConnectionContext _, Canc } } } - -#endif diff --git a/src/Grpc.AspNetCore.Server/GrpcEndpointRouteBuilderExtensions.cs b/src/Grpc.AspNetCore.Server/GrpcEndpointRouteBuilderExtensions.cs index 93f4993be..f583a2c4c 100644 --- a/src/Grpc.AspNetCore.Server/GrpcEndpointRouteBuilderExtensions.cs +++ b/src/Grpc.AspNetCore.Server/GrpcEndpointRouteBuilderExtensions.cs @@ -36,11 +36,7 @@ public static class GrpcEndpointRouteBuilderExtensions /// The service type to map requests to. /// The to add the route to. /// A for endpoints associated with the service. - public static GrpcServiceEndpointConventionBuilder MapGrpcService< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService>(this IEndpointRouteBuilder builder) where TService : class + public static GrpcServiceEndpointConventionBuilder MapGrpcService<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService>(this IEndpointRouteBuilder builder) where TService : class { ArgumentNullThrowHelper.ThrowIfNull(builder); diff --git a/src/Grpc.AspNetCore.Server/GrpcMethodMetadata.cs b/src/Grpc.AspNetCore.Server/GrpcMethodMetadata.cs index cd3577376..d37d9e6a2 100644 --- a/src/Grpc.AspNetCore.Server/GrpcMethodMetadata.cs +++ b/src/Grpc.AspNetCore.Server/GrpcMethodMetadata.cs @@ -33,12 +33,7 @@ public sealed class GrpcMethodMetadata /// /// The implementing service type. /// The method representation. - public GrpcMethodMetadata( -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - Type serviceType, - IMethod method) + public GrpcMethodMetadata([DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] Type serviceType, IMethod method) { ArgumentNullThrowHelper.ThrowIfNull(serviceType); ArgumentNullThrowHelper.ThrowIfNull(method); @@ -50,9 +45,7 @@ public GrpcMethodMetadata( /// /// Gets the implementing service type. /// -#if NET5_0_OR_GREATER [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif public Type ServiceType { get; } /// diff --git a/src/Grpc.AspNetCore.Server/IGrpcServiceActivator.cs b/src/Grpc.AspNetCore.Server/IGrpcServiceActivator.cs index 7a99052f4..b36e9fc22 100644 --- a/src/Grpc.AspNetCore.Server/IGrpcServiceActivator.cs +++ b/src/Grpc.AspNetCore.Server/IGrpcServiceActivator.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -25,11 +25,7 @@ namespace Grpc.AspNetCore.Server; /// A activator abstraction. /// /// The service type. -public interface IGrpcServiceActivator< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TGrpcService> where TGrpcService : class +public interface IGrpcServiceActivator<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TGrpcService> where TGrpcService : class { /// /// Creates a service. diff --git a/src/Grpc.AspNetCore.Server/InterceptorCollection.cs b/src/Grpc.AspNetCore.Server/InterceptorCollection.cs index c8e93e216..fec8bc61a 100644 --- a/src/Grpc.AspNetCore.Server/InterceptorCollection.cs +++ b/src/Grpc.AspNetCore.Server/InterceptorCollection.cs @@ -33,11 +33,7 @@ public class InterceptorCollection : Collection /// /// The interceptor type. /// The list of arguments to pass to the interceptor constructor when creating an instance. - public void Add< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(InterceptorRegistration.InterceptorAccessibility)] -#endif - TInterceptor>(params object[] args) where TInterceptor : Interceptor + public void Add<[DynamicallyAccessedMembers(InterceptorRegistration.InterceptorAccessibility)] TInterceptor>(params object[] args) where TInterceptor : Interceptor { Add(typeof(TInterceptor), args); } @@ -47,11 +43,7 @@ public void Add< /// /// The interceptor type. /// The list of arguments to pass to the interceptor constructor when creating an instance. - public void Add( -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(InterceptorRegistration.InterceptorAccessibility)] -#endif - Type interceptorType, params object[] args) + public void Add([DynamicallyAccessedMembers(InterceptorRegistration.InterceptorAccessibility)] Type interceptorType, params object[] args) { ArgumentNullThrowHelper.ThrowIfNull(interceptorType); diff --git a/src/Grpc.AspNetCore.Server/InterceptorRegistration.cs b/src/Grpc.AspNetCore.Server/InterceptorRegistration.cs index 2e6d23412..b57f378b3 100644 --- a/src/Grpc.AspNetCore.Server/InterceptorRegistration.cs +++ b/src/Grpc.AspNetCore.Server/InterceptorRegistration.cs @@ -28,17 +28,11 @@ namespace Grpc.AspNetCore.Server; /// public class InterceptorRegistration { -#if NET5_0_OR_GREATER internal const DynamicallyAccessedMemberTypes InterceptorAccessibility = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods; -#endif internal object[] _args; - internal InterceptorRegistration( -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(InterceptorAccessibility)] -#endif - Type type, object[] arguments) + internal InterceptorRegistration([DynamicallyAccessedMembers(InterceptorAccessibility)]Type type, object[] arguments) { ArgumentNullThrowHelper.ThrowIfNull(type); ArgumentNullThrowHelper.ThrowIfNull(arguments); @@ -58,9 +52,7 @@ internal InterceptorRegistration( /// /// Get the type of the interceptor. /// -#if NET5_0_OR_GREATER [DynamicallyAccessedMembers(InterceptorAccessibility)] -#endif public Type Type { get; } /// @@ -71,12 +63,10 @@ internal InterceptorRegistration( private IGrpcInterceptorActivator? _interceptorActivator; private ObjectFactory? _factory; -#if NET5_0_OR_GREATER [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:UnrecognizedReflectionPattern", Justification = "Type parameter members are preserved with DynamicallyAccessedMembers on InterceptorRegistration.Type property.")] [UnconditionalSuppressMessage("AotAnalysis", "IL3050:RequiresDynamicCode", Justification = "Type definition is explicitly specified and type argument is always an Interceptor type.")] -#endif internal IGrpcInterceptorActivator GetActivator(IServiceProvider serviceProvider) { // Not thread safe. Side effect is resolving the service twice. diff --git a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ClientStreamingServerCallHandler.cs b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ClientStreamingServerCallHandler.cs index 61655c71a..f6d9bb155 100644 --- a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ClientStreamingServerCallHandler.cs +++ b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ClientStreamingServerCallHandler.cs @@ -24,11 +24,7 @@ namespace Grpc.AspNetCore.Server.Internal.CallHandlers; -internal class ClientStreamingServerCallHandler< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> : ServerCallHandlerBase +internal class ClientStreamingServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/DuplexStreamingServerCallHandler.cs b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/DuplexStreamingServerCallHandler.cs index 9513ab1b6..cc5318511 100644 --- a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/DuplexStreamingServerCallHandler.cs +++ b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/DuplexStreamingServerCallHandler.cs @@ -23,11 +23,7 @@ namespace Grpc.AspNetCore.Server.Internal.CallHandlers; -internal class DuplexStreamingServerCallHandler< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> : ServerCallHandlerBase +internal class DuplexStreamingServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerCallHandlerBase.cs b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerCallHandlerBase.cs index 3596d3131..f4db8601f 100644 --- a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerCallHandlerBase.cs +++ b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerCallHandlerBase.cs @@ -30,11 +30,7 @@ namespace Grpc.AspNetCore.Server.Internal.CallHandlers; -internal abstract class ServerCallHandlerBase< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> +internal abstract class ServerCallHandlerBase<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> where TService : class where TRequest : class where TResponse : class @@ -60,10 +56,7 @@ public Task HandleCallAsync(HttpContext httpContext) } if (!GrpcProtocolConstants.IsHttp2(httpContext.Request.Protocol) -#if NET6_0_OR_GREATER - && !GrpcProtocolConstants.IsHttp3(httpContext.Request.Protocol) -#endif - ) + && !GrpcProtocolConstants.IsHttp3(httpContext.Request.Protocol)) { return ProcessNonHttp2Request(httpContext); } diff --git a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerStreamingServerCallHandler.cs b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerStreamingServerCallHandler.cs index e29c58be5..404822f98 100644 --- a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerStreamingServerCallHandler.cs +++ b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerStreamingServerCallHandler.cs @@ -23,11 +23,7 @@ namespace Grpc.AspNetCore.Server.Internal.CallHandlers; -internal class ServerStreamingServerCallHandler< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> : ServerCallHandlerBase +internal class ServerStreamingServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/UnaryServerCallHandler.cs b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/UnaryServerCallHandler.cs index d959f9dc2..499dc6491 100644 --- a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/UnaryServerCallHandler.cs +++ b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/UnaryServerCallHandler.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -24,11 +24,7 @@ namespace Grpc.AspNetCore.Server.Internal.CallHandlers; -internal class UnaryServerCallHandler< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> : ServerCallHandlerBase +internal class UnaryServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Grpc.AspNetCore.Server/Internal/DefaultGrpcServiceActivator.cs b/src/Grpc.AspNetCore.Server/Internal/DefaultGrpcServiceActivator.cs index 2bba1f8bb..e911697c8 100644 --- a/src/Grpc.AspNetCore.Server/Internal/DefaultGrpcServiceActivator.cs +++ b/src/Grpc.AspNetCore.Server/Internal/DefaultGrpcServiceActivator.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -21,11 +21,7 @@ namespace Grpc.AspNetCore.Server.Internal; -internal sealed class DefaultGrpcServiceActivator< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TGrpcService> : IGrpcServiceActivator where TGrpcService : class +internal sealed class DefaultGrpcServiceActivator<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TGrpcService> : IGrpcServiceActivator where TGrpcService : class { private static readonly Lazy _objectFactory = new Lazy(static () => ActivatorUtilities.CreateFactory(typeof(TGrpcService), Type.EmptyTypes)); diff --git a/src/Grpc.AspNetCore.Server/Internal/GrpcProtocolConstants.cs b/src/Grpc.AspNetCore.Server/Internal/GrpcProtocolConstants.cs index b9fe5afaa..269cf9a4c 100644 --- a/src/Grpc.AspNetCore.Server/Internal/GrpcProtocolConstants.cs +++ b/src/Grpc.AspNetCore.Server/Internal/GrpcProtocolConstants.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -28,51 +28,16 @@ internal static class GrpcProtocolConstants internal const string GrpcContentType = "application/grpc"; internal const string GrpcWebContentType = "application/grpc-web"; internal const string GrpcWebTextContentType = "application/grpc-web-text"; - -#if NET5_0_OR_GREATER internal static readonly string Http2Protocol = HttpProtocol.Http2; -#else - internal const string Http2Protocol = "HTTP/2"; - internal const string Http20Protocol = "HTTP/2.0"; // This is what IIS sets -#endif - -#if NET5_0_OR_GREATER internal static readonly string TimeoutHeader = HeaderNames.GrpcTimeout; -#else - internal const string TimeoutHeader = "grpc-timeout"; -#endif - -#if NET5_0_OR_GREATER internal static readonly string MessageEncodingHeader = HeaderNames.GrpcEncoding; -#else - internal const string MessageEncodingHeader = "grpc-encoding"; -#endif - -#if NET5_0_OR_GREATER internal static readonly string MessageAcceptEncodingHeader = HeaderNames.GrpcAcceptEncoding; -#else - internal const string MessageAcceptEncodingHeader = "grpc-accept-encoding"; -#endif - internal const string CompressionRequestAlgorithmHeader = "grpc-internal-encoding-request"; - -#if NET5_0_OR_GREATER internal static readonly string StatusTrailer = HeaderNames.GrpcStatus; -#else - internal const string StatusTrailer = "grpc-status"; -#endif - -#if NET5_0_OR_GREATER internal static readonly string MessageTrailer = HeaderNames.GrpcMessage; -#else - internal const string MessageTrailer = "grpc-message"; -#endif - internal const string IdentityGrpcEncoding = "identity"; internal const int Http2ResetStreamCancel = 0x8; -#if NET6_0_OR_GREATER internal const int Http3ResetStreamCancel = 0x010c; -#endif internal static readonly HashSet FilteredHeaders = new HashSet(StringComparer.OrdinalIgnoreCase) { @@ -97,20 +62,14 @@ internal static class GrpcProtocolConstants [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool IsHttp2(string protocol) { -#if NET5_0_OR_GREATER return HttpProtocol.IsHttp2(protocol); -#else - return protocol == Http2Protocol || protocol == Http20Protocol; -#endif } -#if NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool IsHttp3(string protocol) { return HttpProtocol.IsHttp3(protocol); } -#endif internal static bool IsGrpcEncodingIdentity(string encoding) { @@ -120,14 +79,8 @@ internal static bool IsGrpcEncodingIdentity(string encoding) internal static int GetCancelErrorCode(string protocol) { -#if NET6_0_OR_GREATER return IsHttp3(protocol) ? Http3ResetStreamCancel : Http2ResetStreamCancel; -#else - return Http2ResetStreamCancel; -#endif } -#if NET5_0_OR_GREATER internal const DynamicallyAccessedMemberTypes ServiceAccessibility = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods; -#endif } diff --git a/src/Grpc.AspNetCore.Server/Internal/GrpcServiceOptionsSetup.cs b/src/Grpc.AspNetCore.Server/Internal/GrpcServiceOptionsSetup.cs index dd1ada872..f2fad234e 100644 --- a/src/Grpc.AspNetCore.Server/Internal/GrpcServiceOptionsSetup.cs +++ b/src/Grpc.AspNetCore.Server/Internal/GrpcServiceOptionsSetup.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -39,9 +39,8 @@ public void Configure(GrpcServiceOptions options) if (options._compressionProviders == null || options._compressionProviders.Count == 0) { options.CompressionProviders.Add(new GzipCompressionProvider(CompressionLevel.Fastest)); -#if NET6_0_OR_GREATER + options.CompressionProviders.Add(new DeflateCompressionProvider(CompressionLevel.Fastest)); -#endif } } } diff --git a/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs b/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs index 5e1d51fa2..f4ef272e0 100644 --- a/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs +++ b/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs @@ -411,14 +411,12 @@ public void Initialize(ISystemClock? clock = null) private Activity? GetHostActivity() { -#if NET6_0_OR_GREATER // Feature always returns the host activity var feature = HttpContext.Features.Get(); if (feature != null) { return feature.Activity; } -#endif // If feature isn't available, or not supported, then fallback to Activity.Current. var activity = Activity.Current; diff --git a/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamWriter.cs b/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamWriter.cs index b6a67f9fd..8a96d9fa1 100644 --- a/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamWriter.cs +++ b/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamWriter.cs @@ -62,13 +62,11 @@ public Task WriteAsync(TResponse message) return WriteCoreAsync(message, CancellationToken.None); } -#if NET5_0_OR_GREATER // Explicit implementation because this WriteAsync has a default interface implementation. Task IAsyncStreamWriter.WriteAsync(TResponse message, CancellationToken cancellationToken) { return WriteCoreAsync(message, cancellationToken); } -#endif private async Task WriteCoreAsync(TResponse message, CancellationToken cancellationToken) { diff --git a/src/Grpc.AspNetCore.Server/Internal/PipeExtensions.cs b/src/Grpc.AspNetCore.Server/Internal/PipeExtensions.cs index ed2796638..e1f23326f 100644 --- a/src/Grpc.AspNetCore.Server/Internal/PipeExtensions.cs +++ b/src/Grpc.AspNetCore.Server/Internal/PipeExtensions.cs @@ -20,9 +20,7 @@ using System.Buffers.Binary; using System.Diagnostics; using System.IO.Pipelines; -#if NET6_0_OR_GREATER using System.Runtime.CompilerServices; -#endif using Grpc.Core; using Grpc.Net.Compression; using Microsoft.Extensions.Logging; @@ -293,9 +291,7 @@ public static async ValueTask ReadSingleMessageAsync(this PipeReader input /// Message deserializer. /// The cancellation token. /// Complete message data or null if the stream is complete. -#if NET6_0_OR_GREATER [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))] -#endif public static async ValueTask ReadStreamMessageAsync(this PipeReader input, HttpContextServerCallContext serverCallContext, Func deserializer, CancellationToken cancellationToken = default) where T : class { diff --git a/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs b/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs index c1426dd18..9d41c3520 100644 --- a/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs +++ b/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -31,11 +31,7 @@ namespace Grpc.AspNetCore.Server.Internal; /// /// Creates server call handlers. Provides a place to get services that call handlers will use. /// -internal partial class ServerCallHandlerFactory< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService> where TService : class +internal partial class ServerCallHandlerFactory<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> where TService : class { private readonly ILoggerFactory _loggerFactory; private readonly IGrpcServiceActivator _serviceActivator; diff --git a/src/Grpc.AspNetCore.Server/Model/IServiceMethodProvider.cs b/src/Grpc.AspNetCore.Server/Model/IServiceMethodProvider.cs index d5778cc23..b771149bc 100644 --- a/src/Grpc.AspNetCore.Server/Model/IServiceMethodProvider.cs +++ b/src/Grpc.AspNetCore.Server/Model/IServiceMethodProvider.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -31,11 +31,7 @@ namespace Grpc.AspNetCore.Server.Model; /// instances are invoked in the order they are registered. /// /// -public interface IServiceMethodProvider< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService> where TService : class +public interface IServiceMethodProvider<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> where TService : class { /// /// Called to execute the provider. diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs b/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs index 68473e105..db6fce070 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -24,11 +24,7 @@ namespace Grpc.AspNetCore.Server.Model.Internal; -internal class BinderServiceMethodProvider< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService> : IServiceMethodProvider where TService : class +internal class BinderServiceMethodProvider<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> : IServiceMethodProvider where TService : class { private readonly ILogger> _logger; diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/ProviderServiceBinder.cs b/src/Grpc.AspNetCore.Server/Model/Internal/ProviderServiceBinder.cs index f570dae64..84be01989 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/ProviderServiceBinder.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/ProviderServiceBinder.cs @@ -24,11 +24,7 @@ namespace Grpc.AspNetCore.Server.Model.Internal; -internal class ProviderServiceBinder< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService> : ServiceBinderBase where TService : class +internal class ProviderServiceBinder<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> : ServiceBinderBase where TService : class { private readonly ServiceMethodProviderContext _context; private readonly Type _declaringType; diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs index 7be1f3ba1..83d8875ae 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs @@ -19,21 +19,15 @@ using System.Diagnostics.CodeAnalysis; using Grpc.AspNetCore.Server.Internal; using Grpc.Core; -using Grpc.Shared; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; -using Microsoft.AspNetCore.Routing.Patterns; using Microsoft.Extensions.Logging; using Log = Grpc.AspNetCore.Server.Model.Internal.ServiceRouteBuilderLog; namespace Grpc.AspNetCore.Server.Model.Internal; -internal class ServiceRouteBuilder< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService> where TService : class +internal class ServiceRouteBuilder<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> where TService : class { private readonly IEnumerable> _serviceMethodProviders; private readonly ServerCallHandlerFactory _serverCallHandlerFactory; diff --git a/src/Grpc.AspNetCore.Server/Model/ServiceMethodProviderContext.cs b/src/Grpc.AspNetCore.Server/Model/ServiceMethodProviderContext.cs index 476f50053..9b283bc22 100644 --- a/src/Grpc.AspNetCore.Server/Model/ServiceMethodProviderContext.cs +++ b/src/Grpc.AspNetCore.Server/Model/ServiceMethodProviderContext.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -29,11 +29,7 @@ namespace Grpc.AspNetCore.Server.Model; /// A context for . /// /// Service type for the context. -public class ServiceMethodProviderContext< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService> where TService : class +public class ServiceMethodProviderContext<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> where TService : class { private readonly ServerCallHandlerFactory _serverCallHandlerFactory; diff --git a/src/Grpc.AspNetCore.Web/Internal/GrpcWebProtocolConstants.cs b/src/Grpc.AspNetCore.Web/Internal/GrpcWebProtocolConstants.cs index f1d1f4161..512256506 100644 --- a/src/Grpc.AspNetCore.Web/Internal/GrpcWebProtocolConstants.cs +++ b/src/Grpc.AspNetCore.Web/Internal/GrpcWebProtocolConstants.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -25,10 +25,5 @@ internal static class GrpcWebProtocolConstants internal const string GrpcContentType = "application/grpc"; internal const string GrpcWebContentType = "application/grpc-web"; internal const string GrpcWebTextContentType = "application/grpc-web-text"; - -#if NET5_0_OR_GREATER internal static readonly string Http2Protocol = HttpProtocol.Http2; -#else - internal const string Http2Protocol = "HTTP/2"; -#endif } diff --git a/src/Shared/Server/BindMethodFinder.cs b/src/Shared/Server/BindMethodFinder.cs index 45d3c8c3f..d48fdb90d 100644 --- a/src/Shared/Server/BindMethodFinder.cs +++ b/src/Shared/Server/BindMethodFinder.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -65,10 +65,8 @@ internal static class BindMethodFinder return null; } -#if NET5_0_OR_GREATER [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern", Justification = "Fallback doesn't have BindServiceMethodAttribute so can't be verified.")] -#endif internal static MethodInfo? GetBindMethodFallback(Type serviceType) { // Search for the generated service base class diff --git a/src/Shared/Server/ClientStreamingServerMethodInvoker.cs b/src/Shared/Server/ClientStreamingServerMethodInvoker.cs index 9b2c7498c..efbad4804 100644 --- a/src/Shared/Server/ClientStreamingServerMethodInvoker.cs +++ b/src/Shared/Server/ClientStreamingServerMethodInvoker.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -31,11 +31,7 @@ namespace Grpc.Shared.Server; /// Service type for this method. /// Request message type for this method. /// Response message type for this method. -internal sealed class ClientStreamingServerMethodInvoker< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> : ServerMethodInvokerBase +internal sealed class ClientStreamingServerMethodInvoker<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerMethodInvokerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Shared/Server/DuplexStreamingServerMethodInvoker.cs b/src/Shared/Server/DuplexStreamingServerMethodInvoker.cs index 33aa1f0e9..e195fb88f 100644 --- a/src/Shared/Server/DuplexStreamingServerMethodInvoker.cs +++ b/src/Shared/Server/DuplexStreamingServerMethodInvoker.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -31,11 +31,7 @@ namespace Grpc.Shared.Server; /// Service type for this method. /// Request message type for this method. /// Response message type for this method. -internal sealed class DuplexStreamingServerMethodInvoker< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> : ServerMethodInvokerBase +internal sealed class DuplexStreamingServerMethodInvoker<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerMethodInvokerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Shared/Server/ServerMethodInvokerBase.cs b/src/Shared/Server/ServerMethodInvokerBase.cs index 247a069c2..b2afd3ef4 100644 --- a/src/Shared/Server/ServerMethodInvokerBase.cs +++ b/src/Shared/Server/ServerMethodInvokerBase.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -29,11 +29,7 @@ namespace Grpc.Shared.Server; /// Service type for this method. /// Request message type for this method. /// Response message type for this method. -internal abstract class ServerMethodInvokerBase< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> +internal abstract class ServerMethodInvokerBase<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> where TRequest : class where TResponse : class where TService : class diff --git a/src/Shared/Server/ServerStreamingServerMethodInvoker.cs b/src/Shared/Server/ServerStreamingServerMethodInvoker.cs index db93b7cc4..268e17463 100644 --- a/src/Shared/Server/ServerStreamingServerMethodInvoker.cs +++ b/src/Shared/Server/ServerStreamingServerMethodInvoker.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -31,11 +31,7 @@ namespace Grpc.Shared.Server; /// Service type for this method. /// Request message type for this method. /// Response message type for this method. -internal sealed class ServerStreamingServerMethodInvoker< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> : ServerMethodInvokerBase +internal sealed class ServerStreamingServerMethodInvoker<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerMethodInvokerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Shared/Server/UnaryServerMethodInvoker.cs b/src/Shared/Server/UnaryServerMethodInvoker.cs index c81c3d7a0..cbd1115fc 100644 --- a/src/Shared/Server/UnaryServerMethodInvoker.cs +++ b/src/Shared/Server/UnaryServerMethodInvoker.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -32,11 +32,7 @@ namespace Grpc.Shared.Server; /// Service type for this method. /// Request message type for this method. /// Response message type for this method. -internal sealed class UnaryServerMethodInvoker< -#if NET5_0_OR_GREATER - [DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] -#endif - TService, TRequest, TResponse> : ServerMethodInvokerBase +internal sealed class UnaryServerMethodInvoker<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerMethodInvokerBase where TRequest : class where TResponse : class where TService : class diff --git a/test/FunctionalTests/Balancer/BalancerHelpers.cs b/test/FunctionalTests/Balancer/BalancerHelpers.cs index 9fc61edf1..2406c40eb 100644 --- a/test/FunctionalTests/Balancer/BalancerHelpers.cs +++ b/test/FunctionalTests/Balancer/BalancerHelpers.cs @@ -238,7 +238,6 @@ public TestSubchannelTransportFactory(TimeSpan socketPingInterval, TimeSpan? con public ISubchannelTransport Create(Subchannel subchannel) { -#if NET5_0_OR_GREATER return new SocketConnectivitySubchannelTransport( subchannel, _socketPingInterval, @@ -246,9 +245,6 @@ public ISubchannelTransport Create(Subchannel subchannel) _connectionIdleTimeout, subchannel._manager.LoggerFactory, _socketConnect); -#else - return new PassiveSubchannelTransport(subchannel); -#endif } } } diff --git a/test/FunctionalTests/Balancer/RoundRobinBalancerTests.cs b/test/FunctionalTests/Balancer/RoundRobinBalancerTests.cs index 9f79cf7e2..19686b10d 100644 --- a/test/FunctionalTests/Balancer/RoundRobinBalancerTests.cs +++ b/test/FunctionalTests/Balancer/RoundRobinBalancerTests.cs @@ -17,7 +17,6 @@ #endregion #if SUPPORT_LOAD_BALANCING -#if NET5_0_OR_GREATER using System; using System.Collections.Generic; @@ -462,4 +461,3 @@ Task UnaryMethod(HelloRequest request, ServerCallContext context) } #endif -#endif diff --git a/test/FunctionalTests/Client/CompressionTests.cs b/test/FunctionalTests/Client/CompressionTests.cs index 27d745262..1444355fd 100644 --- a/test/FunctionalTests/Client/CompressionTests.cs +++ b/test/FunctionalTests/Client/CompressionTests.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -31,9 +31,7 @@ public class CompressionTests : FunctionalTestBase { [TestCase("identity")] [TestCase("gzip")] -#if NET6_0_OR_GREATER [TestCase("deflate")] -#endif public async Task SendCompressedMessage_ServiceCompressionConfigured_ResponseGzipEncoding(string algorithmName) { // Arrange diff --git a/test/FunctionalTests/Client/ConnectionTests.cs b/test/FunctionalTests/Client/ConnectionTests.cs index a5c118577..578230229 100644 --- a/test/FunctionalTests/Client/ConnectionTests.cs +++ b/test/FunctionalTests/Client/ConnectionTests.cs @@ -55,24 +55,17 @@ public async Task ALPN_ProtocolDowngradedToHttp1_ThrowErrorFromServer() // Assert Assert.AreEqual(StatusCode.Internal, ex.StatusCode); -#if NET5_0_OR_GREATER var debugException = ex.Status.DebugException!; Assert.AreEqual("The SSL connection could not be established, see inner exception.", debugException.Message); -#else - Assert.AreEqual("Request protocol 'HTTP/1.1' is not supported.", ex.Status.Detail); -#endif } -#if NET5_0_OR_GREATER [Test] public async Task UnixDomainSockets() { Task UnaryUds(HelloRequest request, ServerCallContext context) { -#if NET6_0_OR_GREATER var endPoint = (UnixDomainSocketEndPoint)context.GetHttpContext().Features.Get()!.Socket.LocalEndPoint!; Assert.NotNull(endPoint); -#endif return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } @@ -96,7 +89,6 @@ Task UnaryUds(HelloRequest request, ServerCallContext context) // Assert Assert.AreEqual("Hello John", response.Message); } -#endif #if NET7_0_OR_GREATER [Test] @@ -122,7 +114,6 @@ public async Task Http3() } #endif -#if NET5_0_OR_GREATER [Test] public async Task ShareSocketsHttpHandler() { @@ -200,5 +191,4 @@ Task Unary(HelloRequest request, ServerCallContext context) var expected = $"CONNECT {http.address.Host}:{http.address.Port} HTTP/1.1"; Assert.AreEqual(expected, proxyServer.Requests[0].RequestLine); } -#endif } diff --git a/test/FunctionalTests/Client/HedgingTests.cs b/test/FunctionalTests/Client/HedgingTests.cs index 6bbd10c4e..e23f06255 100644 --- a/test/FunctionalTests/Client/HedgingTests.cs +++ b/test/FunctionalTests/Client/HedgingTests.cs @@ -679,7 +679,6 @@ await call.RequestStream.WriteAsync( Assert.AreEqual(1, serverAbortCount); } -#if NET5_0_OR_GREATER [Test] public async Task ClientStreaming_WriteAsyncCancellationBefore_ClientAbort() { @@ -949,5 +948,4 @@ async Task ClientStreamingWithReadFailures(IAsyncStreamReader ClientStreamingWithReadFailures(IAsyncStreamReader ClientStreamingWithReadFailures(IAsyncStreamReader UnaryTelemetryHeader(HelloRequest request, ServerCallContext context) { - telemetryHeader = context.RequestHeaders.GetValue( -#if NET5_0_OR_GREATER - "traceparent" -#else - "request-id" -#endif - ); + telemetryHeader = context.RequestHeaders.GetValue("traceparent"); return Task.FromResult(new HelloReply()); } @@ -82,7 +74,6 @@ Task UnaryTelemetryHeader(HelloRequest request, ServerCallContext co var client = CreateClient(clientType, method, handler); // Act -#if NET5_0_OR_GREATER var result = new List>(); using var allSubscription = new AllListenersObserver(new Dictionary>> @@ -90,21 +81,17 @@ Task UnaryTelemetryHeader(HelloRequest request, ServerCallContext co ["HttpHandlerDiagnosticListener"] = new ObserverToList>(result) }); using (DiagnosticListener.AllListeners.Subscribe(allSubscription)) -#endif { await client.UnaryCall(new HelloRequest()).ResponseAsync.DefaultTimeout(); } // Assert Assert.IsNotNull(telemetryHeader); - -#if NET5_0_OR_GREATER Assert.AreEqual(4, result.Count); Assert.AreEqual("System.Net.Http.HttpRequestOut.Start", result[0].Key); Assert.AreEqual("System.Net.Http.Request", result[1].Key); Assert.AreEqual("System.Net.Http.HttpRequestOut.Stop", result[2].Key); Assert.AreEqual("System.Net.Http.Response", result[3].Key); -#endif } private TestClient CreateClient(ClientType clientType, Method method, HttpMessageHandler? handler) diff --git a/test/FunctionalTests/Client/UnaryTests.cs b/test/FunctionalTests/Client/UnaryTests.cs index bc58012ff..368919615 100644 --- a/test/FunctionalTests/Client/UnaryTests.cs +++ b/test/FunctionalTests/Client/UnaryTests.cs @@ -128,7 +128,6 @@ Task UnaryThrowError(HelloRequest request, ServerCallContext context Assert.AreEqual(expectedServerCulture, serverCulture); } -#if NET5_0_OR_GREATER [Test] public async Task MaxConcurrentStreams_StartConcurrently_AdditionalConnectionsCreated() { @@ -226,7 +225,6 @@ async Task UnaryThrowError(HelloRequest request, ServerCallContext c } } } -#endif [Test] public async Task Health_Check_Success() diff --git a/test/FunctionalTests/Infrastructure/GrpcHttpHelper.cs b/test/FunctionalTests/Infrastructure/GrpcHttpHelper.cs index f631e498b..c32b4ab0e 100644 --- a/test/FunctionalTests/Infrastructure/GrpcHttpHelper.cs +++ b/test/FunctionalTests/Infrastructure/GrpcHttpHelper.cs @@ -24,9 +24,7 @@ public static HttpRequestMessage Create(string url, HttpMethod? method = null) { var request = new HttpRequestMessage(method ?? HttpMethod.Post, url); request.Version = new Version(2, 0); -#if NET5_0_OR_GREATER request.VersionPolicy = HttpVersionPolicy.RequestVersionExact; -#endif return request; } diff --git a/test/FunctionalTests/Infrastructure/GrpcTestFixture.cs b/test/FunctionalTests/Infrastructure/GrpcTestFixture.cs index 6c2c61e14..5422fcfba 100644 --- a/test/FunctionalTests/Infrastructure/GrpcTestFixture.cs +++ b/test/FunctionalTests/Infrastructure/GrpcTestFixture.cs @@ -73,9 +73,7 @@ public static IPEndpointInfoContainer Create(ListenOptions listenOptions, bool i public class GrpcTestFixture : IDisposable where TStartup : class { -#if NET5_0_OR_GREATER private readonly string _socketPath = Path.GetTempFileName(); -#endif private readonly InProcessTestServer _server; public GrpcTestFixture( @@ -143,7 +141,6 @@ public GrpcTestFixture( urls[TestServerEndpointName.Http1WithTls] = IPEndpointInfoContainer.Create(listenOptions, isHttps: true); }); -#if NET5_0_OR_GREATER if (File.Exists(_socketPath)) { File.Delete(_socketPath); @@ -155,9 +152,7 @@ public GrpcTestFixture( urls[TestServerEndpointName.UnixDomainSocket] = new SocketsEndpointInfoContainer(_socketPath); }); -#endif -#if NET6_0_OR_GREATER if (RequireHttp3Attribute.IsSupported(out _)) { var http3Port = Convert.ToInt32(context.Configuration["Http3Port"], CultureInfo.InvariantCulture); @@ -175,16 +170,13 @@ public GrpcTestFixture( urls[TestServerEndpointName.Http3WithTls] = IPEndpointInfoContainer.Create(listenOptions, isHttps: true); }); } -#endif }); _server.StartServer(); DynamicGrpc = _server.Host!.Services.GetRequiredService(); -#if !NET5_0 AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); -#endif (Client, Handler) = CreateHttpCore(defaultClientEndpointName); } @@ -221,7 +213,6 @@ public HttpClient CreateClient(TestServerEndpointName? endpointName = null, Dele configureHandler?.Invoke(socketsHttpHandler); -#if NET5_0_OR_GREATER if (endpointName == TestServerEndpointName.UnixDomainSocket) { var udsEndPoint = new UnixDomainSocketEndPoint(_server.GetUrl(endpointName.Value)); @@ -229,7 +220,6 @@ public HttpClient CreateClient(TestServerEndpointName? endpointName = null, Dele socketsHttpHandler.ConnectCallback = connectionFactory.ConnectAsync; } -#endif HttpClient client; HttpMessageHandler handler; @@ -243,23 +233,19 @@ public HttpClient CreateClient(TestServerEndpointName? endpointName = null, Dele handler = socketsHttpHandler; } -#if NET6_0_OR_GREATER if (endpointName == TestServerEndpointName.Http3WithTls) { // TODO(JamesNK): There is a bug with SocketsHttpHandler and HTTP/3 that prevents calls // upgrading from 2 to 3. Force HTTP/3 calls to require that protocol. handler = new Http3DelegatingHandler(handler); } -#endif client = new HttpClient(handler); if (endpointName == TestServerEndpointName.Http2) { client.DefaultRequestVersion = new Version(2, 0); -#if NET5_0_OR_GREATER client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher; -#endif } client.BaseAddress = CalculateBaseAddress(endpointName.Value); @@ -269,12 +255,10 @@ public HttpClient CreateClient(TestServerEndpointName? endpointName = null, Dele private Uri CalculateBaseAddress(TestServerEndpointName endpointName) { -#if NET5_0_OR_GREATER if (endpointName == TestServerEndpointName.UnixDomainSocket) { return new Uri("http://localhost"); } -#endif return new Uri(_server.GetUrl(endpointName)); } @@ -287,14 +271,10 @@ public Uri GetUrl(TestServerEndpointName endpointName) case TestServerEndpointName.Http2: case TestServerEndpointName.Http1WithTls: case TestServerEndpointName.Http2WithTls: -#if NET6_0_OR_GREATER case TestServerEndpointName.Http3WithTls: -#endif return new Uri(_server.GetUrl(endpointName)); -#if NET5_0_OR_GREATER case TestServerEndpointName.UnixDomainSocket: return new Uri("http://localhost"); -#endif default: throw new ArgumentException("Unexpected value: " + endpointName, nameof(endpointName)); } @@ -310,16 +290,13 @@ public void Dispose() { Client.Dispose(); _server.Dispose(); -#if NET5_0_OR_GREATER if (File.Exists(_socketPath)) { File.Delete(_socketPath); } -#endif } -#if NET6_0_OR_GREATER -private class Http3DelegatingHandler : DelegatingHandler + private class Http3DelegatingHandler : DelegatingHandler { public Http3DelegatingHandler(HttpMessageHandler innerHandler) { @@ -333,5 +310,4 @@ protected override Task SendAsync(HttpRequestMessage reques return base.SendAsync(request, cancellationToken); } } -#endif } diff --git a/test/FunctionalTests/Infrastructure/TestServerEndpointName.cs b/test/FunctionalTests/Infrastructure/TestServerEndpointName.cs index 07b2afb35..6af5d65ee 100644 --- a/test/FunctionalTests/Infrastructure/TestServerEndpointName.cs +++ b/test/FunctionalTests/Infrastructure/TestServerEndpointName.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -24,10 +24,6 @@ public enum TestServerEndpointName Http1, Http2WithTls, Http1WithTls, -#if NET5_0_OR_GREATER UnixDomainSocket, -#endif -#if NET6_0_OR_GREATER Http3WithTls, -#endif } diff --git a/test/FunctionalTests/Infrastructure/UnixDomainSocketConnectionFactory.cs b/test/FunctionalTests/Infrastructure/UnixDomainSocketConnectionFactory.cs index f36f32f9d..10e56e483 100644 --- a/test/FunctionalTests/Infrastructure/UnixDomainSocketConnectionFactory.cs +++ b/test/FunctionalTests/Infrastructure/UnixDomainSocketConnectionFactory.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -16,7 +16,6 @@ #endregion -#if NET5_0_OR_GREATER using System; using System.IO; using System.Net; @@ -52,4 +51,3 @@ public async ValueTask ConnectAsync(SocketsHttpConnectionContext _, Canc } } } -#endif diff --git a/test/FunctionalTests/Server/CompressionTests.cs b/test/FunctionalTests/Server/CompressionTests.cs index 856e39140..a683d1510 100644 --- a/test/FunctionalTests/Server/CompressionTests.cs +++ b/test/FunctionalTests/Server/CompressionTests.cs @@ -79,9 +79,7 @@ async Task UnaryEnableCompression(HelloRequest request, ServerCallCo } [TestCase("gzip")] -#if NET6_0_OR_GREATER [TestCase("deflate")] -#endif public async Task SendCompressedMessage_UnaryEnabledInCall_CompressedMessageReturned(string algorithmName) { async Task UnaryEnableCompression(HelloRequest request, ServerCallContext context) @@ -128,9 +126,7 @@ async Task UnaryEnableCompression(HelloRequest request, ServerCallCo } [TestCase("gzip")] -#if NET6_0_OR_GREATER [TestCase("deflate")] -#endif public async Task SendCompressedMessage_ServerStreamingEnabledInCall_CompressedMessageReturned(string algorithmName) { async Task ServerStreamingEnableCompression(HelloRequest request, IServerStreamWriter responseStream, ServerCallContext context) @@ -191,9 +187,7 @@ async Task ServerStreamingEnableCompression(HelloRequest request, IServerStreamW } [TestCase("gzip")] -#if NET6_0_OR_GREATER [TestCase("deflate")] -#endif public async Task SendCompressedMessage_ServiceHasNoCompressionConfigured_ResponseIdentityEncoding(string algorithmName) { // Arrange @@ -222,9 +216,7 @@ public async Task SendCompressedMessage_ServiceHasNoCompressionConfigured_Respon } [TestCase("gzip")] -#if NET6_0_OR_GREATER [TestCase("deflate")] -#endif public async Task SendCompressedMessageWithIdentity_ReturnInternalError(string algorithmName) { // Arrange @@ -291,12 +283,7 @@ public async Task SendUnsupportedEncodingHeaderWithUncompressedMessage_ReturnUnc public async Task SendCompressedMessageWithUnsupportedEncoding_ReturnUnimplemented() { // Arrange - var expectedError = -#if NET6_0_OR_GREATER - "Unsupported grpc-encoding value 'DOES_NOT_EXIST'. Supported encodings: identity, gzip, deflate"; -#else - "Unsupported grpc-encoding value 'DOES_NOT_EXIST'. Supported encodings: identity, gzip"; -#endif + var expectedError = "Unsupported grpc-encoding value 'DOES_NOT_EXIST'. Supported encodings: identity, gzip, deflate"; SetExpectedErrorsFilter(writeContext => { @@ -335,11 +322,7 @@ public async Task SendCompressedMessageWithUnsupportedEncoding_ReturnUnimplement // Assert Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); -#if NET6_0_OR_GREATER Assert.AreEqual("identity,gzip,deflate", response.Headers.GetValues(GrpcProtocolConstants.MessageAcceptEncodingHeader).Single()); -#else - Assert.AreEqual("identity,gzip", response.Headers.GetValues(GrpcProtocolConstants.MessageAcceptEncodingHeader).Single()); -#endif response.AssertTrailerStatus(StatusCode.Unimplemented, expectedError); @@ -389,9 +372,7 @@ public override long Position } [TestCase("gzip")] -#if NET6_0_OR_GREATER [TestCase("deflate")] -#endif public async Task SendCompressedMessageWithoutEncodingHeader_ServerErrorResponse(string algorithmName) { // Arrange @@ -432,9 +413,7 @@ public async Task SendCompressedMessageWithoutEncodingHeader_ServerErrorResponse [TestCase("gzip", "gzip", true)] [TestCase("gzip", "identity, gzip", true)] [TestCase("gzip", "gzip ", true)] -#if NET6_0_OR_GREATER [TestCase("deflate", "deflate", false)] -#endif public async Task SendCompressedMessageAndReturnResultWithNoCompressFlag_ResponseNotCompressed(string algorithmName, string messageAcceptEncoding, bool algorithmSupportedByServer) { // Arrange @@ -473,9 +452,7 @@ public async Task SendCompressedMessageAndReturnResultWithNoCompressFlag_Respons } [TestCase("gzip", true)] -#if NET6_0_OR_GREATER [TestCase("deflate", false)] -#endif public async Task SendUncompressedMessageToServiceWithCompression_ResponseCompressed(string algorithmName, bool algorithmSupportedByServer) { // Arrange diff --git a/test/FunctionalTests/TestServer/Helpers/GrpcTestFixture.cs b/test/FunctionalTests/TestServer/Helpers/GrpcTestFixture.cs index cb5782671..a7c931592 100644 --- a/test/FunctionalTests/TestServer/Helpers/GrpcTestFixture.cs +++ b/test/FunctionalTests/TestServer/Helpers/GrpcTestFixture.cs @@ -58,14 +58,10 @@ public GrpcTestFixture(Action? initialConfigureServices) _host = builder.Start(); _server = _host.GetTestServer(); -#if !NET5_0 // Need to set the response version to 2.0. // Required because of this TestServer issue - https://github.com/aspnet/AspNetCore/issues/16940 var handler = new ResponseVersionHandler(); handler.InnerHandler = _server.CreateHandler(); -#else - var handler = _server.CreateHandler(); -#endif var client = new HttpClient(handler); client.BaseAddress = new Uri("http://localhost"); @@ -84,7 +80,6 @@ public void Dispose() _server.Dispose(); } -#if !NET5_0 private class ResponseVersionHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) @@ -95,7 +90,6 @@ protected override async Task SendAsync(HttpRequestMessage return response; } } -#endif public IDisposable GetTestContext() { diff --git a/test/FunctionalTests/Web/Client/ConnectionTests.cs b/test/FunctionalTests/Web/Client/ConnectionTests.cs index f544f029e..fcd47eaa6 100644 --- a/test/FunctionalTests/Web/Client/ConnectionTests.cs +++ b/test/FunctionalTests/Web/Client/ConnectionTests.cs @@ -70,23 +70,15 @@ private static IEnumerable ConnectionTestData() yield return new TestCaseData(TestServerEndpointName.Http2, "2.0", true); yield return new TestCaseData(TestServerEndpointName.Http2, "1.1", false); yield return new TestCaseData(TestServerEndpointName.Http2, null, true); -#if NET5_0_OR_GREATER // Specifing HTTP/2 doesn't work when the server is using TLS with HTTP/1.1 // Caused by using HttpVersionPolicy.RequestVersionOrHigher setting yield return new TestCaseData(TestServerEndpointName.Http1WithTls, "2.0", false); -#else - yield return new TestCaseData(TestServerEndpointName.Http1WithTls, "2.0", true); -#endif yield return new TestCaseData(TestServerEndpointName.Http1WithTls, "1.1", true); yield return new TestCaseData(TestServerEndpointName.Http1WithTls, null, true); yield return new TestCaseData(TestServerEndpointName.Http2WithTls, "2.0", true); -#if NET5_0_OR_GREATER // Specifing HTTP/1.1 does work when the server is using TLS with HTTP/2 // Caused by using HttpVersionPolicy.RequestVersionOrHigher setting yield return new TestCaseData(TestServerEndpointName.Http2WithTls, "1.1", true); -#else - yield return new TestCaseData(TestServerEndpointName.Http2WithTls, "1.1", false); -#endif yield return new TestCaseData(TestServerEndpointName.Http2WithTls, null, true); #if NET7_0_OR_GREATER yield return new TestCaseData(TestServerEndpointName.Http3WithTls, null, true); @@ -107,13 +99,11 @@ public async Task SendValidRequest_WithConnectionOptionsOnChannel(TestServerEndp private async Task SendRequestWithConnectionOptionsCore(TestServerEndpointName endpointName, string? version, bool success, bool setVersionOnHandler) { -#if NET6_0_OR_GREATER if (endpointName == TestServerEndpointName.Http3WithTls && !RequireHttp3Attribute.IsSupported(out var message)) { Assert.Ignore(message); } -#endif SetExpectedErrorsFilter(writeContext => { diff --git a/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs b/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs index 4e6cabc5e..8dc8c2385 100644 --- a/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs +++ b/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs @@ -40,13 +40,11 @@ protected GrpcWebFunctionalTestBase(GrpcTestMode grpcTestMode, TestServerEndpoin GrpcTestMode = grpcTestMode; EndpointName = endpointName; -#if NET6_0_OR_GREATER if (endpointName == TestServerEndpointName.Http3WithTls && !RequireHttp3Attribute.IsSupported(out var message)) { Assert.Ignore(message); } -#endif } protected HttpClient CreateGrpcWebClient() @@ -71,12 +69,10 @@ protected HttpClient CreateGrpcWebClient() { protocol = new Version(1, 1); } -#if NET6_0_OR_GREATER else if (EndpointName == TestServerEndpointName.Http3WithTls) { protocol = new Version(3, 0); } -#endif else { protocol = new Version(2, 0); diff --git a/test/Grpc.AspNetCore.Server.Tests/CallHandlerTests.cs b/test/Grpc.AspNetCore.Server.Tests/CallHandlerTests.cs index 369495fbb..4f3af453a 100644 --- a/test/Grpc.AspNetCore.Server.Tests/CallHandlerTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/CallHandlerTests.cs @@ -150,27 +150,6 @@ public async Task ProtocolValidation_InvalidProtocol_FailureLogged() Assert.AreEqual("Request protocol of 'HTTP/1.1' is not supported.", log!.Message); } -#if !NET5_0_OR_GREATER - // .NET Core 3.0 + IIS returned HTTP/2.0 as the protocol - [Test] - public async Task ProtocolValidation_IISHttp2Protocol_Success() - { - // Arrange - var testSink = new TestSink(); - var testLoggerFactory = new TestLoggerFactory(testSink, true); - - var httpContext = HttpContextHelpers.CreateContext(protocol: GrpcProtocolConstants.Http20Protocol); - var call = CreateHandler(MethodType.ClientStreaming, testLoggerFactory); - - // Act - await call.HandleCallAsync(httpContext).DefaultTimeout(); - - // Assert - var log = testSink.Writes.SingleOrDefault(w => w.EventId.Name == "UnsupportedRequestProtocol"); - Assert.IsNull(log); - } -#endif - #if NET8_0_OR_GREATER [TestCase(MethodType.Unary, false)] [TestCase(MethodType.ClientStreaming, true)] diff --git a/test/Grpc.AspNetCore.Server.Tests/GrpcServicesExtensionsTests.cs b/test/Grpc.AspNetCore.Server.Tests/GrpcServicesExtensionsTests.cs index a1f3ad5fc..f5f756ca0 100644 --- a/test/Grpc.AspNetCore.Server.Tests/GrpcServicesExtensionsTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/GrpcServicesExtensionsTests.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -48,14 +48,9 @@ public void AddGrpc_ConfigureOptions_OptionsSet() Assert.AreEqual(GrpcServiceOptionsSetup.DefaultReceiveMaxMessageSize, options.MaxReceiveMessageSize); Assert.AreEqual(1, options.MaxSendMessageSize); -#if NET6_0_OR_GREATER Assert.AreEqual(2, options.CompressionProviders.Count); Assert.AreEqual("gzip", options.CompressionProviders[0].EncodingName); Assert.AreEqual("deflate", options.CompressionProviders[1].EncodingName); -#else - Assert.AreEqual(1, options.CompressionProviders.Count); - Assert.AreEqual("gzip", options.CompressionProviders[0].EncodingName); -#endif } [Test] diff --git a/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs b/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs index 63f357cff..fd4a6aff8 100644 --- a/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs @@ -603,9 +603,7 @@ public void RequestHeaders_ManyHttpRequestHeaders_HeadersFiltered(string headerN } [TestCase("HTTP/2", GrpcProtocolConstants.Http2ResetStreamCancel)] -#if NET6_0_OR_GREATER [TestCase("HTTP/3", GrpcProtocolConstants.Http3ResetStreamCancel)] -#endif public Task EndCallAsync_LongRunningDeadlineAbort_WaitsUntilDeadlineAbortIsFinished( string protocol, int expectedResetCode) @@ -618,9 +616,7 @@ public Task EndCallAsync_LongRunningDeadlineAbort_WaitsUntilDeadlineAbortIsFinis } [TestCase("HTTP/2", GrpcProtocolConstants.Http2ResetStreamCancel)] -#if NET6_0_OR_GREATER [TestCase("HTTP/3", GrpcProtocolConstants.Http3ResetStreamCancel)] -#endif public Task ProcessHandlerErrorAsync_LongRunningDeadlineAbort_WaitsUntilDeadlineAbortIsFinished( string protocol, int expectedResetCode) diff --git a/test/Shared/MessageHelpers.cs b/test/Shared/MessageHelpers.cs index 8858d18b3..7534a58cd 100644 --- a/test/Shared/MessageHelpers.cs +++ b/test/Shared/MessageHelpers.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -30,12 +30,10 @@ namespace Grpc.Tests.Shared; internal static class MessageHelpers { private static readonly List DefaultProviders = new List - { - new GzipCompressionProvider(CompressionLevel.Fastest), -#if NET6_0_OR_GREATER - new DeflateCompressionProvider(CompressionLevel.Fastest), -#endif - }; + { + new GzipCompressionProvider(CompressionLevel.Fastest), + new DeflateCompressionProvider(CompressionLevel.Fastest), + }; public static Marshaller GetMarshaller(MessageParser parser) where TMessage : IMessage => Marshallers.Create(r => r.ToByteArray(), data => parser.ParseFrom(data)); From 3ed9fb9f31474b4d1318051123a37d9b6f68cda4 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 7 Sep 2024 14:08:46 +0800 Subject: [PATCH 16/48] Log server cancellation errors at info level (#2527) --- src/Grpc.AspNetCore.Server/Internal/GrpcServerLog.cs | 10 +++++++++- .../Internal/HttpContextServerCallContext.cs | 11 ++++++++++- test/FunctionalTests/Client/StreamingTests.cs | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/Grpc.AspNetCore.Server/Internal/GrpcServerLog.cs b/src/Grpc.AspNetCore.Server/Internal/GrpcServerLog.cs index b93fde101..884a6021d 100644 --- a/src/Grpc.AspNetCore.Server/Internal/GrpcServerLog.cs +++ b/src/Grpc.AspNetCore.Server/Internal/GrpcServerLog.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -104,6 +104,9 @@ internal static class GrpcServerLog private static readonly Action _deadlineStopped = LoggerMessage.Define(LogLevel.Trace, new EventId(27, "DeadlineStopped"), "Request deadline stopped."); + private static readonly Action _serviceMethodCanceled = + LoggerMessage.Define(LogLevel.Information, new EventId(28, "ServiceMethodCanceled"), "Service method '{ServiceMethod}' canceled."); + internal static void DeadlineStopped(ILogger logger) { _deadlineStopped(logger, null); @@ -238,4 +241,9 @@ public static void DeadlineTimerRescheduled(ILogger logger, TimeSpan remaining) { _deadlineTimerRescheduled(logger, remaining, null); } + + public static void ServiceMethodCanceled(ILogger logger, string serviceMethod, Exception ex) + { + _serviceMethodCanceled(logger, serviceMethod, ex); + } } diff --git a/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs b/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs index f4ef272e0..7f26bc046 100644 --- a/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs +++ b/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs @@ -193,7 +193,16 @@ private void ProcessHandlerError(Exception ex, string method) } else { - GrpcServerLog.ErrorExecutingServiceMethod(Logger, method, ex); + if (ex is OperationCanceledException or IOException && CancellationTokenCore.IsCancellationRequested) + { + // Request cancellation can cause OCE and IOException. + // When the request has been canceled log these error types at the info-level to avoid creating error-level noise. + GrpcServerLog.ServiceMethodCanceled(Logger, method, ex); + } + else + { + GrpcServerLog.ErrorExecutingServiceMethod(Logger, method, ex); + } var message = ErrorMessageHelper.BuildErrorMessage("Exception was thrown by handler.", ex, Options.EnableDetailedErrors); diff --git a/test/FunctionalTests/Client/StreamingTests.cs b/test/FunctionalTests/Client/StreamingTests.cs index 8bc2c7d6e..dbe7194c7 100644 --- a/test/FunctionalTests/Client/StreamingTests.cs +++ b/test/FunctionalTests/Client/StreamingTests.cs @@ -429,7 +429,7 @@ async Task ClientStreamedData(IAsyncStreamReader requ AssertHasLog(LogLevel.Information, "GrpcStatusError", "Call failed with gRPC error status. Status code: 'Cancelled', Message: ''."); await TestHelpers.AssertIsTrueRetryAsync( - () => HasLog(LogLevel.Error, "ErrorExecutingServiceMethod", "Error when executing service method 'ClientStreamedDataTimeout'."), + () => HasLog(LogLevel.Information, "ServiceMethodCanceled", "Service method 'ClientStreamedDataTimeout' canceled."), "Wait for server error so it doesn't impact other tests.").DefaultTimeout(); } From de9a82fe8eae0d40b70edbe04a766e3ac0ad8d54 Mon Sep 17 00:00:00 2001 From: Noam Greenberg <106929496+wabalubdub@users.noreply.github.com> Date: Thu, 12 Sep 2024 17:31:10 +0300 Subject: [PATCH 17/48] Update logging to use generated logs (#2531) --- .../GrpcHealthChecksPublisher.cs | 21 +- .../ContextPropagationInterceptor.cs | 13 +- .../GrpcReflectionServiceExtensions.cs | 11 +- .../Internal/GrpcServerLog.cs | 254 ++++-------------- .../Internal/ServerCallHandlerFactory.cs | 20 +- .../Internal/BinderServiceModelProvider.cs | 11 +- .../Model/Internal/ServiceRouteBuilder.cs | 26 +- .../Internal/GrpcWebMiddleware.cs | 33 +-- src/Grpc.Net.Client/Balancer/DnsResolver.cs | 44 +-- .../Balancer/Internal/BalancerHttpHandler.cs | 18 +- .../Balancer/Internal/ConnectionManager.cs | 116 ++------ .../SocketConnectivitySubchannelTransport.cs | 155 +++-------- .../Balancer/PickFirstBalancer.cs | 17 +- .../Balancer/PollingResolver.cs | 66 ++--- src/Grpc.Net.Client/Balancer/Subchannel.cs | 177 ++++-------- .../Balancer/SubchannelsLoadBalancer.cs | 52 ++-- src/Grpc.Net.Client/GrpcChannel.cs | 13 +- .../Internal/ClientStreamWriterBase.cs | 29 +- src/Grpc.Net.Client/Internal/GrpcCallLog.cs | 238 ++++------------ .../Internal/HttpContentClientStreamReader.cs | 11 +- .../Internal/Retry/ChannelRetryThrottling.cs | 13 +- .../Internal/Retry/RetryCallBaseLog.cs | 121 ++------- .../Internal/GrpcCallInvokerFactory.cs | 13 +- 23 files changed, 384 insertions(+), 1088 deletions(-) diff --git a/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksPublisher.cs b/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksPublisher.cs index 36ecd8a28..7fee5bfe5 100644 --- a/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksPublisher.cs +++ b/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksPublisher.cs @@ -25,7 +25,7 @@ namespace Grpc.AspNetCore.HealthChecks; -internal sealed class GrpcHealthChecksPublisher : IHealthCheckPublisher +internal sealed partial class GrpcHealthChecksPublisher : IHealthCheckPublisher { private readonly HealthServiceImpl _healthService; private readonly ILogger _logger; @@ -75,22 +75,13 @@ public Task PublishAsync(HealthReport report, CancellationToken cancellationToke return Task.CompletedTask; } - private static class Log + private static partial class Log { - private static readonly Action _evaluatingPublishedHealthReport = - LoggerMessage.Define(LogLevel.Trace, new EventId(1, "EvaluatingPublishedHealthReport"), "Evaluating {HealthReportEntryCount} published health report entries against {ServiceMappingCount} service mappings."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 1, EventName = "EvaluatingPublishedHealthReport", Message = "Evaluating {HealthReportEntryCount} published health report entries against {ServiceMappingCount} service mappings.")] + public static partial void EvaluatingPublishedHealthReport(ILogger logger, int healthReportEntryCount, int serviceMappingCount); - private static readonly Action _serviceMappingStatusUpdated = - LoggerMessage.Define(LogLevel.Debug, new EventId(2, "ServiceMappingStatusUpdated"), "Service '{ServiceName}' status updated to {Status}. {EntriesCount} health report entries evaluated."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 2, EventName = "ServiceMappingStatusUpdated", Message = "Service '{ServiceName}' status updated to {Status}. {EntriesCount} health report entries evaluated.")] + public static partial void ServiceMappingStatusUpdated(ILogger logger, string serviceName, HealthCheckResponse.Types.ServingStatus status, int entriesCount); - public static void EvaluatingPublishedHealthReport(ILogger logger, int healthReportEntryCount, int serviceMappingCount) - { - _evaluatingPublishedHealthReport(logger, healthReportEntryCount, serviceMappingCount, null); - } - - public static void ServiceMappingStatusUpdated(ILogger logger, string serviceName, HealthCheckResponse.Types.ServingStatus status, int entriesCount) - { - _serviceMappingStatusUpdated(logger, serviceName, status, entriesCount, null); - } } } diff --git a/src/Grpc.AspNetCore.Server.ClientFactory/ContextPropagationInterceptor.cs b/src/Grpc.AspNetCore.Server.ClientFactory/ContextPropagationInterceptor.cs index d2baa257b..651996b96 100644 --- a/src/Grpc.AspNetCore.Server.ClientFactory/ContextPropagationInterceptor.cs +++ b/src/Grpc.AspNetCore.Server.ClientFactory/ContextPropagationInterceptor.cs @@ -30,7 +30,7 @@ namespace Grpc.AspNetCore.ClientFactory; /// The interceptor gets the request from IHttpContextAccessor, which is a singleton. /// IHttpContextAccessor uses an async local value. /// -internal class ContextPropagationInterceptor : Interceptor +internal partial class ContextPropagationInterceptor : Interceptor { private readonly GrpcContextPropagationOptions _options; private readonly IHttpContextAccessor _httpContextAccessor; @@ -258,15 +258,10 @@ public async Task MoveNext(CancellationToken cancellationToken) } } - private static class Log + private static partial class Log { - private static readonly Action _propagateServerCallContextFailure = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "PropagateServerCallContextFailure"), "Unable to propagate server context values to the call. {ErrorMessage}"); - - public static void PropagateServerCallContextFailure(ILogger logger, string errorMessage) - { - _propagateServerCallContextFailure(logger, errorMessage, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "PropagateServerCallContextFailure", Message = "Unable to propagate server context values to the call. {ErrorMessage}")] + public static partial void PropagateServerCallContextFailure(ILogger logger, string errorMessage); } // Store static callbacks so delegates are allocated once diff --git a/src/Grpc.AspNetCore.Server.Reflection/GrpcReflectionServiceExtensions.cs b/src/Grpc.AspNetCore.Server.Reflection/GrpcReflectionServiceExtensions.cs index c8e3770f8..a236ab412 100644 --- a/src/Grpc.AspNetCore.Server.Reflection/GrpcReflectionServiceExtensions.cs +++ b/src/Grpc.AspNetCore.Server.Reflection/GrpcReflectionServiceExtensions.cs @@ -31,7 +31,7 @@ namespace Microsoft.Extensions.DependencyInjection; /// /// Extension methods for the gRPC reflection services. /// -public static class GrpcReflectionServiceExtensions +public static partial class GrpcReflectionServiceExtensions { /// /// Adds gRPC reflection services to the specified . @@ -150,14 +150,13 @@ public static IServiceCollection AddGrpcReflection(this IServiceCollection servi return baseType; } - private static class Log + private static partial class Log { - private static readonly Action _serviceDescriptorNotResolved = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "ServiceDescriptorNotResolved"), "Could not resolve service descriptor for '{ServiceType}'. The service metadata will not be exposed by the reflection service."); - + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "ServiceDescriptorNotResolved", Message = "Could not resolve service descriptor for '{ServiceType}'. The service metadata will not be exposed by the reflection service.")] + private static partial void ServiceDescriptorNotResolved(ILogger logger, string serviceType); public static void ServiceDescriptorNotResolved(ILogger logger, Type serviceType) { - _serviceDescriptorNotResolved(logger, serviceType.FullName ?? string.Empty, null); + ServiceDescriptorNotResolved(logger, serviceType.FullName ?? string.Empty); } } } diff --git a/src/Grpc.AspNetCore.Server/Internal/GrpcServerLog.cs b/src/Grpc.AspNetCore.Server/Internal/GrpcServerLog.cs index 884a6021d..73e991554 100644 --- a/src/Grpc.AspNetCore.Server/Internal/GrpcServerLog.cs +++ b/src/Grpc.AspNetCore.Server/Internal/GrpcServerLog.cs @@ -21,229 +21,89 @@ namespace Grpc.AspNetCore.Server.Internal; -internal static class GrpcServerLog +internal static partial class GrpcServerLog { - private static readonly Action _unableToDisableMaxRequestBodySize = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "UnableToDisableMaxRequestBodySizeLimit"), "Unable to disable the max request body size limit."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "UnableToDisableMaxRequestBodySizeLimit", Message = "Unable to disable the max request body size limit.")] + public static partial void UnableToDisableMaxRequestBodySize(ILogger logger); - private static readonly Action _unsupportedRequestContentType = - LoggerMessage.Define(LogLevel.Information, new EventId(2, "UnsupportedRequestContentType"), "Request content-type of '{ContentType}' is not supported."); + [LoggerMessage(Level = LogLevel.Information, EventId = 2, EventName = "UnsupportedRequestContentType", Message = "Request content-type of '{ContentType}' is not supported.")] + public static partial void UnsupportedRequestContentType(ILogger logger, string? contentType); - private static readonly Action _unsupportedRequestProtocol = - LoggerMessage.Define(LogLevel.Information, new EventId(3, "UnsupportedRequestProtocol"), "Request protocol of '{Protocol}' is not supported."); + [LoggerMessage(Level = LogLevel.Information, EventId = 3, EventName = "UnsupportedRequestProtocol", Message = "Request protocol of '{Protocol}' is not supported.")] + public static partial void UnsupportedRequestProtocol(ILogger logger, string? protocol); - private static readonly Action _deadlineExceeded = - LoggerMessage.Define(LogLevel.Debug, new EventId(4, "DeadlineExceeded"), "Request with timeout of {Timeout} has exceeded its deadline."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 4, EventName = "DeadlineExceeded", Message = "Request with timeout of {Timeout} has exceeded its deadline.")] + public static partial void DeadlineExceeded(ILogger logger, TimeSpan timeout); - private static readonly Action _invalidTimeoutIgnored = - LoggerMessage.Define(LogLevel.Debug, new EventId(5, "InvalidTimeoutIgnored"), "Invalid grpc-timeout header value '{Timeout}' has been ignored."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 5, EventName = "InvalidTimeoutIgnored", Message = "Invalid grpc-timeout header value '{Timeout}' has been ignored.")] + public static partial void InvalidTimeoutIgnored(ILogger logger, string timeout); - private static readonly Action _errorExecutingServiceMethod = - LoggerMessage.Define(LogLevel.Error, new EventId(6, "ErrorExecutingServiceMethod"), "Error when executing service method '{ServiceMethod}'."); + [LoggerMessage(Level = LogLevel.Error, EventId = 6, EventName = "ErrorExecutingServiceMethod", Message = "Error when executing service method '{ServiceMethod}'.")] + public static partial void ErrorExecutingServiceMethod(ILogger logger, string serviceMethod, Exception ex); - private static readonly Action _rpcConnectionError = - LoggerMessage.Define(LogLevel.Information, new EventId(7, "RpcConnectionError"), "Error status code '{StatusCode}' with detail '{Detail}' raised."); + [LoggerMessage(Level = LogLevel.Information, EventId = 7, EventName = "RpcConnectionError", Message = "Error status code '{StatusCode}' with detail '{Detail}' raised.")] + public static partial void RpcConnectionError(ILogger logger, StatusCode statusCode, string detail, Exception? debugException); - private static readonly Action _encodingNotInAcceptEncoding = - LoggerMessage.Define(LogLevel.Debug, new EventId(8, "EncodingNotInAcceptEncoding"), "Request grpc-encoding header value '{GrpcEncoding}' is not in grpc-accept-encoding."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 8, EventName = "EncodingNotInAcceptEncoding", Message = "Request grpc-encoding header value '{GrpcEncoding}' is not in grpc-accept-encoding.")] + public static partial void EncodingNotInAcceptEncoding(ILogger logger, string grpcEncoding); - private static readonly Action _deadlineCancellationError = - LoggerMessage.Define(LogLevel.Error, new EventId(9, "DeadlineCancellationError"), "Error occurred while trying to cancel the request due to deadline exceeded."); + [LoggerMessage(Level = LogLevel.Error, EventId = 9, EventName = "DeadlineCancellationError", Message = "Error occurred while trying to cancel the request due to deadline exceeded.")] + public static partial void DeadlineCancellationError(ILogger logger, Exception ex); - private static readonly Action _readingMessage = - LoggerMessage.Define(LogLevel.Debug, new EventId(10, "ReadingMessage"), "Reading message."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 10, EventName = "ReadingMessage", Message = "Reading message.")] + public static partial void ReadingMessage(ILogger logger); - private static readonly Action _noMessageReturned = - LoggerMessage.Define(LogLevel.Trace, new EventId(11, "NoMessageReturned"), "No message returned."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 11, EventName = "NoMessageReturned", Message = "No message returned.")] + public static partial void NoMessageReturned(ILogger logger); - private static readonly Action _deserializingMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(12, "DeserializingMessage"), "Deserializing {MessageLength} byte message to '{MessageType}'."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 12, EventName = "DeserializingMessage", Message = "Deserializing {MessageLength} byte message to '{MessageType}'.")] + public static partial void DeserializingMessage(ILogger logger, int messageLength, Type messageType); - private static readonly Action _receivedMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(13, "ReceivedMessage"), "Received message."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 13, EventName = "ReceivedMessage", Message = "Received message.")] + public static partial void ReceivedMessage(ILogger logger); - private static readonly Action _errorReadingMessage = - LoggerMessage.Define(LogLevel.Information, new EventId(14, "ErrorReadingMessage"), "Error reading message."); + [LoggerMessage(Level = LogLevel.Information, EventId = 14, EventName = "ErrorReadingMessage", Message = "Error reading message.")] + public static partial void ErrorReadingMessage(ILogger logger, Exception ex); - private static readonly Action _sendingMessage = - LoggerMessage.Define(LogLevel.Debug, new EventId(15, "SendingMessage"), "Sending message."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 15, EventName = "SendingMessage", Message = "Sending message.")] + public static partial void SendingMessage(ILogger logger); - private static readonly Action _messageSent = - LoggerMessage.Define(LogLevel.Trace, new EventId(16, "MessageSent"), "Message sent."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 16, EventName = "MessageSent", Message = "Message sent.")] + public static partial void MessageSent(ILogger logger); - private static readonly Action _errorSendingMessage = - LoggerMessage.Define(LogLevel.Information, new EventId(17, "ErrorSendingMessage"), "Error sending message."); + [LoggerMessage(Level = LogLevel.Information, EventId = 17, EventName = "ErrorSendingMessage", Message = "Error sending message.")] + public static partial void ErrorSendingMessage(ILogger logger, Exception ex); - private static readonly Action _serializedMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(18, "SerializedMessage"), "Serialized '{MessageType}' to {MessageLength} byte message."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 18, EventName = "SerializedMessage", Message = "Serialized '{MessageType}' to {MessageLength} byte message.")] + public static partial void SerializedMessage(ILogger logger, Type messageType, int messageLength); - private static readonly Action _compressingMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(19, "CompressingMessage"), "Compressing message with '{MessageEncoding}' encoding."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 19, EventName = "CompressingMessage", Message = "Compressing message with '{MessageEncoding}' encoding.")] + public static partial void CompressingMessage(ILogger logger, string messageEncoding); - private static readonly Action _decompressingMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(20, "DecompressingMessage"), "Decompressing message with '{MessageEncoding}' encoding."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 20, EventName = "DecompressingMessage", Message = "Decompressing message with '{MessageEncoding}' encoding.")] + public static partial void DecompressingMessage(ILogger logger, string messageEncoding); - private static readonly Action _resettingResponse = - LoggerMessage.Define(LogLevel.Debug, new EventId(21, "ResettingResponse"), "Resetting response stream with error code {ErrorCode}."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 21, EventName = "ResettingResponse", Message = "Resetting response stream with error code {ErrorCode}.")] + public static partial void ResettingResponse(ILogger logger, int errorCode); - private static readonly Action _abortingResponse = - LoggerMessage.Define(LogLevel.Debug, new EventId(22, "AbortingResponse"), "IHttpResetFeature is not available so unable to cleanly reset response stream. Aborting response stream."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 22, EventName = "AbortingResponse", Message = "IHttpResetFeature is not available so unable to cleanly reset response stream. Aborting response stream.")] + public static partial void AbortingResponse(ILogger logger); - private static readonly Action _unhandledCorsPreflightRequest = - LoggerMessage.Define(LogLevel.Information, new EventId(23, "UnhandledCorsPreflightRequest"), "Unhandled CORS preflight request received. CORS may not be configured correctly in the application."); + [LoggerMessage(Level = LogLevel.Information, EventId = 23, EventName = "UnhandledCorsPreflightRequest", Message = "Unhandled CORS preflight request received. CORS may not be configured correctly in the application.")] + public static partial void UnhandledCorsPreflightRequest(ILogger logger); - private static readonly Action _deadlineTimeoutTooLong = - LoggerMessage.Define(LogLevel.Debug, new EventId(24, "DeadlineTimeoutTooLong"), "Deadline timeout {Timeout} is above maximum allowed timeout of 99999999 seconds. Maximum timeout will be used."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 24, EventName = "DeadlineTimeoutTooLong", Message = "Deadline timeout {Timeout} is above maximum allowed timeout of 99999999 seconds. Maximum timeout will be used.")] + public static partial void DeadlineTimeoutTooLong(ILogger logger, TimeSpan timeout); - private static readonly Action _deadlineTimerRescheduled = - LoggerMessage.Define(LogLevel.Trace, new EventId(25, "DeadlineTimerRescheduled"), "Deadline timer triggered but {Remaining} remaining before deadline exceeded. Deadline timer rescheduled."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 25, EventName = "DeadlineTimerRescheduled", Message = "Deadline timer triggered but {Remaining} remaining before deadline exceeded. Deadline timer rescheduled.")] + public static partial void DeadlineTimerRescheduled(ILogger logger, TimeSpan remaining); - private static readonly Action _deadlineStarted = - LoggerMessage.Define(LogLevel.Trace, new EventId(26, "DeadlineStarted"), "Request deadline timeout of {Timeout} started."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 26, EventName = "DeadlineStarted", Message = "Request deadline timeout of {Timeout} started.")] + public static partial void DeadlineStarted(ILogger logger, TimeSpan timeout); - private static readonly Action _deadlineStopped = - LoggerMessage.Define(LogLevel.Trace, new EventId(27, "DeadlineStopped"), "Request deadline stopped."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 27, EventName = "DeadlineStopped", Message = "Request deadline stopped.")] + internal static partial void DeadlineStopped(ILogger logger); - private static readonly Action _serviceMethodCanceled = - LoggerMessage.Define(LogLevel.Information, new EventId(28, "ServiceMethodCanceled"), "Service method '{ServiceMethod}' canceled."); - - internal static void DeadlineStopped(ILogger logger) - { - _deadlineStopped(logger, null); - } - - public static void DeadlineStarted(ILogger logger, TimeSpan timeout) - { - _deadlineStarted(logger, timeout, null); - } - - public static void DeadlineExceeded(ILogger logger, TimeSpan timeout) - { - _deadlineExceeded(logger, timeout, null); - } - - public static void InvalidTimeoutIgnored(ILogger logger, string timeout) - { - _invalidTimeoutIgnored(logger, timeout, null); - } - - public static void ErrorExecutingServiceMethod(ILogger logger, string serviceMethod, Exception ex) - { - _errorExecutingServiceMethod(logger, serviceMethod, ex); - } - - public static void RpcConnectionError(ILogger logger, StatusCode statusCode, string detail, Exception? debugException) - { - _rpcConnectionError(logger, statusCode, detail, debugException); - } - - public static void EncodingNotInAcceptEncoding(ILogger logger, string grpcEncoding) - { - _encodingNotInAcceptEncoding(logger, grpcEncoding, null); - } - - public static void DeadlineCancellationError(ILogger logger, Exception ex) - { - _deadlineCancellationError(logger, ex); - } - - public static void UnableToDisableMaxRequestBodySize(ILogger logger) - { - _unableToDisableMaxRequestBodySize(logger, null); - } - - public static void UnsupportedRequestContentType(ILogger logger, string? contentType) - { - _unsupportedRequestContentType(logger, contentType, null); - } - - public static void UnsupportedRequestProtocol(ILogger logger, string? protocol) - { - _unsupportedRequestProtocol(logger, protocol, null); - } - - public static void ReadingMessage(ILogger logger) - { - _readingMessage(logger, null); - } - - public static void NoMessageReturned(ILogger logger) - { - _noMessageReturned(logger, null); - } - - public static void DeserializingMessage(ILogger logger, int messageLength, Type messageType) - { - _deserializingMessage(logger, messageLength, messageType, null); - } - - public static void ReceivedMessage(ILogger logger) - { - _receivedMessage(logger, null); - } - - public static void ErrorReadingMessage(ILogger logger, Exception ex) - { - _errorReadingMessage(logger, ex); - } - - public static void SendingMessage(ILogger logger) - { - _sendingMessage(logger, null); - } - - public static void MessageSent(ILogger logger) - { - _messageSent(logger, null); - } - - public static void ErrorSendingMessage(ILogger logger, Exception ex) - { - _errorSendingMessage(logger, ex); - } - - public static void SerializedMessage(ILogger logger, Type messageType, int messageLength) - { - _serializedMessage(logger, messageType, messageLength, null); - } - - public static void CompressingMessage(ILogger logger, string messageEncoding) - { - _compressingMessage(logger, messageEncoding, null); - } - - public static void DecompressingMessage(ILogger logger, string messageEncoding) - { - _decompressingMessage(logger, messageEncoding, null); - } - - public static void ResettingResponse(ILogger logger, int errorCode) - { - _resettingResponse(logger, errorCode, null); - } - - public static void AbortingResponse(ILogger logger) - { - _abortingResponse(logger, null); - } - - public static void UnhandledCorsPreflightRequest(ILogger logger) - { - _unhandledCorsPreflightRequest(logger, null); - } - - public static void DeadlineTimeoutTooLong(ILogger logger, TimeSpan timeout) - { - _deadlineTimeoutTooLong(logger, timeout, null); - } - - public static void DeadlineTimerRescheduled(ILogger logger, TimeSpan remaining) - { - _deadlineTimerRescheduled(logger, remaining, null); - } - - public static void ServiceMethodCanceled(ILogger logger, string serviceMethod, Exception ex) - { - _serviceMethodCanceled(logger, serviceMethod, ex); - } + [LoggerMessage(Level = LogLevel.Information, EventId = 28, EventName = "ServiceMethodCanceled", Message = "Service method '{ServiceMethod}' canceled.")] + public static partial void ServiceMethodCanceled(ILogger logger, string serviceMethod, Exception ex); } diff --git a/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs b/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs index 9d41c3520..95d545942 100644 --- a/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs +++ b/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs @@ -154,21 +154,11 @@ public RequestDelegate CreateUnimplementedService() } } -internal static class ServerCallHandlerFactoryLog +internal static partial class ServerCallHandlerFactoryLog { - private static readonly Action _serviceUnimplemented = - LoggerMessage.Define(LogLevel.Information, new EventId(1, "ServiceUnimplemented"), "Service '{ServiceName}' is unimplemented."); + [LoggerMessage(Level = LogLevel.Information, EventId = 1, EventName = "ServiceUnimplemented", Message = "Service '{ServiceName}' is unimplemented.")] + public static partial void ServiceUnimplemented(ILogger logger, string serviceName); - private static readonly Action _methodUnimplemented = - LoggerMessage.Define(LogLevel.Information, new EventId(2, "MethodUnimplemented"), "Method '{MethodName}' is unimplemented."); - - public static void ServiceUnimplemented(ILogger logger, string serviceName) - { - _serviceUnimplemented(logger, serviceName, null); - } - - public static void MethodUnimplemented(ILogger logger, string methodName) - { - _methodUnimplemented(logger, methodName, null); - } + [LoggerMessage(Level = LogLevel.Information, EventId = 2, EventName = "MethodUnimplemented", Message = "Method '{MethodName}' is unimplemented.")] + public static partial void MethodUnimplemented(ILogger logger, string methodName); } diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs b/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs index db6fce070..101ee27e6 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs @@ -61,13 +61,8 @@ public void OnServiceMethodDiscovery(ServiceMethodProviderContext cont } } -internal static class BinderServiceMethodProviderLog +internal static partial class BinderServiceMethodProviderLog { - private static readonly Action _bindMethodNotFound = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "BindMethodNotFound"), "Could not find bind method for {ServiceType}."); - - public static void BindMethodNotFound(ILogger logger, Type serviceType) - { - _bindMethodNotFound(logger, serviceType, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "BindMethodNotFound", Message = "Could not find bind method for {ServiceType}.")] + public static partial void BindMethodNotFound(ILogger logger, Type serviceType); } diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs index 83d8875ae..dc3613ffa 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs @@ -156,16 +156,10 @@ private static IEndpointConventionBuilder CreateUnimplementedEndpoint(IEndpointR } } -internal static class ServiceRouteBuilderLog +internal static partial class ServiceRouteBuilderLog { - private static readonly Action _addedServiceMethod = - LoggerMessage.Define(LogLevel.Trace, new EventId(1, "AddedServiceMethod"), "Added gRPC method '{MethodName}' to service '{ServiceName}'. Method type: {MethodType}, HTTP method: {HttpMethod}, route pattern: '{RoutePattern}'."); - - private static readonly Action _discoveringServiceMethods = - LoggerMessage.Define(LogLevel.Trace, new EventId(2, "DiscoveringServiceMethods"), "Discovering gRPC methods for {ServiceType}."); - - private static readonly Action _noServiceMethodsDiscovered = - LoggerMessage.Define(LogLevel.Debug, new EventId(3, "NoServiceMethodsDiscovered"), "No gRPC methods discovered for {ServiceType}."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 1, EventName = "AddedServiceMethod", Message = "Added gRPC method '{MethodName}' to service '{ServiceName}'. Method type: {MethodType}, HTTP method: {HttpMethod}, route pattern: '{RoutePattern}'.")] + private static partial void AddedServiceMethod(ILogger logger, string methodName, string serviceName, MethodType methodType, string HttpMethod, string routePattern); public static void AddedServiceMethod(ILogger logger, string methodName, string serviceName, MethodType methodType, IReadOnlyList httpMethods, string routePattern) { @@ -174,17 +168,13 @@ public static void AddedServiceMethod(ILogger logger, string methodName, string // There should be one HTTP method here, but concat in case someone has overriden metadata. var allHttpMethods = string.Join(',', httpMethods); - _addedServiceMethod(logger, methodName, serviceName, methodType, allHttpMethods, routePattern, null); + AddedServiceMethod(logger, methodName, serviceName, methodType, allHttpMethods, routePattern); } } - public static void DiscoveringServiceMethods(ILogger logger, Type serviceType) - { - _discoveringServiceMethods(logger, serviceType, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 2, EventName = "DiscoveringServiceMethods", Message = "Discovering gRPC methods for {ServiceType}.")] + public static partial void DiscoveringServiceMethods(ILogger logger, Type serviceType); - public static void NoServiceMethodsDiscovered(ILogger logger, Type serviceType) - { - _noServiceMethodsDiscovered(logger, serviceType, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 3, EventName = "NoServiceMethodsDiscovered", Message = "No gRPC methods discovered for {ServiceType}.")] + public static partial void NoServiceMethodsDiscovered(ILogger logger, Type serviceType); } diff --git a/src/Grpc.AspNetCore.Web/Internal/GrpcWebMiddleware.cs b/src/Grpc.AspNetCore.Web/Internal/GrpcWebMiddleware.cs index ece1298f3..a10ba975f 100644 --- a/src/Grpc.AspNetCore.Web/Internal/GrpcWebMiddleware.cs +++ b/src/Grpc.AspNetCore.Web/Internal/GrpcWebMiddleware.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -24,7 +24,7 @@ namespace Grpc.AspNetCore.Web.Internal; -internal sealed class GrpcWebMiddleware +internal sealed partial class GrpcWebMiddleware { private readonly GrpcWebOptions _options; private readonly ILogger _logger; @@ -158,30 +158,15 @@ private static bool TryGetWebMode(string? contentType, out ServerGrpcWebMode mod return false; } - private static class Log + private static partial class Log { - private static readonly Action _detectedGrpcWebRequest = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "DetectedGrpcWebRequest"), "Detected gRPC-Web request from content-type '{ContentType}'."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "DetectedGrpcWebRequest", Message = "Detected gRPC-Web request from content-type '{ContentType}'.")] + public static partial void DetectedGrpcWebRequest(ILogger logger, string contentType); - private static readonly Action _grpcWebRequestNotProcessed = - LoggerMessage.Define(LogLevel.Debug, new EventId(2, "GrpcWebRequestNotProcessed"), $"gRPC-Web request not processed. gRPC-Web must be enabled by placing the [EnableGrpcWeb] attribute on a service or method, or enable for all services in the app with {nameof(GrpcWebOptions)}."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 2, EventName = "GrpcWebRequestNotProcessed", Message = $"gRPC-Web request not processed. gRPC-Web must be enabled by placing the [EnableGrpcWeb] attribute on a service or method, or enable for all services in the app with {nameof(GrpcWebOptions)}.")] + public static partial void GrpcWebRequestNotProcessed(ILogger logger); - private static readonly Action _sendingGrpcWebResponse = - LoggerMessage.Define(LogLevel.Debug, new EventId(3, "SendingGrpcWebResponse"), "Sending gRPC-Web response with content-type '{ContentType}'."); - - public static void DetectedGrpcWebRequest(ILogger logger, string contentType) - { - _detectedGrpcWebRequest(logger, contentType, null); - } - - public static void GrpcWebRequestNotProcessed(ILogger logger) - { - _grpcWebRequestNotProcessed(logger, null); - } - - public static void SendingGrpcWebResponse(ILogger logger, string contentType) - { - _sendingGrpcWebResponse(logger, contentType, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 3, EventName = "SendingGrpcWebResponse", Message = "Sending gRPC-Web response with content-type '{ContentType}'.")] + public static partial void SendingGrpcWebResponse(ILogger logger, string contentType); } } diff --git a/src/Grpc.Net.Client/Balancer/DnsResolver.cs b/src/Grpc.Net.Client/Balancer/DnsResolver.cs index 2ae026594..d8cb1b39e 100644 --- a/src/Grpc.Net.Client/Balancer/DnsResolver.cs +++ b/src/Grpc.Net.Client/Balancer/DnsResolver.cs @@ -145,50 +145,30 @@ private void OnTimerCallback(object? state) } } -internal static class DnsResolverLog +internal static partial class DnsResolverLog { - private static readonly Action _startingRateLimitDelay = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "StartingRateLimitDelay"), "Starting rate limit delay of {DelayDuration}. DNS resolution rate limit is once every {RateLimitDuration}."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "StartingRateLimitDelay", Message = "Starting rate limit delay of {DelayDuration}. DNS resolution rate limit is once every {RateLimitDuration}.")] + public static partial void StartingRateLimitDelay(ILogger logger, TimeSpan delayDuration, TimeSpan rateLimitDuration); - private static readonly Action _startingDnsQuery = - LoggerMessage.Define(LogLevel.Trace, new EventId(2, "StartingDnsQuery"), "Starting DNS query to get hosts from '{DnsAddress}'."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 2, EventName = "StartingDnsQuery", Message = "Starting DNS query to get hosts from '{DnsAddress}'.")] + public static partial void StartingDnsQuery(ILogger logger, string dnsAddress); - private static readonly Action _receivedDnsResults = - LoggerMessage.Define(LogLevel.Debug, new EventId(3, "ReceivedDnsResults"), "Received {ResultCount} DNS results from '{DnsAddress}'. Results: {DnsResults}"); - - private static readonly Action _errorQueryingDns = - LoggerMessage.Define(LogLevel.Error, new EventId(4, "ErrorQueryingDns"), "Error querying DNS hosts for '{DnsAddress}'."); - - private static readonly Action _errorFromRefreshInterval = - LoggerMessage.Define(LogLevel.Error, new EventId(5, "ErrorFromRefreshIntervalTimer"), "Error from refresh interval timer."); - - public static void StartingRateLimitDelay(ILogger logger, TimeSpan delayDuration, TimeSpan rateLimitDuration) - { - _startingRateLimitDelay(logger, delayDuration, rateLimitDuration, null); - } - - public static void StartingDnsQuery(ILogger logger, string dnsAddress) - { - _startingDnsQuery(logger, dnsAddress, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 3, EventName = "ReceivedDnsResults", Message = "Received {ResultCount} DNS results from '{DnsAddress}'. Results: {DnsResults}")] + private static partial void ReceivedDnsResults(ILogger logger, int resultCount, string dnsAddress, string dnsResults); public static void ReceivedDnsResults(ILogger logger, int resultCount, string dnsAddress, IList dnsResults) { if (logger.IsEnabled(LogLevel.Debug)) { - _receivedDnsResults(logger, resultCount, dnsAddress, string.Join(", ", dnsResults), null); + ReceivedDnsResults(logger, resultCount, dnsAddress, string.Join(", ", dnsResults)); } } - public static void ErrorQueryingDns(ILogger logger, string dnsAddress, Exception ex) - { - _errorQueryingDns(logger, dnsAddress, ex); - } + [LoggerMessage(Level = LogLevel.Error, EventId = 4, EventName = "ErrorQueryingDns", Message = "Error querying DNS hosts for '{DnsAddress}'.")] + public static partial void ErrorQueryingDns(ILogger logger, string dnsAddress, Exception ex); - public static void ErrorFromRefreshInterval(ILogger logger, Exception ex) - { - _errorFromRefreshInterval(logger, ex); - } + [LoggerMessage(Level = LogLevel.Error, EventId = 5, EventName = "ErrorFromRefreshIntervalTimer", Message = "Error from refresh interval timer.")] + public static partial void ErrorFromRefreshInterval(ILogger logger, Exception ex); } /// diff --git a/src/Grpc.Net.Client/Balancer/Internal/BalancerHttpHandler.cs b/src/Grpc.Net.Client/Balancer/Internal/BalancerHttpHandler.cs index 33bb1d8b5..37bc3c7e9 100644 --- a/src/Grpc.Net.Client/Balancer/Internal/BalancerHttpHandler.cs +++ b/src/Grpc.Net.Client/Balancer/Internal/BalancerHttpHandler.cs @@ -29,7 +29,7 @@ namespace Grpc.Net.Client.Balancer.Internal; -internal class BalancerHttpHandler : DelegatingHandler +internal partial class BalancerHttpHandler : DelegatingHandler { private static readonly object SetupLock = new object(); @@ -171,24 +171,20 @@ protected override async Task SendAsync( } } - internal static class Log + internal static partial class Log { - private static readonly Action _sendingRequest = - LoggerMessage.Define(LogLevel.Trace, new EventId(1, "SendingRequest"), "Sending request {RequestUri}."); - private static readonly Action _startingConnectCallback = - LoggerMessage.Define(LogLevel.Trace, new EventId(2, "StartingConnectCallback"), "Starting connect callback for {Endpoint}."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 1, EventName = "SendingRequest", Message = "Sending request {RequestUri}.")] + public static partial void SendingRequest(ILogger logger, Uri requestUri); - public static void SendingRequest(ILogger logger, Uri requestUri) - { - _sendingRequest(logger, requestUri, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 2, EventName = "StartingConnectCallback", Message = "Starting connect callback for {Endpoint}.")] + private static partial void StartingConnectCallback(ILogger logger, string endpoint); public static void StartingConnectCallback(ILogger logger, DnsEndPoint endpoint) { if (logger.IsEnabled(LogLevel.Trace)) { - _startingConnectCallback(logger, $"{endpoint.Host}:{endpoint.Port}", null); + StartingConnectCallback(logger, $"{endpoint.Host}:{endpoint.Port}"); } } } diff --git a/src/Grpc.Net.Client/Balancer/Internal/ConnectionManager.cs b/src/Grpc.Net.Client/Balancer/Internal/ConnectionManager.cs index b64a4557c..3512d9b45 100644 --- a/src/Grpc.Net.Client/Balancer/Internal/ConnectionManager.cs +++ b/src/Grpc.Net.Client/Balancer/Internal/ConnectionManager.cs @@ -469,114 +469,54 @@ public void Dispose() } } -internal static class ConnectionManagerLog +internal static partial class ConnectionManagerLog { - private static readonly Action _resolverUnsupportedLoadBalancingConfig = - LoggerMessage.Define(LogLevel.Warning, new EventId(1, "ResolverUnsupportedLoadBalancingConfig"), "Service config returned by the resolver contains unsupported load balancer policies: {LoadBalancingConfigs}. Load balancer unchanged."); - - private static readonly Action _resolverServiceConfigNotUsed = - LoggerMessage.Define(LogLevel.Debug, new EventId(2, "ResolverServiceConfigNotUsed"), "Service config returned by the resolver not used."); - - private static readonly Action _channelStateUpdated = - LoggerMessage.Define(LogLevel.Debug, new EventId(3, "ChannelStateUpdated"), "Channel state updated to {State}."); - - private static readonly Action _channelPickerUpdated = - LoggerMessage.Define(LogLevel.Debug, new EventId(4, "ChannelPickerUpdated"), "Channel picker updated."); - - private static readonly Action _pickStarted = - LoggerMessage.Define(LogLevel.Trace, new EventId(5, "PickStarted"), "Pick started."); - - private static readonly Action _pickResultSuccessful = - LoggerMessage.Define(LogLevel.Debug, new EventId(6, "PickResultSuccessful"), "Successfully picked subchannel id '{SubchannelId}' with address {CurrentAddress}. Transport status: {TransportStatus}"); - - private static readonly Action _pickResultSubchannelNoCurrentAddress = - LoggerMessage.Define(LogLevel.Debug, new EventId(7, "PickResultSubchannelNoCurrentAddress"), "Picked subchannel id '{SubchannelId}' doesn't have a current address."); - - private static readonly Action _pickResultQueued = - LoggerMessage.Define(LogLevel.Debug, new EventId(8, "PickResultQueued"), "Picked queued."); - - private static readonly Action _pickResultFailure = - LoggerMessage.Define(LogLevel.Debug, new EventId(9, "PickResultFailure"), "Picked failure with status: {Status}"); - - private static readonly Action _pickResultFailureWithWaitForReady = - LoggerMessage.Define(LogLevel.Debug, new EventId(10, "PickResultFailureWithWaitForReady"), "Picked failure with status: {Status}. Retrying because wait for ready is enabled."); - - private static readonly Action _pickWaiting = - LoggerMessage.Define(LogLevel.Trace, new EventId(11, "PickWaiting"), "Waiting for a new picker."); - - private static readonly Action _resolverServiceConfigFallback = - LoggerMessage.Define(LogLevel.Debug, new EventId(12, "ResolverServiceConfigFallback"), "Falling back to previously loaded service config. Resolver failure when retreiving or parsing service config with status: {Status}"); - - private static readonly Action _pickResultSubchannelNotReady = - LoggerMessage.Define(LogLevel.Debug, new EventId(13, "PickResultSubchannelNotReady"), "Picked subchannel id '{SubchannelId}' with address {CurrentAddress} doesn't have a ready state. Subchannel state: {State}"); + [LoggerMessage(Level = LogLevel.Warning, EventId = 1, EventName = "ResolverUnsupportedLoadBalancingConfig", Message = "Service config returned by the resolver contains unsupported load balancer policies: {LoadBalancingConfigs}. Load balancer unchanged.")] + private static partial void ResolverUnsupportedLoadBalancingConfig(ILogger logger, string loadBalancingConfigs); public static void ResolverUnsupportedLoadBalancingConfig(ILogger logger, IList loadBalancingConfigs) { if (logger.IsEnabled(LogLevel.Warning)) { var loadBalancingConfigText = string.Join(", ", loadBalancingConfigs.Select(c => $"'{c.PolicyName}'")); - _resolverUnsupportedLoadBalancingConfig(logger, loadBalancingConfigText, null); + ResolverUnsupportedLoadBalancingConfig(logger, loadBalancingConfigText); } } - public static void ResolverServiceConfigNotUsed(ILogger logger) - { - _resolverServiceConfigNotUsed(logger, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 2, EventName = "ResolverServiceConfigNotUsed", Message = "Service config returned by the resolver not used.")] + public static partial void ResolverServiceConfigNotUsed(ILogger logger); - public static void ChannelStateUpdated(ILogger logger, ConnectivityState connectivityState) - { - _channelStateUpdated(logger, connectivityState, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 3, EventName = "ChannelStateUpdated", Message = "Channel state updated to {State}.")] + public static partial void ChannelStateUpdated(ILogger logger, ConnectivityState state); - public static void ChannelPickerUpdated(ILogger logger) - { - _channelPickerUpdated(logger, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 4, EventName = "ChannelPickerUpdated", Message = "Channel picker updated.")] + public static partial void ChannelPickerUpdated(ILogger logger); - public static void PickStarted(ILogger logger) - { - _pickStarted(logger, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 5, EventName = "PickStarted", Message = "Pick started.")] + public static partial void PickStarted(ILogger logger); - public static void PickResultSuccessful(ILogger logger, string subchannelId, BalancerAddress currentAddress, TransportStatus transportStatus) - { - _pickResultSuccessful(logger, subchannelId, currentAddress, transportStatus, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 6, EventName = "PickResultSuccessful", Message = "Successfully picked subchannel id '{SubchannelId}' with address {CurrentAddress}. Transport status: {TransportStatus}")] + public static partial void PickResultSuccessful(ILogger logger, string subchannelId, BalancerAddress currentAddress, TransportStatus transportStatus); - public static void PickResultSubchannelNoCurrentAddress(ILogger logger, string subchannelId) - { - _pickResultSubchannelNoCurrentAddress(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 7, EventName = "PickResultSubchannelNoCurrentAddress", Message = "Picked subchannel id '{SubchannelId}' doesn't have a current address.")] + public static partial void PickResultSubchannelNoCurrentAddress(ILogger logger, string subchannelId); - public static void PickResultQueued(ILogger logger) - { - _pickResultQueued(logger, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 8, EventName = "PickResultQueued", Message = "Picked queued.")] + public static partial void PickResultQueued(ILogger logger); - public static void PickResultFailure(ILogger logger, Status status) - { - _pickResultFailure(logger, status, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 9, EventName = "PickResultFailure", Message = "Picked failure with status: {Status}")] + public static partial void PickResultFailure(ILogger logger, Status status); - public static void PickResultFailureWithWaitForReady(ILogger logger, Status status) - { - _pickResultFailureWithWaitForReady(logger, status, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 10, EventName = "PickResultFailureWithWaitForReady", Message = "Picked failure with status: {Status}. Retrying because wait for ready is enabled.")] + public static partial void PickResultFailureWithWaitForReady(ILogger logger, Status status); - public static void PickWaiting(ILogger logger) - { - _pickWaiting(logger, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 11, EventName = "PickWaiting", Message = "Waiting for a new picker.")] + public static partial void PickWaiting(ILogger logger); - public static void ResolverServiceConfigFallback(ILogger logger, Status status) - { - _resolverServiceConfigFallback(logger, status, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 12, EventName = "ResolverServiceConfigFallback", Message = "Falling back to previously loaded service config. Resolver failure when retreiving or parsing service config with status: {Status}")] + public static partial void ResolverServiceConfigFallback(ILogger logger, Status status); - public static void PickResultSubchannelNotReady(ILogger logger, string subchannelId, BalancerAddress currentAddress, ConnectivityState state) - { - _pickResultSubchannelNotReady(logger, subchannelId, currentAddress, state, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 13, EventName = "PickResultSubchannelNotReady", Message = "Picked subchannel id '{SubchannelId}' with address {CurrentAddress} doesn't have a ready state. Subchannel state: {State}")] + public static partial void PickResultSubchannelNotReady(ILogger logger, string subchannelId, BalancerAddress currentAddress, ConnectivityState state); } #endif diff --git a/src/Grpc.Net.Client/Balancer/Internal/SocketConnectivitySubchannelTransport.cs b/src/Grpc.Net.Client/Balancer/Internal/SocketConnectivitySubchannelTransport.cs index b54666d88..f1f3ffab3 100644 --- a/src/Grpc.Net.Client/Balancer/Internal/SocketConnectivitySubchannelTransport.cs +++ b/src/Grpc.Net.Client/Balancer/Internal/SocketConnectivitySubchannelTransport.cs @@ -544,142 +544,57 @@ public void Dispose() } } -internal static class SocketConnectivitySubchannelTransportLog +internal static partial class SocketConnectivitySubchannelTransportLog { - private static readonly Action _connectingSocket = - LoggerMessage.Define(LogLevel.Trace, new EventId(1, "ConnectingSocket"), "Subchannel id '{SubchannelId}' connecting socket to {EndPoint}."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 1, EventName = "ConnectingSocket", Message = "Subchannel id '{SubchannelId}' connecting socket to {EndPoint}.")] + public static partial void ConnectingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint); - private static readonly Action _connectedSocket = - LoggerMessage.Define(LogLevel.Debug, new EventId(2, "ConnectedSocket"), "Subchannel id '{SubchannelId}' connected to socket {EndPoint}."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 2, EventName = "ConnectedSocket", Message = "Subchannel id '{SubchannelId}' connected to socket {EndPoint}.")] + public static partial void ConnectedSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint); - private static readonly Action _errorConnectingSocket = - LoggerMessage.Define(LogLevel.Debug, new EventId(3, "ErrorConnectingSocket"), "Subchannel id '{SubchannelId}' error connecting to socket {EndPoint}."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 3, EventName = "ErrorConnectingSocket", Message = "Subchannel id '{SubchannelId}' error connecting to socket {EndPoint}.")] + public static partial void ErrorConnectingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint, Exception ex); - private static readonly Action _checkingSocket = - LoggerMessage.Define(LogLevel.Trace, new EventId(4, "CheckingSocket"), "Subchannel id '{SubchannelId}' checking socket {EndPoint}."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 4, EventName = "CheckingSocket", Message = "Subchannel id '{SubchannelId}' checking socket {EndPoint}.")] + public static partial void CheckingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint); - private static readonly Action _errorCheckingSocket = - LoggerMessage.Define(LogLevel.Debug, new EventId(5, "ErrorCheckingSocket"), "Subchannel id '{SubchannelId}' error checking socket {EndPoint}."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 5, EventName = "ErrorCheckingSocket", Message = "Subchannel id '{SubchannelId}' error checking socket {EndPoint}.")] + public static partial void ErrorCheckingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint, Exception ex); - private static readonly Action _errorSocketTimer = - LoggerMessage.Define(LogLevel.Error, new EventId(6, "ErrorSocketTimer"), "Subchannel id '{SubchannelId}' unexpected error in check socket timer."); + [LoggerMessage(Level = LogLevel.Error, EventId = 6, EventName = "ErrorSocketTimer", Message = "Subchannel id '{SubchannelId}' unexpected error in check socket timer.")] + public static partial void ErrorSocketTimer(ILogger logger, string subchannelId, Exception ex); - private static readonly Action _creatingStream = - LoggerMessage.Define(LogLevel.Trace, new EventId(7, "CreatingStream"), "Subchannel id '{SubchannelId}' creating stream for {EndPoint}."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 7, EventName = "CreatingStream", Message = "Subchannel id '{SubchannelId}' creating stream for {EndPoint}.")] + public static partial void CreatingStream(ILogger logger, string subchannelId, DnsEndPoint endPoint); - private static readonly Action _disposingStream = - LoggerMessage.Define(LogLevel.Trace, new EventId(8, "DisposingStream"), "Subchannel id '{SubchannelId}' disposing stream for {EndPoint}. Transport has {ActiveStreams} active streams."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 8, EventName = "DisposingStream", Message = "Subchannel id '{SubchannelId}' disposing stream for {EndPoint}. Transport has {ActiveStreams} active streams.")] + public static partial void DisposingStream(ILogger logger, string subchannelId, DnsEndPoint endPoint, int activeStreams); - private static readonly Action _disposingTransport = - LoggerMessage.Define(LogLevel.Trace, new EventId(9, "DisposingTransport"), "Subchannel id '{SubchannelId}' disposing transport."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 9, EventName = "DisposingTransport", Message = "Subchannel id '{SubchannelId}' disposing transport.")] + public static partial void DisposingTransport(ILogger logger, string subchannelId); - private static readonly Action _errorOnDisposingStream = - LoggerMessage.Define(LogLevel.Error, new EventId(10, "ErrorOnDisposingStream"), "Subchannel id '{SubchannelId}' unexpected error when reacting to transport stream dispose."); + [LoggerMessage(Level = LogLevel.Error, EventId = 10, EventName = "ErrorOnDisposingStream", Message = "Subchannel id '{SubchannelId}' unexpected error when reacting to transport stream dispose.")] + public static partial void ErrorOnDisposingStream(ILogger logger, string subchannelId, Exception ex); - private static readonly Action _connectingOnCreateStream = - LoggerMessage.Define(LogLevel.Trace, new EventId(11, "ConnectingOnCreateStream"), "Subchannel id '{SubchannelId}' doesn't have a connected socket available. Connecting new stream socket for {EndPoint}."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 11, EventName = "ConnectingOnCreateStream", Message = "Subchannel id '{SubchannelId}' doesn't have a connected socket available. Connecting new stream socket for {EndPoint}.")] + public static partial void ConnectingOnCreateStream(ILogger logger, string subchannelId, DnsEndPoint endPoint); - private static readonly Action _streamCreated = - LoggerMessage.Define(LogLevel.Trace, new EventId(12, "StreamCreated"), "Subchannel id '{SubchannelId}' created stream for {EndPoint} with {BufferedBytes} buffered bytes. Transport has {ActiveStreams} active streams."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 12, EventName = "StreamCreated", Message = "Subchannel id '{SubchannelId}' created stream for {EndPoint} with {BufferedBytes} buffered bytes. Transport has {ActiveStreams} active streams.")] + public static partial void StreamCreated(ILogger logger, string subchannelId, DnsEndPoint endPoint, int bufferedBytes, int activeStreams); - private static readonly Action _errorPollingSocket = - LoggerMessage.Define(LogLevel.Debug, new EventId(13, "ErrorPollingSocket"), "Subchannel id '{SubchannelId}' error checking socket {EndPoint}."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 13, EventName = "ErrorPollingSocket", Message = "Subchannel id '{SubchannelId}' error checking socket {EndPoint}.")] + public static partial void ErrorPollingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint, Exception ex); - private static readonly Action _socketPollBadState = - LoggerMessage.Define(LogLevel.Debug, new EventId(14, "SocketPollBadState"), "Subchannel id '{SubchannelId}' socket {EndPoint} is in a bad state and can't be used."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 14, EventName = "SocketPollBadState", Message = "Subchannel id '{SubchannelId}' socket {EndPoint} is in a bad state and can't be used.")] + public static partial void SocketPollBadState(ILogger logger, string subchannelId, DnsEndPoint endPoint); - private static readonly Action _socketReceivingAvailable = - LoggerMessage.Define(LogLevel.Trace, new EventId(15, "SocketReceivingAvailable"), "Subchannel id '{SubchannelId}' socket {EndPoint} is receiving {ReadBytesAvailableCount} available bytes."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 15, EventName = "SocketReceivingAvailable", Message = "Subchannel id '{SubchannelId}' socket {EndPoint} is receiving {ReadBytesAvailableCount} available bytes.")] + public static partial void SocketReceivingAvailable(ILogger logger, string subchannelId, DnsEndPoint endPoint, int readBytesAvailableCount); - private static readonly Action _closingUnusableSocket = - LoggerMessage.Define(LogLevel.Debug, new EventId(16, "ClosingUnusableSocket"), "Subchannel id '{SubchannelId}' socket {EndPoint} is being closed because it can't be used. Socket lifetime of {SocketLifetime}. The socket either can't receive data or it has received unexpected data."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 16, EventName = "ClosingUnusableSocket", Message = "Subchannel id '{SubchannelId}' socket {EndPoint} is being closed because it can't be used. Socket lifetime of {SocketLifetime}. The socket either can't receive data or it has received unexpected data.")] + public static partial void ClosingUnusableSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint, TimeSpan socketLifetime); - private static readonly Action _closingSocketFromIdleTimeoutOnCreateStream = - LoggerMessage.Define(LogLevel.Debug, new EventId(16, "ClosingSocketFromIdleTimeoutOnCreateStream"), "Subchannel id '{SubchannelId}' socket {EndPoint} is being closed because it exceeds the idle timeout of {SocketIdleTimeout}."); - - public static void ConnectingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint) - { - _connectingSocket(logger, subchannelId, endPoint, null); - } - - public static void ConnectedSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint) - { - _connectedSocket(logger, subchannelId, endPoint, null); - } - - public static void ErrorConnectingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint, Exception ex) - { - _errorConnectingSocket(logger, subchannelId, endPoint, ex); - } - - public static void CheckingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint) - { - _checkingSocket(logger, subchannelId, endPoint, null); - } - - public static void ErrorCheckingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint, Exception ex) - { - _errorCheckingSocket(logger, subchannelId, endPoint, ex); - } - - public static void ErrorSocketTimer(ILogger logger, string subchannelId, Exception ex) - { - _errorSocketTimer(logger, subchannelId, ex); - } - - public static void CreatingStream(ILogger logger, string subchannelId, DnsEndPoint endPoint) - { - _creatingStream(logger, subchannelId, endPoint, null); - } - - public static void DisposingStream(ILogger logger, string subchannelId, DnsEndPoint endPoint, int activeStreams) - { - _disposingStream(logger, subchannelId, endPoint, activeStreams, null); - } - - public static void DisposingTransport(ILogger logger, string subchannelId) - { - _disposingTransport(logger, subchannelId, null); - } - - public static void ErrorOnDisposingStream(ILogger logger, string subchannelId, Exception ex) - { - _errorOnDisposingStream(logger, subchannelId, ex); - } - - public static void ConnectingOnCreateStream(ILogger logger, string subchannelId, DnsEndPoint endPoint) - { - _connectingOnCreateStream(logger, subchannelId, endPoint, null); - } - - public static void StreamCreated(ILogger logger, string subchannelId, DnsEndPoint endPoint, int bufferedBytes, int activeStreams) - { - _streamCreated(logger, subchannelId, endPoint, bufferedBytes, activeStreams, null); - } - - public static void ErrorPollingSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint, Exception ex) - { - _errorPollingSocket(logger, subchannelId, endPoint, ex); - } - - public static void SocketPollBadState(ILogger logger, string subchannelId, DnsEndPoint endPoint) - { - _socketPollBadState(logger, subchannelId, endPoint, null); - } - - public static void SocketReceivingAvailable(ILogger logger, string subchannelId, DnsEndPoint endPoint, int readBytesAvailableCount) - { - _socketReceivingAvailable(logger, subchannelId, endPoint, readBytesAvailableCount, null); - } - - public static void ClosingUnusableSocket(ILogger logger, string subchannelId, DnsEndPoint endPoint, TimeSpan socketLifetime) - { - _closingUnusableSocket(logger, subchannelId, endPoint, socketLifetime, null); - } - - public static void ClosingSocketFromIdleTimeoutOnCreateStream(ILogger logger, string subchannelId, DnsEndPoint endPoint, TimeSpan socketIdleTimeout) - { - _closingSocketFromIdleTimeoutOnCreateStream(logger, subchannelId, endPoint, socketIdleTimeout, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 17, EventName = "ClosingSocketFromIdleTimeoutOnCreateStream", Message = "Subchannel id '{SubchannelId}' socket {EndPoint} is being closed because it exceeds the idle timeout of {SocketIdleTimeout}.")] + public static partial void ClosingSocketFromIdleTimeoutOnCreateStream(ILogger logger, string subchannelId, DnsEndPoint endPoint, TimeSpan socketIdleTimeout); } #endif diff --git a/src/Grpc.Net.Client/Balancer/PickFirstBalancer.cs b/src/Grpc.Net.Client/Balancer/PickFirstBalancer.cs index 16a8a8f31..88f4cfead 100644 --- a/src/Grpc.Net.Client/Balancer/PickFirstBalancer.cs +++ b/src/Grpc.Net.Client/Balancer/PickFirstBalancer.cs @@ -200,23 +200,18 @@ public override PickResult Pick(PickContext context) } } -internal static class PickFirstBalancerLog +internal static partial class PickFirstBalancerLog { - private static readonly Action _processingSubchannelStateChanged = - LoggerMessage.Define(LogLevel.Trace, new EventId(1, "ProcessingSubchannelStateChanged"), "Processing subchannel id '{SubchannelId}' state changed to {State}. Detail: '{Detail}'."); - - private static readonly Action _ignoredSubchannelStateChange = - LoggerMessage.Define(LogLevel.Trace, new EventId(2, "IgnoredSubchannelStateChange"), "Ignored state change because of unknown subchannel id '{SubchannelId}'."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 1, EventName = "ProcessingSubchannelStateChanged", Message = "Processing subchannel id '{SubchannelId}' state changed to {State}. Detail: '{Detail}'.")] + private static partial void ProcessingSubchannelStateChanged(ILogger logger, string subchannelId, ConnectivityState state, string Detail, Exception? DebugException); public static void ProcessingSubchannelStateChanged(ILogger logger, string subchannelId, ConnectivityState state, Status status) { - _processingSubchannelStateChanged(logger, subchannelId, state, status.Detail, status.DebugException); + ProcessingSubchannelStateChanged(logger, subchannelId, state, status.Detail, status.DebugException); } - public static void IgnoredSubchannelStateChange(ILogger logger, string subchannelId) - { - _ignoredSubchannelStateChange(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 2, EventName = "IgnoredSubchannelStateChange", Message = "Ignored state change because of unknown subchannel id '{SubchannelId}'.")] + public static partial void IgnoredSubchannelStateChange(ILogger logger, string subchannelId); } /// diff --git a/src/Grpc.Net.Client/Balancer/PollingResolver.cs b/src/Grpc.Net.Client/Balancer/PollingResolver.cs index 0973f9339..0f7650d88 100644 --- a/src/Grpc.Net.Client/Balancer/PollingResolver.cs +++ b/src/Grpc.Net.Client/Balancer/PollingResolver.cs @@ -36,7 +36,7 @@ namespace Grpc.Net.Client.Balancer; /// Note: Experimental API that can change or be removed without any prior notice. /// /// -public abstract class PollingResolver : Resolver +public abstract partial class PollingResolver : Resolver { // Internal for testing internal Task _resolveTask = Task.CompletedTask; @@ -256,70 +256,70 @@ protected override void Dispose(bool disposing) _disposed = true; } - internal static class Log + internal static partial class Log { - private static readonly Action _resolverRefreshRequested = - LoggerMessage.Define(LogLevel.Trace, new EventId(1, "ResolverRefreshRequested"), "{ResolveType} refresh requested."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 1, EventName = "ResolverRefreshRequested", Message = "{ResolveType} refresh requested.")] + private static partial void ResolverRefreshRequested(ILogger logger, string resolveType); - private static readonly Action _resolverRefreshIgnored = - LoggerMessage.Define(LogLevel.Trace, new EventId(2, "ResolverRefreshIgnored"), "{ResolveType} refresh ignored because resolve is already in progress."); - - private static readonly Action _resolveError = - LoggerMessage.Define(LogLevel.Error, new EventId(3, "ResolveError"), "Error resolving {ResolveType}."); - - private static readonly Action _resolveResult = - LoggerMessage.Define(LogLevel.Trace, new EventId(4, "ResolveResult"), "{ResolveType} result with status code '{StatusCode}' and {AddressCount} addresses."); - - private static readonly Action _startingResolveBackoff = - LoggerMessage.Define(LogLevel.Trace, new EventId(5, "StartingResolveBackoff"), "{ResolveType} starting resolve backoff of {BackoffDuration}."); - - private static readonly Action _errorRetryingResolve = - LoggerMessage.Define(LogLevel.Error, new EventId(6, "ErrorRetryingResolve"), "{ResolveType} error retrying resolve."); - - private static readonly Action _resolveTaskCompleted = - LoggerMessage.Define(LogLevel.Trace, new EventId(7, "ResolveTaskCompleted"), "{ResolveType} resolve task completed."); - - private static readonly Action _resolveStarting = - LoggerMessage.Define(LogLevel.Trace, new EventId(8, "ResolveStarting"), "{ResolveType} resolve starting."); - public static void ResolverRefreshRequested(ILogger logger, Type resolverType) { - _resolverRefreshRequested(logger, resolverType.Name, null); + ResolverRefreshRequested(logger, resolverType.Name); } + [LoggerMessage(Level = LogLevel.Trace, EventId = 2, EventName = "ResolverRefreshIgnored", Message = "{ResolveType} refresh ignored because resolve is already in progress.")] + private static partial void ResolverRefreshIgnored(ILogger logger, string resolveType); + public static void ResolverRefreshIgnored(ILogger logger, Type resolverType) { - _resolverRefreshIgnored(logger, resolverType.Name, null); + ResolverRefreshIgnored(logger, resolverType.Name); } + [LoggerMessage(Level = LogLevel.Error, EventId = 3, EventName = "ResolveError", Message = "Error resolving {ResolveType}.")] + private static partial void ResolveError(ILogger logger, string resolveType, Exception ex); + public static void ResolveError(ILogger logger, Type resolverType, Exception ex) { - _resolveError(logger, resolverType.Name, ex); + ResolveError(logger, resolverType.Name, ex); } + [LoggerMessage(Level = LogLevel.Trace, EventId = 4, EventName = "ResolveResult", Message = "{ResolveType} result with status code '{StatusCode}' and {AddressCount} addresses.")] + private static partial void ResolveResult(ILogger logger, string resolveType, StatusCode statusCode, int addressCount); + public static void ResolveResult(ILogger logger, Type resolverType, StatusCode statusCode, int addressCount) { - _resolveResult(logger, resolverType.Name, statusCode, addressCount, null); + ResolveResult(logger, resolverType.Name, statusCode, addressCount); } + [LoggerMessage(Level = LogLevel.Trace, EventId = 5, EventName = "StartingResolveBackoff", Message = "{ResolveType} starting resolve backoff of {BackoffDuration}.")] + private static partial void StartingResolveBackoff(ILogger logger, string resolveType, TimeSpan BackoffDuration); + public static void StartingResolveBackoff(ILogger logger, Type resolverType, TimeSpan delay) { - _startingResolveBackoff(logger, resolverType.Name, delay, null); + StartingResolveBackoff(logger, resolverType.Name, delay); } + [LoggerMessage(Level = LogLevel.Error, EventId = 6, EventName = "ErrorRetryingResolve", Message = "{ResolveType} error retrying resolve.")] + private static partial void ErrorRetryingResolve(ILogger logger, string resolveType, Exception ex); + public static void ErrorRetryingResolve(ILogger logger, Type resolverType, Exception ex) { - _errorRetryingResolve(logger, resolverType.Name, ex); + ErrorRetryingResolve(logger, resolverType.Name, ex); } + [LoggerMessage(Level = LogLevel.Trace, EventId = 7, EventName = "ResolveTaskCompleted", Message = "{ResolveType} resolve task completed.")] + private static partial void ResolveTaskCompleted(ILogger logger, string resolveType); + public static void ResolveTaskCompleted(ILogger logger, Type resolverType) { - _resolveTaskCompleted(logger, resolverType.Name, null); + ResolveTaskCompleted(logger, resolverType.Name); } + [LoggerMessage(Level = LogLevel.Trace, EventId = 8, EventName = "ResolveStarting", Message = "{ResolveType} resolve starting.")] + private static partial void ResolveStarting(ILogger logger, string resolveType); + public static void ResolveStarting(ILogger logger, Type resolverType) { - _resolveStarting(logger, resolverType.Name, null); + ResolveStarting(logger, resolverType.Name); } } } diff --git a/src/Grpc.Net.Client/Balancer/Subchannel.cs b/src/Grpc.Net.Client/Balancer/Subchannel.cs index dcfdcd8a5..db0a2ee42 100644 --- a/src/Grpc.Net.Client/Balancer/Subchannel.cs +++ b/src/Grpc.Net.Client/Balancer/Subchannel.cs @@ -544,174 +544,87 @@ public void Dispose() } } -internal static class SubchannelLog +internal static partial class SubchannelLog { - private static readonly Action _subchannelCreated = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "SubchannelCreated"), "Subchannel id '{SubchannelId}' created with addresses: {Addresses}"); - - private static readonly Action _addressesUpdatedWhileConnecting = - LoggerMessage.Define(LogLevel.Debug, new EventId(2, "AddressesUpdatedWhileConnecting"), "Subchannel id '{SubchannelId}' is connecting when its addresses are updated. Restarting connect."); - - private static readonly Action _connectedAddressNotInUpdatedAddresses = - LoggerMessage.Define(LogLevel.Debug, new EventId(3, "ConnectedAddressNotInUpdatedAddresses"), "Subchannel id '{SubchannelId}' current address '{CurrentAddress}' is not in the updated addresses."); - - private static readonly Action _connectionRequested = - LoggerMessage.Define(LogLevel.Trace, new EventId(4, "ConnectionRequested"), "Subchannel id '{SubchannelId}' connection requested."); - - private static readonly Action _connectionRequestedInNonIdleState = - LoggerMessage.Define(LogLevel.Debug, new EventId(5, "ConnectionRequestedInNonIdleState"), "Subchannel id '{SubchannelId}' connection requested in non-idle state of {State}."); - - private static readonly Action _connectingTransport = - LoggerMessage.Define(LogLevel.Debug, new EventId(6, "ConnectingTransport"), "Subchannel id '{SubchannelId}' connecting to transport."); - - private static readonly Action _startingConnectBackoff = - LoggerMessage.Define(LogLevel.Trace, new EventId(7, "StartingConnectBackoff"), "Subchannel id '{SubchannelId}' starting connect backoff of {BackoffDuration}."); - - private static readonly Action _connectBackoffInterrupted = - LoggerMessage.Define(LogLevel.Trace, new EventId(8, "ConnectBackoffInterrupted"), "Subchannel id '{SubchannelId}' connect backoff interrupted."); - - private static readonly Action _connectCanceled = - LoggerMessage.Define(LogLevel.Debug, new EventId(9, "ConnectCanceled"), "Subchannel id '{SubchannelId}' connect canceled."); - - private static readonly Action _connectError = - LoggerMessage.Define(LogLevel.Error, new EventId(10, "ConnectError"), "Subchannel id '{SubchannelId}' unexpected error while connecting to transport."); - - private static readonly Action _subchannelStateChanged = - LoggerMessage.Define(LogLevel.Debug, new EventId(11, "SubchannelStateChanged"), "Subchannel id '{SubchannelId}' state changed to {State}. Detail: '{Detail}'."); - - private static readonly Action _stateChangedRegistrationCreated = - LoggerMessage.Define(LogLevel.Trace, new EventId(12, "StateChangedRegistrationCreated"), "Subchannel id '{SubchannelId}' state changed registration '{RegistrationId}' created."); - - private static readonly Action _stateChangedRegistrationRemoved = - LoggerMessage.Define(LogLevel.Trace, new EventId(13, "StateChangedRegistrationRemoved"), "Subchannel id '{SubchannelId}' state changed registration '{RegistrationId}' removed."); - - private static readonly Action _executingStateChangedRegistration = - LoggerMessage.Define(LogLevel.Trace, new EventId(14, "ExecutingStateChangedRegistration"), "Subchannel id '{SubchannelId}' executing state changed registration '{RegistrationId}'."); - - private static readonly Action _noStateChangedRegistrations = - LoggerMessage.Define(LogLevel.Trace, new EventId(15, "NoStateChangedRegistrations"), "Subchannel id '{SubchannelId}' has no state changed registrations."); - - private static readonly Action _subchannelPreserved = - LoggerMessage.Define(LogLevel.Trace, new EventId(16, "SubchannelPreserved"), "Subchannel id '{SubchannelId}' matches address '{Address}' and is preserved."); - - private static readonly Action _cancelingConnect = - LoggerMessage.Define(LogLevel.Debug, new EventId(17, "CancelingConnect"), "Subchannel id '{SubchannelId}' canceling connect."); - - private static readonly Action _connectBackoffComplete = - LoggerMessage.Define(LogLevel.Trace, new EventId(18, "ConnectBackoffComplete"), "Subchannel id '{SubchannelId}' connect backoff complete."); - - private static readonly Action _addressesUpdated = - LoggerMessage.Define(LogLevel.Trace, new EventId(19, "AddressesUpdated"), "Subchannel id '{SubchannelId}' updated with addresses: {Addresses}"); - - private static readonly Action _queuingConnect = - LoggerMessage.Define(LogLevel.Debug, new EventId(20, "QueuingConnect"), "Subchannel id '{SubchannelId}' queuing connect because a connect is already in progress."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "SubchannelCreated", Message = "Subchannel id '{SubchannelId}' created with addresses: {Addresses}")] + private static partial void SubchannelCreated(ILogger logger, string subchannelId, string addresses); public static void SubchannelCreated(ILogger logger, string subchannelId, IReadOnlyList addresses) { if (logger.IsEnabled(LogLevel.Debug)) { var addressesText = string.Join(", ", addresses.Select(a => a.EndPoint.Host + ":" + a.EndPoint.Port)); - _subchannelCreated(logger, subchannelId, addressesText, null); + SubchannelCreated(logger, subchannelId, addressesText); } } - public static void AddressesUpdatedWhileConnecting(ILogger logger, string subchannelId) - { - _addressesUpdatedWhileConnecting(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 2, EventName = "AddressesUpdatedWhileConnecting", Message = "Subchannel id '{SubchannelId}' is connecting when its addresses are updated. Restarting connect.")] + public static partial void AddressesUpdatedWhileConnecting(ILogger logger, string subchannelId); - public static void ConnectedAddressNotInUpdatedAddresses(ILogger logger, string subchannelId, BalancerAddress currentAddress) - { - _connectedAddressNotInUpdatedAddresses(logger, subchannelId, currentAddress, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 3, EventName = "ConnectedAddressNotInUpdatedAddresses", Message = "Subchannel id '{SubchannelId}' current address '{CurrentAddress}' is not in the updated addresses.")] + public static partial void ConnectedAddressNotInUpdatedAddresses(ILogger logger, string subchannelId, BalancerAddress currentAddress); - public static void ConnectionRequested(ILogger logger, string subchannelId) - { - _connectionRequested(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 4, EventName = "ConnectionRequested", Message = "Subchannel id '{SubchannelId}' connection requested.")] + public static partial void ConnectionRequested(ILogger logger, string subchannelId); - public static void ConnectionRequestedInNonIdleState(ILogger logger, string subchannelId, ConnectivityState state) - { - _connectionRequestedInNonIdleState(logger, subchannelId, state, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 5, EventName = "ConnectionRequestedInNonIdleState", Message = "Subchannel id '{SubchannelId}' connection requested in non-idle state of {State}.")] + public static partial void ConnectionRequestedInNonIdleState(ILogger logger, string subchannelId, ConnectivityState state); - public static void ConnectingTransport(ILogger logger, string subchannelId) - { - _connectingTransport(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 6, EventName = "ConnectingTransport", Message = "Subchannel id '{SubchannelId}' connecting to transport.")] + public static partial void ConnectingTransport(ILogger logger, string subchannelId); - public static void StartingConnectBackoff(ILogger logger, string subchannelId, TimeSpan delay) - { - _startingConnectBackoff(logger, subchannelId, delay, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 7, EventName = "StartingConnectBackoff", Message = "Subchannel id '{SubchannelId}' starting connect backoff of {BackoffDuration}.")] + public static partial void StartingConnectBackoff(ILogger logger, string subchannelId, TimeSpan BackoffDuration); - public static void ConnectBackoffInterrupted(ILogger logger, string subchannelId) - { - _connectBackoffInterrupted(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 8, EventName = "ConnectBackoffInterrupted", Message = "Subchannel id '{SubchannelId}' connect backoff interrupted.")] + public static partial void ConnectBackoffInterrupted(ILogger logger, string subchannelId); - public static void ConnectCanceled(ILogger logger, string subchannelId) - { - _connectCanceled(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 9, EventName = "ConnectCanceled", Message = "Subchannel id '{SubchannelId}' connect canceled.")] + public static partial void ConnectCanceled(ILogger logger, string subchannelId); - public static void ConnectError(ILogger logger, string subchannelId, Exception ex) - { - _connectError(logger, subchannelId, ex); - } + [LoggerMessage(Level = LogLevel.Error, EventId = 10, EventName = "ConnectError", Message = "Subchannel id '{SubchannelId}' unexpected error while connecting to transport.")] + public static partial void ConnectError(ILogger logger, string subchannelId, Exception ex); + + [LoggerMessage(Level = LogLevel.Debug, EventId = 11, EventName = "SubchannelStateChanged", Message = "Subchannel id '{SubchannelId}' state changed to {State}. Detail: '{Detail}'.")] + private static partial void SubchannelStateChanged(ILogger logger, string subchannelId, ConnectivityState state, string Detail, Exception? DebugException); public static void SubchannelStateChanged(ILogger logger, string subchannelId, ConnectivityState state, Status status) { - _subchannelStateChanged(logger, subchannelId, state, status.Detail, status.DebugException); + SubchannelStateChanged(logger, subchannelId, state, status.Detail, status.DebugException); } - public static void ExecutingStateChangedRegistration(ILogger logger, string subchannelId, string registrationId) - { - _executingStateChangedRegistration(logger, subchannelId, registrationId, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 12, EventName = "StateChangedRegistrationCreated", Message = "Subchannel id '{SubchannelId}' state changed registration '{RegistrationId}' created.")] + public static partial void StateChangedRegistrationCreated(ILogger logger, string subchannelId, string registrationId); - public static void NoStateChangedRegistrations(ILogger logger, string subchannelId) - { - _noStateChangedRegistrations(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 13, EventName = "StateChangedRegistrationRemoved", Message = "Subchannel id '{SubchannelId}' state changed registration '{RegistrationId}' removed.")] + public static partial void StateChangedRegistrationRemoved(ILogger logger, string subchannelId, string registrationId); - public static void StateChangedRegistrationCreated(ILogger logger, string subchannelId, string registrationId) - { - _stateChangedRegistrationCreated(logger, subchannelId, registrationId, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 14, EventName = "ExecutingStateChangedRegistration", Message = "Subchannel id '{SubchannelId}' executing state changed registration '{RegistrationId}'.")] + public static partial void ExecutingStateChangedRegistration(ILogger logger, string subchannelId, string registrationId); - public static void StateChangedRegistrationRemoved(ILogger logger, string subchannelId, string registrationId) - { - _stateChangedRegistrationRemoved(logger, subchannelId, registrationId, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 15, EventName = "NoStateChangedRegistrations", Message = "Subchannel id '{SubchannelId}' has no state changed registrations.")] + public static partial void NoStateChangedRegistrations(ILogger logger, string subchannelId); - public static void SubchannelPreserved(ILogger logger, string subchannelId, BalancerAddress address) - { - _subchannelPreserved(logger, subchannelId, address, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 16, EventName = "SubchannelPreserved", Message = "Subchannel id '{SubchannelId}' matches address '{Address}' and is preserved.")] + public static partial void SubchannelPreserved(ILogger logger, string subchannelId, BalancerAddress address); - public static void CancelingConnect(ILogger logger, string subchannelId) - { - _cancelingConnect(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 17, EventName = "CancelingConnect", Message = "Subchannel id '{SubchannelId}' canceling connect.")] + public static partial void CancelingConnect(ILogger logger, string subchannelId); - public static void ConnectBackoffComplete(ILogger logger, string subchannelId) - { - _connectBackoffComplete(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 18, EventName = "ConnectBackoffComplete", Message = "Subchannel id '{SubchannelId}' connect backoff complete.")] + public static partial void ConnectBackoffComplete(ILogger logger, string subchannelId); + [LoggerMessage(Level = LogLevel.Trace, EventId = 19, EventName = "AddressesUpdated", Message = "Subchannel id '{SubchannelId}' updated with addresses: {Addresses}")] + private static partial void AddressesUpdated(ILogger logger, string subchannelId, string addresses); public static void AddressesUpdated(ILogger logger, string subchannelId, IReadOnlyList addresses) { if (logger.IsEnabled(LogLevel.Trace)) { var addressesText = string.Join(", ", addresses.Select(a => a.EndPoint.Host + ":" + a.EndPoint.Port)); - _addressesUpdated(logger, subchannelId, addressesText, null); + AddressesUpdated(logger, subchannelId, addressesText); } } - - public static void QueuingConnect(ILogger logger, string subchannelId) - { - _queuingConnect(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 20, EventName = "QueuingConnect", Message = "Subchannel id '{SubchannelId}' queuing connect because a connect is already in progress.")] + public static partial void QueuingConnect(ILogger logger, string subchannelId); } #endif diff --git a/src/Grpc.Net.Client/Balancer/SubchannelsLoadBalancer.cs b/src/Grpc.Net.Client/Balancer/SubchannelsLoadBalancer.cs index f5fccf828..5f27c347b 100644 --- a/src/Grpc.Net.Client/Balancer/SubchannelsLoadBalancer.cs +++ b/src/Grpc.Net.Client/Balancer/SubchannelsLoadBalancer.cs @@ -336,56 +336,36 @@ public void UpdateKnownState(ConnectivityState knownState) } } -internal static class SubchannelsLoadBalancerLog +internal static partial class SubchannelsLoadBalancerLog { - private static readonly Action _processingSubchannelStateChanged = - LoggerMessage.Define(LogLevel.Trace, new EventId(1, "ProcessingSubchannelStateChanged"), "Processing subchannel id '{SubchannelId}' state changed to {State}. Detail: '{Detail}'."); - - private static readonly Action _ignoredSubchannelStateChange = - LoggerMessage.Define(LogLevel.Trace, new EventId(2, "IgnoredSubchannelStateChange"), "Ignored state change because of unknown subchannel id '{SubchannelId}'."); - - private static readonly Action _connectionsUnchanged = - LoggerMessage.Define(LogLevel.Trace, new EventId(3, "ConnectionsUnchanged"), "Connections unchanged."); - - private static readonly Action _refreshingResolverForSubchannel = - LoggerMessage.Define(LogLevel.Trace, new EventId(4, "RefreshingResolverForSubchannel"), "Refreshing resolver because subchannel id '{SubchannelId}' is in state {State}."); - - private static readonly Action _requestingConnectionForSubchannel = - LoggerMessage.Define(LogLevel.Trace, new EventId(5, "RequestingConnectionForSubchannel"), "Requesting connection for subchannel id '{SubchannelId}' because it is in state {State}."); - - private static readonly Action _creatingReadyPicker = - LoggerMessage.Define(LogLevel.Trace, new EventId(6, "CreatingReadyPicker"), "Creating ready picker with {SubchannelCount} subchannels: {Subchannels}"); + [LoggerMessage(Level = LogLevel.Trace, EventId = 1, EventName = "ProcessingSubchannelStateChanged", Message = "Processing subchannel id '{SubchannelId}' state changed to {State}. Detail: '{Detail}'.")] + private static partial void ProcessingSubchannelStateChanged(ILogger logger, string subchannelId, ConnectivityState state, string Detail, Exception? DebugException); public static void ProcessingSubchannelStateChanged(ILogger logger, string subchannelId, ConnectivityState state, Status status) { - _processingSubchannelStateChanged(logger, subchannelId, state, status.Detail, status.DebugException); + ProcessingSubchannelStateChanged(logger, subchannelId, state, status.Detail, status.DebugException); } - public static void IgnoredSubchannelStateChange(ILogger logger, string subchannelId) - { - _ignoredSubchannelStateChange(logger, subchannelId, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 2, EventName = "IgnoredSubchannelStateChange", Message = "Ignored state change because of unknown subchannel id '{SubchannelId}'.")] + public static partial void IgnoredSubchannelStateChange(ILogger logger, string subchannelId); - public static void ConnectionsUnchanged(ILogger logger) - { - _connectionsUnchanged(logger, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 3, EventName = "ConnectionsUnchanged", Message = "Connections unchanged.")] + public static partial void ConnectionsUnchanged(ILogger logger); - public static void RefreshingResolverForSubchannel(ILogger logger, string subchannelId, ConnectivityState state) - { - _refreshingResolverForSubchannel(logger, subchannelId, state, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 4, EventName = "RefreshingResolverForSubchannel", Message = "Refreshing resolver because subchannel id '{SubchannelId}' is in state {State}.")] + public static partial void RefreshingResolverForSubchannel(ILogger logger, string subchannelId, ConnectivityState state); - public static void RequestingConnectionForSubchannel(ILogger logger, string subchannelId, ConnectivityState state) - { - _requestingConnectionForSubchannel(logger, subchannelId, state, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 5, EventName = "RequestingConnectionForSubchannel", Message = "Requesting connection for subchannel id '{SubchannelId}' because it is in state {State}.")] + public static partial void RequestingConnectionForSubchannel(ILogger logger, string subchannelId, ConnectivityState state); + + [LoggerMessage(Level = LogLevel.Trace, EventId = 6, EventName = "CreatingReadyPicker", Message = "Creating ready picker with {SubchannelCount} subchannels: {Subchannels}")] + private static partial void CreatingReadyPicker(ILogger logger, int subchannelCount, string subchannels); public static void CreatingReadyPicker(ILogger logger, List readySubchannels) { if (logger.IsEnabled(LogLevel.Trace)) { - _creatingReadyPicker(logger, readySubchannels.Count, string.Join(", ", readySubchannels.Select(s => $"id '{s.Id}' ({string.Join(",", s.GetAddresses())})")), null); + CreatingReadyPicker(logger, readySubchannels.Count, string.Join(", ", readySubchannels.Select(s => $"id '{s.Id}' ({string.Join(",", s.GetAddresses())})"))); } } } diff --git a/src/Grpc.Net.Client/GrpcChannel.cs b/src/Grpc.Net.Client/GrpcChannel.cs index e046854a1..05e170e04 100644 --- a/src/Grpc.Net.Client/GrpcChannel.cs +++ b/src/Grpc.Net.Client/GrpcChannel.cs @@ -39,7 +39,7 @@ namespace Grpc.Net.Client; /// a remote call so in general you should reuse a single channel for as many calls as possible. /// [DebuggerDisplay("{DebuggerToString(),nq}")] -public sealed class GrpcChannel : ChannelBase, IDisposable +public sealed partial class GrpcChannel : ChannelBase, IDisposable { internal const int DefaultMaxReceiveMessageSize = 1024 * 1024 * 4; // 4 MB #if SUPPORT_LOAD_BALANCING @@ -934,15 +934,10 @@ public override int GetHashCode() => (Method != null ? StringComparer.Ordinal.GetHashCode(Method) : 0); } - private static class Log + private static partial class Log { - private static readonly Action _addressPathUnused = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "AddressPathUnused"), "The path in the channel's address '{Address}' won't be used when making gRPC calls. A DelegatingHandler can be used to include a path with gRPC calls. See https://aka.ms/aspnet/grpc/subdir for details."); - - public static void AddressPathUnused(ILogger logger, string address) - { - _addressPathUnused(logger, address, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "AddressPathUnused", Message = "The path in the channel's address '{Address}' won't be used when making gRPC calls. A DelegatingHandler can be used to include a path with gRPC calls. See https://aka.ms/aspnet/grpc/subdir for details.")] + public static partial void AddressPathUnused(ILogger logger, string address); } private readonly record struct HttpHandlerContext(HttpHandlerType HttpHandlerType, TimeSpan? ConnectTimeout = null, TimeSpan? ConnectionIdleTimeout = null); diff --git a/src/Grpc.Net.Client/Internal/ClientStreamWriterBase.cs b/src/Grpc.Net.Client/Internal/ClientStreamWriterBase.cs index a70049eac..c8b89dddd 100644 --- a/src/Grpc.Net.Client/Internal/ClientStreamWriterBase.cs +++ b/src/Grpc.Net.Client/Internal/ClientStreamWriterBase.cs @@ -76,29 +76,14 @@ protected bool IsWriteInProgressUnsynchronized } } -internal static class ClientStreamWriterBaseLog +internal static partial class ClientStreamWriterBaseLog { - private static readonly Action _completingClientStream = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "CompletingClientStream"), "Completing client stream."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "CompletingClientStream", Message = "Completing client stream.")] + public static partial void CompletingClientStream(ILogger logger); - private static readonly Action _writeMessageError = - LoggerMessage.Define(LogLevel.Error, new EventId(2, "WriteMessageError"), "Error writing message."); + [LoggerMessage(Level = LogLevel.Error, EventId = 2, EventName = "WriteMessageError", Message = "Error writing message.")] + public static partial void WriteMessageError(ILogger logger, Exception ex); - private static readonly Action _completeClientStreamError = - LoggerMessage.Define(LogLevel.Error, new EventId(3, "CompleteClientStreamError"), "Error completing client stream."); - - public static void CompletingClientStream(ILogger logger) - { - _completingClientStream(logger, null); - } - - public static void WriteMessageError(ILogger logger, Exception ex) - { - _writeMessageError(logger, ex); - } - - public static void CompleteClientStreamError(ILogger logger, Exception ex) - { - _completeClientStreamError(logger, ex); - } + [LoggerMessage(Level = LogLevel.Error, EventId = 3, EventName = "CompleteClientStreamError", Message = "Error completing client stream.")] + public static partial void CompleteClientStreamError(ILogger logger, Exception ex); } diff --git a/src/Grpc.Net.Client/Internal/GrpcCallLog.cs b/src/Grpc.Net.Client/Internal/GrpcCallLog.cs index 9404b85f2..7156f6574 100644 --- a/src/Grpc.Net.Client/Internal/GrpcCallLog.cs +++ b/src/Grpc.Net.Client/Internal/GrpcCallLog.cs @@ -21,216 +21,88 @@ namespace Grpc.Net.Client.Internal; -internal static class GrpcCallLog +internal static partial class GrpcCallLog { - private static readonly Action _startingCall = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "StartingCall"), "Starting gRPC call. Method type: '{MethodType}', URI: '{Uri}'."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "StartingCall", Message = "Starting gRPC call. Method type: '{MethodType}', URI: '{Uri}'.")] + public static partial void StartingCall(ILogger logger, MethodType methodType, Uri uri); - private static readonly Action _responseHeadersReceived = - LoggerMessage.Define(LogLevel.Trace, new EventId(2, "ResponseHeadersReceived"), "Response headers received."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 2, EventName = "ResponseHeadersReceived", Message = "Response headers received.")] + public static partial void ResponseHeadersReceived(ILogger logger); - private static readonly Action _grpcStatusError = - LoggerMessage.Define(LogLevel.Information, new EventId(3, "GrpcStatusError"), "Call failed with gRPC error status. Status code: '{StatusCode}', Message: '{StatusMessage}'."); + [LoggerMessage(Level = LogLevel.Information, EventId = 3, EventName = "GrpcStatusError", Message = "Call failed with gRPC error status. Status code: '{StatusCode}', Message: '{StatusMessage}'.")] + public static partial void GrpcStatusError(ILogger logger, StatusCode statusCode, string statusMessage, Exception? debugException); - private static readonly Action _finishedCall = - LoggerMessage.Define(LogLevel.Debug, new EventId(4, "FinishedCall"), "Finished gRPC call."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 4, EventName = "FinishedCall", Message = "Finished gRPC call.")] + public static partial void FinishedCall(ILogger logger); - private static readonly Action _startingDeadlineTimeout = - LoggerMessage.Define(LogLevel.Trace, new EventId(5, "StartingDeadlineTimeout"), "Starting deadline timeout. Duration: {DeadlineTimeout}."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 5, EventName = "StartingDeadlineTimeout", Message = "Starting deadline timeout. Duration: {DeadlineTimeout}.")] + public static partial void StartingDeadlineTimeout(ILogger logger, TimeSpan deadlineTimeout); - private static readonly Action _errorStartingCall = - LoggerMessage.Define(LogLevel.Debug, new EventId(6, "ErrorStartingCall"), "Error starting gRPC call."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 6, EventName = "ErrorStartingCall", Message = "Error starting gRPC call.")] + public static partial void ErrorStartingCall(ILogger logger); - private static readonly Action _deadlineExceeded = - LoggerMessage.Define(LogLevel.Warning, new EventId(7, "DeadlineExceeded"), "gRPC call deadline exceeded."); + [LoggerMessage(Level = LogLevel.Warning, EventId = 7, EventName = "DeadlineExceeded", Message = "gRPC call deadline exceeded.")] + public static partial void DeadlineExceeded(ILogger logger); - private static readonly Action _canceledCall = - LoggerMessage.Define(LogLevel.Debug, new EventId(8, "CanceledCall"), "gRPC call canceled."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 8, EventName = "CanceledCall", Message = "gRPC call canceled.")] + public static partial void CanceledCall(ILogger logger); - private static readonly Action _messageNotReturned = - LoggerMessage.Define(LogLevel.Debug, new EventId(9, "MessageNotReturned"), "Message not returned from unary or client streaming call."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 9, EventName = "MessageNotReturned", Message = "Message not returned from unary or client streaming call.")] + public static partial void MessageNotReturned(ILogger logger); // 10, 11 unused. - private static readonly Action _callCredentialsNotUsed = - LoggerMessage.Define(LogLevel.Warning, new EventId(12, "CallCredentialsNotUsed"), "The configured CallCredentials were not used because the call does not use TLS."); + [LoggerMessage(Level = LogLevel.Warning, EventId = 12, EventName = "CallCredentialsNotUsed", Message = "The configured CallCredentials were not used because the call does not use TLS.")] + public static partial void CallCredentialsNotUsed(ILogger logger); - private static readonly Action _readingMessage = - LoggerMessage.Define(LogLevel.Debug, new EventId(13, "ReadingMessage"), "Reading message."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 13, EventName = "ReadingMessage", Message = "Reading message.")] + public static partial void ReadingMessage(ILogger logger); - private static readonly Action _noMessageReturned = - LoggerMessage.Define(LogLevel.Trace, new EventId(14, "NoMessageReturned"), "No message returned."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 14, EventName = "NoMessageReturned", Message = "No message returned.")] + public static partial void NoMessageReturned(ILogger logger); - private static readonly Action _deserializingMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(15, "DeserializingMessage"), "Deserializing {MessageLength} byte message to '{MessageType}'."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 15, EventName = "DeserializingMessage", Message = "Deserializing {MessageLength} byte message to '{MessageType}'.")] + public static partial void DeserializingMessage(ILogger logger, int messageLength, Type messageType); - private static readonly Action _receivedMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(16, "ReceivedMessage"), "Received message."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 16, EventName = "ReceivedMessage", Message = "Received message.")] + public static partial void ReceivedMessage(ILogger logger); - private static readonly Action _errorReadingMessage = - LoggerMessage.Define(LogLevel.Information, new EventId(17, "ErrorReadingMessage"), "Error reading message."); + [LoggerMessage(Level = LogLevel.Information, EventId = 17, EventName = "ErrorReadingMessage", Message = "Error reading message.")] + public static partial void ErrorReadingMessage(ILogger logger, Exception ex); - private static readonly Action _sendingMessage = - LoggerMessage.Define(LogLevel.Debug, new EventId(18, "SendingMessage"), "Sending message."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 18, EventName = "SendingMessage", Message = "Sending message.")] + public static partial void SendingMessage(ILogger logger); - private static readonly Action _messageSent = - LoggerMessage.Define(LogLevel.Trace, new EventId(19, "MessageSent"), "Message sent."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 19, EventName = "MessageSent", Message = "Message sent.")] + public static partial void MessageSent(ILogger logger); - private static readonly Action _errorSendingMessage = - LoggerMessage.Define(LogLevel.Information, new EventId(20, "ErrorSendingMessage"), "Error sending message."); + [LoggerMessage(Level = LogLevel.Information, EventId = 20, EventName = "ErrorSendingMessage", Message = "Error sending message.")] + public static partial void ErrorSendingMessage(ILogger logger, Exception ex); - private static readonly Action _serializedMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(21, "SerializedMessage"), "Serialized '{MessageType}' to {MessageLength} byte message."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 21, EventName = "SerializedMessage", Message = "Serialized '{MessageType}' to {MessageLength} byte message.")] + public static partial void SerializedMessage(ILogger logger, Type messageType, int messageLength); - private static readonly Action _compressingMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(22, "CompressingMessage"), "Compressing message with '{MessageEncoding}' encoding."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 22, EventName = "CompressingMessage", Message = "Compressing message with '{MessageEncoding}' encoding.")] + public static partial void CompressingMessage(ILogger logger, string messageEncoding); - private static readonly Action _decompressingMessage = - LoggerMessage.Define(LogLevel.Trace, new EventId(23, "DecompressingMessage"), "Decompressing message with '{MessageEncoding}' encoding."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 23, EventName = "DecompressingMessage", Message = "Decompressing message with '{MessageEncoding}' encoding.")] + public static partial void DecompressingMessage(ILogger logger, string messageEncoding); - private static readonly Action _deadlineTimeoutTooLong = - LoggerMessage.Define(LogLevel.Debug, new EventId(24, "DeadlineTimeoutTooLong"), "Deadline timeout {Timeout} is above maximum allowed timeout of 99999999 seconds. Maximum timeout will be used."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 24, EventName = "DeadlineTimeoutTooLong", Message = "Deadline timeout {Timeout} is above maximum allowed timeout of 99999999 seconds. Maximum timeout will be used.")] + public static partial void DeadlineTimeoutTooLong(ILogger logger, TimeSpan timeout); - private static readonly Action _deadlineTimerRescheduled = - LoggerMessage.Define(LogLevel.Trace, new EventId(25, "DeadlineTimerRescheduled"), "Deadline timer triggered but {Remaining} remaining before deadline exceeded. Deadline timer rescheduled."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 25, EventName = "DeadlineTimerRescheduled", Message = "Deadline timer triggered but {Remaining} remaining before deadline exceeded. Deadline timer rescheduled.")] + public static partial void DeadlineTimerRescheduled(ILogger logger, TimeSpan remaining); - private static readonly Action _errorParsingTrailers = - LoggerMessage.Define(LogLevel.Error, new EventId(26, "ErrorParsingTrailers"), "Error parsing trailers."); + [LoggerMessage(Level = LogLevel.Error, EventId = 26, EventName = "ErrorParsingTrailers", Message = "Error parsing trailers.")] + public static partial void ErrorParsingTrailers(ILogger logger, Exception ex); - private static readonly Action _errorExceedingDeadline = - LoggerMessage.Define(LogLevel.Error, new EventId(27, "ErrorExceedingDeadline"), "Error exceeding deadline."); + [LoggerMessage(Level = LogLevel.Error, EventId = 27, EventName = "ErrorExceedingDeadline", Message = "Error exceeding deadline.")] + public static partial void ErrorExceedingDeadline(ILogger logger, Exception ex); - private static readonly Action _invalidGrpcStatusInHeader = - LoggerMessage.Define(LogLevel.Error, new EventId(28, "InvalidGrpcStatusInHeader"), "Header contains an OK gRPC status. This is invalid for unary or client streaming calls because a status in the header indicates there is no response body. " + - "A message in the response body is required for unary and client streaming calls."); + [LoggerMessage(Level = LogLevel.Error, EventId = 28, EventName = "InvalidGrpcStatusInHeader", + Message = "Header contains an OK gRPC status. This is invalid for unary or client streaming calls because a status in the header indicates there is no response body." + + " A message in the response body is required for unary and client streaming calls.")] + public static partial void InvalidGrpcStatusInHeader(ILogger logger); - public static void StartingCall(ILogger logger, MethodType methodType, Uri uri) - { - _startingCall(logger, methodType, uri, null); - } - - public static void ResponseHeadersReceived(ILogger logger) - { - _responseHeadersReceived(logger, null); - } - - public static void GrpcStatusError(ILogger logger, StatusCode status, string message, Exception? debugException) - { - _grpcStatusError(logger, status, message, debugException); - } - - public static void FinishedCall(ILogger logger) - { - _finishedCall(logger, null); - } - - public static void StartingDeadlineTimeout(ILogger logger, TimeSpan deadlineTimeout) - { - _startingDeadlineTimeout(logger, deadlineTimeout, null); - } - - public static void ErrorStartingCall(ILogger logger) - { - _errorStartingCall(logger, null); - } - - public static void DeadlineExceeded(ILogger logger) - { - _deadlineExceeded(logger, null); - } - - public static void CanceledCall(ILogger logger) - { - _canceledCall(logger, null); - } - - public static void MessageNotReturned(ILogger logger) - { - _messageNotReturned(logger, null); - } - - public static void CallCredentialsNotUsed(ILogger logger) - { - _callCredentialsNotUsed(logger, null); - } - - public static void ReadingMessage(ILogger logger) - { - _readingMessage(logger, null); - } - - public static void NoMessageReturned(ILogger logger) - { - _noMessageReturned(logger, null); - } - - public static void DeserializingMessage(ILogger logger, int messageLength, Type messageType) - { - _deserializingMessage(logger, messageLength, messageType, null); - } - - public static void ReceivedMessage(ILogger logger) - { - _receivedMessage(logger, null); - } - - public static void ErrorReadingMessage(ILogger logger, Exception ex) - { - _errorReadingMessage(logger, ex); - } - - public static void SendingMessage(ILogger logger) - { - _sendingMessage(logger, null); - } - - public static void MessageSent(ILogger logger) - { - _messageSent(logger, null); - } - - public static void ErrorSendingMessage(ILogger logger, Exception ex) - { - _errorSendingMessage(logger, ex); - } - - public static void SerializedMessage(ILogger logger, Type messageType, int messageLength) - { - _serializedMessage(logger, messageType, messageLength, null); - } - - public static void CompressingMessage(ILogger logger, string messageEncoding) - { - _compressingMessage(logger, messageEncoding, null); - } - - public static void DecompressingMessage(ILogger logger, string messageEncoding) - { - _decompressingMessage(logger, messageEncoding, null); - } - - public static void DeadlineTimeoutTooLong(ILogger logger, TimeSpan timeout) - { - _deadlineTimeoutTooLong(logger, timeout, null); - } - - public static void DeadlineTimerRescheduled(ILogger logger, TimeSpan remaining) - { - _deadlineTimerRescheduled(logger, remaining, null); - } - - public static void ErrorParsingTrailers(ILogger logger, Exception ex) - { - _errorParsingTrailers(logger, ex); - } - - public static void ErrorExceedingDeadline(ILogger logger, Exception ex) - { - _errorExceedingDeadline(logger, ex); - } - - public static void InvalidGrpcStatusInHeader(ILogger logger) - { - _invalidGrpcStatusInHeader(logger, null); - } } diff --git a/src/Grpc.Net.Client/Internal/HttpContentClientStreamReader.cs b/src/Grpc.Net.Client/Internal/HttpContentClientStreamReader.cs index d38002909..7ec3a1534 100644 --- a/src/Grpc.Net.Client/Internal/HttpContentClientStreamReader.cs +++ b/src/Grpc.Net.Client/Internal/HttpContentClientStreamReader.cs @@ -275,13 +275,8 @@ public HttpContentClientStreamReaderDebugView(HttpContentClientStreamReader _readMessageError = - LoggerMessage.Define(LogLevel.Error, new EventId(1, "ReadMessageError"), "Error reading message."); - - public static void ReadMessageError(ILogger logger, Exception ex) - { - _readMessageError(logger, ex); - } + [LoggerMessage(Level = LogLevel.Error, EventId = 1, EventName = "ReadMessageError", Message = "Error reading message.")] + public static partial void ReadMessageError(ILogger logger, Exception ex); } diff --git a/src/Grpc.Net.Client/Internal/Retry/ChannelRetryThrottling.cs b/src/Grpc.Net.Client/Internal/Retry/ChannelRetryThrottling.cs index 2cbe4d3fd..17c52c84a 100644 --- a/src/Grpc.Net.Client/Internal/Retry/ChannelRetryThrottling.cs +++ b/src/Grpc.Net.Client/Internal/Retry/ChannelRetryThrottling.cs @@ -21,7 +21,7 @@ namespace Grpc.Net.Client.Internal.Retry; -internal class ChannelRetryThrottling +internal partial class ChannelRetryThrottling { private readonly object _lock = new object(); private readonly double _tokenRatio; @@ -83,14 +83,9 @@ private void UpdateRetryThrottlingActive() } } - private static class Log + private static partial class Log { - private static readonly Action _retryThrottlingActiveChanged = - LoggerMessage.Define(LogLevel.Trace, new EventId(1, "RetryThrottlingActiveChanged"), "Retry throttling active state changed. New value: {RetryThrottlingActive}"); - - public static void RetryThrottlingActiveChanged(ILogger logger, bool isRetryThrottlingActive) - { - _retryThrottlingActiveChanged(logger, isRetryThrottlingActive, null); - } + [LoggerMessage(Level = LogLevel.Trace, EventId = 1, EventName = "RetryThrottlingActiveChanged", Message = "Retry throttling active state changed. New value: {RetryThrottlingActive}")] + public static partial void RetryThrottlingActiveChanged(ILogger logger, bool retryThrottlingActive); } } diff --git a/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseLog.cs b/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseLog.cs index a06390f73..e5b96c3f2 100644 --- a/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseLog.cs +++ b/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseLog.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -21,109 +21,44 @@ namespace Grpc.Net.Client.Internal.Retry; -internal static class RetryCallBaseLog +internal static partial class RetryCallBaseLog { - private static readonly Action _retryEvaluated = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "RetryEvaluated"), "Evaluated retry for failed gRPC call. Status code: '{StatusCode}', Attempt: {AttemptCount}, Retry: {WillRetry}"); + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "RetryEvaluated", Message = "Evaluated retry for failed gRPC call. Status code: '{StatusCode}', Attempt: {AttemptCount}, Retry: {WillRetry}")] + internal static partial void RetryEvaluated(ILogger logger, StatusCode statusCode, int attemptCount, bool willRetry); - private static readonly Action _retryPushbackReceived = - LoggerMessage.Define(LogLevel.Debug, new EventId(2, "RetryPushbackReceived"), "Retry pushback of '{RetryPushback}' received from the failed gRPC call."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 2, EventName = "RetryPushbackReceived", Message = "Retry pushback of '{RetryPushback}' received from the failed gRPC call.")] + internal static partial void RetryPushbackReceived(ILogger logger, string retryPushback); - private static readonly Action _startingRetryDelay = - LoggerMessage.Define(LogLevel.Trace, new EventId(3, "StartingRetryDelay"), "Starting retry delay of {DelayDuration}."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 3, EventName = "StartingRetryDelay", Message = "Starting retry delay of {DelayDuration}.")] + internal static partial void StartingRetryDelay(ILogger logger, TimeSpan delayDuration); - private static readonly Action _errorRetryingCall = - LoggerMessage.Define(LogLevel.Error, new EventId(4, "ErrorRetryingCall"), "Error retrying gRPC call."); + [LoggerMessage(Level = LogLevel.Error, EventId = 4, EventName = "ErrorRetryingCall", Message = "Error retrying gRPC call.")] + internal static partial void ErrorRetryingCall(ILogger logger, Exception ex); - private static readonly Action _sendingBufferedMessages = - LoggerMessage.Define(LogLevel.Trace, new EventId(5, "SendingBufferedMessages"), "Sending {MessageCount} buffered messages from previous failed gRPC calls."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 5, EventName = "SendingBufferedMessages", Message = "Sending {MessageCount} buffered messages from previous failed gRPC calls.")] + internal static partial void SendingBufferedMessages(ILogger logger, int messageCount); - private static readonly Action _messageAddedToBuffer = - LoggerMessage.Define(LogLevel.Trace, new EventId(6, "MessageAddedToBuffer"), "Message with {MessageSize} bytes added to the buffer. There are {CallBufferSize} bytes buffered for this call."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 6, EventName = "MessageAddedToBuffer", Message = "Message with {MessageSize} bytes added to the buffer. There are {CallBufferSize} bytes buffered for this call.")] + internal static partial void MessageAddedToBuffer(ILogger logger, int messageSize, long callBufferSize); - private static readonly Action _callCommited = - LoggerMessage.Define(LogLevel.Debug, new EventId(7, "CallCommited"), "Call commited. Reason: {CommitReason}"); + [LoggerMessage(Level = LogLevel.Debug, EventId = 7, EventName = "CallCommited", Message = "Call commited. Reason: {CommitReason}")] + internal static partial void CallCommited(ILogger logger, CommitReason commitReason); - private static readonly Action _startingRetryWorker = - LoggerMessage.Define(LogLevel.Trace, new EventId(8, "StartingRetryWorker"), "Starting retry worker."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 8, EventName = "StartingRetryWorker", Message = "Starting retry worker.")] + internal static partial void StartingRetryWorker(ILogger logger); - private static readonly Action _stoppingRetryWorker = - LoggerMessage.Define(LogLevel.Trace, new EventId(9, "StoppingRetryWorker"), "Stopping retry worker."); + [LoggerMessage(Level = LogLevel.Trace, EventId = 9, EventName = "StoppingRetryWorker", Message = "Stopping retry worker.")] + internal static partial void StoppingRetryWorker(ILogger logger); - private static readonly Action _maxAttemptsLimited = - LoggerMessage.Define(LogLevel.Debug, new EventId(10, "MaxAttemptsLimited"), "The method has {ServiceConfigMaxAttempts} attempts specified in the service config. The number of attempts has been limited by channel configuration to {ChannelMaxAttempts}."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 10, EventName = "MaxAttemptsLimited", Message = "The method has {ServiceConfigMaxAttempts} attempts specified in the service config. The number of attempts has been limited by channel configuration to {ChannelMaxAttempts}.")] + internal static partial void MaxAttemptsLimited(ILogger logger, int serviceConfigMaxAttempts, int channelMaxAttempts); - private static readonly Action _additionalCallsBlockedByRetryThrottling = - LoggerMessage.Define(LogLevel.Debug, new EventId(11, "AdditionalCallsBlockedByRetryThrottling"), "Additional calls blocked by retry throttling."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 11, EventName = "AdditionalCallsBlockedByRetryThrottling", Message = "Additional calls blocked by retry throttling.")] + internal static partial void AdditionalCallsBlockedByRetryThrottling(ILogger logger); - private static readonly Action _startingAttempt = - LoggerMessage.Define(LogLevel.Debug, new EventId(12, "StartingAttempt"), "Starting attempt {AttemptCount}."); + [LoggerMessage(Level = LogLevel.Debug, EventId = 12, EventName = "StartingAttempt", Message = "Starting attempt {AttemptCount}.")] + internal static partial void StartingAttempt(ILogger logger, int AttemptCount); - private static readonly Action _canceledRetry = - LoggerMessage.Define(LogLevel.Debug, new EventId(13, "CanceledRetry"), "gRPC retry call canceled."); - - internal static void RetryEvaluated(ILogger logger, StatusCode statusCode, int attemptCount, bool willRetry) - { - _retryEvaluated(logger, statusCode, attemptCount, willRetry, null); - } - - internal static void RetryPushbackReceived(ILogger logger, string retryPushback) - { - _retryPushbackReceived(logger, retryPushback, null); - } - - internal static void StartingRetryDelay(ILogger logger, TimeSpan delayDuration) - { - _startingRetryDelay(logger, delayDuration, null); - } - - internal static void ErrorRetryingCall(ILogger logger, Exception ex) - { - _errorRetryingCall(logger, ex); - } - - internal static void SendingBufferedMessages(ILogger logger, int messageCount) - { - _sendingBufferedMessages(logger, messageCount, null); - } - - internal static void MessageAddedToBuffer(ILogger logger, int messageSize, long callBufferSize) - { - _messageAddedToBuffer(logger, messageSize, callBufferSize, null); - } - - internal static void CallCommited(ILogger logger, CommitReason commitReason) - { - _callCommited(logger, commitReason, null); - } - - internal static void StartingRetryWorker(ILogger logger) - { - _startingRetryWorker(logger, null); - } - - internal static void StoppingRetryWorker(ILogger logger) - { - _stoppingRetryWorker(logger, null); - } - - internal static void MaxAttemptsLimited(ILogger logger, int serviceConfigMaxAttempts, int channelMaxAttempts) - { - _maxAttemptsLimited(logger, serviceConfigMaxAttempts, channelMaxAttempts, null); - } - - internal static void AdditionalCallsBlockedByRetryThrottling(ILogger logger) - { - _additionalCallsBlockedByRetryThrottling(logger, null); - } - - internal static void StartingAttempt(ILogger logger, int attempts) - { - _startingAttempt(logger, attempts, null); - } - - internal static void CanceledRetry(ILogger logger) - { - _canceledRetry(logger, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 13, EventName = "CanceledRetry", Message = "gRPC retry call canceled.")] + internal static partial void CanceledRetry(ILogger logger); } diff --git a/src/Grpc.Net.ClientFactory/Internal/GrpcCallInvokerFactory.cs b/src/Grpc.Net.ClientFactory/Internal/GrpcCallInvokerFactory.cs index 8b46cbb86..b63816785 100644 --- a/src/Grpc.Net.ClientFactory/Internal/GrpcCallInvokerFactory.cs +++ b/src/Grpc.Net.ClientFactory/Internal/GrpcCallInvokerFactory.cs @@ -31,7 +31,7 @@ namespace Grpc.Net.ClientFactory.Internal; internal readonly record struct EntryKey(string Name, Type Type); -internal class GrpcCallInvokerFactory +internal partial class GrpcCallInvokerFactory { private readonly ILoggerFactory _loggerFactory; private readonly IOptionsMonitor _grpcClientFactoryOptionsMonitor; @@ -251,14 +251,9 @@ protected override Task SendAsync(HttpRequestMessage reques } } - private static class Log + private static partial class Log { - private static readonly Action _httpClientActionsPartiallySupported = - LoggerMessage.Define(LogLevel.Debug, new EventId(1, "HttpClientActionsPartiallySupported"), "The ConfigureHttpClient method is used to configure gRPC client '{ClientName}'. ConfigureHttpClient is partially supported when creating gRPC clients and only some HttpClient properties such as BaseAddress and DefaultRequestHeaders are applied to the gRPC client."); - - public static void HttpClientActionsPartiallySupported(ILogger logger, string clientName) - { - _httpClientActionsPartiallySupported(logger, clientName, null); - } + [LoggerMessage(Level = LogLevel.Debug, EventId = 1, EventName = "HttpClientActionsPartiallySupported", Message = "The ConfigureHttpClient method is used to configure gRPC client '{ClientName}'. ConfigureHttpClient is partially supported when creating gRPC clients and only some HttpClient properties such as BaseAddress and DefaultRequestHeaders are applied to the gRPC client.")] + public static partial void HttpClientActionsPartiallySupported(ILogger logger, string clientName); } } From b1df3e4c76792212a0401e1ae17114867fd6663b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 21:54:20 +0800 Subject: [PATCH 18/48] Bump serve-static from 1.14.2 to 1.16.2 in /examples/Spar/Server/ClientApp (#2536) Bumps [serve-static](https://github.com/expressjs/serve-static) from 1.14.2 to 1.16.2. - [Release notes](https://github.com/expressjs/serve-static/releases) - [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md) - [Commits](https://github.com/expressjs/serve-static/compare/v1.14.2...v1.16.2) --- updated-dependencies: - dependency-name: serve-static dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../Spar/Server/ClientApp/package-lock.json | 179 ++++++++++-------- 1 file changed, 99 insertions(+), 80 deletions(-) diff --git a/examples/Spar/Server/ClientApp/package-lock.json b/examples/Spar/Server/ClientApp/package-lock.json index 8e0c650ae..6215cf0cb 100644 --- a/examples/Spar/Server/ClientApp/package-lock.json +++ b/examples/Spar/Server/ClientApp/package-lock.json @@ -3613,12 +3613,12 @@ } }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/des.js": { @@ -3632,10 +3632,14 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/diffie-hellman": { "version": "5.0.3", @@ -3769,7 +3773,7 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "node_modules/electron-to-chromium": { @@ -3800,9 +3804,9 @@ "dev": true }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "engines": { "node": ">= 0.8" @@ -3910,7 +3914,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "node_modules/escape-string-regexp": { @@ -3991,7 +3995,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "engines": { "node": ">= 0.6" @@ -4311,7 +4315,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "engines": { "node": ">= 0.6" @@ -4956,19 +4960,19 @@ } }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-signature": { @@ -6344,9 +6348,9 @@ } }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "dependencies": { "ee-first": "1.1.1" @@ -7825,24 +7829,24 @@ } }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -7860,9 +7864,18 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -7879,15 +7892,15 @@ } }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -8414,12 +8427,12 @@ } }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/stealthy-require": { @@ -12133,9 +12146,9 @@ "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "des.js": { @@ -12149,9 +12162,9 @@ } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "diffie-hellman": { @@ -12274,7 +12287,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "electron-to-chromium": { @@ -12307,9 +12320,9 @@ } }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, "entities": { @@ -12389,7 +12402,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "escape-string-regexp": { @@ -12440,7 +12453,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, "events": { @@ -12708,7 +12721,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, "fs.realpath": { @@ -13198,15 +13211,15 @@ } }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" } }, @@ -14294,9 +14307,9 @@ } }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -15519,24 +15532,24 @@ "dev": true }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -15551,11 +15564,17 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -15571,15 +15590,15 @@ "dev": true }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.19.0" } }, "set-value": { @@ -16017,9 +16036,9 @@ } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, "stealthy-require": { From df3d8dc9964b4a80c3ea5ad1bd54a98da92fb6a3 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 1 Oct 2024 14:24:32 +0800 Subject: [PATCH 19/48] Update to Grpc.Tools 2.67.0-pre1 (#2547) --- Directory.Packages.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 10504653f..e12fc9bfb 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,7 +5,7 @@ 8.0.6 7.0.5 6.0.33 - 2.63.0 + 2.66.0 1.6.0 1.8.1 1.8.0-beta.1 @@ -33,7 +33,7 @@ - + From 490894cdedb34b43c32dc576d5745c41223764b6 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Wed, 2 Oct 2024 08:10:26 +0800 Subject: [PATCH 20/48] Cleanup gRPC unit testing helpers in tester sample (#2548) --- .../UnitTests/Helpers/TestServerCallContext.cs | 5 +---- .../UnitTests/Helpers/TestServerStreamWriter.cs | 16 +++++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/examples/Tester/Tests/Server/UnitTests/Helpers/TestServerCallContext.cs b/examples/Tester/Tests/Server/UnitTests/Helpers/TestServerCallContext.cs index 1f4cbd3bf..ddc4aa405 100644 --- a/examples/Tester/Tests/Server/UnitTests/Helpers/TestServerCallContext.cs +++ b/examples/Tester/Tests/Server/UnitTests/Helpers/TestServerCallContext.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -22,8 +22,6 @@ using System.Threading.Tasks; using Grpc.Core; -// TODO(JamesNK): Remove nullable override after Grpc.Core.Api update -#pragma warning disable CS8764 // Nullability of return type doesn't match overridden member (possibly because of nullability attributes). namespace Tests.Server.UnitTests.Helpers { public class TestServerCallContext : ServerCallContext @@ -81,4 +79,3 @@ public static TestServerCallContext Create(Metadata? requestHeaders = null, Canc } } } -#pragma warning restore CS8764 // Nullability of return type doesn't match overridden member (possibly because of nullability attributes). diff --git a/examples/Tester/Tests/Server/UnitTests/Helpers/TestServerStreamWriter.cs b/examples/Tester/Tests/Server/UnitTests/Helpers/TestServerStreamWriter.cs index 08163f12a..a00d8cf79 100644 --- a/examples/Tester/Tests/Server/UnitTests/Helpers/TestServerStreamWriter.cs +++ b/examples/Tester/Tests/Server/UnitTests/Helpers/TestServerStreamWriter.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -22,8 +22,6 @@ using System.Threading.Tasks; using Grpc.Core; -// TODO(JamesNK): Remove nullable override after Grpc.Core.Api update -#pragma warning disable CS8766 // Nullability of reference types in return type doesn't match implicitly implemented member (possibly because of nullability attributes). namespace Tests.Server.UnitTests.Helpers { public class TestServerStreamWriter : IServerStreamWriter where T : class @@ -63,8 +61,12 @@ public IAsyncEnumerable ReadAllAsync() } } - public Task WriteAsync(T message) + public Task WriteAsync(T message, CancellationToken cancellationToken) { + if (cancellationToken.IsCancellationRequested) + { + return Task.FromCanceled(cancellationToken); + } if (_serverCallContext.CancellationToken.IsCancellationRequested) { return Task.FromCanceled(_serverCallContext.CancellationToken); @@ -77,6 +79,10 @@ public Task WriteAsync(T message) return Task.CompletedTask; } + + public Task WriteAsync(T message) + { + return WriteAsync(message, CancellationToken.None); + } } } -#pragma warning restore CS8766 // Nullability of reference types in return type doesn't match implicitly implemented member (possibly because of nullability attributes). From 0f2ffdc03edcd832e6f83a9deb73e2d57c0b8dbf Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Wed, 9 Oct 2024 10:01:33 +0800 Subject: [PATCH 21/48] Fix UpdateBalancingState not called when address attributes are modified (#2553) --- examples/Container/Backend/Dockerfile | 4 +- examples/Container/Frontend/Dockerfile | 4 +- global.json | 2 +- .../Balancer/SubchannelsLoadBalancer.cs | 5 +- .../Balancer/SubchannelsLoadBalancerTests.cs | 199 ++++++++++++++++++ .../InteropTestsGrpcWebWebsite/Dockerfile | 4 +- testassets/InteropTestsWebsite/Dockerfile | 4 +- 7 files changed, 212 insertions(+), 10 deletions(-) create mode 100644 test/Grpc.Net.Client.Tests/Balancer/SubchannelsLoadBalancerTests.cs diff --git a/examples/Container/Backend/Dockerfile b/examples/Container/Backend/Dockerfile index 78b8007d5..7c0429870 100644 --- a/examples/Container/Backend/Dockerfile +++ b/examples/Container/Backend/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/nightly/sdk:9.0-preview AS build-env +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build-env WORKDIR /app # Copy everything @@ -8,7 +8,7 @@ RUN dotnet restore examples/Container/Backend RUN dotnet publish examples/Container/Backend -c Release -o out # Build runtime image -FROM mcr.microsoft.com/dotnet/nightly/aspnet:9.0-preview +FROM mcr.microsoft.com/dotnet/aspnet:9.0 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "Backend.dll"] \ No newline at end of file diff --git a/examples/Container/Frontend/Dockerfile b/examples/Container/Frontend/Dockerfile index 23403110c..017712b23 100644 --- a/examples/Container/Frontend/Dockerfile +++ b/examples/Container/Frontend/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/nightly/sdk:9.0-preview AS build-env +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build-env WORKDIR /app # Copy everything @@ -8,7 +8,7 @@ RUN dotnet restore examples/Container/Frontend RUN dotnet publish examples/Container/Frontend -c Release -o out # Build runtime image -FROM mcr.microsoft.com/dotnet/nightly/aspnet:9.0-preview +FROM mcr.microsoft.com/dotnet/aspnet:9.0 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "Frontend.dll"] \ No newline at end of file diff --git a/global.json b/global.json index 67d91a4f9..0344c423c 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "9.0.100-preview.7.24407.12", + "version": "9.0.100-rc.2.24474.11", "rollForward": "latestFeature" } } diff --git a/src/Grpc.Net.Client/Balancer/SubchannelsLoadBalancer.cs b/src/Grpc.Net.Client/Balancer/SubchannelsLoadBalancer.cs index 5f27c347b..73b88f7e1 100644 --- a/src/Grpc.Net.Client/Balancer/SubchannelsLoadBalancer.cs +++ b/src/Grpc.Net.Client/Balancer/SubchannelsLoadBalancer.cs @@ -122,6 +122,7 @@ public override void UpdateChannelState(ChannelState state) var allUpdatedSubchannels = new List(); var newSubchannels = new List(); + var hasModifiedSubchannels = false; var currentSubchannels = _addressSubchannels.ToList(); // The state's addresses is the new authoritative list of addresses. @@ -150,6 +151,8 @@ public override void UpdateChannelState(ChannelState state) address, newOrCurrentSubchannel.LastKnownState); newOrCurrentSubchannel.Subchannel.UpdateAddresses(new[] { address }); + + hasModifiedSubchannels = true; } SubchannelLog.SubchannelPreserved(_logger, newOrCurrentSubchannel.Subchannel.Id, address); @@ -171,7 +174,7 @@ public override void UpdateChannelState(ChannelState state) // This can all be removed. var removedSubConnections = currentSubchannels; - if (removedSubConnections.Count == 0 && newSubchannels.Count == 0) + if (removedSubConnections.Count == 0 && newSubchannels.Count == 0 && !hasModifiedSubchannels) { SubchannelsLoadBalancerLog.ConnectionsUnchanged(_logger); return; diff --git a/test/Grpc.Net.Client.Tests/Balancer/SubchannelsLoadBalancerTests.cs b/test/Grpc.Net.Client.Tests/Balancer/SubchannelsLoadBalancerTests.cs new file mode 100644 index 000000000..533ce0e3f --- /dev/null +++ b/test/Grpc.Net.Client.Tests/Balancer/SubchannelsLoadBalancerTests.cs @@ -0,0 +1,199 @@ +#region Copyright notice and license + +// Copyright 2019 The gRPC Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion + +#if SUPPORT_LOAD_BALANCING +using System.Net; +using Grpc.Core; +using Grpc.Net.Client.Balancer; +using Grpc.Net.Client.Balancer.Internal; +using Grpc.Tests.Shared; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; + +namespace Grpc.Net.Client.Tests.Infrastructure.Balancer; + +[TestFixture] +public class SubchannelsLoadBalancerTests +{ + [Test] + public void UpdateChannelState_AddressMatchAndAttributesDifferent_UpdateState() + { + // Arrange + const string host1 = "127.0.0.1"; + const string host2 = "127.0.0.2"; + const int port = 80; + + const string attributeKey = "key1"; + + var controller = new CustomChannelControlHelper(); + var balancer = new CustomBalancer(controller, NullLoggerFactory.Instance); + + // create 2 addresses with some attributes + var address1 = new BalancerAddress(host1, port); + address1.Attributes.TryAdd(attributeKey, 20); // <-- difference + + var address2 = new BalancerAddress(host2, port); + address2.Attributes.TryAdd(attributeKey, 80); // <-- difference + + var state1 = new ChannelState( + status: new Status(), + addresses: [address1, address2], + loadBalancingConfig: null, + attributes: new BalancerAttributes()); + + // create 2 addresses with the same hosts and ports as previous but with other attribute values + var address3 = new BalancerAddress(host1, port); + address3.Attributes.TryAdd(attributeKey, 40); // <-- difference + + var address4 = new BalancerAddress(host2, port); + address4.Attributes.TryAdd(attributeKey, 60); // <-- difference + + var state2 = new ChannelState( + status: new Status(), + addresses: [address3, address4], + loadBalancingConfig: null, + attributes: new BalancerAttributes()); + + // Act + // first update with `address1` and `address2` + balancer.UpdateChannelState(state1); + + // remember count of `IChannelControlHelper.UpdateState()` calls + var updateStateCallsCount1 = controller.UpdateStateCallsCount; + + // second update with `address3` and `address4` + // which differs from `address1` and `address2` _only_ in attributes values + balancer.UpdateChannelState(state2); + + // get count of `IChannelControlHelper.UpdateState()` calls after second update + var updateStateCallsCount2 = controller.UpdateStateCallsCount; + + // Assert + Assert.True( + updateStateCallsCount2 > updateStateCallsCount1, + "`IChannelControlHelper.UpdateState()` was not called from `SubchannelsLoadBalancer.UpdateChannelState()`"); + } +} + +file class CustomBalancer( + IChannelControlHelper controller, + ILoggerFactory loggerFactory) + : SubchannelsLoadBalancer(controller, loggerFactory) +{ + protected override SubchannelPicker CreatePicker(IReadOnlyList readySubchannels) + { + return new CustomPicker(readySubchannels); + } +} + +file class CustomPicker : SubchannelPicker +{ + private IReadOnlyList readySubchannels; + + public CustomPicker(IReadOnlyList readySubchannels) + { + this.readySubchannels = readySubchannels; + } + + public override PickResult Pick(PickContext context) + { + return PickResult.ForSubchannel(readySubchannels[0]); + } +} + +file class CustomChannelControlHelper : IChannelControlHelper +{ + public int UpdateStateCallsCount { get; private set; } + + public Subchannel CreateSubchannel(SubchannelOptions options) + { + var subchannelTransportFactory = new CustomSubchannelTransportFactory(); + + var manager = new ConnectionManager( + new CustomResolver(), + true, + NullLoggerFactory.Instance, + new CustomBackoffPolicyFactory(), + subchannelTransportFactory, + []); + + return ((IChannelControlHelper)manager).CreateSubchannel(options); + } + + public void UpdateState(BalancerState state) + { + UpdateStateCallsCount++; + } + + public void RefreshResolver() { } +} + +file class CustomResolver() : PollingResolver(NullLoggerFactory.Instance) +{ + protected override Task ResolveAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} + +file class CustomBackoffPolicyFactory : IBackoffPolicyFactory +{ + public IBackoffPolicy Create() + { + return new CustomBackoffPolicy(); + } +} + +file class CustomBackoffPolicy : IBackoffPolicy +{ + public TimeSpan NextBackoff() + { + return TimeSpan.Zero; + } +} + +file class CustomSubchannelTransportFactory : ISubchannelTransportFactory +{ + public ISubchannelTransport Create(Subchannel subchannel) + { + return new CustomSubchannelTransport(); + } +} + +file class CustomSubchannelTransport : ISubchannelTransport +{ + public void Dispose() { } + + public DnsEndPoint? CurrentEndPoint { get; } + public TimeSpan? ConnectTimeout { get; } + public TransportStatus TransportStatus { get; } + + public ValueTask GetStreamAsync(DnsEndPoint endPoint, CancellationToken cancellationToken) + { + return ValueTask.FromResult(new MemoryStream()); + } + + public ValueTask TryConnectAsync(ConnectContext context, int attempt) + { + return ValueTask.FromResult(ConnectResult.Success); + } + + public void Disconnect() { } +} + +#endif diff --git a/testassets/InteropTestsGrpcWebWebsite/Dockerfile b/testassets/InteropTestsGrpcWebWebsite/Dockerfile index c8ecbf5c2..9a71faacf 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Dockerfile +++ b/testassets/InteropTestsGrpcWebWebsite/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/nightly/sdk:9.0-preview AS build-env +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build-env WORKDIR /app # Copy everything @@ -8,7 +8,7 @@ RUN dotnet restore testassets/InteropTestsGrpcWebWebsite RUN dotnet publish testassets/InteropTestsGrpcWebWebsite -c Release -o out # Build runtime image -FROM mcr.microsoft.com/dotnet/nightly/aspnet:9.0-preview +FROM mcr.microsoft.com/dotnet/aspnet:9.0 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "InteropTestsGrpcWebWebsite.dll", "--urls", "http://+:80"] diff --git a/testassets/InteropTestsWebsite/Dockerfile b/testassets/InteropTestsWebsite/Dockerfile index 16e916257..59cdeb214 100644 --- a/testassets/InteropTestsWebsite/Dockerfile +++ b/testassets/InteropTestsWebsite/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/nightly/sdk:9.0-preview AS build-env +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build-env WORKDIR /app # Copy everything @@ -8,7 +8,7 @@ RUN dotnet restore testassets/InteropTestsWebsite RUN dotnet publish testassets/InteropTestsWebsite --framework net9.0 -c Release -o out -p:LatestFramework=true # Build runtime image -FROM mcr.microsoft.com/dotnet/nightly/aspnet:9.0-preview +FROM mcr.microsoft.com/dotnet/aspnet:9.0 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "InteropTestsWebsite.dll", "--port_http1", "80"] \ No newline at end of file From b88713e83f3c75282678fdc15bf830fa78bfff2c Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Wed, 9 Oct 2024 13:52:55 +0800 Subject: [PATCH 22/48] Update Grpc.Tools to 2.67.0 (#2554) --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index e12fc9bfb..9819d45ec 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -33,7 +33,7 @@ - + From 5fffc489f779a897b52679dfec1df02124268e83 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 11 Oct 2024 06:51:57 +0800 Subject: [PATCH 23/48] Fix System.Text.Json vulnerability warning (#2556) --- Directory.Packages.props | 1 + src/dotnet-grpc/dotnet-grpc.csproj | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 9819d45ec..3e1741614 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -82,6 +82,7 @@ + diff --git a/src/dotnet-grpc/dotnet-grpc.csproj b/src/dotnet-grpc/dotnet-grpc.csproj index 3b246baeb..c48025ae9 100644 --- a/src/dotnet-grpc/dotnet-grpc.csproj +++ b/src/dotnet-grpc/dotnet-grpc.csproj @@ -1,4 +1,4 @@ - + Command line tool for gRPC projects gRPC RPC CLI @@ -26,6 +26,7 @@ + From 1732f28dc6ad74da33b2758f11cbdfabb2dcbc86 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 24 Oct 2024 04:06:42 +0800 Subject: [PATCH 24/48] Update package dependencies to 9.0 RC2 (#2560) --- Directory.Packages.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 3e1741614..9a3224d64 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,7 +1,7 @@ true - 9.0.0-preview.5.24306.11 + 9.0.0-rc.2.24474.3 8.0.6 7.0.5 6.0.33 @@ -9,7 +9,7 @@ 1.6.0 1.8.1 1.8.0-beta.1 - 9.0.0-preview.5.24306.7 + 9.0.0-rc.2.24473.5 6.0.0 From dacb7b41ea2fb42f2c0756e3d3a4ad4dcfecdc7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 13:34:00 +0800 Subject: [PATCH 25/48] Bump elliptic from 6.5.7 to 6.6.0 in /examples/Spar/Server/ClientApp (#2567) Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.7 to 6.6.0. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.7...v6.6.0) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/Spar/Server/ClientApp/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/Spar/Server/ClientApp/package-lock.json b/examples/Spar/Server/ClientApp/package-lock.json index 6215cf0cb..fdcf0ae59 100644 --- a/examples/Spar/Server/ClientApp/package-lock.json +++ b/examples/Spar/Server/ClientApp/package-lock.json @@ -3783,9 +3783,9 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "dev": true, "dependencies": { "bn.js": "^4.11.9", @@ -12297,9 +12297,9 @@ "dev": true }, "elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "dev": true, "requires": { "bn.js": "^4.11.9", From 5a58c24efc1d0b7c5ff88e7b0582ea891b90b17f Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 15 Nov 2024 06:47:13 +0800 Subject: [PATCH 26/48] Update to .NET 9 RTM (#2571) --- Directory.Packages.props | 6 +++--- global.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 9a3224d64..1c82cda73 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,7 +1,7 @@ true - 9.0.0-rc.2.24474.3 + 9.0.0 8.0.6 7.0.5 6.0.33 @@ -9,7 +9,7 @@ 1.6.0 1.8.1 1.8.0-beta.1 - 9.0.0-rc.2.24473.5 + 9.0.0 6.0.0 @@ -65,7 +65,7 @@ - + diff --git a/global.json b/global.json index 0344c423c..cdbb589ed 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "9.0.100-rc.2.24474.11", + "version": "9.0.100", "rollForward": "latestFeature" } } From b6cfbd05e9ccb47ef64c2b8a2f88260fab46470e Mon Sep 17 00:00:00 2001 From: Weihan Li Date: Mon, 9 Dec 2024 08:35:21 +0800 Subject: [PATCH 27/48] update ArgumentNullException.ThrowIfNull usage (#2563) --- src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs b/src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs index fd0129fb3..904072415 100644 --- a/src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs +++ b/src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs @@ -13,7 +13,7 @@ internal static partial class ArgumentNullThrowHelper /// The name of the parameter with which corresponds. public static void ThrowIfNull([NotNull] object? argument, [CallerArgumentExpression("argument")] string? paramName = null) { -#if !NET7_0_OR_GREATER +#if !NET6_0_OR_GREATER if (argument is null) { Throw(paramName); @@ -23,7 +23,7 @@ public static void ThrowIfNull([NotNull] object? argument, [CallerArgumentExpres #endif } -#if !NET7_0_OR_GREATER +#if !NET6_0_OR_GREATER [DoesNotReturn] internal static void Throw(string? paramName) => throw new ArgumentNullException(paramName); From 3bf19a113cbdb09012c14cc253f146ec822de11c Mon Sep 17 00:00:00 2001 From: Weihan Li Date: Mon, 9 Dec 2024 08:36:19 +0800 Subject: [PATCH 28/48] use nameof for CallerArgumentExpression (#2562) --- src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs b/src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs index 904072415..21b3466ed 100644 --- a/src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs +++ b/src/Shared/ThrowHelpers/ArgumentNullThrowHelper.cs @@ -11,7 +11,7 @@ internal static partial class ArgumentNullThrowHelper /// Throws an if is null. /// The reference type argument to validate as non-null. /// The name of the parameter with which corresponds. - public static void ThrowIfNull([NotNull] object? argument, [CallerArgumentExpression("argument")] string? paramName = null) + public static void ThrowIfNull([NotNull] object? argument, [CallerArgumentExpression(nameof(argument))] string? paramName = null) { #if !NET6_0_OR_GREATER if (argument is null) From 651a0cb64a6b0971058078dfce6fc2c777f50ade Mon Sep 17 00:00:00 2001 From: Henrik Date: Mon, 9 Dec 2024 01:38:01 +0100 Subject: [PATCH 29/48] Correctness: Make some private & internal classes sealed where possible (#2559) --- perf/benchmarkapps/Shared/BenchmarkServiceImpl.cs | 4 ++-- .../CallHandlers/ClientStreamingServerCallHandler.cs | 2 +- .../CallHandlers/DuplexStreamingServerCallHandler.cs | 2 +- .../CallHandlers/ServerStreamingServerCallHandler.cs | 2 +- .../Internal/CallHandlers/UnaryServerCallHandler.cs | 2 +- src/Grpc.AspNetCore.Server/Internal/GrpcMarkerService.cs | 2 +- src/Grpc.AspNetCore.Server/Internal/GrpcServerBuilder.cs | 2 +- .../Internal/GrpcServiceOptionsSetup.cs | 4 ++-- .../Internal/HttpContextStreamReader.cs | 2 +- .../Internal/HttpContextStreamWriter.cs | 2 +- .../Internal/ReadOnlySequenceStream.cs | 2 +- .../Internal/ServerCallHandlerFactory.cs | 2 +- src/Grpc.AspNetCore.Server/Internal/SystemClock.cs | 2 +- .../Model/Internal/BinderServiceModelProvider.cs | 2 +- src/Grpc.AspNetCore.Server/Model/Internal/MethodModel.cs | 2 +- .../Model/Internal/ProviderServiceBinder.cs | 2 +- .../Model/Internal/ServiceMethodsRegistry.cs | 2 +- .../Model/Internal/ServiceRouteBuilder.cs | 2 +- src/Grpc.AspNetCore.Web/Internal/Base64PipeReader.cs | 2 +- src/Grpc.AspNetCore.Web/Internal/Base64PipeWriter.cs | 4 ++-- src/Grpc.AspNetCore.Web/Internal/GrpcWebFeature.cs | 2 +- src/Grpc.AspNetCore.Web/Internal/MemorySegment.cs | 2 +- src/Grpc.Core.Api/CallCredentials.cs | 4 ++-- src/Grpc.Core.Api/ClientBase.cs | 4 ++-- src/Grpc.Core.Api/Interceptors/CallInvokerExtensions.cs | 2 +- .../Interceptors/InterceptingCallInvoker.cs | 3 +-- src/Grpc.Core.Api/Internal/UnimplementedCallInvoker.cs | 5 +---- src/Grpc.Net.Client.Web/Internal/Base64RequestStream.cs | 2 +- src/Grpc.Net.Client.Web/Internal/Base64ResponseStream.cs | 2 +- .../Internal/GrpcWebRequestContent.cs | 2 +- .../Internal/GrpcWebResponseContent.cs | 2 +- .../Internal/GrpcWebResponseStream.cs | 2 +- src/Grpc.Net.Client.Web/Internal/OperatingSystem.cs | 2 +- .../Balancer/Internal/BalancerAddressEqualityComparer.cs | 2 +- .../Balancer/Internal/BalancerHttpHandler.cs | 9 ++------- src/Grpc.Net.Client/Balancer/Internal/ErrorPicker.cs | 3 +-- .../Balancer/Internal/PassiveSubchannelTransport.cs | 6 +----- .../Internal/SocketConnectivitySubchannelTransport.cs | 4 ++-- src/Grpc.Net.Client/Balancer/PickFirstBalancer.cs | 4 +--- src/Grpc.Net.Client/Internal/GrpcCallScope.cs | 2 +- src/Grpc.Net.Client/Internal/GrpcMethodInfo.cs | 8 ++++---- src/Grpc.Net.Client/Internal/Http/PushStreamContent.cs | 2 +- src/Grpc.Net.Client/Internal/Http/PushUnaryContent.cs | 2 +- src/Grpc.Net.Client/Internal/Http/WinHttpUnaryContent.cs | 2 +- .../Internal/HttpContentClientStreamReader.cs | 2 +- .../Internal/HttpContentClientStreamWriter.cs | 2 +- .../Internal/Retry/ChannelRetryThrottling.cs | 2 +- .../Internal/Retry/RetryCallBaseClientStreamReader.cs | 2 +- .../Internal/Retry/RetryCallBaseClientStreamWriter.cs | 2 +- src/Shared/Server/InterceptorPipelineBuilder.cs | 4 ++-- src/Shared/TrailingHeadersHelpers.cs | 2 +- src/dotnet-grpc/Commands/AddFileCommand.cs | 5 +---- src/dotnet-grpc/Commands/AddUrlCommand.cs | 3 +-- src/dotnet-grpc/Commands/ListCommand.cs | 3 +-- src/dotnet-grpc/Commands/RefreshCommand.cs | 4 +--- src/dotnet-grpc/Commands/RemoveCommand.cs | 5 +---- src/dotnet-grpc/Internal/CLIToolException.cs | 2 +- src/dotnet-grpc/Internal/GrpcDependencyAttribute.cs | 2 +- 58 files changed, 69 insertions(+), 95 deletions(-) diff --git a/perf/benchmarkapps/Shared/BenchmarkServiceImpl.cs b/perf/benchmarkapps/Shared/BenchmarkServiceImpl.cs index 83c03970f..bc8ae2bb9 100644 --- a/perf/benchmarkapps/Shared/BenchmarkServiceImpl.cs +++ b/perf/benchmarkapps/Shared/BenchmarkServiceImpl.cs @@ -20,7 +20,7 @@ using Grpc.Core; using Grpc.Testing; -class BenchmarkServiceImpl : BenchmarkService.BenchmarkServiceBase +sealed class BenchmarkServiceImpl : BenchmarkService.BenchmarkServiceBase { #if CLIENT_CERTIFICATE_AUTHENTICATION [Microsoft.AspNetCore.Authorization.Authorize] @@ -98,4 +98,4 @@ public static SimpleResponse CreateResponse(SimpleRequest request) var payload = new Payload { Body = body }; return new SimpleResponse { Payload = payload }; } -} \ No newline at end of file +} diff --git a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ClientStreamingServerCallHandler.cs b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ClientStreamingServerCallHandler.cs index f6d9bb155..99437edc9 100644 --- a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ClientStreamingServerCallHandler.cs +++ b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ClientStreamingServerCallHandler.cs @@ -24,7 +24,7 @@ namespace Grpc.AspNetCore.Server.Internal.CallHandlers; -internal class ClientStreamingServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase +internal sealed class ClientStreamingServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/DuplexStreamingServerCallHandler.cs b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/DuplexStreamingServerCallHandler.cs index cc5318511..2649b1fb5 100644 --- a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/DuplexStreamingServerCallHandler.cs +++ b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/DuplexStreamingServerCallHandler.cs @@ -23,7 +23,7 @@ namespace Grpc.AspNetCore.Server.Internal.CallHandlers; -internal class DuplexStreamingServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase +internal sealed class DuplexStreamingServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerStreamingServerCallHandler.cs b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerStreamingServerCallHandler.cs index 404822f98..da49752c9 100644 --- a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerStreamingServerCallHandler.cs +++ b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/ServerStreamingServerCallHandler.cs @@ -23,7 +23,7 @@ namespace Grpc.AspNetCore.Server.Internal.CallHandlers; -internal class ServerStreamingServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase +internal sealed class ServerStreamingServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/UnaryServerCallHandler.cs b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/UnaryServerCallHandler.cs index 499dc6491..f0d3047cd 100644 --- a/src/Grpc.AspNetCore.Server/Internal/CallHandlers/UnaryServerCallHandler.cs +++ b/src/Grpc.AspNetCore.Server/Internal/CallHandlers/UnaryServerCallHandler.cs @@ -24,7 +24,7 @@ namespace Grpc.AspNetCore.Server.Internal.CallHandlers; -internal class UnaryServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase +internal sealed class UnaryServerCallHandler<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService, TRequest, TResponse> : ServerCallHandlerBase where TRequest : class where TResponse : class where TService : class diff --git a/src/Grpc.AspNetCore.Server/Internal/GrpcMarkerService.cs b/src/Grpc.AspNetCore.Server/Internal/GrpcMarkerService.cs index 0b75f7e7f..635b74ac4 100644 --- a/src/Grpc.AspNetCore.Server/Internal/GrpcMarkerService.cs +++ b/src/Grpc.AspNetCore.Server/Internal/GrpcMarkerService.cs @@ -24,6 +24,6 @@ namespace Grpc.AspNetCore.Server.Internal; /// A marker class used to determine if all the required gRPC services were added /// to the . /// -internal class GrpcMarkerService +internal sealed class GrpcMarkerService { } diff --git a/src/Grpc.AspNetCore.Server/Internal/GrpcServerBuilder.cs b/src/Grpc.AspNetCore.Server/Internal/GrpcServerBuilder.cs index 465c83b05..1704becc7 100644 --- a/src/Grpc.AspNetCore.Server/Internal/GrpcServerBuilder.cs +++ b/src/Grpc.AspNetCore.Server/Internal/GrpcServerBuilder.cs @@ -20,7 +20,7 @@ namespace Grpc.AspNetCore.Server.Internal; -internal class GrpcServerBuilder : IGrpcServerBuilder +internal sealed class GrpcServerBuilder : IGrpcServerBuilder { public IServiceCollection Services { get; } diff --git a/src/Grpc.AspNetCore.Server/Internal/GrpcServiceOptionsSetup.cs b/src/Grpc.AspNetCore.Server/Internal/GrpcServiceOptionsSetup.cs index f2fad234e..f6a9193af 100644 --- a/src/Grpc.AspNetCore.Server/Internal/GrpcServiceOptionsSetup.cs +++ b/src/Grpc.AspNetCore.Server/Internal/GrpcServiceOptionsSetup.cs @@ -22,7 +22,7 @@ namespace Grpc.AspNetCore.Server.Internal; -internal class GrpcServiceOptionsSetup : IConfigureOptions +internal sealed class GrpcServiceOptionsSetup : IConfigureOptions { // Default to no send limit and 4mb receive limit. // Matches the gRPC C impl defaults @@ -45,7 +45,7 @@ public void Configure(GrpcServiceOptions options) } } -internal class GrpcServiceOptionsSetup : IConfigureOptions> where TService : class +internal sealed class GrpcServiceOptionsSetup : IConfigureOptions> where TService : class { private readonly GrpcServiceOptions _options; diff --git a/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamReader.cs b/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamReader.cs index 528aeed87..169a460d5 100644 --- a/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamReader.cs +++ b/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamReader.cs @@ -26,7 +26,7 @@ namespace Grpc.AspNetCore.Server.Internal; [DebuggerDisplay("{DebuggerToString(),nq}")] [DebuggerTypeProxy(typeof(HttpContextStreamReader<>.HttpContextStreamReaderDebugView))] -internal class HttpContextStreamReader : IAsyncStreamReader where TRequest : class +internal sealed class HttpContextStreamReader : IAsyncStreamReader where TRequest : class { private readonly HttpContextServerCallContext _serverCallContext; private readonly Func _deserializer; diff --git a/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamWriter.cs b/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamWriter.cs index 8a96d9fa1..d69b8e7e6 100644 --- a/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamWriter.cs +++ b/src/Grpc.AspNetCore.Server/Internal/HttpContextStreamWriter.cs @@ -26,7 +26,7 @@ namespace Grpc.AspNetCore.Server.Internal; [DebuggerDisplay("{DebuggerToString(),nq}")] [DebuggerTypeProxy(typeof(HttpContextStreamWriter<>.HttpContextStreamWriterDebugView))] -internal class HttpContextStreamWriter : IServerStreamWriter +internal sealed class HttpContextStreamWriter : IServerStreamWriter where TResponse : class { private readonly HttpContextServerCallContext _context; diff --git a/src/Grpc.AspNetCore.Server/Internal/ReadOnlySequenceStream.cs b/src/Grpc.AspNetCore.Server/Internal/ReadOnlySequenceStream.cs index bd196e9f7..36f16774a 100644 --- a/src/Grpc.AspNetCore.Server/Internal/ReadOnlySequenceStream.cs +++ b/src/Grpc.AspNetCore.Server/Internal/ReadOnlySequenceStream.cs @@ -21,7 +21,7 @@ namespace Grpc.AspNetCore.Server.Internal; // Potentially remove in the future when https://github.com/dotnet/corefx/issues/31804 is implemented -internal class ReadOnlySequenceStream : Stream +internal sealed class ReadOnlySequenceStream : Stream { private static readonly Task TaskOfZero = Task.FromResult(0); diff --git a/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs b/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs index 95d545942..7da6ff722 100644 --- a/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs +++ b/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs @@ -31,7 +31,7 @@ namespace Grpc.AspNetCore.Server.Internal; /// /// Creates server call handlers. Provides a place to get services that call handlers will use. /// -internal partial class ServerCallHandlerFactory<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> where TService : class +internal sealed partial class ServerCallHandlerFactory<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> where TService : class { private readonly ILoggerFactory _loggerFactory; private readonly IGrpcServiceActivator _serviceActivator; diff --git a/src/Grpc.AspNetCore.Server/Internal/SystemClock.cs b/src/Grpc.AspNetCore.Server/Internal/SystemClock.cs index cfa40177b..89c4db069 100644 --- a/src/Grpc.AspNetCore.Server/Internal/SystemClock.cs +++ b/src/Grpc.AspNetCore.Server/Internal/SystemClock.cs @@ -18,7 +18,7 @@ namespace Grpc.AspNetCore.Server.Internal; -internal class SystemClock : ISystemClock +internal sealed class SystemClock : ISystemClock { public static readonly SystemClock Instance = new SystemClock(); diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs b/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs index 101ee27e6..537b8a35b 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/BinderServiceModelProvider.cs @@ -24,7 +24,7 @@ namespace Grpc.AspNetCore.Server.Model.Internal; -internal class BinderServiceMethodProvider<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> : IServiceMethodProvider where TService : class +internal sealed class BinderServiceMethodProvider<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> : IServiceMethodProvider where TService : class { private readonly ILogger> _logger; diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/MethodModel.cs b/src/Grpc.AspNetCore.Server/Model/Internal/MethodModel.cs index 3b82d96d2..c030a4cd4 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/MethodModel.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/MethodModel.cs @@ -22,7 +22,7 @@ namespace Grpc.AspNetCore.Server.Model.Internal; -internal class MethodModel +internal sealed class MethodModel { public MethodModel(IMethod method, RoutePattern pattern, IList metadata, RequestDelegate requestDelegate) { diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/ProviderServiceBinder.cs b/src/Grpc.AspNetCore.Server/Model/Internal/ProviderServiceBinder.cs index 84be01989..eeaae23c6 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/ProviderServiceBinder.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/ProviderServiceBinder.cs @@ -24,7 +24,7 @@ namespace Grpc.AspNetCore.Server.Model.Internal; -internal class ProviderServiceBinder<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> : ServiceBinderBase where TService : class +internal sealed class ProviderServiceBinder<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> : ServiceBinderBase where TService : class { private readonly ServiceMethodProviderContext _context; private readonly Type _declaringType; diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceMethodsRegistry.cs b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceMethodsRegistry.cs index 5c2cf7882..0d1df6e45 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceMethodsRegistry.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceMethodsRegistry.cs @@ -21,7 +21,7 @@ namespace Grpc.AspNetCore.Server.Model.Internal; /// /// A registry of all the service methods in the application. /// -internal class ServiceMethodsRegistry +internal sealed class ServiceMethodsRegistry { public List Methods { get; } = new List(); } diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs index dc3613ffa..b30d28a39 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs @@ -27,7 +27,7 @@ namespace Grpc.AspNetCore.Server.Model.Internal; -internal class ServiceRouteBuilder<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> where TService : class +internal sealed class ServiceRouteBuilder<[DynamicallyAccessedMembers(GrpcProtocolConstants.ServiceAccessibility)] TService> where TService : class { private readonly IEnumerable> _serviceMethodProviders; private readonly ServerCallHandlerFactory _serverCallHandlerFactory; diff --git a/src/Grpc.AspNetCore.Web/Internal/Base64PipeReader.cs b/src/Grpc.AspNetCore.Web/Internal/Base64PipeReader.cs index 668adeb88..ff5dabbb1 100644 --- a/src/Grpc.AspNetCore.Web/Internal/Base64PipeReader.cs +++ b/src/Grpc.AspNetCore.Web/Internal/Base64PipeReader.cs @@ -25,7 +25,7 @@ namespace Grpc.AspNetCore.Web.Internal; /// /// Reads and decodes base64 encoded bytes from the inner reader. /// -internal class Base64PipeReader : PipeReader +internal sealed class Base64PipeReader : PipeReader { private readonly PipeReader _inner; private ReadOnlySequence _currentDecodedBuffer; diff --git a/src/Grpc.AspNetCore.Web/Internal/Base64PipeWriter.cs b/src/Grpc.AspNetCore.Web/Internal/Base64PipeWriter.cs index 22185a23b..b50c70d26 100644 --- a/src/Grpc.AspNetCore.Web/Internal/Base64PipeWriter.cs +++ b/src/Grpc.AspNetCore.Web/Internal/Base64PipeWriter.cs @@ -25,7 +25,7 @@ namespace Grpc.AspNetCore.Web.Internal; /// /// Writes bytes as base64 encoded to the inner writer. /// -internal class Base64PipeWriter : PipeWriter +internal sealed class Base64PipeWriter : PipeWriter { private readonly PipeWriter _inner; // We have to write original data to buffer. GetSpan/GetMemory isn't guaranteed to return the @@ -187,4 +187,4 @@ private void WriteRemainder() _remainder = 0; } } -} \ No newline at end of file +} diff --git a/src/Grpc.AspNetCore.Web/Internal/GrpcWebFeature.cs b/src/Grpc.AspNetCore.Web/Internal/GrpcWebFeature.cs index 23738e426..adfda938d 100644 --- a/src/Grpc.AspNetCore.Web/Internal/GrpcWebFeature.cs +++ b/src/Grpc.AspNetCore.Web/Internal/GrpcWebFeature.cs @@ -22,7 +22,7 @@ namespace Grpc.AspNetCore.Web.Internal; -internal class GrpcWebFeature : +internal sealed class GrpcWebFeature : IRequestBodyPipeFeature, IHttpResponseBodyFeature, IHttpResponseTrailersFeature, diff --git a/src/Grpc.AspNetCore.Web/Internal/MemorySegment.cs b/src/Grpc.AspNetCore.Web/Internal/MemorySegment.cs index 7a534f1e3..63b1eedd1 100644 --- a/src/Grpc.AspNetCore.Web/Internal/MemorySegment.cs +++ b/src/Grpc.AspNetCore.Web/Internal/MemorySegment.cs @@ -20,7 +20,7 @@ namespace Grpc.AspNetCore.Web.Internal; -internal class MemorySegment : ReadOnlySequenceSegment +internal sealed class MemorySegment : ReadOnlySequenceSegment { public MemorySegment(ReadOnlyMemory memory) { diff --git a/src/Grpc.Core.Api/CallCredentials.cs b/src/Grpc.Core.Api/CallCredentials.cs index 086ecd8ca..144989d5c 100644 --- a/src/Grpc.Core.Api/CallCredentials.cs +++ b/src/Grpc.Core.Api/CallCredentials.cs @@ -53,7 +53,7 @@ public static CallCredentials FromInterceptor(AsyncAuthInterceptor interceptor) /// public abstract void InternalPopulateConfiguration(CallCredentialsConfiguratorBase configurator, object? state); - private class CompositeCallCredentials : CallCredentials + private sealed class CompositeCallCredentials : CallCredentials { readonly IReadOnlyList credentials; @@ -69,7 +69,7 @@ public override void InternalPopulateConfiguration(CallCredentialsConfiguratorBa } } - private class AsyncAuthInterceptorCredentials : CallCredentials + private sealed class AsyncAuthInterceptorCredentials : CallCredentials { readonly AsyncAuthInterceptor interceptor; diff --git a/src/Grpc.Core.Api/ClientBase.cs b/src/Grpc.Core.Api/ClientBase.cs index 7379959b9..bd01586a0 100644 --- a/src/Grpc.Core.Api/ClientBase.cs +++ b/src/Grpc.Core.Api/ClientBase.cs @@ -175,12 +175,12 @@ public ClientBaseDebugType(ClientBase client) /// /// Represents configuration of ClientBase. The class itself is visible to /// subclasses, but contents are marked as internal to make the instances opaque. - /// The verbose name of this class was chosen to make name clash in generated code + /// The verbose name of this class was chosen to make name clash in generated code /// less likely. /// protected internal class ClientBaseConfiguration { - private class ClientBaseConfigurationInterceptor : Interceptor + private sealed class ClientBaseConfigurationInterceptor : Interceptor { readonly Func interceptor; diff --git a/src/Grpc.Core.Api/Interceptors/CallInvokerExtensions.cs b/src/Grpc.Core.Api/Interceptors/CallInvokerExtensions.cs index 81a27943a..3aedecfa6 100644 --- a/src/Grpc.Core.Api/Interceptors/CallInvokerExtensions.cs +++ b/src/Grpc.Core.Api/Interceptors/CallInvokerExtensions.cs @@ -94,7 +94,7 @@ public static CallInvoker Intercept(this CallInvoker invoker, Func interceptor; diff --git a/src/Grpc.Core.Api/Interceptors/InterceptingCallInvoker.cs b/src/Grpc.Core.Api/Interceptors/InterceptingCallInvoker.cs index d1e39a77d..902a98010 100644 --- a/src/Grpc.Core.Api/Interceptors/InterceptingCallInvoker.cs +++ b/src/Grpc.Core.Api/Interceptors/InterceptingCallInvoker.cs @@ -16,7 +16,6 @@ #endregion -using System; using System.Diagnostics; using Grpc.Core.Utils; @@ -27,7 +26,7 @@ namespace Grpc.Core.Interceptors; /// intercept calls through a given interceptor. /// [DebuggerDisplay("{invoker}")] -internal class InterceptingCallInvoker : CallInvoker +internal sealed class InterceptingCallInvoker : CallInvoker { readonly CallInvoker invoker; readonly Interceptor interceptor; diff --git a/src/Grpc.Core.Api/Internal/UnimplementedCallInvoker.cs b/src/Grpc.Core.Api/Internal/UnimplementedCallInvoker.cs index 7fadcd255..bebf7694d 100644 --- a/src/Grpc.Core.Api/Internal/UnimplementedCallInvoker.cs +++ b/src/Grpc.Core.Api/Internal/UnimplementedCallInvoker.cs @@ -17,16 +17,13 @@ #endregion using System; -using System.Threading.Tasks; -using Grpc.Core; -using Grpc.Core.Utils; namespace Grpc.Core.Internal; /// /// Call invoker that throws NotImplementedException for all requests. /// -internal class UnimplementedCallInvoker : CallInvoker +internal sealed class UnimplementedCallInvoker : CallInvoker { public UnimplementedCallInvoker() { diff --git a/src/Grpc.Net.Client.Web/Internal/Base64RequestStream.cs b/src/Grpc.Net.Client.Web/Internal/Base64RequestStream.cs index cd73c42b5..e9c1c2499 100644 --- a/src/Grpc.Net.Client.Web/Internal/Base64RequestStream.cs +++ b/src/Grpc.Net.Client.Web/Internal/Base64RequestStream.cs @@ -21,7 +21,7 @@ namespace Grpc.Net.Client.Web.Internal; -internal class Base64RequestStream : Stream +internal sealed class Base64RequestStream : Stream { private readonly Stream _inner; private byte[]? _buffer; diff --git a/src/Grpc.Net.Client.Web/Internal/Base64ResponseStream.cs b/src/Grpc.Net.Client.Web/Internal/Base64ResponseStream.cs index ec37ae87a..18bd6eec2 100644 --- a/src/Grpc.Net.Client.Web/Internal/Base64ResponseStream.cs +++ b/src/Grpc.Net.Client.Web/Internal/Base64ResponseStream.cs @@ -22,7 +22,7 @@ namespace Grpc.Net.Client.Web.Internal; -internal class Base64ResponseStream : Stream +internal sealed class Base64ResponseStream : Stream { private readonly Stream _inner; diff --git a/src/Grpc.Net.Client.Web/Internal/GrpcWebRequestContent.cs b/src/Grpc.Net.Client.Web/Internal/GrpcWebRequestContent.cs index 4a9586223..4309bf34c 100644 --- a/src/Grpc.Net.Client.Web/Internal/GrpcWebRequestContent.cs +++ b/src/Grpc.Net.Client.Web/Internal/GrpcWebRequestContent.cs @@ -20,7 +20,7 @@ namespace Grpc.Net.Client.Web.Internal; -internal class GrpcWebRequestContent : HttpContent +internal sealed class GrpcWebRequestContent : HttpContent { private readonly HttpContent _inner; private readonly GrpcWebMode _mode; diff --git a/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseContent.cs b/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseContent.cs index 8df348fe6..f7105942e 100644 --- a/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseContent.cs +++ b/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseContent.cs @@ -21,7 +21,7 @@ namespace Grpc.Net.Client.Web.Internal; -internal class GrpcWebResponseContent : HttpContent +internal sealed class GrpcWebResponseContent : HttpContent { private readonly HttpContent _inner; private readonly GrpcWebMode _mode; diff --git a/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseStream.cs b/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseStream.cs index 3f29028d5..7e2cc7054 100644 --- a/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseStream.cs +++ b/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseStream.cs @@ -29,7 +29,7 @@ namespace Grpc.Net.Client.Web.Internal; /// for trailers. When the trailers message is encountered then they are parsed as HTTP/1.1 trailers and /// added to the HttpResponseMessage.TrailingHeaders. /// -internal class GrpcWebResponseStream : Stream +internal sealed class GrpcWebResponseStream : Stream { private const int HeaderLength = 5; diff --git a/src/Grpc.Net.Client.Web/Internal/OperatingSystem.cs b/src/Grpc.Net.Client.Web/Internal/OperatingSystem.cs index 0c15c19bb..759cdc838 100644 --- a/src/Grpc.Net.Client.Web/Internal/OperatingSystem.cs +++ b/src/Grpc.Net.Client.Web/Internal/OperatingSystem.cs @@ -25,7 +25,7 @@ internal interface IOperatingSystem bool IsBrowser { get; } } -internal class OperatingSystem : IOperatingSystem +internal sealed class OperatingSystem : IOperatingSystem { public static readonly OperatingSystem Instance = new OperatingSystem(); diff --git a/src/Grpc.Net.Client/Balancer/Internal/BalancerAddressEqualityComparer.cs b/src/Grpc.Net.Client/Balancer/Internal/BalancerAddressEqualityComparer.cs index 60c62bf59..5f852a416 100644 --- a/src/Grpc.Net.Client/Balancer/Internal/BalancerAddressEqualityComparer.cs +++ b/src/Grpc.Net.Client/Balancer/Internal/BalancerAddressEqualityComparer.cs @@ -21,7 +21,7 @@ namespace Grpc.Net.Client.Balancer.Internal; -internal class BalancerAddressEqualityComparer : IEqualityComparer +internal sealed class BalancerAddressEqualityComparer : IEqualityComparer { internal static readonly BalancerAddressEqualityComparer Instance = new BalancerAddressEqualityComparer(); diff --git a/src/Grpc.Net.Client/Balancer/Internal/BalancerHttpHandler.cs b/src/Grpc.Net.Client/Balancer/Internal/BalancerHttpHandler.cs index 37bc3c7e9..8b0953e8e 100644 --- a/src/Grpc.Net.Client/Balancer/Internal/BalancerHttpHandler.cs +++ b/src/Grpc.Net.Client/Balancer/Internal/BalancerHttpHandler.cs @@ -17,19 +17,14 @@ #endregion #if SUPPORT_LOAD_BALANCING -using System; using System.Diagnostics; -using System.IO; using System.Net; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; using Grpc.Shared; using Microsoft.Extensions.Logging; namespace Grpc.Net.Client.Balancer.Internal; -internal partial class BalancerHttpHandler : DelegatingHandler +internal sealed partial class BalancerHttpHandler : DelegatingHandler { private static readonly object SetupLock = new object(); @@ -178,7 +173,7 @@ internal static partial class Log public static partial void SendingRequest(ILogger logger, Uri requestUri); [LoggerMessage(Level = LogLevel.Trace, EventId = 2, EventName = "StartingConnectCallback", Message = "Starting connect callback for {Endpoint}.")] - private static partial void StartingConnectCallback(ILogger logger, string endpoint); + private static partial void StartingConnectCallback(ILogger logger, string endpoint); public static void StartingConnectCallback(ILogger logger, DnsEndPoint endpoint) { diff --git a/src/Grpc.Net.Client/Balancer/Internal/ErrorPicker.cs b/src/Grpc.Net.Client/Balancer/Internal/ErrorPicker.cs index b96865943..e9eb4fcf0 100644 --- a/src/Grpc.Net.Client/Balancer/Internal/ErrorPicker.cs +++ b/src/Grpc.Net.Client/Balancer/Internal/ErrorPicker.cs @@ -17,13 +17,12 @@ #endregion #if SUPPORT_LOAD_BALANCING -using System; using System.Diagnostics; using Grpc.Core; namespace Grpc.Net.Client.Balancer.Internal; -internal class ErrorPicker : SubchannelPicker +internal sealed class ErrorPicker : SubchannelPicker { private readonly Status _status; diff --git a/src/Grpc.Net.Client/Balancer/Internal/PassiveSubchannelTransport.cs b/src/Grpc.Net.Client/Balancer/Internal/PassiveSubchannelTransport.cs index a4ea4093c..83217f6c4 100644 --- a/src/Grpc.Net.Client/Balancer/Internal/PassiveSubchannelTransport.cs +++ b/src/Grpc.Net.Client/Balancer/Internal/PassiveSubchannelTransport.cs @@ -17,12 +17,8 @@ #endregion #if SUPPORT_LOAD_BALANCING -using System; using System.Diagnostics; -using System.IO; using System.Net; -using System.Threading; -using System.Threading.Tasks; using Grpc.Core; namespace Grpc.Net.Client.Balancer.Internal; @@ -32,7 +28,7 @@ namespace Grpc.Net.Client.Balancer.Internal; /// This transport will only be used when there is one address. /// It isn't able to correctly determine connectivity state. /// -internal class PassiveSubchannelTransport : ISubchannelTransport, IDisposable +internal sealed class PassiveSubchannelTransport : ISubchannelTransport, IDisposable { private readonly Subchannel _subchannel; private DnsEndPoint? _currentEndPoint; diff --git a/src/Grpc.Net.Client/Balancer/Internal/SocketConnectivitySubchannelTransport.cs b/src/Grpc.Net.Client/Balancer/Internal/SocketConnectivitySubchannelTransport.cs index f1f3ffab3..41656ae64 100644 --- a/src/Grpc.Net.Client/Balancer/Internal/SocketConnectivitySubchannelTransport.cs +++ b/src/Grpc.Net.Client/Balancer/Internal/SocketConnectivitySubchannelTransport.cs @@ -28,7 +28,7 @@ namespace Grpc.Net.Client.Balancer.Internal; /// /// Transport that makes it possible to monitor connectivity state while using HttpClient. -/// +/// /// Features: /// 1. When a connection is requested the transport creates a Socket and connects to the server. /// The socket is used with the first stream created by SocketsHttpHandler.ConnectCallback. @@ -39,7 +39,7 @@ namespace Grpc.Net.Client.Balancer.Internal; /// 2. Transport supports multiple addresses. When connecting it will iterate through the addresses, /// attempting to connect to each one. /// -internal class SocketConnectivitySubchannelTransport : ISubchannelTransport, IDisposable +internal sealed class SocketConnectivitySubchannelTransport : ISubchannelTransport, IDisposable { private const int MaximumInitialSocketDataSize = 1024 * 16; internal static readonly TimeSpan SocketPingInterval = TimeSpan.FromSeconds(5); diff --git a/src/Grpc.Net.Client/Balancer/PickFirstBalancer.cs b/src/Grpc.Net.Client/Balancer/PickFirstBalancer.cs index 88f4cfead..bc1f5ad90 100644 --- a/src/Grpc.Net.Client/Balancer/PickFirstBalancer.cs +++ b/src/Grpc.Net.Client/Balancer/PickFirstBalancer.cs @@ -17,8 +17,6 @@ #endregion #if SUPPORT_LOAD_BALANCING -using System; -using System.Collections.Generic; using Grpc.Core; using Grpc.Net.Client.Balancer.Internal; using Grpc.Net.Client.Configuration; @@ -187,7 +185,7 @@ public override PickResult Pick(PickContext context) } } -internal class RequestConnectionPicker : PickFirstPicker +internal sealed class RequestConnectionPicker : PickFirstPicker { public RequestConnectionPicker(Subchannel subchannel) : base(subchannel) { diff --git a/src/Grpc.Net.Client/Internal/GrpcCallScope.cs b/src/Grpc.Net.Client/Internal/GrpcCallScope.cs index afc3d79c7..abc9b4b02 100644 --- a/src/Grpc.Net.Client/Internal/GrpcCallScope.cs +++ b/src/Grpc.Net.Client/Internal/GrpcCallScope.cs @@ -21,7 +21,7 @@ namespace Grpc.Net.Client.Internal; -internal class GrpcCallScope : IReadOnlyList> +internal sealed class GrpcCallScope : IReadOnlyList> { private const string GrpcMethodTypeKey = "GrpcMethodType"; private const string GrpcUriKey = "GrpcUri"; diff --git a/src/Grpc.Net.Client/Internal/GrpcMethodInfo.cs b/src/Grpc.Net.Client/Internal/GrpcMethodInfo.cs index 5f357730b..fad5e0b18 100644 --- a/src/Grpc.Net.Client/Internal/GrpcMethodInfo.cs +++ b/src/Grpc.Net.Client/Internal/GrpcMethodInfo.cs @@ -24,7 +24,7 @@ namespace Grpc.Net.Client.Internal; /// /// Cached log scope and URI for a gRPC . /// -internal class GrpcMethodInfo +internal sealed class GrpcMethodInfo { public GrpcMethodInfo(GrpcCallScope logScope, Uri callUri, MethodConfig? methodConfig) { @@ -116,13 +116,13 @@ internal static HedgingPolicyInfo CreateHedgingPolicy(HedgingPolicy h) public MethodConfigInfo? MethodConfig { get; } } -internal class MethodConfigInfo +internal sealed class MethodConfigInfo { public RetryPolicyInfo? RetryPolicy { get; set; } public HedgingPolicyInfo? HedgingPolicy { get; set; } } -internal class RetryPolicyInfo +internal sealed class RetryPolicyInfo { public int MaxAttempts { get; init; } public TimeSpan InitialBackoff { get; init; } @@ -131,7 +131,7 @@ internal class RetryPolicyInfo public List RetryableStatusCodes { get; init; } = default!; } -internal class HedgingPolicyInfo +internal sealed class HedgingPolicyInfo { public int MaxAttempts { get; set; } public TimeSpan HedgingDelay { get; set; } diff --git a/src/Grpc.Net.Client/Internal/Http/PushStreamContent.cs b/src/Grpc.Net.Client/Internal/Http/PushStreamContent.cs index 13ae19a3f..2e1e2407d 100644 --- a/src/Grpc.Net.Client/Internal/Http/PushStreamContent.cs +++ b/src/Grpc.Net.Client/Internal/Http/PushStreamContent.cs @@ -20,7 +20,7 @@ namespace Grpc.Net.Client.Internal.Http; -internal class PushStreamContent : HttpContent +internal sealed class PushStreamContent : HttpContent where TRequest : class where TResponse : class { diff --git a/src/Grpc.Net.Client/Internal/Http/PushUnaryContent.cs b/src/Grpc.Net.Client/Internal/Http/PushUnaryContent.cs index c31a72251..a1b232fd5 100644 --- a/src/Grpc.Net.Client/Internal/Http/PushUnaryContent.cs +++ b/src/Grpc.Net.Client/Internal/Http/PushUnaryContent.cs @@ -22,7 +22,7 @@ namespace Grpc.Net.Client.Internal; // TODO: Still need generic args? -internal class PushUnaryContent : HttpContent +internal sealed class PushUnaryContent : HttpContent where TRequest : class where TResponse : class { diff --git a/src/Grpc.Net.Client/Internal/Http/WinHttpUnaryContent.cs b/src/Grpc.Net.Client/Internal/Http/WinHttpUnaryContent.cs index 44e1c374d..39e946a85 100644 --- a/src/Grpc.Net.Client/Internal/Http/WinHttpUnaryContent.cs +++ b/src/Grpc.Net.Client/Internal/Http/WinHttpUnaryContent.cs @@ -27,7 +27,7 @@ namespace Grpc.Net.Client.Internal.Http; /// The payload is then written directly to the request using specialized context /// and serializer method. /// -internal class WinHttpUnaryContent : HttpContent +internal sealed class WinHttpUnaryContent : HttpContent where TRequest : class where TResponse : class { diff --git a/src/Grpc.Net.Client/Internal/HttpContentClientStreamReader.cs b/src/Grpc.Net.Client/Internal/HttpContentClientStreamReader.cs index 7ec3a1534..907604752 100644 --- a/src/Grpc.Net.Client/Internal/HttpContentClientStreamReader.cs +++ b/src/Grpc.Net.Client/Internal/HttpContentClientStreamReader.cs @@ -27,7 +27,7 @@ namespace Grpc.Net.Client.Internal; [DebuggerDisplay("{DebuggerToString(),nq}")] [DebuggerTypeProxy(typeof(HttpContentClientStreamReader<,>.HttpContentClientStreamReaderDebugView))] -internal class HttpContentClientStreamReader : IAsyncStreamReader +internal sealed class HttpContentClientStreamReader : IAsyncStreamReader where TRequest : class where TResponse : class { diff --git a/src/Grpc.Net.Client/Internal/HttpContentClientStreamWriter.cs b/src/Grpc.Net.Client/Internal/HttpContentClientStreamWriter.cs index 028658e18..83666f9ba 100644 --- a/src/Grpc.Net.Client/Internal/HttpContentClientStreamWriter.cs +++ b/src/Grpc.Net.Client/Internal/HttpContentClientStreamWriter.cs @@ -26,7 +26,7 @@ namespace Grpc.Net.Client.Internal; [DebuggerDisplay("{DebuggerToString(),nq}")] [DebuggerTypeProxy(typeof(HttpContentClientStreamWriter<,>.HttpContentClientStreamWriterDebugView))] -internal class HttpContentClientStreamWriter : ClientStreamWriterBase +internal sealed class HttpContentClientStreamWriter : ClientStreamWriterBase where TRequest : class where TResponse : class { diff --git a/src/Grpc.Net.Client/Internal/Retry/ChannelRetryThrottling.cs b/src/Grpc.Net.Client/Internal/Retry/ChannelRetryThrottling.cs index 17c52c84a..874f843eb 100644 --- a/src/Grpc.Net.Client/Internal/Retry/ChannelRetryThrottling.cs +++ b/src/Grpc.Net.Client/Internal/Retry/ChannelRetryThrottling.cs @@ -21,7 +21,7 @@ namespace Grpc.Net.Client.Internal.Retry; -internal partial class ChannelRetryThrottling +internal sealed partial class ChannelRetryThrottling { private readonly object _lock = new object(); private readonly double _tokenRatio; diff --git a/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseClientStreamReader.cs b/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseClientStreamReader.cs index 5c68c18cb..da41c5d82 100644 --- a/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseClientStreamReader.cs +++ b/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseClientStreamReader.cs @@ -24,7 +24,7 @@ namespace Grpc.Net.Client.Internal.Retry; [DebuggerDisplay("{DebuggerToString(),nq}")] [DebuggerTypeProxy(typeof(RetryCallBaseClientStreamReader<,>.RetryCallBaseClientStreamReaderDebugView))] -internal class RetryCallBaseClientStreamReader : IAsyncStreamReader +internal sealed class RetryCallBaseClientStreamReader : IAsyncStreamReader where TRequest : class where TResponse : class { diff --git a/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseClientStreamWriter.cs b/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseClientStreamWriter.cs index 0ceffe746..9d5857df2 100644 --- a/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseClientStreamWriter.cs +++ b/src/Grpc.Net.Client/Internal/Retry/RetryCallBaseClientStreamWriter.cs @@ -24,7 +24,7 @@ namespace Grpc.Net.Client.Internal.Retry; [DebuggerDisplay("{DebuggerToString(),nq}")] [DebuggerTypeProxy(typeof(RetryCallBaseClientStreamWriter<,>.RetryCallBaseClientStreamWriterDebugView))] -internal class RetryCallBaseClientStreamWriter : ClientStreamWriterBase +internal sealed class RetryCallBaseClientStreamWriter : ClientStreamWriterBase where TRequest : class where TResponse : class { diff --git a/src/Shared/Server/InterceptorPipelineBuilder.cs b/src/Shared/Server/InterceptorPipelineBuilder.cs index df1da7297..71e5e9a1d 100644 --- a/src/Shared/Server/InterceptorPipelineBuilder.cs +++ b/src/Shared/Server/InterceptorPipelineBuilder.cs @@ -22,7 +22,7 @@ namespace Grpc.Shared.Server; -internal class InterceptorPipelineBuilder +internal sealed class InterceptorPipelineBuilder where TRequest : class where TResponse : class { @@ -159,4 +159,4 @@ private static GrpcActivatorHandle CreateInterceptor(InterceptorReg return interceptorHandle; } -} \ No newline at end of file +} diff --git a/src/Shared/TrailingHeadersHelpers.cs b/src/Shared/TrailingHeadersHelpers.cs index 024a5b9b9..ce4d29518 100644 --- a/src/Shared/TrailingHeadersHelpers.cs +++ b/src/Shared/TrailingHeadersHelpers.cs @@ -51,7 +51,7 @@ public static void EnsureTrailingHeaders(this HttpResponseMessage responseMessag public static readonly string ResponseTrailersKey = "__ResponseTrailers"; - private class ResponseTrailers : HttpHeaders + private sealed class ResponseTrailers : HttpHeaders { public static readonly ResponseTrailers Empty = new ResponseTrailers(); } diff --git a/src/dotnet-grpc/Commands/AddFileCommand.cs b/src/dotnet-grpc/Commands/AddFileCommand.cs index 35302c143..dd6e79b48 100644 --- a/src/dotnet-grpc/Commands/AddFileCommand.cs +++ b/src/dotnet-grpc/Commands/AddFileCommand.cs @@ -16,17 +16,14 @@ #endregion -using System; using System.CommandLine; -using System.CommandLine.Invocation; using Grpc.Dotnet.Cli.Internal; using Grpc.Dotnet.Cli.Options; using Grpc.Dotnet.Cli.Properties; -using Microsoft.Build.Evaluation; namespace Grpc.Dotnet.Cli.Commands; -internal class AddFileCommand : CommandBase +internal sealed class AddFileCommand : CommandBase { public AddFileCommand(IConsole console, string? projectPath, HttpClient httpClient) : base(console, projectPath, httpClient) { } diff --git a/src/dotnet-grpc/Commands/AddUrlCommand.cs b/src/dotnet-grpc/Commands/AddUrlCommand.cs index fa8a52265..99e9b0ebf 100644 --- a/src/dotnet-grpc/Commands/AddUrlCommand.cs +++ b/src/dotnet-grpc/Commands/AddUrlCommand.cs @@ -17,14 +17,13 @@ #endregion using System.CommandLine; -using System.CommandLine.Invocation; using Grpc.Dotnet.Cli.Internal; using Grpc.Dotnet.Cli.Options; using Grpc.Dotnet.Cli.Properties; namespace Grpc.Dotnet.Cli.Commands; -internal class AddUrlCommand : CommandBase +internal sealed class AddUrlCommand : CommandBase { public AddUrlCommand(IConsole console, string? projectPath, HttpClient httpClient) : base(console, projectPath, httpClient) { } diff --git a/src/dotnet-grpc/Commands/ListCommand.cs b/src/dotnet-grpc/Commands/ListCommand.cs index 158510355..99056aec4 100644 --- a/src/dotnet-grpc/Commands/ListCommand.cs +++ b/src/dotnet-grpc/Commands/ListCommand.cs @@ -17,7 +17,6 @@ #endregion using System.CommandLine; -using System.CommandLine.Invocation; using System.CommandLine.Rendering; using System.CommandLine.Rendering.Views; using Grpc.Dotnet.Cli.Internal; @@ -27,7 +26,7 @@ namespace Grpc.Dotnet.Cli.Commands; -internal class ListCommand : CommandBase +internal sealed class ListCommand : CommandBase { public ListCommand(IConsole console, string? projectPath, HttpClient httpClient) : base(console, projectPath, httpClient) { } diff --git a/src/dotnet-grpc/Commands/RefreshCommand.cs b/src/dotnet-grpc/Commands/RefreshCommand.cs index 2069f1f15..be5522748 100644 --- a/src/dotnet-grpc/Commands/RefreshCommand.cs +++ b/src/dotnet-grpc/Commands/RefreshCommand.cs @@ -17,15 +17,13 @@ #endregion using System.CommandLine; -using System.CommandLine.Invocation; using Grpc.Dotnet.Cli.Internal; using Grpc.Dotnet.Cli.Options; using Grpc.Dotnet.Cli.Properties; -using Microsoft.Build.Evaluation; namespace Grpc.Dotnet.Cli.Commands; -internal class RefreshCommand : CommandBase +internal sealed class RefreshCommand : CommandBase { public RefreshCommand(IConsole console, string? projectPath, HttpClient httpClient) : base(console, projectPath, httpClient) { } diff --git a/src/dotnet-grpc/Commands/RemoveCommand.cs b/src/dotnet-grpc/Commands/RemoveCommand.cs index 1a956b352..3bfc7d11e 100644 --- a/src/dotnet-grpc/Commands/RemoveCommand.cs +++ b/src/dotnet-grpc/Commands/RemoveCommand.cs @@ -16,17 +16,14 @@ #endregion -using System; using System.CommandLine; -using System.CommandLine.Invocation; using Grpc.Dotnet.Cli.Internal; using Grpc.Dotnet.Cli.Options; using Grpc.Dotnet.Cli.Properties; -using Microsoft.Build.Evaluation; namespace Grpc.Dotnet.Cli.Commands; -internal class RemoveCommand : CommandBase +internal sealed class RemoveCommand : CommandBase { public RemoveCommand(IConsole console, string? projectPath, HttpClient httpClient) : base(console, projectPath, httpClient) { } diff --git a/src/dotnet-grpc/Internal/CLIToolException.cs b/src/dotnet-grpc/Internal/CLIToolException.cs index b9dbb71ec..92ac9945d 100644 --- a/src/dotnet-grpc/Internal/CLIToolException.cs +++ b/src/dotnet-grpc/Internal/CLIToolException.cs @@ -19,7 +19,7 @@ namespace Grpc.Dotnet.Cli.Internal; -internal class CLIToolException : Exception +internal sealed class CLIToolException : Exception { public CLIToolException(string message) : base(message) { } } diff --git a/src/dotnet-grpc/Internal/GrpcDependencyAttribute.cs b/src/dotnet-grpc/Internal/GrpcDependencyAttribute.cs index 7b1a69f63..08f0b311b 100644 --- a/src/dotnet-grpc/Internal/GrpcDependencyAttribute.cs +++ b/src/dotnet-grpc/Internal/GrpcDependencyAttribute.cs @@ -20,7 +20,7 @@ namespace Grpc.Dotnet.Cli.Internal; [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] -internal class GrpcDependencyAttribute : Attribute +internal sealed class GrpcDependencyAttribute : Attribute { public GrpcDependencyAttribute(string name, string version, string privateAssets, string applicableServices, string? applicableToWeb = null) { From 42593dde65f9ee483924d58c570353ac87c3f8d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 08:48:20 +0800 Subject: [PATCH 30/48] Bump vue from 2.6.14 to 3.0.0 in /examples/Spar/Server/ClientApp (#2565) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../Spar/Server/ClientApp/package-lock.json | 172 +++++++++++++++--- examples/Spar/Server/ClientApp/package.json | 2 +- 2 files changed, 149 insertions(+), 25 deletions(-) diff --git a/examples/Spar/Server/ClientApp/package-lock.json b/examples/Spar/Server/ClientApp/package-lock.json index fdcf0ae59..7cf245d58 100644 --- a/examples/Spar/Server/ClientApp/package-lock.json +++ b/examples/Spar/Server/ClientApp/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "google-protobuf": "^3.19.4", "grpc-web": "^1.3.1", - "vue": "^2.6.12", + "vue": "^3.0.0", "vue-class-component": "^7.2.6", "vue-hot-reload-api": "^2.3.4", "vue-property-decorator": "^9.1.2" @@ -420,7 +420,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -429,7 +428,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -490,7 +488,6 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1690,7 +1687,6 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -1856,6 +1852,27 @@ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", "dev": true }, + "node_modules/@vue/compiler-core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0.tgz", + "integrity": "sha512-XqPC7vdv4rFE77S71oCHmT1K4Ks3WE2Gi6Lr4B5wn0Idmp+NyQQBUHsCNieMDRiEpgtJrw+yOHslrsV0AfAsfQ==", + "dependencies": { + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "@vue/shared": "3.0.0", + "estree-walker": "^2.0.1", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0.tgz", + "integrity": "sha512-ukDEGOP8P7lCPyStuM3F2iD5w2QPgUu2xwCW2XNeqPjFKIlR2xMsWjy4raI/cLjN6W16GtlMFaZdK8tLj5PRog==", + "dependencies": { + "@vue/compiler-core": "3.0.0", + "@vue/shared": "3.0.0" + } + }, "node_modules/@vue/component-compiler-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", @@ -1875,6 +1892,38 @@ "prettier": "^1.18.2 || ^2.0.0" } }, + "node_modules/@vue/reactivity": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0.tgz", + "integrity": "sha512-mEGkztGQrAPZRhV7C6PorrpT3+NtuA4dY2QjMzzrW31noKhssWTajRZTwpLF39NBRrF5UU6cp9+1I0FfavMgEQ==", + "dependencies": { + "@vue/shared": "3.0.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0.tgz", + "integrity": "sha512-3ABMLeA0ZbeVNLbGGLXr+pNUwqXILOqz8WCVGfDWwQb+jW114Cm8djOHVVDoqdvRETQvDf8yHSUmpKHZpQuTkA==", + "dependencies": { + "@vue/reactivity": "3.0.0", + "@vue/shared": "3.0.0" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0.tgz", + "integrity": "sha512-f312n5w9gK6mVvkDSj6/Xnot1XjlKXzFBYybmoy6ahAVC8ExbQ+LOWti1IZM/adU8VMNdKaw7Q53Hxz3y5jX8g==", + "dependencies": { + "@vue/runtime-core": "3.0.0", + "@vue/shared": "3.0.0", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/shared": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0.tgz", + "integrity": "sha512-4XWL/avABGxU2E2ZF1eZq3Tj7fvksCMssDZUHOykBIMmh5d+KcAnQMC5XHMhtnA0NAvktYsA2YpdsVwVmhWzvA==" + }, "node_modules/abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -3485,6 +3534,11 @@ "cssom": "0.3.x" } }, + "node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -3983,6 +4037,11 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -8161,7 +8220,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8681,7 +8739,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, "engines": { "node": ">=4" } @@ -9208,9 +9265,14 @@ "dev": true }, "node_modules/vue": { - "version": "2.6.14", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz", - "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0.tgz", + "integrity": "sha512-ZMrAARZ32sGIaYKr7Fk2GZEBh/VhulSrGxcGBiAvbN4fhjl3tuJyNFbbbLFqGjndbLoBW66I2ECq8ICdvkKdJw==", + "dependencies": { + "@vue/compiler-dom": "3.0.0", + "@vue/runtime-dom": "3.0.0", + "@vue/shared": "3.0.0" + } }, "node_modules/vue-class-component": { "version": "7.2.6", @@ -9691,14 +9753,12 @@ "@babel/helper-string-parser": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" }, "@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { "version": "7.16.7", @@ -9743,8 +9803,7 @@ "@babel/parser": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -10550,7 +10609,6 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -10685,6 +10743,27 @@ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", "dev": true }, + "@vue/compiler-core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0.tgz", + "integrity": "sha512-XqPC7vdv4rFE77S71oCHmT1K4Ks3WE2Gi6Lr4B5wn0Idmp+NyQQBUHsCNieMDRiEpgtJrw+yOHslrsV0AfAsfQ==", + "requires": { + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "@vue/shared": "3.0.0", + "estree-walker": "^2.0.1", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0.tgz", + "integrity": "sha512-ukDEGOP8P7lCPyStuM3F2iD5w2QPgUu2xwCW2XNeqPjFKIlR2xMsWjy4raI/cLjN6W16GtlMFaZdK8tLj5PRog==", + "requires": { + "@vue/compiler-core": "3.0.0", + "@vue/shared": "3.0.0" + } + }, "@vue/component-compiler-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", @@ -10702,6 +10781,38 @@ "vue-template-es2015-compiler": "^1.9.0" } }, + "@vue/reactivity": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0.tgz", + "integrity": "sha512-mEGkztGQrAPZRhV7C6PorrpT3+NtuA4dY2QjMzzrW31noKhssWTajRZTwpLF39NBRrF5UU6cp9+1I0FfavMgEQ==", + "requires": { + "@vue/shared": "3.0.0" + } + }, + "@vue/runtime-core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0.tgz", + "integrity": "sha512-3ABMLeA0ZbeVNLbGGLXr+pNUwqXILOqz8WCVGfDWwQb+jW114Cm8djOHVVDoqdvRETQvDf8yHSUmpKHZpQuTkA==", + "requires": { + "@vue/reactivity": "3.0.0", + "@vue/shared": "3.0.0" + } + }, + "@vue/runtime-dom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0.tgz", + "integrity": "sha512-f312n5w9gK6mVvkDSj6/Xnot1XjlKXzFBYybmoy6ahAVC8ExbQ+LOWti1IZM/adU8VMNdKaw7Q53Hxz3y5jX8g==", + "requires": { + "@vue/runtime-core": "3.0.0", + "@vue/shared": "3.0.0", + "csstype": "^2.6.8" + } + }, + "@vue/shared": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0.tgz", + "integrity": "sha512-4XWL/avABGxU2E2ZF1eZq3Tj7fvksCMssDZUHOykBIMmh5d+KcAnQMC5XHMhtnA0NAvktYsA2YpdsVwVmhWzvA==" + }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -12046,6 +12157,11 @@ "cssom": "0.3.x" } }, + "csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -12444,6 +12560,11 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -15817,8 +15938,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { "version": "0.5.3", @@ -16233,8 +16353,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", @@ -16673,9 +16792,14 @@ "dev": true }, "vue": { - "version": "2.6.14", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz", - "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0.tgz", + "integrity": "sha512-ZMrAARZ32sGIaYKr7Fk2GZEBh/VhulSrGxcGBiAvbN4fhjl3tuJyNFbbbLFqGjndbLoBW66I2ECq8ICdvkKdJw==", + "requires": { + "@vue/compiler-dom": "3.0.0", + "@vue/runtime-dom": "3.0.0", + "@vue/shared": "3.0.0" + } }, "vue-class-component": { "version": "7.2.6", diff --git a/examples/Spar/Server/ClientApp/package.json b/examples/Spar/Server/ClientApp/package.json index f49dbdd08..8c3e8bd7d 100644 --- a/examples/Spar/Server/ClientApp/package.json +++ b/examples/Spar/Server/ClientApp/package.json @@ -11,7 +11,7 @@ "dependencies": { "google-protobuf": "^3.19.4", "grpc-web": "^1.3.1", - "vue": "^2.6.12", + "vue": "^3.0.0", "vue-class-component": "^7.2.6", "vue-hot-reload-api": "^2.3.4", "vue-property-decorator": "^9.1.2" From be98a74f688282466aaea4460bac63f363b1ce99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 08:48:58 +0800 Subject: [PATCH 31/48] Bump cross-spawn from 7.0.3 to 7.0.6 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2574) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../InteropTestsGrpcWebWebsite/Tests/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json index be28a0d87..dda6f2d74 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json @@ -1647,9 +1647,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", From cacf59d94227f338ac12cbbb47187118277f433d Mon Sep 17 00:00:00 2001 From: subhraOffGit <162678244+subhraOffGit@users.noreply.github.com> Date: Mon, 9 Dec 2024 06:19:13 +0530 Subject: [PATCH 32/48] [vote]Added Active maintainers into MAINTAINERS.md. (#2449) --- MAINTAINERS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 1155b86fc..4454ee7fb 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -15,9 +15,10 @@ for general contribution guidelines. - [BrennanConroy](https://github.com/BrennanConroy), Microsoft Corporation - [davidfowl](https://github.com/davidfowl), Microsoft Corporation - [JamesNK](https://github.com/JamesNK), Microsoft Corporation -- [jtattermusch](https://github.com/jtattermusch), Google LLC - [mgravell](https://github.com/mgravell), Microsoft Corporation - [ReubenBond](https://github.com/ReubenBond), Microsoft Corporation +- [stanley-cheung](https://github.com/stanley-cheung), Google LLC ## Emeritus Maintainers (in alphabetical order) +- [jtattermusch](https://github.com/jtattermusch) - [JunTaoLuo](https://github.com/JunTaoLuo) From 6a3c9774f651b2d5ab0b92a8987732f0a6643b25 Mon Sep 17 00:00:00 2001 From: Dexter Ajoku Date: Mon, 9 Dec 2024 01:54:24 +0100 Subject: [PATCH 33/48] Refactor: Use `await using` for `packageVersionStream` to ensure proper disposal of async resources (#2521) --- src/dotnet-grpc/Commands/CommandBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dotnet-grpc/Commands/CommandBase.cs b/src/dotnet-grpc/Commands/CommandBase.cs index d0a400cfd..ce56115da 100644 --- a/src/dotnet-grpc/Commands/CommandBase.cs +++ b/src/dotnet-grpc/Commands/CommandBase.cs @@ -127,7 +127,7 @@ public async Task EnsureNugetPackagesAsync(Services services) }*/ try { - using var packageVersionStream = await _httpClient.GetStreamAsync(PackageVersionUrl); + await using var packageVersionStream = await _httpClient.GetStreamAsync(PackageVersionUrl); using var packageVersionDocument = await JsonDocument.ParseAsync(packageVersionStream); var packageVersionsElement = packageVersionDocument.RootElement.GetProperty("Packages"); var packageVersionsDictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); From b7af033360155835fede1f042f6e45cc3ce94aa0 Mon Sep 17 00:00:00 2001 From: Henrik Date: Mon, 9 Dec 2024 11:03:21 +0100 Subject: [PATCH 34/48] Performance microoptimizations (#2558) Co-authored-by: James Newton-King --- .../Internal/GrpcProtocolHelpers.cs | 10 ++++------ src/Grpc.AspNetCore.Web/Internal/ServerGrpcWebMode.cs | 2 +- src/Shared/Server/MethodOptions.cs | 5 +---- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Grpc.AspNetCore.Server/Internal/GrpcProtocolHelpers.cs b/src/Grpc.AspNetCore.Server/Internal/GrpcProtocolHelpers.cs index ef5a7b191..9e4e1f7a0 100644 --- a/src/Grpc.AspNetCore.Server/Internal/GrpcProtocolHelpers.cs +++ b/src/Grpc.AspNetCore.Server/Internal/GrpcProtocolHelpers.cs @@ -18,6 +18,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Runtime.InteropServices; using System.Security.Cryptography.X509Certificates; using System.Text; using Grpc.Core; @@ -108,7 +109,7 @@ public static byte[] ParseBinaryHeader(string base64) switch (base64.Length % 4) { case 0: - // base64 has the required padding + // base64 has the required padding decodable = base64; break; case 2: @@ -208,11 +209,8 @@ public static AuthContext CreateAuthContext(X509Certificate2 clientCertificate) static void AddProperty(Dictionary> properties, string name, string value) { - if (!properties.TryGetValue(name, out var values)) - { - values = new List(); - properties[name] = values; - } + ref var values = ref CollectionsMarshal.GetValueRefOrAddDefault(properties, name, out _); + values ??= []; values.Add(AuthProperty.Create(name, Encoding.UTF8.GetBytes(value))); } diff --git a/src/Grpc.AspNetCore.Web/Internal/ServerGrpcWebMode.cs b/src/Grpc.AspNetCore.Web/Internal/ServerGrpcWebMode.cs index 2d7a74938..ce980264d 100644 --- a/src/Grpc.AspNetCore.Web/Internal/ServerGrpcWebMode.cs +++ b/src/Grpc.AspNetCore.Web/Internal/ServerGrpcWebMode.cs @@ -20,7 +20,7 @@ namespace Grpc.AspNetCore.Web.Internal; internal readonly record struct ServerGrpcWebContext(ServerGrpcWebMode Request, ServerGrpcWebMode Response); -internal enum ServerGrpcWebMode +internal enum ServerGrpcWebMode : byte { None, GrpcWeb, diff --git a/src/Shared/Server/MethodOptions.cs b/src/Shared/Server/MethodOptions.cs index 1f0e29c24..f50fc4cd3 100644 --- a/src/Shared/Server/MethodOptions.cs +++ b/src/Shared/Server/MethodOptions.cs @@ -158,10 +158,7 @@ private static void AddCompressionProviders(Dictionary Date: Thu, 12 Dec 2024 10:17:08 +0800 Subject: [PATCH 35/48] Complete health checks watch service on server shutting down (#2582) --- .../GrpcHealthChecksOptions.cs | 18 ++ .../GrpcHealthChecksPublisher.cs | 1 - .../Internal/HealthServiceIntegration.cs | 81 ++++++- src/Grpc.HealthCheck/HealthServiceImpl.cs | 7 + .../HealthChecks/HealthServiceTests.cs | 221 +++++++++++++++++- .../TestHostApplicationLifetime.cs | 37 +++ 6 files changed, 359 insertions(+), 6 deletions(-) create mode 100644 test/Grpc.AspNetCore.Server.Tests/TestObjects/TestHostApplicationLifetime.cs diff --git a/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksOptions.cs b/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksOptions.cs index 84bfe3d91..4390eba2e 100644 --- a/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksOptions.cs +++ b/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksOptions.cs @@ -17,6 +17,7 @@ #endregion using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Hosting; namespace Grpc.AspNetCore.HealthChecks; @@ -39,4 +40,21 @@ public sealed class GrpcHealthChecksOptions /// published by are returned. /// public bool UseHealthChecksCache { get; set; } + + /// + /// Gets or sets a value indicating whether to suppress completing Watch health check calls when the application begins shutting down. + /// The default value is false. + /// + /// + /// + /// When false, health checks Watch calls are completed with a status of NotServing when the server application begins shutting down. + /// Shutdown is indicated by the token being raised and causes Watch to complete. + /// When true, health checks Watch calls are left running. Running calls will be eventually be forcefully aborted when the server finishes shutting down. + /// + /// + /// Completing the Watch call allows the server to gracefully exit. If Watch calls aren't shutdown then the server runs until + /// is exceeded and the server forcefully aborts remaining active requests. + /// + /// + public bool SuppressCompletionOnShutdown { get; set; } } diff --git a/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksPublisher.cs b/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksPublisher.cs index 7fee5bfe5..24b23031e 100644 --- a/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksPublisher.cs +++ b/src/Grpc.AspNetCore.HealthChecks/GrpcHealthChecksPublisher.cs @@ -16,7 +16,6 @@ #endregion -using System.Linq; using Grpc.Health.V1; using Grpc.HealthCheck; using Microsoft.Extensions.Diagnostics.HealthChecks; diff --git a/src/Grpc.AspNetCore.HealthChecks/Internal/HealthServiceIntegration.cs b/src/Grpc.AspNetCore.HealthChecks/Internal/HealthServiceIntegration.cs index fbe185e48..710dccd4b 100644 --- a/src/Grpc.AspNetCore.HealthChecks/Internal/HealthServiceIntegration.cs +++ b/src/Grpc.AspNetCore.HealthChecks/Internal/HealthServiceIntegration.cs @@ -22,6 +22,7 @@ using Grpc.HealthCheck; using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; namespace Grpc.AspNetCore.HealthChecks.Internal; @@ -32,17 +33,20 @@ internal sealed class HealthServiceIntegration : Grpc.Health.V1.Health.HealthBas private readonly GrpcHealthChecksOptions _grpcHealthCheckOptions; private readonly HealthServiceImpl _healthServiceImpl; private readonly HealthCheckService _healthCheckService; + private readonly IHostApplicationLifetime _applicationLifetime; public HealthServiceIntegration( HealthServiceImpl healthServiceImpl, IOptions healthCheckOptions, IOptions grpcHealthCheckOptions, - HealthCheckService healthCheckService) + HealthCheckService healthCheckService, + IHostApplicationLifetime applicationLifetime) { _healthCheckOptions = healthCheckOptions.Value; _grpcHealthCheckOptions = grpcHealthCheckOptions.Value; _healthServiceImpl = healthServiceImpl; _healthCheckService = healthCheckService; + _applicationLifetime = applicationLifetime; } public override Task Check(HealthCheckRequest request, ServerCallContext context) @@ -57,15 +61,84 @@ public override Task Check(HealthCheckRequest request, Serv } } - public override Task Watch(HealthCheckRequest request, IServerStreamWriter responseStream, ServerCallContext context) + public override async Task Watch(HealthCheckRequest request, IServerStreamWriter responseStream, ServerCallContext context) { + ServerCallContext resolvedContext; + IServerStreamWriter resolvedResponseStream; + + if (!_grpcHealthCheckOptions.SuppressCompletionOnShutdown) + { + // Create a linked token source to cancel the request if the application is stopping. + // This is required because the server won't shut down gracefully if the request is still open. + // The context needs to be wrapped because HealthServiceImpl is in an assembly that can't reference IHostApplicationLifetime. + var cts = CancellationTokenSource.CreateLinkedTokenSource(context.CancellationToken, _applicationLifetime.ApplicationStopping); + resolvedContext = new WrappedServerCallContext(context, cts); + } + else + { + resolvedContext = context; + } + if (!_grpcHealthCheckOptions.UseHealthChecksCache) { // Stream writer replaces first health checks results from the cache with newly calculated health check results. - responseStream = new WatchServerStreamWriter(this, request, responseStream, context.CancellationToken); + resolvedResponseStream = new WatchServerStreamWriter(this, request, responseStream, context.CancellationToken); + } + else + { + resolvedResponseStream = responseStream; + } + + await _healthServiceImpl.Watch(request, resolvedResponseStream, resolvedContext); + + // If the request is not canceled and the application is stopping then return NotServing before finishing. + if (!context.CancellationToken.IsCancellationRequested && _applicationLifetime.ApplicationStopping.IsCancellationRequested) + { + await responseStream.WriteAsync(new HealthCheckResponse { Status = HealthCheckResponse.Types.ServingStatus.NotServing }); } + } - return _healthServiceImpl.Watch(request, responseStream, context); + private sealed class WrappedServerCallContext : ServerCallContext + { + private readonly ServerCallContext _serverCallContext; + private readonly CancellationTokenSource _cancellationTokenSource; + + public WrappedServerCallContext(ServerCallContext serverCallContext, CancellationTokenSource cancellationTokenSource) + { + _serverCallContext = serverCallContext; + _cancellationTokenSource = cancellationTokenSource; + } + + protected override string MethodCore => _serverCallContext.Method; + protected override string HostCore => _serverCallContext.Host; + protected override string PeerCore => _serverCallContext.Peer; + protected override DateTime DeadlineCore => _serverCallContext.Deadline; + protected override Metadata RequestHeadersCore => _serverCallContext.RequestHeaders; + protected override CancellationToken CancellationTokenCore => _cancellationTokenSource.Token; + protected override Metadata ResponseTrailersCore => _serverCallContext.ResponseTrailers; + protected override Status StatusCore + { + get => _serverCallContext.Status; + set => _serverCallContext.Status = value; + } + protected override WriteOptions? WriteOptionsCore + { + get => _serverCallContext.WriteOptions; + set => _serverCallContext.WriteOptions = value; + } + protected override AuthContext AuthContextCore => _serverCallContext.AuthContext; + + protected override IDictionary UserStateCore => _serverCallContext.UserState; + + protected override ContextPropagationToken CreatePropagationTokenCore(ContextPropagationOptions? options) + { + return _serverCallContext.CreatePropagationToken(options); + } + + protected override Task WriteResponseHeadersAsyncCore(Metadata responseHeaders) + { + return _serverCallContext.WriteResponseHeadersAsync(responseHeaders); + } } private async Task GetHealthCheckResponseAsync(string service, bool throwOnNotFound, CancellationToken cancellationToken) diff --git a/src/Grpc.HealthCheck/HealthServiceImpl.cs b/src/Grpc.HealthCheck/HealthServiceImpl.cs index 80003ee68..4dc6bf84c 100644 --- a/src/Grpc.HealthCheck/HealthServiceImpl.cs +++ b/src/Grpc.HealthCheck/HealthServiceImpl.cs @@ -141,6 +141,13 @@ public override Task Check(HealthCheckRequest request, Serv /// A task indicating completion of the handler. public override async Task Watch(HealthCheckRequest request, IServerStreamWriter responseStream, ServerCallContext context) { + // The call has already been canceled. Writing to the response will fail so immediately exit. + // In the real world this situation is unlikely to happen as the server would have prevented a canceled call from making it this far. + if (context.CancellationToken.IsCancellationRequested) + { + return; + } + string service = request.Service; // Channel is used to to marshall multiple callers updating status into a single queue. diff --git a/test/Grpc.AspNetCore.Server.Tests/HealthChecks/HealthServiceTests.cs b/test/Grpc.AspNetCore.Server.Tests/HealthChecks/HealthServiceTests.cs index 649981b66..9eac43567 100644 --- a/test/Grpc.AspNetCore.Server.Tests/HealthChecks/HealthServiceTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/HealthChecks/HealthServiceTests.cs @@ -20,6 +20,7 @@ using Grpc.AspNetCore.HealthChecks; using Grpc.AspNetCore.HealthChecks.Internal; using Grpc.AspNetCore.Server.Tests.Infrastructure; +using Grpc.AspNetCore.Server.Tests.TestObjects; using Grpc.Core; using Grpc.Health.V1; using Grpc.HealthCheck; @@ -63,6 +64,8 @@ public async Task HealthService_Watch_UsePublishedChecks_WriteResults() o.Delay = TimeSpan.FromSeconds(1); o.Period = TimeSpan.FromSeconds(1); }); + var lifetime = new TestHostApplicationLifetime(); + services.AddSingleton(lifetime); var serviceProvider = services.BuildServiceProvider(); @@ -133,6 +136,8 @@ public async Task HealthService_Watch_RunChecks_WriteResults() o.Delay = TimeSpan.FromSeconds(1); o.Period = TimeSpan.FromSeconds(1); }); + var lifetime = new TestHostApplicationLifetime(); + services.AddSingleton(lifetime); var serviceProvider = services.BuildServiceProvider(); @@ -206,6 +211,8 @@ public async Task HealthService_Watch_RunChecks_Log() o.Delay = TimeSpan.FromSeconds(1); o.Period = TimeSpan.FromSeconds(1); }); + var lifetime = new TestHostApplicationLifetime(); + services.AddSingleton(lifetime); var serviceProvider = services.BuildServiceProvider(); @@ -260,6 +267,210 @@ public async Task HealthService_Watch_RunChecks_Log() Assert.AreEqual("Service '' status updated to NotServing. 1 health report entries evaluated.", serviceMappingStatusUpdated.Message); } + [Test] + public async Task HealthService_Watch_ServerShutdownDuringCall_WatchCompleted() + { + // Arrange + var testSink = new TestSink(); + var testProvider = new TestLoggerProvider(testSink); + + var healthCheckResult = new HealthCheckResult(HealthStatus.Healthy); + + var services = new ServiceCollection(); + services.AddLogging(o => o.AddProvider(testProvider).SetMinimumLevel(LogLevel.Debug)); + services.AddNUnitLogger(); + services.AddGrpcHealthChecks().AddAsyncCheck( + "", + () => Task.FromResult(healthCheckResult), new string[] { "sample" }); + services.Configure(o => + { + o.Delay = TimeSpan.FromSeconds(1); + o.Period = TimeSpan.FromSeconds(1); + }); + var lifetime = new TestHostApplicationLifetime(); + services.AddSingleton(lifetime); + + var serviceProvider = services.BuildServiceProvider(); + + var healthService = CreateService(serviceProvider); + var hostedService = serviceProvider.GetServices().Single(); + + HealthCheckResponse? response = null; + var syncPoint = new SyncPoint(runContinuationsAsynchronously: true); + var testServerStreamWriter = new TestServerStreamWriter(); + testServerStreamWriter.OnWriteAsync = async message => + { + response = message; + await syncPoint.WaitToContinue(); + }; + + var cts = new CancellationTokenSource(); + var callTask = healthService.Watch( + new HealthCheckRequest(), + testServerStreamWriter, + new TestServerCallContext(DateTime.MaxValue, cts.Token)); + + // Act + await hostedService.StartAsync(CancellationToken.None); + + // Assert + try + { + await syncPoint.WaitForSyncPoint().DefaultTimeout(); + Assert.AreEqual(HealthCheckResponse.Types.ServingStatus.Serving, response!.Status); + syncPoint.Continue(); + + syncPoint = new SyncPoint(runContinuationsAsynchronously: true); + lifetime.StopApplication(); + await syncPoint.WaitForSyncPoint().DefaultTimeout(); + Assert.AreEqual(HealthCheckResponse.Types.ServingStatus.NotServing, response!.Status); + syncPoint.Continue(); + + await callTask.DefaultTimeout(); + } + finally + { + await hostedService.StopAsync(CancellationToken.None); + } + } + + [Test] + public async Task HealthService_Watch_ServerShutdownBeforeCall_WatchCompleted() + { + // Arrange + var testSink = new TestSink(); + var testProvider = new TestLoggerProvider(testSink); + + var healthCheckResult = new HealthCheckResult(HealthStatus.Healthy); + + var services = new ServiceCollection(); + services.AddLogging(o => o.AddProvider(testProvider).SetMinimumLevel(LogLevel.Debug)); + services.AddNUnitLogger(); + services.AddGrpcHealthChecks().AddAsyncCheck( + "", + () => Task.FromResult(healthCheckResult), new string[] { "sample" }); + services.Configure(o => + { + o.Delay = TimeSpan.FromSeconds(1); + o.Period = TimeSpan.FromSeconds(1); + }); + var lifetime = new TestHostApplicationLifetime(); + services.AddSingleton(lifetime); + + var serviceProvider = services.BuildServiceProvider(); + + var healthService = CreateService(serviceProvider); + var hostedService = serviceProvider.GetServices().Single(); + + HealthCheckResponse? response = null; + var syncPoint = new SyncPoint(runContinuationsAsynchronously: true); + var testServerStreamWriter = new TestServerStreamWriter(); + testServerStreamWriter.OnWriteAsync = async message => + { + response = message; + await syncPoint.WaitToContinue(); + }; + + lifetime.StopApplication(); + + var cts = new CancellationTokenSource(); + var callTask = healthService.Watch( + new HealthCheckRequest(), + testServerStreamWriter, + new TestServerCallContext(DateTime.MaxValue, cts.Token)); + + // Act + await hostedService.StartAsync(CancellationToken.None); + + // Assert + try + { + await syncPoint.WaitForSyncPoint().DefaultTimeout(); + Assert.AreEqual(HealthCheckResponse.Types.ServingStatus.NotServing, response!.Status); + syncPoint.Continue(); + + await callTask.DefaultTimeout(); + } + finally + { + await hostedService.StopAsync(CancellationToken.None); + } + } + + [Test] + public async Task HealthService_Watch_ServerShutdown_SuppressCompletion_WatchNotCompleted() + { + // Arrange + var testSink = new TestSink(); + var testProvider = new TestLoggerProvider(testSink); + + var healthCheckResult = new HealthCheckResult(HealthStatus.Healthy); + + var services = new ServiceCollection(); + services.AddLogging(o => o.AddProvider(testProvider).SetMinimumLevel(LogLevel.Debug)); + services.AddNUnitLogger(); + services.AddGrpcHealthChecks(o => o.SuppressCompletionOnShutdown = true).AddAsyncCheck( + "", + () => Task.FromResult(healthCheckResult), new string[] { "sample" }); + services.Configure(o => + { + o.Delay = TimeSpan.FromSeconds(1); + o.Period = TimeSpan.FromSeconds(1); + }); + var lifetime = new TestHostApplicationLifetime(); + services.AddSingleton(lifetime); + + var serviceProvider = services.BuildServiceProvider(); + + var healthService = CreateService(serviceProvider); + var hostedService = serviceProvider.GetServices().Single(); + + HealthCheckResponse? response = null; + var syncPoint = new SyncPoint(runContinuationsAsynchronously: true); + var testServerStreamWriter = new TestServerStreamWriter(); + testServerStreamWriter.OnWriteAsync = async message => + { + response = message; + await syncPoint.WaitToContinue(); + }; + + var cts = new CancellationTokenSource(); + var callTask = healthService.Watch( + new HealthCheckRequest(), + testServerStreamWriter, + new TestServerCallContext(DateTime.MaxValue, cts.Token)); + + // Act + await hostedService.StartAsync(CancellationToken.None); + + // Assert + try + { + await syncPoint.WaitForSyncPoint().DefaultTimeout(); + Assert.AreEqual(HealthCheckResponse.Types.ServingStatus.Serving, response!.Status); + syncPoint.Continue(); + + syncPoint = new SyncPoint(runContinuationsAsynchronously: true); + lifetime.StopApplication(); + + // Wait a second to double check that watch doesn't complete. + var waitForSyncPointTask = syncPoint.WaitForSyncPoint(); + var timeoutTask = Task.Delay(TimeSpan.FromSeconds(0.5)); + if (await Task.WhenAny(callTask, waitForSyncPointTask, timeoutTask) != timeoutTask) + { + Assert.Fail("Expected watch to not complete."); + } + + cts.Cancel(); + + await callTask.DefaultTimeout(); + } + finally + { + await hostedService.StopAsync(CancellationToken.None); + } + } + private class TestHealthCheckPublisher : IHealthCheckPublisher { public Func? OnHealthReport { get; set; } @@ -279,7 +490,8 @@ private static HealthServiceIntegration CreateService(IServiceProvider servicePr serviceProvider.GetRequiredService(), serviceProvider.GetRequiredService>(), serviceProvider.GetRequiredService>(), - serviceProvider.GetRequiredService()); + serviceProvider.GetRequiredService(), + serviceProvider.GetRequiredService()); } [Test] @@ -300,6 +512,9 @@ public async Task HealthService_CheckWithFilter_RunChecks_FilteredResultsExclude .AddAsyncCheck("default", () => RunHealthCheck(healthCheckStatus, "")) .AddAsyncCheck("filtered", () => RunHealthCheck(healthCheckStatus, "filtered"), new string[] { "exclude" }); + var lifetime = new TestHostApplicationLifetime(); + services.AddSingleton(lifetime); + var serviceProvider = services.BuildServiceProvider(); var healthService = CreateService(serviceProvider); @@ -384,6 +599,8 @@ public async Task HealthService_CheckWithFilter_UsePublishedChecks_FilteredResul o.Delay = TimeSpan.FromSeconds(1); o.Period = TimeSpan.FromSeconds(1); }); + var lifetime = new TestHostApplicationLifetime(); + services.AddSingleton(lifetime); HealthReport? report = null; var syncPoint = new SyncPoint(runContinuationsAsynchronously: true); @@ -458,6 +675,8 @@ public async Task HealthService_RemoveDefault_DefaultNotFound() o.Delay = TimeSpan.FromSeconds(1); o.Period = TimeSpan.FromSeconds(1); }); + var lifetime = new TestHostApplicationLifetime(); + services.AddSingleton(lifetime); HealthReport? report = null; var syncPoint = new SyncPoint(runContinuationsAsynchronously: true); diff --git a/test/Grpc.AspNetCore.Server.Tests/TestObjects/TestHostApplicationLifetime.cs b/test/Grpc.AspNetCore.Server.Tests/TestObjects/TestHostApplicationLifetime.cs new file mode 100644 index 000000000..bc2a90c7e --- /dev/null +++ b/test/Grpc.AspNetCore.Server.Tests/TestObjects/TestHostApplicationLifetime.cs @@ -0,0 +1,37 @@ +#region Copyright notice and license + +// Copyright 2019 The gRPC Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.Hosting; + +namespace Grpc.AspNetCore.Server.Tests.TestObjects; + +public class TestHostApplicationLifetime : IHostApplicationLifetime +{ + private readonly CancellationTokenSource _cts = new(); + + public CancellationToken ApplicationStarted => _cts.Token; + public CancellationToken ApplicationStopped => _cts.Token; + public CancellationToken ApplicationStopping => _cts.Token; + + public void StopApplication() + { + _cts.Cancel(); + } +} From a2f7d06e02ae710143ff820ca14911bb9c8906e7 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Wed, 19 Feb 2025 07:17:50 +0800 Subject: [PATCH 36/48] Avoid using ConcurrentDictionary for channels with few methods (#2597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Günther Foidl --- .github/workflows/test.yml | 4 +- src/Grpc.Net.Client/GrpcChannel.cs | 5 +- .../Internal/ThreadSafeLookup.cs | 104 ++++++++++++++++++ .../ThreadSafeLookupTests.cs | 69 ++++++++++++ 4 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 src/Grpc.Net.Client/Internal/ThreadSafeLookup.cs create mode 100644 test/Grpc.Net.Client.Tests/ThreadSafeLookupTests.cs diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8dace7b8f..b9e727bb2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: build: name: Basic Tests - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Check out code @@ -36,7 +36,7 @@ jobs: grpc_web: name: gRPC-Web Tests - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Check out code diff --git a/src/Grpc.Net.Client/GrpcChannel.cs b/src/Grpc.Net.Client/GrpcChannel.cs index 05e170e04..1ee1d41a6 100644 --- a/src/Grpc.Net.Client/GrpcChannel.cs +++ b/src/Grpc.Net.Client/GrpcChannel.cs @@ -16,7 +16,6 @@ #endregion -using System.Collections.Concurrent; using System.Diagnostics; using Grpc.Core; #if SUPPORT_LOAD_BALANCING @@ -51,7 +50,7 @@ public sealed partial class GrpcChannel : ChannelBase, IDisposable internal const long DefaultMaxRetryBufferPerCallSize = 1024 * 1024; // 1 MB private readonly object _lock; - private readonly ConcurrentDictionary _methodInfoCache; + private readonly ThreadSafeLookup _methodInfoCache; private readonly Func _createMethodInfoFunc; private readonly Dictionary? _serviceConfigMethods; private readonly bool _isSecure; @@ -109,7 +108,7 @@ public sealed partial class GrpcChannel : ChannelBase, IDisposable internal GrpcChannel(Uri address, GrpcChannelOptions channelOptions) : base(address.Authority) { _lock = new object(); - _methodInfoCache = new ConcurrentDictionary(); + _methodInfoCache = new ThreadSafeLookup(); // Dispose the HTTP client/handler if... // 1. No client/handler was specified and so the channel created the client itself diff --git a/src/Grpc.Net.Client/Internal/ThreadSafeLookup.cs b/src/Grpc.Net.Client/Internal/ThreadSafeLookup.cs new file mode 100644 index 000000000..b7a37b8d1 --- /dev/null +++ b/src/Grpc.Net.Client/Internal/ThreadSafeLookup.cs @@ -0,0 +1,104 @@ +#region Copyright notice and license + +// Copyright 2019 The gRPC Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion + +using System.Collections.Concurrent; + +internal sealed class ThreadSafeLookup where TKey : notnull +{ + // Avoid allocating ConcurrentDictionary until the threshold is reached. + // Looking up a key in an array is as fast as a dictionary for small collections and uses much less memory. + internal const int Threshold = 10; + + private KeyValuePair[] _array = Array.Empty>(); + private ConcurrentDictionary? _dictionary; + + /// + /// Gets the value for the key if it exists. If the key does not exist then the value is created using the valueFactory. + /// The value is created outside of a lock and there is no guarentee which value will be stored or returned. + /// + public TValue GetOrAdd(TKey key, Func valueFactory) + { + if (_dictionary != null) + { + return _dictionary.GetOrAdd(key, valueFactory); + } + + if (TryGetValue(_array, key, out var value)) + { + return value; + } + + var newValue = valueFactory(key); + + lock (this) + { + if (_dictionary != null) + { + _dictionary.TryAdd(key, newValue); + } + else + { + // Double check inside lock if the key was added to the array by another thread. + if (TryGetValue(_array, key, out value)) + { + return value; + } + + if (_array.Length > Threshold - 1) + { + // Array length exceeds threshold so switch to dictionary. + var newDict = new ConcurrentDictionary(); + foreach (var kvp in _array) + { + newDict.TryAdd(kvp.Key, kvp.Value); + } + newDict.TryAdd(key, newValue); + + _dictionary = newDict; + _array = Array.Empty>(); + } + else + { + // Add new value by creating a new array with old plus new value. + var newArray = new KeyValuePair[_array.Length + 1]; + Array.Copy(_array, newArray, _array.Length); + newArray[newArray.Length - 1] = new KeyValuePair(key, newValue); + + _array = newArray; + } + } + } + + return newValue; + } + + private static bool TryGetValue(KeyValuePair[] array, TKey key, out TValue value) + { + foreach (var kvp in array) + { + if (EqualityComparer.Default.Equals(kvp.Key, key)) + { + value = kvp.Value; + return true; + } + } + + value = default!; + return false; + } +} diff --git a/test/Grpc.Net.Client.Tests/ThreadSafeLookupTests.cs b/test/Grpc.Net.Client.Tests/ThreadSafeLookupTests.cs new file mode 100644 index 000000000..57d073c61 --- /dev/null +++ b/test/Grpc.Net.Client.Tests/ThreadSafeLookupTests.cs @@ -0,0 +1,69 @@ +#region Copyright notice and license + +// Copyright 2019 The gRPC Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion + +namespace Grpc.Net.Client.Tests; + +[TestFixture] +public class ThreadSafeLookupTests +{ + [Test] + public void GetOrAdd_ReturnsCorrectValueForNewKey() + { + var lookup = new ThreadSafeLookup(); + var result = lookup.GetOrAdd(1, k => "Value-1"); + + Assert.AreEqual("Value-1", result); + } + + [Test] + public void GetOrAdd_ReturnsExistingValueForExistingKey() + { + var lookup = new ThreadSafeLookup(); + lookup.GetOrAdd(1, k => "InitialValue"); + var result = lookup.GetOrAdd(1, k => "NewValue"); + + Assert.AreEqual("InitialValue", result); + } + + [Test] + public void GetOrAdd_SwitchesToDictionaryAfterThreshold() + { + var addCount = (ThreadSafeLookup.Threshold * 2); + var lookup = new ThreadSafeLookup(); + + for (var i = 0; i <= addCount; i++) + { + lookup.GetOrAdd(i, k => $"Value-{k}"); + } + + var result = lookup.GetOrAdd(addCount, k => $"NewValue-{addCount}"); + + Assert.AreEqual($"Value-{addCount}", result); + } + + [Test] + public void GetOrAdd_HandlesConcurrentAccess() + { + var lookup = new ThreadSafeLookup(); + Parallel.For(0, 1000, i => + { + var value = lookup.GetOrAdd(i, k => $"Value-{k}"); + Assert.AreEqual($"Value-{i}", value); + }); + } +} From 60d9d2ce15c117ed9eaed6e2737bb635728c5c04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 07:28:54 +0800 Subject: [PATCH 37/48] Bump elliptic from 6.6.0 to 6.6.1 in /examples/Spar/Server/ClientApp (#2599) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/Spar/Server/ClientApp/package-lock.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/Spar/Server/ClientApp/package-lock.json b/examples/Spar/Server/ClientApp/package-lock.json index 7cf245d58..b80027769 100644 --- a/examples/Spar/Server/ClientApp/package-lock.json +++ b/examples/Spar/Server/ClientApp/package-lock.json @@ -3837,10 +3837,11 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -12413,9 +12414,9 @@ "dev": true }, "elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, "requires": { "bn.js": "^4.11.9", From 852a118c7b97afc23fae45166b2fa2bd6943c468 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 25 Feb 2025 08:19:30 +0800 Subject: [PATCH 38/48] Move updating connectivity state outside of subchannel lock (#2601) --- src/Grpc.Net.Client/Balancer/Subchannel.cs | 13 ++- .../Balancer/ConnectionManagerTests.cs | 85 +++++++++++++++++++ 2 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/Grpc.Net.Client/Balancer/Subchannel.cs b/src/Grpc.Net.Client/Balancer/Subchannel.cs index db0a2ee42..d80d5adeb 100644 --- a/src/Grpc.Net.Client/Balancer/Subchannel.cs +++ b/src/Grpc.Net.Client/Balancer/Subchannel.cs @@ -237,6 +237,7 @@ public void UpdateAddresses(IReadOnlyList addresses) /// public void RequestConnection() { + var connectionRequested = false; lock (Lock) { switch (_state) @@ -245,7 +246,8 @@ public void RequestConnection() SubchannelLog.ConnectionRequested(_logger, Id); // Only start connecting underlying transport if in an idle state. - UpdateConnectivityState(ConnectivityState.Connecting, "Connection requested."); + // Update connectivity state outside of subchannel lock to avoid deadlock. + connectionRequested = true; break; case ConnectivityState.Connecting: case ConnectivityState.Ready: @@ -264,6 +266,11 @@ public void RequestConnection() } } + if (connectionRequested) + { + UpdateConnectivityState(ConnectivityState.Connecting, "Connection requested."); + } + // Don't capture the current ExecutionContext and its AsyncLocals onto the connect var restoreFlow = false; if (!ExecutionContext.IsFlowSuppressed()) @@ -448,6 +455,8 @@ internal bool UpdateConnectivityState(ConnectivityState state, string successDet internal bool UpdateConnectivityState(ConnectivityState state, Status status) { + Debug.Assert(!Monitor.IsEntered(Lock), "Ensure the subchannel lock isn't held here. Updating channel state with the subchannel lock can cause a deadlock."); + lock (Lock) { // Don't update subchannel state if the state is the same or the subchannel has been shutdown. @@ -462,7 +471,7 @@ internal bool UpdateConnectivityState(ConnectivityState state, Status status) } _state = state; } - + // Notify channel outside of lock to avoid deadlocks. _manager.OnSubchannelStateChange(this, state, status); return true; diff --git a/test/Grpc.Net.Client.Tests/Balancer/ConnectionManagerTests.cs b/test/Grpc.Net.Client.Tests/Balancer/ConnectionManagerTests.cs index 743639886..7a5221728 100644 --- a/test/Grpc.Net.Client.Tests/Balancer/ConnectionManagerTests.cs +++ b/test/Grpc.Net.Client.Tests/Balancer/ConnectionManagerTests.cs @@ -17,6 +17,7 @@ #endregion #if SUPPORT_LOAD_BALANCING +using System.Diagnostics; using System.Net; using System.Threading.Channels; using Greet; @@ -29,6 +30,7 @@ using Grpc.Tests.Shared; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Testing; using NUnit.Framework; using ChannelState = Grpc.Net.Client.Balancer.ChannelState; @@ -535,6 +537,89 @@ public async Task PickAsync_DoesNotDeadlockAfterReconnect_WithZeroAddressResolve await pickTask.DefaultTimeout(); } + [Test] + public async Task PickAsync_UpdateAddressesWhileRequestingConnection_DoesNotDeadlock() + { + var services = new ServiceCollection(); + services.AddNUnitLogger(); + + var testSink = new TestSink(); + var testProvider = new TestLoggerProvider(testSink); + + services.AddLogging(b => + { + b.AddProvider(testProvider); + }); + + await using var serviceProvider = services.BuildServiceProvider(); + var loggerFactory = serviceProvider.GetRequiredService(); + + var resolver = new TestResolver(loggerFactory); + resolver.UpdateAddresses(new List + { + new BalancerAddress("localhost", 80) + }); + + var channelOptions = new GrpcChannelOptions(); + + var transportFactory = new TestSubchannelTransportFactory(); + var clientChannel = CreateConnectionManager(loggerFactory, resolver, transportFactory, new[] { new PickFirstBalancerFactory() }); + // Configure balancer similar to how GrpcChannel constructor does it + clientChannel.ConfigureBalancer(c => new ChildHandlerLoadBalancer( + c, + channelOptions.ServiceConfig, + clientChannel)); + + await clientChannel.ConnectAsync(waitForReady: true, cancellationToken: CancellationToken.None); + + transportFactory.Transports.ForEach(t => t.Disconnect()); + + var requestConnectionSyncPoint = new SyncPoint(runContinuationsAsynchronously: true); + testSink.MessageLogged += (w) => + { + if (w.EventId.Name == "ConnectionRequested") + { + requestConnectionSyncPoint.WaitToContinue().Wait(); + } + }; + + // Task should pause when requesting connection because of the logger sink. + var pickTask = Task.Run(() => clientChannel.PickAsync( + new PickContext { Request = new HttpRequestMessage() }, + waitForReady: true, + CancellationToken.None).AsTask()); + + // Wait until we're paused on requesting a connection. + await requestConnectionSyncPoint.WaitForSyncPoint().DefaultTimeout(); + + // Update addresses while requesting a connection. + var updateAddressesTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var updateAddressesTask = Task.Run(() => + { + updateAddressesTcs.TrySetResult(null); + resolver.UpdateAddresses(new List + { + new BalancerAddress("localhost", 81) + }); + }); + + // There isn't a clean way to wait for UpdateAddresses to be waiting for the subchannel lock. + // Use a long delay to ensure we're waiting for the lock and are in the right state. + await updateAddressesTcs.Task.DefaultTimeout(); + await Task.Delay(500); + requestConnectionSyncPoint.Continue(); + + // Ensure the pick completes without deadlock. + try + { + await pickTask.DefaultTimeout(); + } + catch (TimeoutException ex) + { + throw new InvalidOperationException("Likely deadlock when picking subchannel.", ex); + } + } + [Test] public async Task PickAsync_ExecutionContext_DoesNotCaptureAsyncLocalsInConnect() { From 147a4647ad43a4107e38c414e271dbecceefc999 Mon Sep 17 00:00:00 2001 From: apolcyn Date: Mon, 24 Feb 2025 22:46:09 -0800 Subject: [PATCH 39/48] bump Grpc.Tools dep (#2603) --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1c82cda73..35b4940a7 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -33,7 +33,7 @@ - + From 5816e69828ece5b5f3474d98057c2bc89a64dfd7 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 7 Mar 2025 07:33:39 +0800 Subject: [PATCH 40/48] Remove old dotnet-core feed (#2611) --- nuget.config | 1 - .../Balancer/ConnectivityStateTests.cs | 7 ++++++- test/Shared/TestResolver.cs | 14 +++++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/nuget.config b/nuget.config index e4d73b867..d5ff7157f 100644 --- a/nuget.config +++ b/nuget.config @@ -3,7 +3,6 @@ - diff --git a/test/Grpc.Net.Client.Tests/Balancer/ConnectivityStateTests.cs b/test/Grpc.Net.Client.Tests/Balancer/ConnectivityStateTests.cs index 9b9d60ea4..621f042c7 100644 --- a/test/Grpc.Net.Client.Tests/Balancer/ConnectivityStateTests.cs +++ b/test/Grpc.Net.Client.Tests/Balancer/ConnectivityStateTests.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -29,6 +29,7 @@ using Grpc.Net.Client.Tests.Infrastructure.Balancer; using Grpc.Tests.Shared; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using NUnit.Framework; namespace Grpc.Net.Client.Tests.Balancer; @@ -52,11 +53,13 @@ public async Task ResolverReturnsNoAddresses_CallWithWaitForReady_Wait() }); var services = new ServiceCollection(); + services.AddNUnitLogger(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(new TestSubchannelTransportFactory()); var serviceProvider = services.BuildServiceProvider(); + var logger = serviceProvider.GetRequiredService>(); var invoker = HttpClientCallInvokerFactory.Create(testMessageHandler, "test:///localhost", configure: o => { o.Credentials = ChannelCredentials.Insecure; @@ -72,6 +75,8 @@ public async Task ResolverReturnsNoAddresses_CallWithWaitForReady_Wait() Assert.IsNull(authority); var resolver = serviceProvider.GetRequiredService(); + + logger.LogInformation("UpdateAddresses"); resolver.UpdateAddresses(new List { new BalancerAddress("localhost", 81) diff --git a/test/Shared/TestResolver.cs b/test/Shared/TestResolver.cs index 8136f981b..c6584d219 100644 --- a/test/Shared/TestResolver.cs +++ b/test/Shared/TestResolver.cs @@ -32,6 +32,7 @@ namespace Grpc.Tests.Shared; internal class TestResolver : PollingResolver { + private readonly object _lock; private readonly Func? _onRefreshAsync; private readonly TaskCompletionSource _hasResolvedTcs; private readonly ILogger _logger; @@ -45,6 +46,7 @@ public TestResolver(ILoggerFactory loggerFactory) : this(loggerFactory, null) public TestResolver(ILoggerFactory? loggerFactory = null, Func? onRefreshAsync = null) : base(loggerFactory ?? NullLoggerFactory.Instance) { + _lock = new object(); _onRefreshAsync = onRefreshAsync; _hasResolvedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); _logger = (ILogger?)loggerFactory?.CreateLogger() ?? NullLogger.Instance; @@ -64,8 +66,11 @@ public void UpdateError(Status status) public void UpdateResult(ResolverResult result) { - _result = result; - Listener?.Invoke(result); + lock (_lock) + { + _result = result; + Listener?.Invoke(result); + } } protected override async Task ResolveAsync(CancellationToken cancellationToken) @@ -75,7 +80,10 @@ protected override async Task ResolveAsync(CancellationToken cancellationToken) await _onRefreshAsync(); } - Listener(_result ?? ResolverResult.ForResult(Array.Empty(), serviceConfig: null, serviceConfigStatus: null)); + lock (_lock) + { + Listener(_result ?? ResolverResult.ForResult(Array.Empty(), serviceConfig: null, serviceConfigStatus: null)); + } _hasResolvedTcs.TrySetResult(null); } } From 06cd2a9f7ad370cda685e7858a5c64b60416652e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Apr 2025 17:07:32 +0800 Subject: [PATCH 41/48] Bump axios in /testassets/InteropTestsGrpcWebWebsite/Tests (#2615) Bumps [axios](https://github.com/axios/axios) from 1.7.4 to 1.8.4. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.7.4...v1.8.4) --- updated-dependencies: - dependency-name: axios dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../InteropTestsGrpcWebWebsite/Tests/package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json index dda6f2d74..d8363903c 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json @@ -1137,9 +1137,10 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", From 2aed7b5ef368d23c80567063330397ea7641d2f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Apr 2025 17:07:45 +0800 Subject: [PATCH 42/48] Bump @babel/helpers in /testassets/InteropTestsGrpcWebWebsite/Tests (#2616) Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.25.0 to 7.27.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.27.0/packages/babel-helpers) --- updated-dependencies: - dependency-name: "@babel/helpers" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../Tests/package-lock.json | 158 +++++------------- 1 file changed, 40 insertions(+), 118 deletions(-) diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json index d8363903c..5dab3f07f 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json @@ -26,11 +26,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -153,17 +155,19 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -177,101 +181,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -486,13 +414,14 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" @@ -516,13 +445,13 @@ } }, "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3159,7 +3088,8 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -4172,14 +4102,6 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", From 30553b5624359779035f80955b3cee6bd9457f8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Apr 2025 18:09:07 +0800 Subject: [PATCH 43/48] Bump tar-fs in /testassets/InteropTestsGrpcWebWebsite/Tests (#2619) Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 3.0.6 to 3.0.8. - [Commits](https://github.com/mafintosh/tar-fs/compare/v3.0.6...v3.0.8) --- updated-dependencies: - dependency-name: tar-fs dependency-version: 3.0.8 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../Tests/package-lock.json | 97 ++++++++++++------- 1 file changed, 62 insertions(+), 35 deletions(-) diff --git a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json index 5dab3f07f..89f3c1689 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json +++ b/testassets/InteropTestsGrpcWebWebsite/Tests/package-lock.json @@ -1191,44 +1191,75 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", "optional": true }, "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.2.tgz", + "integrity": "sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==", + "license": "Apache-2.0", "optional": true, "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } } }, "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", - "optional": true + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } }, "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", "optional": true, "dependencies": { - "bare-os": "^2.1.0" + "bare-os": "^3.0.1" } }, "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "license": "Apache-2.0", "optional": true, "dependencies": { - "streamx": "^2.18.0" + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, "node_modules/base64-js": { @@ -3733,11 +3764,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -3951,12 +3977,12 @@ } }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" }, "optionalDependencies": { @@ -4049,16 +4075,17 @@ } }, "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "license": "MIT", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, "node_modules/tar-stream": { From 6f03f0e0b5e3025ad62c4eda1000fc0fda563acb Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Wed, 9 Apr 2025 21:06:56 +0800 Subject: [PATCH 44/48] Fix race condition that caused inprogress connect to be canceled (#2618) --- src/Grpc.Net.Client/Balancer/Subchannel.cs | 21 ++- .../Balancer/ConnectionManagerTests.cs | 122 ++++++++++++++++++ 2 files changed, 139 insertions(+), 4 deletions(-) diff --git a/src/Grpc.Net.Client/Balancer/Subchannel.cs b/src/Grpc.Net.Client/Balancer/Subchannel.cs index d80d5adeb..638876aa8 100644 --- a/src/Grpc.Net.Client/Balancer/Subchannel.cs +++ b/src/Grpc.Net.Client/Balancer/Subchannel.cs @@ -266,10 +266,10 @@ public void RequestConnection() } } - if (connectionRequested) - { - UpdateConnectivityState(ConnectivityState.Connecting, "Connection requested."); - } + Debug.Assert(connectionRequested, "Ensure that only expected state made it to this point."); + + SubchannelLog.StartingConnectionRequest(_logger, Id); + UpdateConnectivityState(ConnectivityState.Connecting, "Connection requested."); // Don't capture the current ExecutionContext and its AsyncLocals onto the connect var restoreFlow = false; @@ -327,6 +327,15 @@ private async Task ConnectTransportAsync() return; } + // There is already a connect in-progress on this transport. + // Don't cancel and start again as that causes queued requests waiting on the connect to fail. + if (_connectContext != null && !_connectContext.Disposed) + { + SubchannelLog.ConnectionRequestedInNonIdleState(_logger, Id, _state); + _delayInterruptTcs?.TrySetResult(null); + return; + } + connectContext = GetConnectContextUnsynchronized(); // Use a semaphore to limit one connection attempt at a time. This is done to prevent a race conditional where a canceled connect @@ -633,7 +642,11 @@ public static void AddressesUpdated(ILogger logger, string subchannelId, IReadOn AddressesUpdated(logger, subchannelId, addressesText); } } + [LoggerMessage(Level = LogLevel.Debug, EventId = 20, EventName = "QueuingConnect", Message = "Subchannel id '{SubchannelId}' queuing connect because a connect is already in progress.")] public static partial void QueuingConnect(ILogger logger, string subchannelId); + + [LoggerMessage(Level = LogLevel.Trace, EventId = 21, EventName = "StartingConnectionRequest", Message = "Subchannel id '{SubchannelId}' starting connection request.")] + public static partial void StartingConnectionRequest(ILogger logger, string subchannelId); } #endif diff --git a/test/Grpc.Net.Client.Tests/Balancer/ConnectionManagerTests.cs b/test/Grpc.Net.Client.Tests/Balancer/ConnectionManagerTests.cs index 7a5221728..7e807aeb8 100644 --- a/test/Grpc.Net.Client.Tests/Balancer/ConnectionManagerTests.cs +++ b/test/Grpc.Net.Client.Tests/Balancer/ConnectionManagerTests.cs @@ -620,6 +620,128 @@ public async Task PickAsync_UpdateAddressesWhileRequestingConnection_DoesNotDead } } + [Test] + public async Task PickAsync_MultipleRequestsRequestConnect_SingleConnectAttempt() + { + var services = new ServiceCollection(); + services.AddNUnitLogger(); + + var testSink = new TestSink(); + var testProvider = new TestLoggerProvider(testSink); + + services.AddLogging(b => + { + b.AddProvider(testProvider); + }); + + await using var serviceProvider = services.BuildServiceProvider(); + var loggerFactory = serviceProvider.GetRequiredService(); + var logger = loggerFactory.CreateLogger(nameof(PickAsync_MultipleRequestsRequestConnect_SingleConnectAttempt)); + + var requestConnectionChannel = Channel.CreateUnbounded(); + var requestConnectionSyncPoint1 = new SyncPoint(runContinuationsAsynchronously: true); + var requestConnectionSyncPoint2 = new SyncPoint(runContinuationsAsynchronously: true); + requestConnectionChannel.Writer.TryWrite(requestConnectionSyncPoint1); + requestConnectionChannel.Writer.TryWrite(requestConnectionSyncPoint2); + + var connectingSyncPoint = new SyncPoint(runContinuationsAsynchronously: true); + + var resolver = new TestResolver(loggerFactory); + resolver.UpdateAddresses(new List + { + new BalancerAddress("localhost", 80) + }); + + var channelOptions = new GrpcChannelOptions(); + var acting = false; + var transportFactory = TestSubchannelTransportFactory.Create(async (subChannel, attempt, cancellationToken) => + { + cancellationToken.Register(() => + { + logger.LogError("Connect cancellation token canceled."); + }); + + if (!acting) + { + return new TryConnectResult(ConnectivityState.Ready); + } + + await connectingSyncPoint.WaitToContinue().WaitAsync(cancellationToken); + + Assert.IsFalse(cancellationToken.IsCancellationRequested, "Cancellation token should not be canceled."); + + return new TryConnectResult(ConnectivityState.Ready); + }); + var clientChannel = CreateConnectionManager(loggerFactory, resolver, transportFactory, new[] { new PickFirstBalancerFactory() }); + // Configure balancer similar to how GrpcChannel constructor does it + clientChannel.ConfigureBalancer(c => new ChildHandlerLoadBalancer( + c, + channelOptions.ServiceConfig, + clientChannel)); + + await clientChannel.ConnectAsync(waitForReady: true, cancellationToken: CancellationToken.None); + + transportFactory.Transports.ForEach(t => t.Disconnect()); + + testSink.MessageLogged += (w) => + { + if (w.EventId.Name == "StartingConnectionRequest") + { + if (!requestConnectionChannel.Reader.TryRead(out var syncPoint)) + { + throw new InvalidOperationException("Channel should have sync point."); + } + syncPoint.WaitToContinue().Wait(); + } + }; + + acting = true; + + logger.LogInformation("Start first pick."); + var pickTask1 = Task.Run(() => clientChannel.PickAsync( + new PickContext { Request = new HttpRequestMessage() }, + waitForReady: true, + CancellationToken.None).AsTask()); + + logger.LogInformation("Wait for first pick to request connection."); + await requestConnectionSyncPoint1.WaitForSyncPoint().DefaultTimeout(); + + logger.LogInformation("Start second pick."); + var pickTask2 = Task.Run(() => clientChannel.PickAsync( + new PickContext { Request = new HttpRequestMessage() }, + waitForReady: true, + CancellationToken.None).AsTask()); + + logger.LogInformation("Wait for second pick to request connection."); + await requestConnectionSyncPoint2.WaitForSyncPoint().DefaultTimeout(); + + logger.LogInformation("Allow first pick to start connecting."); + requestConnectionSyncPoint1.Continue(); + await connectingSyncPoint.WaitForSyncPoint(); + + var connectionRequestedInNonIdleStateTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + testSink.MessageLogged += (w) => + { + if (w.EventId.Name == "ConnectionRequestedInNonIdleState") + { + connectionRequestedInNonIdleStateTcs.TrySetResult(null); + } + }; + + logger.LogInformation("Allow second pick to wait for connecting to complete."); + requestConnectionSyncPoint2.Continue(); + + logger.LogInformation("Wait for second pick to report that there is already a connection requested."); + await connectionRequestedInNonIdleStateTcs.Task.DefaultTimeout(); + + logger.LogInformation("Allow first pick connecting to complete."); + connectingSyncPoint.Continue(); + + logger.LogInformation("Wait for both picks to complete successfully."); + await pickTask1.DefaultTimeout(); + await pickTask2.DefaultTimeout(); + } + [Test] public async Task PickAsync_ExecutionContext_DoesNotCaptureAsyncLocalsInConnect() { From b1af190d8c21f74a10f9aab8e720cfa9e017a3f6 Mon Sep 17 00:00:00 2001 From: apolcyn Date: Wed, 9 Apr 2025 15:17:09 -0700 Subject: [PATCH 45/48] bump tools package to 2.71 (#2621) --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 35b4940a7..db4c7d8f4 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -33,7 +33,7 @@ - + From d170b24e9dce6c7a43b39c0458746ad5634ba173 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 10 Apr 2025 08:45:17 +0800 Subject: [PATCH 46/48] Update NuGet package versions (#2620) --- Directory.Packages.props | 17 ++++++++-------- examples/Error/Client/Client.csproj | 10 +++------- examples/Error/Error.sln | 30 ----------------------------- examples/Error/Server/Server.csproj | 10 ++-------- 4 files changed, 14 insertions(+), 53 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index db4c7d8f4..d3994391c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,11 +1,11 @@ true - 9.0.0 - 8.0.6 - 7.0.5 - 6.0.33 - 2.66.0 + 9.0.4 + 8.0.15 + 7.0.20 + 6.0.36 + 2.70.0 1.6.0 1.8.1 1.8.0-beta.1 @@ -47,6 +47,7 @@ + @@ -59,9 +60,9 @@ - - - + + + diff --git a/examples/Error/Client/Client.csproj b/examples/Error/Client/Client.csproj index 90dd30d2d..0ed7ee380 100644 --- a/examples/Error/Client/Client.csproj +++ b/examples/Error/Client/Client.csproj @@ -8,13 +8,9 @@ - + + + - - - - - - diff --git a/examples/Error/Error.sln b/examples/Error/Error.sln index c15fc0471..6991c4d4d 100644 --- a/examples/Error/Error.sln +++ b/examples/Error/Error.sln @@ -7,16 +7,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server", "Server\Server.csp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client", "Client\Client.csproj", "{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.StatusProto", "..\..\src\Grpc.StatusProto\Grpc.StatusProto.csproj", "{08BEBE52-D94B-449B-A5B5-9ABAABDE7CB2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.Core.Api", "..\..\src\Grpc.Core.Api\Grpc.Core.Api.csproj", "{E00E8BDE-19A9-47D7-B2D8-B304B2DEBAF3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.Net.Client", "..\..\src\Grpc.Net.Client\Grpc.Net.Client.csproj", "{E2C141A0-E21F-4F0F-9E32-FD90C57E8AD0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.Net.Common", "..\..\src\Grpc.Net.Common\Grpc.Net.Common.csproj", "{23678E37-37D4-4543-9961-403B3760862B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.AspNetCore.Server", "..\..\src\Grpc.AspNetCore.Server\Grpc.AspNetCore.Server.csproj", "{A1368174-6D27-49F1-B6DC-F1868CAE000F}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -31,26 +21,6 @@ Global {48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Debug|Any CPU.Build.0 = Debug|Any CPU {48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Release|Any CPU.ActiveCfg = Release|Any CPU {48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Release|Any CPU.Build.0 = Release|Any CPU - {08BEBE52-D94B-449B-A5B5-9ABAABDE7CB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {08BEBE52-D94B-449B-A5B5-9ABAABDE7CB2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {08BEBE52-D94B-449B-A5B5-9ABAABDE7CB2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {08BEBE52-D94B-449B-A5B5-9ABAABDE7CB2}.Release|Any CPU.Build.0 = Release|Any CPU - {E00E8BDE-19A9-47D7-B2D8-B304B2DEBAF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E00E8BDE-19A9-47D7-B2D8-B304B2DEBAF3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E00E8BDE-19A9-47D7-B2D8-B304B2DEBAF3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E00E8BDE-19A9-47D7-B2D8-B304B2DEBAF3}.Release|Any CPU.Build.0 = Release|Any CPU - {E2C141A0-E21F-4F0F-9E32-FD90C57E8AD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2C141A0-E21F-4F0F-9E32-FD90C57E8AD0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2C141A0-E21F-4F0F-9E32-FD90C57E8AD0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2C141A0-E21F-4F0F-9E32-FD90C57E8AD0}.Release|Any CPU.Build.0 = Release|Any CPU - {23678E37-37D4-4543-9961-403B3760862B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {23678E37-37D4-4543-9961-403B3760862B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {23678E37-37D4-4543-9961-403B3760862B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {23678E37-37D4-4543-9961-403B3760862B}.Release|Any CPU.Build.0 = Release|Any CPU - {A1368174-6D27-49F1-B6DC-F1868CAE000F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A1368174-6D27-49F1-B6DC-F1868CAE000F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A1368174-6D27-49F1-B6DC-F1868CAE000F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A1368174-6D27-49F1-B6DC-F1868CAE000F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/examples/Error/Server/Server.csproj b/examples/Error/Server/Server.csproj index 4544e2b24..4563c022e 100644 --- a/examples/Error/Server/Server.csproj +++ b/examples/Error/Server/Server.csproj @@ -7,14 +7,8 @@ - - - - - - - - + + From d666241d86bbc6f990416c1c4aa5a523ddc7eb53 Mon Sep 17 00:00:00 2001 From: apolcyn Date: Thu, 10 Apr 2025 10:11:52 -0700 Subject: [PATCH 47/48] update versions (#2622) --- build/version.props | 4 ++-- src/Grpc.Core.Api/VersionInfo.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/version.props b/build/version.props index 75373120d..6cd3e4738 100644 --- a/build/version.props +++ b/build/version.props @@ -2,13 +2,13 @@ - 2.66.0-dev + 2.71.0-pre1 2.0.0.0 - 2.66.0.0 + 2.71.0.0 diff --git a/src/Grpc.Core.Api/VersionInfo.cs b/src/Grpc.Core.Api/VersionInfo.cs index d4b472b99..0eec9cddf 100644 --- a/src/Grpc.Core.Api/VersionInfo.cs +++ b/src/Grpc.Core.Api/VersionInfo.cs @@ -36,10 +36,10 @@ public static class VersionInfo /// /// Current AssemblyFileVersion of gRPC C# assemblies /// - public const string CurrentAssemblyFileVersion = "2.66.0.0"; + public const string CurrentAssemblyFileVersion = "2.71.0.0"; /// /// Current version of gRPC C# /// - public const string CurrentVersion = "2.66.0-dev"; + public const string CurrentVersion = "2.71.0-pre1"; } From c2555f2951c56a23d6c57bae6970cdfd30c552a7 Mon Sep 17 00:00:00 2001 From: apolcyn Date: Tue, 22 Apr 2025 15:38:00 -0700 Subject: [PATCH 48/48] remove pre1 for stable release (#2627) --- build/version.props | 2 +- src/Grpc.Core.Api/VersionInfo.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/version.props b/build/version.props index 6cd3e4738..b6b5c96bb 100644 --- a/build/version.props +++ b/build/version.props @@ -2,7 +2,7 @@ - 2.71.0-pre1 + 2.71.0 2.0.0.0 diff --git a/src/Grpc.Core.Api/VersionInfo.cs b/src/Grpc.Core.Api/VersionInfo.cs index 0eec9cddf..cd707526a 100644 --- a/src/Grpc.Core.Api/VersionInfo.cs +++ b/src/Grpc.Core.Api/VersionInfo.cs @@ -41,5 +41,5 @@ public static class VersionInfo /// /// Current version of gRPC C# /// - public const string CurrentVersion = "2.71.0-pre1"; + public const string CurrentVersion = "2.71.0"; }