From 152a95d130931e72c2f0d383e7b729e5eee448c0 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Wed, 28 Jun 2023 20:02:27 +0200 Subject: [PATCH 001/344] Mock server --- .../ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 20 ++ packages/csharp/ArmoniK.Api.Mock/Program.cs | 116 +++++++++ .../ArmoniK.Api.Mock/Services/AgentService.cs | 189 ++++++++++++++ .../Services/ApplicationsService.cs | 67 +++++ .../ArmoniK.Api.Mock/Services/AuthService.cs | 59 +++++ .../Services/EventsService.cs | 65 +++++ .../Services/PartitionsService.cs | 78 ++++++ .../Services/ResultsService.cs | 173 +++++++++++++ .../Services/SessionsService.cs | 100 +++++++ .../Services/SubmitterService.cs | 244 ++++++++++++++++++ .../ArmoniK.Api.Mock/Services/TasksService.cs | 153 +++++++++++ .../Services/VersionsService.cs | 60 +++++ .../csharp/ArmoniK.Api.Mock/appsettings.json | 8 + packages/csharp/ArmoniK.Api.sln | 6 + 14 files changed, 1338 insertions(+) create mode 100644 packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj create mode 100644 packages/csharp/ArmoniK.Api.Mock/Program.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/appsettings.json diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj new file mode 100644 index 000000000..425251ce7 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -0,0 +1,20 @@ + + + + net6.0 + enable + enable + + + + + + + + + + + + + + diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs new file mode 100644 index 000000000..a61122b00 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -0,0 +1,116 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using System.Text; + +using ArmoniK.Api.Mock.Services; + +using Microsoft.AspNetCore.Server.Kestrel.Core; + +using Newtonsoft.Json; + +var builder = WebApplication.CreateBuilder(args); + +// Additional configuration is required to successfully run gRPC on macOS. +// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682 + +// Add services to the container. +builder.Services.AddGrpc(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +builder.WebHost.UseKestrel(options => + { + options.ListenAnyIP(1080, + listenOptions => + { + listenOptions.Protocols = HttpProtocols.Http2; + }); + options.ListenAnyIP(1081, + listenOptions => listenOptions.Protocols = HttpProtocols.Http1); + options.ListenAnyIP(5001, + listenOptions => listenOptions.Protocols = HttpProtocols.Http2); + }); + +var app = builder.Build(); + +app.UseRouting(); +app.UseGrpcWeb(new GrpcWebOptions + { + DefaultEnabled = true, + }); + +// Configure the HTTP request pipeline. +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGet("/", + () + => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); +app.MapGet("/calls.json", + async context => + { + var body = JsonConvert.SerializeObject(new + { + Agent = app.Services.GetService() + ?.Calls, + Applications = app.Services.GetService() + ?.Calls, + Auth = app.Services.GetService() + ?.Calls, + Events = app.Services.GetService() + ?.Calls, + PartitionsService = app.Services.GetService() + ?.Calls, + Results = app.Services.GetService() + ?.Calls, + Sessions = app.Services.GetService() + ?.Calls, + Submitter = app.Services.GetService() + ?.Calls, + Tasks = app.Services.GetService() + ?.Calls, + Versions = app.Services.GetService() + ?.Calls, + }); + context.Response.ContentType = "application/json"; + await context.Response.Body.WriteAsync(Encoding.ASCII.GetBytes(body)); + }); + +app.Run(); diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs new file mode 100644 index 000000000..925f5c12a --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs @@ -0,0 +1,189 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using ArmoniK.Api.gRPC.V1; +using ArmoniK.Api.gRPC.V1.Agent; + +using Grpc.Core; + +namespace ArmoniK.Api.Mock.Services; + +public class AgentService : Agent.AgentBase +{ + public CallCount Calls = new(); + + /// + public override Task CreateTask(IAsyncStreamReader requestStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CreateTask, + 1); + return Task.FromResult(new CreateTaskReply + { + CommunicationToken = "communication-token", + CreationStatusList = new CreateTaskReply.Types.CreationStatusList(), + }); + } + + /// + public override async Task GetCommonData(DataRequest request, + IServerStreamWriter responseStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetCommonData, + 1); + await responseStream.WriteAsync(new DataReply + { + Data = new DataChunk + { + DataComplete = true, + }, + }) + .ConfigureAwait(false); + } + + /// + public override async Task GetDirectData(DataRequest request, + IServerStreamWriter responseStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetDirectData, + 1); + await responseStream.WriteAsync(new DataReply + { + Data = new DataChunk + { + DataComplete = true, + }, + }) + .ConfigureAwait(false); + } + + /// + public override async Task GetResourceData(DataRequest request, + IServerStreamWriter responseStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetResourceData, + 1); + await responseStream.WriteAsync(new DataReply + { + Data = new DataChunk + { + DataComplete = true, + }, + }) + .ConfigureAwait(false); + } + + /// + public override async Task SendResult(IAsyncStreamReader requestStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.SendResult, + 1); + await foreach (var _ in requestStream.ReadAllAsync()) + { + } + + return new ResultReply + { + Ok = new Empty(), + }; + } + + /// + public override Task CreateResultsMetaData(CreateResultsMetaDataRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CreateResultsMetaData, + 1); + + return Task.FromResult(new CreateResultsMetaDataResponse + { + CommunicationToken = request.CommunicationToken, + }); + } + + /// + public override Task SubmitTasks(SubmitTasksRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.SubmitTasks, + 1); + + return Task.FromResult(new SubmitTasksResponse + { + CommunicationToken = request.CommunicationToken, + }); + } + + /// + public override async Task UploadResultData(IAsyncStreamReader requestStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.UploadResultData, + 1); + await foreach (var _ in requestStream.ReadAllAsync()) + { + } + + return new UploadResultDataResponse + { + ResultId = "result-id", + CommunicationToken = "communication-token", + }; + } + + /// + public override Task CreateResults(CreateResultsRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CreateResults, + 1); + + return Task.FromResult(new CreateResultsResponse + { + CommunicationToken = request.CommunicationToken, + }); + } + + + public struct CallCount + { + public int CreateTask = 0; + public int GetCommonData = 0; + public int GetDirectData = 0; + public int GetResourceData = 0; + public int SendResult = 0; + public int CreateResultsMetaData = 0; + public int SubmitTasks = 0; + public int UploadResultData = 0; + public int CreateResults = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs new file mode 100644 index 000000000..80acaaf6b --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs @@ -0,0 +1,67 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using ArmoniK.Api.gRPC.V1.Applications; + +using Grpc.Core; + +namespace ArmoniK.Api.Mock.Services; + +public class ApplicationsService : Applications.ApplicationsBase +{ + public CallCount Calls = new(); + + /// + public override Task ListApplications(ListApplicationsRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.ListApplications, + 1); + return Task.FromResult(new ListApplicationsResponse + { + Page = request.Page, + PageSize = request.PageSize, + Total = 0, + }); + } + + /// + public override Task CountTasksByStatus(CountTasksByStatusRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CountTasksByStatus, + 1); + return Task.FromResult(new CountTasksByStatusResponse()); + } + + public struct CallCount + { + public int ListApplications = 0; + public int CountTasksByStatus = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs new file mode 100644 index 000000000..59e458359 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs @@ -0,0 +1,59 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using ArmoniK.Api.gRPC.V1.Auth; + +using Grpc.Core; + +namespace ArmoniK.Api.Mock.Services; + +public class AuthService : Authentication.AuthenticationBase +{ + public CallCount Calls = new(); + + + /// + public override Task GetCurrentUser(GetCurrentUserRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetCurrentUser, + 1); + return Task.FromResult(new GetCurrentUserResponse + { + User = new User + { + Username = "username", + }, + }); + } + + public struct CallCount + { + public int GetCurrentUser = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs new file mode 100644 index 000000000..4af1326d5 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs @@ -0,0 +1,65 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using ArmoniK.Api.gRPC.V1; +using ArmoniK.Api.gRPC.V1.Events; + +using Grpc.Core; + +namespace ArmoniK.Api.Mock.Services; + +public class EventsService : Events.EventsBase +{ + public CallCount Calls = new(); + + + /// + public override async Task GetEvents(EventSubscriptionRequest request, + IServerStreamWriter responseStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetEvents, + 1); + await responseStream.WriteAsync(new EventSubscriptionResponse + { + SessionId = "session-id", + NewResult = new EventSubscriptionResponse.Types.NewResult + { + ResultId = "result-id", + OwnerId = "owner-id", + Status = ResultStatus.Created, + }, + }) + .ConfigureAwait(false); + } + + public struct CallCount + { + public int GetEvents = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs new file mode 100644 index 000000000..8ae2f3a71 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs @@ -0,0 +1,78 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using Armonik.Api.Grpc.V1.Partitions; + +using Grpc.Core; + +namespace ArmoniK.Api.Mock.Services; + +public class PartitionsService : Partitions.PartitionsBase +{ + public CallCount Calls = new(); + + /// + public override Task GetPartition(GetPartitionRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetPartition, + 1); + return Task.FromResult(new GetPartitionResponse + { + Partition = new PartitionRaw + { + Id = "partition-id", + Priority = 1, + PodMax = 1, + PodReserved = 1, + PreemptionPercentage = 0, + }, + }); + } + + + /// + public override Task ListPartitions(ListPartitionsRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.ListPartitions, + 1); + return Task.FromResult(new ListPartitionsResponse + { + PageSize = request.PageSize, + Page = 0, + Total = 0, + }); + } + + public struct CallCount + { + public int GetPartition = 0; + public int ListPartitions = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs new file mode 100644 index 000000000..0e0b2e69e --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs @@ -0,0 +1,173 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using ArmoniK.Api.gRPC.V1; +using ArmoniK.Api.gRPC.V1.Results; + +using Grpc.Core; + +using Results = ArmoniK.Api.gRPC.V1.Results.Results; + +namespace ArmoniK.Api.Mock.Services; + +public class ResultsService : Results.ResultsBase +{ + private static readonly ResultRaw MockResult = new() + { + SessionId = "session-id", + ResultId = "result-id", + Name = "result-name", + Status = ResultStatus.Completed, + OwnerTaskId = "owner-task-id", + }; + + public CallCount Calls = new(); + + + /// + public override Task GetOwnerTaskId(GetOwnerTaskIdRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetOwnerTaskId, + 1); + return Task.FromResult(new GetOwnerTaskIdResponse + { + SessionId = "session-id", + }); + } + + /// + public override Task ListResults(ListResultsRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.ListResults, + 1); + return Task.FromResult(new ListResultsResponse + { + Page = 0, + Total = 0, + PageSize = request.PageSize, + }); + } + + /// + public override Task CreateResultsMetaData(CreateResultsMetaDataRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CreateResultsMetaData, + 1); + return Task.FromResult(new CreateResultsMetaDataResponse()); + } + + /// + public override Task CreateResults(CreateResultsRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CreateResults, + 1); + return Task.FromResult(new CreateResultsResponse()); + } + + /// + public override Task DeleteResultsData(DeleteResultsDataRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.DeleteResultsData, + 1); + return Task.FromResult(new DeleteResultsDataResponse + { + SessionId = "session-id", + }); + } + + /// + public override Task DownloadResultData(DownloadResultDataRequest request, + IServerStreamWriter responseStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.DownloadResultData, + 1); + return Task.CompletedTask; + } + + /// + public override Task GetServiceConfiguration(Empty request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetServiceConfiguration, + 1); + return Task.FromResult(new ResultsServiceConfigurationResponse + { + DataChunkMaxSize = 80 * 1024, + }); + } + + + /// + public override async Task UploadResultData(IAsyncStreamReader requestStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.UploadResultData, + 1); + + await foreach (var _ in requestStream.ReadAllAsync()) + { + } + + return new UploadResultDataResponse + { + Result = MockResult, + }; + } + + /// + public override Task GetResult(GetResultRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetResult, + 1); + + return Task.FromResult(new GetResultResponse + { + Result = MockResult, + }); + } + + public struct CallCount + { + public int GetOwnerTaskId = 0; + public int ListResults = 0; + public int CreateResultsMetaData = 0; + public int CreateResults = 0; + public int DeleteResultsData = 0; + public int DownloadResultData = 0; + public int GetServiceConfiguration = 0; + public int UploadResultData = 0; + public int GetResult = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs new file mode 100644 index 000000000..164344e08 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs @@ -0,0 +1,100 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using ArmoniK.Api.gRPC.V1; +using ArmoniK.Api.gRPC.V1.Sessions; + +using Grpc.Core; + +namespace ArmoniK.Api.Mock.Services; + +public class SessionsService : Sessions.SessionsBase +{ + private static readonly SessionRaw MockSession = new() + { + SessionId = "session-id", + Status = SessionStatus.Cancelled, + }; + + public CallCount Calls = new(); + + /// + public override Task CancelSession(CancelSessionRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CancelSession, + 1); + return Task.FromResult(new CancelSessionResponse + { + Session = MockSession, + }); + } + + /// + public override Task GetSession(GetSessionRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetSession, + 1); + return Task.FromResult(new GetSessionResponse + { + Session = MockSession, + }); + } + + /// + public override Task ListSessions(ListSessionsRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.ListSessions, + 1); + return Task.FromResult(new ListSessionsResponse + { + Page = 0, + PageSize = request.PageSize, + Total = 0, + }); + } + + /// + public override Task CountTasksByStatus(CountTasksByStatusRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CountTasksByStatus, + 1); + return Task.FromResult(new CountTasksByStatusResponse()); + } + + public struct CallCount + { + public int CancelSession = 0; + public int GetSession = 0; + public int ListSessions = 0; + public int CountTasksByStatus = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs new file mode 100644 index 000000000..69407df8c --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs @@ -0,0 +1,244 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using ArmoniK.Api.gRPC.V1; +using ArmoniK.Api.gRPC.V1.Submitter; + +using Grpc.Core; + +namespace ArmoniK.Api.Mock.Services; + +public class SubmitterService : Submitter.SubmitterBase +{ + public CallCount Calls = new(); + + /// + public override Task GetServiceConfiguration(Empty request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetServiceConfiguration, + 1); + return Task.FromResult(new Configuration + { + DataChunkMaxSize = 80 * 1024, + }); + } + + /// + public override Task CancelSession(Session request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CancelSession, + 1); + return Task.FromResult(new Empty()); + } + + /// + public override Task CancelTasks(TaskFilter request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CancelTasks, + 1); + return Task.FromResult(new Empty()); + } + + /// + public override Task CreateSession(CreateSessionRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CreateSession, + 1); + return Task.FromResult(new CreateSessionReply + { + SessionId = "session-id", + }); + } + + /// + public override Task CreateSmallTasks(CreateSmallTaskRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CreateSmallTasks, + 1); + return Task.FromResult(new CreateTaskReply + { + CreationStatusList = new CreateTaskReply.Types.CreationStatusList(), + Error = "", + }); + } + + + /// + public override async Task CreateLargeTasks(IAsyncStreamReader requestStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CreateLargeTasks, + 1); + await foreach (var _ in requestStream.ReadAllAsync()) + { + } + + return new CreateTaskReply + { + CreationStatusList = new CreateTaskReply.Types.CreationStatusList(), + Error = "", + }; + } + + /// + public override Task CountTasks(TaskFilter request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CountTasks, + 1); + return Task.FromResult(new Count()); + } + + /// + public override async Task TryGetResultStream(ResultRequest request, + IServerStreamWriter responseStream, + ServerCallContext context) + { + Interlocked.Add(ref Calls.TryGetResultStream, + 1); + await responseStream.WriteAsync(new ResultReply + { + Result = new DataChunk + { + DataComplete = true, + }, + }) + .ConfigureAwait(false); + } + + /// + public override Task WaitForCompletion(WaitRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.WaitForCompletion, + 1); + return Task.FromResult(new Count()); + } + + /// + public override Task TryGetTaskOutput(TaskOutputRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.TryGetTaskOutput, + 1); + return Task.FromResult(new Output + { + Ok = new Empty(), + }); + } + + /// + [Obsolete] + public override Task WaitForAvailability(ResultRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.WaitForAvailability, + 1); + return Task.FromResult(new AvailabilityReply + { + Ok = new Empty(), + }); + } + + /// + public override Task GetTaskStatus(GetTaskStatusRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetTaskStatus, + 1); + return Task.FromResult(new GetTaskStatusReply()); + } + + /// + [Obsolete] + public override Task GetResultStatus(GetResultStatusRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetResultStatus, + 1); + return Task.FromResult(new GetResultStatusReply()); + } + + /// + public override Task ListTasks(TaskFilter request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.ListTasks, + 1); + + return Task.FromResult(new TaskIdList()); + } + + /// + public override Task ListSessions(SessionFilter request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.ListSessions, + 1); + return Task.FromResult(new SessionIdList()); + } + + /// + public override async Task WatchResults(IAsyncStreamReader requestStream, + IServerStreamWriter responseStream, + ServerCallContext context) + { + await foreach (var req in requestStream.ReadAllAsync()) + { + await responseStream.WriteAsync(new WatchResultStream + { + Status = ResultStatus.Unspecified, + }) + .ConfigureAwait(false); + } + } + + public struct CallCount + { + public int GetServiceConfiguration = 0; + public int CancelSession = 0; + public int CancelTasks = 0; + public int CreateSession = 0; + public int CreateSmallTasks = 0; + public int CreateLargeTasks = 0; + public int CountTasks = 0; + public int TryGetResultStream = 0; + public int WaitForCompletion = 0; + public int TryGetTaskOutput = 0; + public int WaitForAvailability = 0; + public int GetTaskStatus = 0; + public int GetResultStatus = 0; + public int ListTasks = 0; + public int ListSessions = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs new file mode 100644 index 000000000..444025129 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs @@ -0,0 +1,153 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using ArmoniK.Api.gRPC.V1; +using ArmoniK.Api.gRPC.V1.Tasks; + +using Google.Protobuf.WellKnownTypes; + +using Grpc.Core; + +using TaskStatus = ArmoniK.Api.gRPC.V1.TaskStatus; + +namespace ArmoniK.Api.Mock.Services; + +public class TasksService : Tasks.TasksBase +{ + private static readonly TaskRaw MockTask = new() + { + Id = "task-id", + SessionId = "session-id", + Status = TaskStatus.Completed, + Options = new TaskOptions + { + Priority = 1, + ApplicationName = "application-name", + ApplicationNamespace = "application-namespace", + ApplicationService = "application-service", + ApplicationVersion = "application-version", + EngineType = "engine-type", + MaxDuration = new Duration + { + Seconds = 1, + }, + MaxRetries = 1, + PartitionId = "partition-id", + }, + }; + + public CallCount Calls = new(); + + + /// + public override Task GetTask(GetTaskRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetTask, + 1); + return Task.FromResult(new GetTaskResponse + { + Task = MockTask, + }); + } + + /// + public override Task ListTasks(ListTasksRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.ListTasks, + 1); + return Task.FromResult(new ListTasksResponse + { + Page = 0, + Total = 0, + PageSize = request.PageSize, + }); + } + + /// + public override Task GetResultIds(GetResultIdsRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.GetResultIds, + 1); + return Task.FromResult(new GetResultIdsResponse()); + } + + /// + public override Task CancelTasks(CancelTasksRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CancelTasks, + 1); + return Task.FromResult(new CancelTasksResponse()); + } + + /// + public override Task CountTasksByStatus(CountTasksByStatusRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.CountTasksByStatus, + 1); + return Task.FromResult(new CountTasksByStatusResponse()); + } + + /// + public override Task ListTasksRaw(ListTasksRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.ListTasksRaw, + 1); + return Task.FromResult(new ListTasksRawResponse + { + Page = 0, + Total = 0, + PageSize = request.PageSize, + }); + } + + /// + public override Task SubmitTasks(SubmitTasksRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.SubmitTasks, + 1); + return Task.FromResult(new SubmitTasksResponse()); + } + + public struct CallCount + { + public int GetTask = 0; + public int ListTasks = 0; + public int GetResultIds = 0; + public int CancelTasks = 0; + public int CountTasksByStatus = 0; + public int ListTasksRaw = 0; + public int SubmitTasks = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs new file mode 100644 index 000000000..43abe34e9 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs @@ -0,0 +1,60 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// W.Kirschenmann +// J.Gurhem +// D.Dubuc +// L.Ziane Khodja +// F.Lemaitre +// S.Djebbar +// J.Fonseca +// +// This program is free software:you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program.If not, see . + +using Armonik.Api.Grpc.V1.Versions; + +using Grpc.Core; + +namespace ArmoniK.Api.Mock.Services; + +public class VersionsService : Versions.VersionsBase +{ + private static readonly string ApiVersion = typeof(Versions.VersionsBase).Assembly.GetName() + .Version!.ToString(); + + public CallCount Calls = new(); + + + /// + public override Task ListVersions(ListVersionsRequest request, + ServerCallContext context) + { + Interlocked.Add(ref Calls.ListVersions, + 1); + return Task.FromResult(new ListVersionsResponse + { + Core = "Unknown", + Api = ApiVersion, + }); + } + + public struct CallCount + { + public int ListVersions = 0; + + public CallCount() + { + } + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/appsettings.json b/packages/csharp/ArmoniK.Api.Mock/appsettings.json new file mode 100644 index 000000000..8929653dd --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/appsettings.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug" + } + }, + "AllowedHosts": "*" +} diff --git a/packages/csharp/ArmoniK.Api.sln b/packages/csharp/ArmoniK.Api.sln index 2dcad6a60..7c05ff45c 100644 --- a/packages/csharp/ArmoniK.Api.sln +++ b/packages/csharp/ArmoniK.Api.sln @@ -17,6 +17,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArmoniK.Api.Common.Channel" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArmoniK.Api.Client.Tests", "ArmoniK.Api.Client.Test\ArmoniK.Api.Client.Tests.csproj", "{45BFA5D4-602D-47C5-8CD6-9AE6878E02FB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArmoniK.Api.Mock", "ArmoniK.Api.Mock\ArmoniK.Api.Mock.csproj", "{3CC5FB77-EC5B-4DDE-B71A-10C4A67B31C0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -51,6 +53,10 @@ Global {45BFA5D4-602D-47C5-8CD6-9AE6878E02FB}.Debug|Any CPU.Build.0 = Debug|Any CPU {45BFA5D4-602D-47C5-8CD6-9AE6878E02FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {45BFA5D4-602D-47C5-8CD6-9AE6878E02FB}.Release|Any CPU.Build.0 = Release|Any CPU + {3CC5FB77-EC5B-4DDE-B71A-10C4A67B31C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3CC5FB77-EC5B-4DDE-B71A-10C4A67B31C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CC5FB77-EC5B-4DDE-B71A-10C4A67B31C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3CC5FB77-EC5B-4DDE-B71A-10C4A67B31C0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From bf88ca29a3e5adbbc236568e488fd31517d5e5d8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Jul 2023 19:36:58 +0000 Subject: [PATCH 002/344] chore(deps): update dependency jasmine-core to v5 --- packages/angular/package.json | 2 +- packages/angular/pnpm-lock.yaml | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/angular/package.json b/packages/angular/package.json index 7f8ef0c6b..cb43829fe 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -34,7 +34,7 @@ "@ngx-grpc/protoc-gen-ng": "^3.1.1", "@types/google-protobuf": "^3.15.6", "@types/jasmine": "~4.3.5", - "jasmine-core": "~4.6.0", + "jasmine-core": "~5.1.0", "karma": "~6.4.2", "karma-chrome-launcher": "~3.2.0", "karma-coverage": "~2.2.1", diff --git a/packages/angular/pnpm-lock.yaml b/packages/angular/pnpm-lock.yaml index 68604d1ac..5dc92e8d0 100644 --- a/packages/angular/pnpm-lock.yaml +++ b/packages/angular/pnpm-lock.yaml @@ -71,8 +71,8 @@ devDependencies: specifier: ~4.3.5 version: 4.3.5 jasmine-core: - specifier: ~4.6.0 - version: 4.6.0 + specifier: ~5.1.0 + version: 5.1.0 karma: specifier: ~6.4.2 version: 6.4.2 @@ -87,7 +87,7 @@ devDependencies: version: 5.1.0(karma@6.4.2) karma-jasmine-html-reporter: specifier: ~2.1.0 - version: 2.1.0(jasmine-core@4.6.0)(karma-jasmine@5.1.0)(karma@6.4.2) + version: 2.1.0(jasmine-core@5.1.0)(karma-jasmine@5.1.0)(karma@6.4.2) ng-packagr: specifier: ^16.1.0 version: 16.1.0(@angular/compiler-cli@16.1.6)(tslib@2.6.0)(typescript@5.1.6) @@ -4567,6 +4567,10 @@ packages: resolution: {integrity: sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==} dev: true + /jasmine-core@5.1.0: + resolution: {integrity: sha512-bFMMwpKuTZXCuGd51yClFobw5SOtad1kmdWnYO8dNwYV8i01Xj0C2+nyQpSKl1EKxiPfyd1ZgBl/rsusL3aS6w==} + dev: true + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -4669,14 +4673,14 @@ packages: - supports-color dev: true - /karma-jasmine-html-reporter@2.1.0(jasmine-core@4.6.0)(karma-jasmine@5.1.0)(karma@6.4.2): + /karma-jasmine-html-reporter@2.1.0(jasmine-core@5.1.0)(karma-jasmine@5.1.0)(karma@6.4.2): resolution: {integrity: sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==} peerDependencies: jasmine-core: ^4.0.0 || ^5.0.0 karma: ^6.0.0 karma-jasmine: ^5.0.0 dependencies: - jasmine-core: 4.6.0 + jasmine-core: 5.1.0 karma: 6.4.2 karma-jasmine: 5.1.0(karma@6.4.2) dev: true From 2b5a5a1f6fbf3e35ef9bedad98b19687ac86da9e Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Thu, 10 Aug 2023 23:06:38 +0200 Subject: [PATCH 003/344] Mock filtering --- packages/csharp/ArmoniK.Api.Mock/ICounter.cs | 50 ++++++++++++ .../ArmoniK.Api.Mock/ICountingService.cs | 76 +++++++++++++++++++ packages/csharp/ArmoniK.Api.Mock/Program.cs | 50 ++++++------ .../ArmoniK.Api.Mock/Services/AgentService.cs | 28 ++++--- .../Services/ApplicationsService.cs | 14 ++-- .../ArmoniK.Api.Mock/Services/AuthService.cs | 12 ++- .../Services/EventsService.cs | 12 ++- .../Services/PartitionsService.cs | 14 ++-- .../Services/ResultsService.cs | 28 ++++--- .../Services/SessionsService.cs | 18 +++-- .../Services/SubmitterService.cs | 40 +++++----- .../ArmoniK.Api.Mock/Services/TasksService.cs | 24 +++--- .../Services/VersionsService.cs | 12 ++- 13 files changed, 269 insertions(+), 109 deletions(-) create mode 100644 packages/csharp/ArmoniK.Api.Mock/ICounter.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/ICountingService.cs diff --git a/packages/csharp/ArmoniK.Api.Mock/ICounter.cs b/packages/csharp/ArmoniK.Api.Mock/ICounter.cs new file mode 100644 index 000000000..582644562 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/ICounter.cs @@ -0,0 +1,50 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +namespace ArmoniK.Api.Mock; + +public interface ICounter +{ +} + +public static class Counter +{ + public static Dictionary ToDict(this ICounter? counter, + IEnumerable? exclude = null) + { + if (counter is null) + { + return new Dictionary(); + } + + var excludeSet = exclude as HashSet ?? exclude?.ToHashSet() ?? new HashSet(); + return counter.GetType() + .GetFields() + .Select(field => new KeyValuePair(field.Name, + field.GetValue(counter))) + .Where(prop => prop.Value is not null && !excludeSet.Contains(prop.Key)) + .ToDictionary(prop => prop.Key, + prop => (int)(prop.Value ?? 0)); + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/ICountingService.cs b/packages/csharp/ArmoniK.Api.Mock/ICountingService.cs new file mode 100644 index 000000000..aba6d4c98 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/ICountingService.cs @@ -0,0 +1,76 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.Reflection; + +namespace ArmoniK.Api.Mock; + +public interface ICountingService +{ + public ICounter GetCounter(); +} + +public static class CountingService +{ + public static Dictionary> GetCounters(this IServiceProvider services, + IDictionary>? exclude = null) + => AppDomain.CurrentDomain.GetAssemblies() + // Get all types from assemblies + .SelectMany(s => + { + try + { + return s.GetTypes(); + } + catch (ReflectionTypeLoadException e) + { + return e.Types.Where(t => t is not null); + } + catch + { + return Array.Empty(); + } + }) + // Keep only concrete classes that implement counter + .Where(p => typeof(ICountingService).IsAssignableFrom(p) && !p.IsAbstract) + .Select(type => + { + if (type is null || services.GetService(type) is not ICountingService service) + { + return new KeyValuePair>("", + new Dictionary()); + } + + HashSet? counterExclude = null; + exclude?.TryGetValue(type.Name, + out counterExclude); + + return new KeyValuePair>(type.Name, + service.GetCounter() + .ToDict(counterExclude)); + }) + .Where(kv => !string.IsNullOrEmpty(kv.Key)) + .ToDictionary(kv => kv.Key, + kv => kv.Value); +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index a61122b00..1511168de 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -24,6 +24,7 @@ using System.Text; +using ArmoniK.Api.Mock; using ArmoniK.Api.Mock.Services; using Microsoft.AspNetCore.Server.Kestrel.Core; @@ -84,33 +85,26 @@ () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); app.MapGet("/calls.json", - async context => - { - var body = JsonConvert.SerializeObject(new - { - Agent = app.Services.GetService() - ?.Calls, - Applications = app.Services.GetService() - ?.Calls, - Auth = app.Services.GetService() - ?.Calls, - Events = app.Services.GetService() - ?.Calls, - PartitionsService = app.Services.GetService() - ?.Calls, - Results = app.Services.GetService() - ?.Calls, - Sessions = app.Services.GetService() - ?.Calls, - Submitter = app.Services.GetService() - ?.Calls, - Tasks = app.Services.GetService() - ?.Calls, - Versions = app.Services.GetService() - ?.Calls, - }); - context.Response.ContentType = "application/json"; - await context.Response.Body.WriteAsync(Encoding.ASCII.GetBytes(body)); - }); + Calls); +app.MapPost("/calls.json", + Calls); app.Run(); + +async Task ReadAll(Stream stream) +{ + await using var ms = new MemoryStream(); + await stream.CopyToAsync(ms); + return ms.ToArray(); +} + +async Task Calls(HttpContext context) +{ + var requestBody = Encoding.ASCII.GetString(await ReadAll(context.Request.Body)); + var exclude = string.IsNullOrWhiteSpace(requestBody) + ? null + : JsonConvert.DeserializeObject>>(requestBody); + var body = JsonConvert.SerializeObject(app.Services.GetCounters(exclude)); + context.Response.ContentType = "application/json"; + await context.Response.Body.WriteAsync(Encoding.ASCII.GetBytes(body)); +} diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs index 925f5c12a..b3ce221c8 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs @@ -29,15 +29,19 @@ namespace ArmoniK.Api.Mock.Services; -public class AgentService : Agent.AgentBase +public class AgentService : Agent.AgentBase, ICountingService { - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// public override Task CreateTask(IAsyncStreamReader requestStream, ServerCallContext context) { - Interlocked.Add(ref Calls.CreateTask, + Interlocked.Add(ref calls_.CreateTask, 1); return Task.FromResult(new CreateTaskReply { @@ -51,7 +55,7 @@ public override async Task GetCommonData(DataRequest request, IServerStreamWriter responseStream, ServerCallContext context) { - Interlocked.Add(ref Calls.GetCommonData, + Interlocked.Add(ref calls_.GetCommonData, 1); await responseStream.WriteAsync(new DataReply { @@ -68,7 +72,7 @@ public override async Task GetDirectData(DataRequest request, IServerStreamWriter responseStream, ServerCallContext context) { - Interlocked.Add(ref Calls.GetDirectData, + Interlocked.Add(ref calls_.GetDirectData, 1); await responseStream.WriteAsync(new DataReply { @@ -85,7 +89,7 @@ public override async Task GetResourceData(DataRequest reques IServerStreamWriter responseStream, ServerCallContext context) { - Interlocked.Add(ref Calls.GetResourceData, + Interlocked.Add(ref calls_.GetResourceData, 1); await responseStream.WriteAsync(new DataReply { @@ -101,7 +105,7 @@ await responseStream.WriteAsync(new DataReply public override async Task SendResult(IAsyncStreamReader requestStream, ServerCallContext context) { - Interlocked.Add(ref Calls.SendResult, + Interlocked.Add(ref calls_.SendResult, 1); await foreach (var _ in requestStream.ReadAllAsync()) { @@ -117,7 +121,7 @@ public override async Task SendResult(IAsyncStreamReader re public override Task CreateResultsMetaData(CreateResultsMetaDataRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CreateResultsMetaData, + Interlocked.Add(ref calls_.CreateResultsMetaData, 1); return Task.FromResult(new CreateResultsMetaDataResponse @@ -130,7 +134,7 @@ public override Task CreateResultsMetaData(Create public override Task SubmitTasks(SubmitTasksRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.SubmitTasks, + Interlocked.Add(ref calls_.SubmitTasks, 1); return Task.FromResult(new SubmitTasksResponse @@ -143,7 +147,7 @@ public override Task SubmitTasks(SubmitTasksRequest request public override async Task UploadResultData(IAsyncStreamReader requestStream, ServerCallContext context) { - Interlocked.Add(ref Calls.UploadResultData, + Interlocked.Add(ref calls_.UploadResultData, 1); await foreach (var _ in requestStream.ReadAllAsync()) { @@ -160,7 +164,7 @@ public override async Task UploadResultData(IAsyncStre public override Task CreateResults(CreateResultsRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CreateResults, + Interlocked.Add(ref calls_.CreateResults, 1); return Task.FromResult(new CreateResultsResponse @@ -170,7 +174,7 @@ public override Task CreateResults(CreateResultsRequest r } - public struct CallCount + private struct CallCount : ICounter { public int CreateTask = 0; public int GetCommonData = 0; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs index 80acaaf6b..4e25e85ea 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs @@ -28,15 +28,19 @@ namespace ArmoniK.Api.Mock.Services; -public class ApplicationsService : Applications.ApplicationsBase +public class ApplicationsService : Applications.ApplicationsBase, ICountingService { - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// public override Task ListApplications(ListApplicationsRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.ListApplications, + Interlocked.Add(ref calls_.ListApplications, 1); return Task.FromResult(new ListApplicationsResponse { @@ -50,12 +54,12 @@ public override Task ListApplications(ListApplications public override Task CountTasksByStatus(CountTasksByStatusRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CountTasksByStatus, + Interlocked.Add(ref calls_.CountTasksByStatus, 1); return Task.FromResult(new CountTasksByStatusResponse()); } - public struct CallCount + private struct CallCount : ICounter { public int ListApplications = 0; public int CountTasksByStatus = 0; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs index 59e458359..3796fb960 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs @@ -28,16 +28,20 @@ namespace ArmoniK.Api.Mock.Services; -public class AuthService : Authentication.AuthenticationBase +public class AuthService : Authentication.AuthenticationBase, ICountingService { - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// public override Task GetCurrentUser(GetCurrentUserRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetCurrentUser, + Interlocked.Add(ref calls_.GetCurrentUser, 1); return Task.FromResult(new GetCurrentUserResponse { @@ -48,7 +52,7 @@ public override Task GetCurrentUser(GetCurrentUserReques }); } - public struct CallCount + private struct CallCount : ICounter { public int GetCurrentUser = 0; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs index 4af1326d5..618747f3c 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs @@ -29,9 +29,13 @@ namespace ArmoniK.Api.Mock.Services; -public class EventsService : Events.EventsBase +public class EventsService : Events.EventsBase, ICountingService { - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// @@ -39,7 +43,7 @@ public override async Task GetEvents(EventSubscriptionRequest IServerStreamWriter responseStream, ServerCallContext context) { - Interlocked.Add(ref Calls.GetEvents, + Interlocked.Add(ref calls_.GetEvents, 1); await responseStream.WriteAsync(new EventSubscriptionResponse { @@ -54,7 +58,7 @@ await responseStream.WriteAsync(new EventSubscriptionResponse .ConfigureAwait(false); } - public struct CallCount + private struct CallCount : ICounter { public int GetEvents = 0; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs index 8ae2f3a71..dc08f5dbc 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs @@ -28,15 +28,19 @@ namespace ArmoniK.Api.Mock.Services; -public class PartitionsService : Partitions.PartitionsBase +public class PartitionsService : Partitions.PartitionsBase, ICountingService { - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// public override Task GetPartition(GetPartitionRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetPartition, + Interlocked.Add(ref calls_.GetPartition, 1); return Task.FromResult(new GetPartitionResponse { @@ -56,7 +60,7 @@ public override Task GetPartition(GetPartitionRequest requ public override Task ListPartitions(ListPartitionsRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.ListPartitions, + Interlocked.Add(ref calls_.ListPartitions, 1); return Task.FromResult(new ListPartitionsResponse { @@ -66,7 +70,7 @@ public override Task ListPartitions(ListPartitionsReques }); } - public struct CallCount + private struct CallCount : ICounter { public int GetPartition = 0; public int ListPartitions = 0; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs index 0e0b2e69e..13b746b03 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs @@ -31,7 +31,7 @@ namespace ArmoniK.Api.Mock.Services; -public class ResultsService : Results.ResultsBase +public class ResultsService : Results.ResultsBase, ICountingService { private static readonly ResultRaw MockResult = new() { @@ -42,14 +42,18 @@ public class ResultsService : Results.ResultsBase OwnerTaskId = "owner-task-id", }; - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// public override Task GetOwnerTaskId(GetOwnerTaskIdRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetOwnerTaskId, + Interlocked.Add(ref calls_.GetOwnerTaskId, 1); return Task.FromResult(new GetOwnerTaskIdResponse { @@ -61,7 +65,7 @@ public override Task GetOwnerTaskId(GetOwnerTaskIdReques public override Task ListResults(ListResultsRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.ListResults, + Interlocked.Add(ref calls_.ListResults, 1); return Task.FromResult(new ListResultsResponse { @@ -75,7 +79,7 @@ public override Task ListResults(ListResultsRequest request public override Task CreateResultsMetaData(CreateResultsMetaDataRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CreateResultsMetaData, + Interlocked.Add(ref calls_.CreateResultsMetaData, 1); return Task.FromResult(new CreateResultsMetaDataResponse()); } @@ -84,7 +88,7 @@ public override Task CreateResultsMetaData(Create public override Task CreateResults(CreateResultsRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CreateResults, + Interlocked.Add(ref calls_.CreateResults, 1); return Task.FromResult(new CreateResultsResponse()); } @@ -93,7 +97,7 @@ public override Task CreateResults(CreateResultsRequest r public override Task DeleteResultsData(DeleteResultsDataRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.DeleteResultsData, + Interlocked.Add(ref calls_.DeleteResultsData, 1); return Task.FromResult(new DeleteResultsDataResponse { @@ -106,7 +110,7 @@ public override Task DownloadResultData(DownloadResultDataRequest IServerStreamWriter responseStream, ServerCallContext context) { - Interlocked.Add(ref Calls.DownloadResultData, + Interlocked.Add(ref calls_.DownloadResultData, 1); return Task.CompletedTask; } @@ -115,7 +119,7 @@ public override Task DownloadResultData(DownloadResultDataRequest public override Task GetServiceConfiguration(Empty request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetServiceConfiguration, + Interlocked.Add(ref calls_.GetServiceConfiguration, 1); return Task.FromResult(new ResultsServiceConfigurationResponse { @@ -128,7 +132,7 @@ public override Task GetServiceConfiguratio public override async Task UploadResultData(IAsyncStreamReader requestStream, ServerCallContext context) { - Interlocked.Add(ref Calls.UploadResultData, + Interlocked.Add(ref calls_.UploadResultData, 1); await foreach (var _ in requestStream.ReadAllAsync()) @@ -145,7 +149,7 @@ public override async Task UploadResultData(IAsyncStre public override Task GetResult(GetResultRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetResult, + Interlocked.Add(ref calls_.GetResult, 1); return Task.FromResult(new GetResultResponse @@ -154,7 +158,7 @@ public override Task GetResult(GetResultRequest request, }); } - public struct CallCount + private struct CallCount : ICounter { public int GetOwnerTaskId = 0; public int ListResults = 0; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs index 164344e08..49509cbd6 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs @@ -29,7 +29,7 @@ namespace ArmoniK.Api.Mock.Services; -public class SessionsService : Sessions.SessionsBase +public class SessionsService : Sessions.SessionsBase, ICountingService { private static readonly SessionRaw MockSession = new() { @@ -37,13 +37,17 @@ public class SessionsService : Sessions.SessionsBase Status = SessionStatus.Cancelled, }; - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// public override Task CancelSession(CancelSessionRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CancelSession, + Interlocked.Add(ref calls_.CancelSession, 1); return Task.FromResult(new CancelSessionResponse { @@ -55,7 +59,7 @@ public override Task CancelSession(CancelSessionRequest r public override Task GetSession(GetSessionRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetSession, + Interlocked.Add(ref calls_.GetSession, 1); return Task.FromResult(new GetSessionResponse { @@ -67,7 +71,7 @@ public override Task GetSession(GetSessionRequest request, public override Task ListSessions(ListSessionsRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.ListSessions, + Interlocked.Add(ref calls_.ListSessions, 1); return Task.FromResult(new ListSessionsResponse { @@ -81,12 +85,12 @@ public override Task ListSessions(ListSessionsRequest requ public override Task CountTasksByStatus(CountTasksByStatusRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CountTasksByStatus, + Interlocked.Add(ref calls_.CountTasksByStatus, 1); return Task.FromResult(new CountTasksByStatusResponse()); } - public struct CallCount + private struct CallCount : ICounter { public int CancelSession = 0; public int GetSession = 0; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs index 69407df8c..e2160f2a2 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs @@ -29,15 +29,19 @@ namespace ArmoniK.Api.Mock.Services; -public class SubmitterService : Submitter.SubmitterBase +public class SubmitterService : Submitter.SubmitterBase, ICountingService { - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// public override Task GetServiceConfiguration(Empty request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetServiceConfiguration, + Interlocked.Add(ref calls_.GetServiceConfiguration, 1); return Task.FromResult(new Configuration { @@ -49,7 +53,7 @@ public override Task GetServiceConfiguration(Empty re public override Task CancelSession(Session request, ServerCallContext context) { - Interlocked.Add(ref Calls.CancelSession, + Interlocked.Add(ref calls_.CancelSession, 1); return Task.FromResult(new Empty()); } @@ -58,7 +62,7 @@ public override Task CancelSession(Session request, public override Task CancelTasks(TaskFilter request, ServerCallContext context) { - Interlocked.Add(ref Calls.CancelTasks, + Interlocked.Add(ref calls_.CancelTasks, 1); return Task.FromResult(new Empty()); } @@ -67,7 +71,7 @@ public override Task CancelTasks(TaskFilter request, public override Task CreateSession(CreateSessionRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CreateSession, + Interlocked.Add(ref calls_.CreateSession, 1); return Task.FromResult(new CreateSessionReply { @@ -79,7 +83,7 @@ public override Task CreateSession(CreateSessionRequest requ public override Task CreateSmallTasks(CreateSmallTaskRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CreateSmallTasks, + Interlocked.Add(ref calls_.CreateSmallTasks, 1); return Task.FromResult(new CreateTaskReply { @@ -93,7 +97,7 @@ public override Task CreateSmallTasks(CreateSmallTaskRequest re public override async Task CreateLargeTasks(IAsyncStreamReader requestStream, ServerCallContext context) { - Interlocked.Add(ref Calls.CreateLargeTasks, + Interlocked.Add(ref calls_.CreateLargeTasks, 1); await foreach (var _ in requestStream.ReadAllAsync()) { @@ -110,7 +114,7 @@ public override async Task CreateLargeTasks(IAsyncStreamReader< public override Task CountTasks(TaskFilter request, ServerCallContext context) { - Interlocked.Add(ref Calls.CountTasks, + Interlocked.Add(ref calls_.CountTasks, 1); return Task.FromResult(new Count()); } @@ -120,7 +124,7 @@ public override async Task TryGetResultStream(ResultRequest r IServerStreamWriter responseStream, ServerCallContext context) { - Interlocked.Add(ref Calls.TryGetResultStream, + Interlocked.Add(ref calls_.TryGetResultStream, 1); await responseStream.WriteAsync(new ResultReply { @@ -136,7 +140,7 @@ await responseStream.WriteAsync(new ResultReply public override Task WaitForCompletion(WaitRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.WaitForCompletion, + Interlocked.Add(ref calls_.WaitForCompletion, 1); return Task.FromResult(new Count()); } @@ -145,7 +149,7 @@ public override Task WaitForCompletion(WaitRequest request, public override Task TryGetTaskOutput(TaskOutputRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.TryGetTaskOutput, + Interlocked.Add(ref calls_.TryGetTaskOutput, 1); return Task.FromResult(new Output { @@ -158,7 +162,7 @@ public override Task TryGetTaskOutput(TaskOutputRequest request, public override Task WaitForAvailability(ResultRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.WaitForAvailability, + Interlocked.Add(ref calls_.WaitForAvailability, 1); return Task.FromResult(new AvailabilityReply { @@ -170,7 +174,7 @@ public override Task WaitForAvailability(ResultRequest re public override Task GetTaskStatus(GetTaskStatusRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetTaskStatus, + Interlocked.Add(ref calls_.GetTaskStatus, 1); return Task.FromResult(new GetTaskStatusReply()); } @@ -180,7 +184,7 @@ public override Task GetTaskStatus(GetTaskStatusRequest requ public override Task GetResultStatus(GetResultStatusRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetResultStatus, + Interlocked.Add(ref calls_.GetResultStatus, 1); return Task.FromResult(new GetResultStatusReply()); } @@ -189,7 +193,7 @@ public override Task GetResultStatus(GetResultStatusReques public override Task ListTasks(TaskFilter request, ServerCallContext context) { - Interlocked.Add(ref Calls.ListTasks, + Interlocked.Add(ref calls_.ListTasks, 1); return Task.FromResult(new TaskIdList()); @@ -199,7 +203,7 @@ public override Task ListTasks(TaskFilter request, public override Task ListSessions(SessionFilter request, ServerCallContext context) { - Interlocked.Add(ref Calls.ListSessions, + Interlocked.Add(ref calls_.ListSessions, 1); return Task.FromResult(new SessionIdList()); } @@ -219,7 +223,7 @@ await responseStream.WriteAsync(new WatchResultStream } } - public struct CallCount + private struct CallCount : ICounter { public int GetServiceConfiguration = 0; public int CancelSession = 0; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs index 444025129..1eb276447 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs @@ -33,7 +33,7 @@ namespace ArmoniK.Api.Mock.Services; -public class TasksService : Tasks.TasksBase +public class TasksService : Tasks.TasksBase, ICountingService { private static readonly TaskRaw MockTask = new() { @@ -57,14 +57,18 @@ public class TasksService : Tasks.TasksBase }, }; - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// public override Task GetTask(GetTaskRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetTask, + Interlocked.Add(ref calls_.GetTask, 1); return Task.FromResult(new GetTaskResponse { @@ -76,7 +80,7 @@ public override Task GetTask(GetTaskRequest request, public override Task ListTasks(ListTasksRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.ListTasks, + Interlocked.Add(ref calls_.ListTasks, 1); return Task.FromResult(new ListTasksResponse { @@ -90,7 +94,7 @@ public override Task ListTasks(ListTasksRequest request, public override Task GetResultIds(GetResultIdsRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.GetResultIds, + Interlocked.Add(ref calls_.GetResultIds, 1); return Task.FromResult(new GetResultIdsResponse()); } @@ -99,7 +103,7 @@ public override Task GetResultIds(GetResultIdsRequest requ public override Task CancelTasks(CancelTasksRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CancelTasks, + Interlocked.Add(ref calls_.CancelTasks, 1); return Task.FromResult(new CancelTasksResponse()); } @@ -108,7 +112,7 @@ public override Task CancelTasks(CancelTasksRequest request public override Task CountTasksByStatus(CountTasksByStatusRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.CountTasksByStatus, + Interlocked.Add(ref calls_.CountTasksByStatus, 1); return Task.FromResult(new CountTasksByStatusResponse()); } @@ -117,7 +121,7 @@ public override Task CountTasksByStatus(CountTasksBy public override Task ListTasksRaw(ListTasksRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.ListTasksRaw, + Interlocked.Add(ref calls_.ListTasksRaw, 1); return Task.FromResult(new ListTasksRawResponse { @@ -131,12 +135,12 @@ public override Task ListTasksRaw(ListTasksRequest reques public override Task SubmitTasks(SubmitTasksRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.SubmitTasks, + Interlocked.Add(ref calls_.SubmitTasks, 1); return Task.FromResult(new SubmitTasksResponse()); } - public struct CallCount + private struct CallCount : ICounter { public int GetTask = 0; public int ListTasks = 0; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs index 43abe34e9..f188c0733 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs @@ -28,19 +28,23 @@ namespace ArmoniK.Api.Mock.Services; -public class VersionsService : Versions.VersionsBase +public class VersionsService : Versions.VersionsBase, ICountingService { private static readonly string ApiVersion = typeof(Versions.VersionsBase).Assembly.GetName() .Version!.ToString(); - public CallCount Calls = new(); + private CallCount calls_ = new(); + + /// + public ICounter GetCounter() + => calls_; /// public override Task ListVersions(ListVersionsRequest request, ServerCallContext context) { - Interlocked.Add(ref Calls.ListVersions, + Interlocked.Add(ref calls_.ListVersions, 1); return Task.FromResult(new ListVersionsResponse { @@ -49,7 +53,7 @@ public override Task ListVersions(ListVersionsRequest requ }); } - public struct CallCount + private struct CallCount : ICounter { public int ListVersions = 0; From 38bb065b516c25251023c49853d066bbf81972de Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 11 Aug 2023 16:15:41 +0000 Subject: [PATCH 004/344] chore(deps): update docs npm packages --- .docs/package.json | 8 +- .docs/pnpm-lock.yaml | 1696 +++++++++++++++++++++++++++--------------- 2 files changed, 1116 insertions(+), 588 deletions(-) diff --git a/.docs/package.json b/.docs/package.json index a7e7e54bb..1909290d7 100644 --- a/.docs/package.json +++ b/.docs/package.json @@ -2,7 +2,7 @@ "name": "armonik-api-docs", "version": "0.1.0", "private": true, - "packageManager": "pnpm@8.6.5", + "packageManager": "pnpm@8.6.12", "scripts": { "prepare": "nuxi prepare", "dev": "nuxi dev", @@ -15,13 +15,13 @@ "lint:md:fix": "markdownlint . --fix && case-police --fix ./**/*.md" }, "dependencies": { - "@aneoconsultingfr/armonik-docs-theme": "^0.6.12", - "nuxt": "^3.6.1" + "@aneoconsultingfr/armonik-docs-theme": "^0.6.13", + "nuxt": "^3.6.5" }, "devDependencies": { "@nuxtjs/eslint-config-typescript": "^12.0.0", "case-police": "^0.6.1", - "eslint": "^8.44.0", + "eslint": "^8.47.0", "markdownlint-cli": "^0.35.0" } } diff --git a/.docs/pnpm-lock.yaml b/.docs/pnpm-lock.yaml index 9b8a3262a..5e55d0eab 100644 --- a/.docs/pnpm-lock.yaml +++ b/.docs/pnpm-lock.yaml @@ -6,22 +6,22 @@ settings: dependencies: '@aneoconsultingfr/armonik-docs-theme': - specifier: ^0.6.12 - version: 0.6.12(@types/node@18.15.3)(@unhead/vue@1.1.28)(eslint@8.44.0)(postcss@8.4.24)(rollup@3.25.1)(typescript@5.0.4)(vite@4.3.9)(vue@3.3.4) + specifier: ^0.6.13 + version: 0.6.13(@types/node@18.15.3)(@unhead/vue@1.1.28)(eslint@8.47.0)(postcss@8.4.24)(rollup@3.25.1)(typescript@5.0.4)(vite@4.3.9)(vue@3.3.4) nuxt: - specifier: ^3.6.1 - version: 3.6.1(@types/node@18.15.3)(eslint@8.44.0)(rollup@3.25.1)(typescript@5.0.4) + specifier: ^3.6.5 + version: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) devDependencies: '@nuxtjs/eslint-config-typescript': specifier: ^12.0.0 - version: 12.0.0(eslint@8.44.0)(typescript@5.0.4) + version: 12.0.0(eslint@8.47.0)(typescript@5.0.4) case-police: specifier: ^0.6.1 version: 0.6.1 eslint: - specifier: ^8.44.0 - version: 8.44.0 + specifier: ^8.47.0 + version: 8.47.0 markdownlint-cli: specifier: ^0.35.0 version: 0.35.0 @@ -40,14 +40,15 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: false - /@aneoconsultingfr/armonik-docs-theme@0.6.12(@types/node@18.15.3)(@unhead/vue@1.1.28)(eslint@8.44.0)(postcss@8.4.24)(rollup@3.25.1)(typescript@5.0.4)(vite@4.3.9)(vue@3.3.4): - resolution: {integrity: sha512-jvurHffr7TukP7GuCQKnHt3lSPQVviZ3ROBMI9hz1T7Hxh5wPyi+sOSbkl8HolUe6frbCaGCRgKm02VyTF3EKw==} + /@aneoconsultingfr/armonik-docs-theme@0.6.13(@types/node@18.15.3)(@unhead/vue@1.1.28)(eslint@8.47.0)(postcss@8.4.24)(rollup@3.25.1)(typescript@5.0.4)(vite@4.3.9)(vue@3.3.4): + resolution: {integrity: sha512-jXLDJFFC7zeDi8zvRnus5Qe35gS3kRzt5JrSLA6enAgnt8waTg7Yo5vLRpSQwPdX8Yn5ZlbtG7qSBNDzRE19zA==} dependencies: - '@nuxt-themes/docus': 1.12.3(nuxt@3.6.1)(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) - '@nuxt/devtools': 0.6.4(nuxt@3.6.1)(rollup@3.25.1)(vite@4.3.9) - mermaid: 10.2.3 - nuxt: 3.6.1(@types/node@18.15.3)(eslint@8.44.0)(rollup@3.25.1)(typescript@5.0.4) + '@nuxt-themes/docus': 1.14.6(nuxt@3.6.5)(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) + '@nuxt/devtools': 0.7.6(nuxt@3.6.5)(rollup@3.25.1)(vite@4.3.9) + mermaid: 10.3.1 + nuxt: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) nuxt-seo-kit: 1.3.9(@unhead/vue@1.1.28)(rollup@3.25.1)(vue@3.3.4) + playwright: 1.37.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -55,6 +56,7 @@ packages: - '@azure/identity' - '@azure/keyvault-secrets' - '@azure/storage-blob' + - '@capacitor/preferences' - '@parcel/watcher' - '@planetscale/database' - '@types/node' @@ -62,23 +64,33 @@ packages: - '@upstash/redis' - '@vercel/kv' - '@vue/composition-api' + - async-validator + - axios - bluebird - bufferutil + - change-case - debug + - drauu - encoding - eslint + - idb-keyval + - jwt-decode - less - meow + - nprogress - optionator - postcss + - qrcode - rollup - sass + - sortablejs - stylelint - stylus - sugarss - supports-color - terser - typescript + - universal-cookie - utf-8-validate - vite - vls @@ -91,6 +103,10 @@ packages: resolution: {integrity: sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==} dev: false + /@antfu/utils@0.7.5: + resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==} + dev: false + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} @@ -277,11 +293,6 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} @@ -310,6 +321,14 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/parser@7.22.10: + resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: false + /@babel/parser@7.22.5: resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} engines: {node: '>=6.0.0'} @@ -468,8 +487,8 @@ packages: dev: false optional: true - /@esbuild/android-arm64@0.18.10: - resolution: {integrity: sha512-ynm4naLbNbK0ajf9LUWtQB+6Vfg1Z/AplArqr4tGebC00Z6m9Y91OVIcjDa461wGcZwcaHYaZAab4yJxfhisTQ==} + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -486,8 +505,8 @@ packages: dev: false optional: true - /@esbuild/android-arm@0.18.10: - resolution: {integrity: sha512-3KClmVNd+Fku82uZJz5C4Rx8m1PPmWUFz5Zkw8jkpZPOmsq+EG1TTOtw1OXkHuX3WczOFQigrtf60B1ijKwNsg==} + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -504,8 +523,8 @@ packages: dev: false optional: true - /@esbuild/android-x64@0.18.10: - resolution: {integrity: sha512-vFfXj8P9Yfjh54yqUDEHKzqzYuEfPyAOl3z7R9hjkwt+NCvbn9VMxX+IILnAfdImRBfYVItgSUsqGKhJFnBwZw==} + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -522,8 +541,8 @@ packages: dev: false optional: true - /@esbuild/darwin-arm64@0.18.10: - resolution: {integrity: sha512-k2OJQ7ZxE6sVc91+MQeZH9gFeDAH2uIYALPAwTjTCvcPy9Dzrf7V7gFUQPYkn09zloWhQ+nvxWHia2x2ZLR0sQ==} + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -540,8 +559,8 @@ packages: dev: false optional: true - /@esbuild/darwin-x64@0.18.10: - resolution: {integrity: sha512-tnz/mdZk1L1Z3WpGjin/L2bKTe8/AKZpI8fcCLtH+gq8WXWsCNJSxlesAObV4qbtTl6pG5vmqFXfWUQ5hV8PAQ==} + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -558,8 +577,8 @@ packages: dev: false optional: true - /@esbuild/freebsd-arm64@0.18.10: - resolution: {integrity: sha512-QJluV0LwBrbHnYYwSKC+K8RGz0g/EyhpQH1IxdoFT0nM7PfgjE+aS8wxq/KFEsU0JkL7U/EEKd3O8xVBxXb2aA==} + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -576,8 +595,8 @@ packages: dev: false optional: true - /@esbuild/freebsd-x64@0.18.10: - resolution: {integrity: sha512-Hi/ycUkS6KTw+U9G5PK5NoK7CZboicaKUSVs0FSiPNtuCTzK6HNM4DIgniH7hFaeuszDS9T4dhAHWiLSt/Y5Ng==} + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -594,8 +613,8 @@ packages: dev: false optional: true - /@esbuild/linux-arm64@0.18.10: - resolution: {integrity: sha512-Nz6XcfRBOO7jSrVpKAyEyFOPGhySPNlgumSDhWAspdQQ11ub/7/NZDMhWDFReE9QH/SsCOCLQbdj0atAk/HMOQ==} + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -612,8 +631,8 @@ packages: dev: false optional: true - /@esbuild/linux-arm@0.18.10: - resolution: {integrity: sha512-HfFoxY172tVHPIvJy+FHxzB4l8xU7e5cxmNS11cQ2jt4JWAukn/7LXaPdZid41UyTweqa4P/1zs201gRGCTwHw==} + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -630,8 +649,8 @@ packages: dev: false optional: true - /@esbuild/linux-ia32@0.18.10: - resolution: {integrity: sha512-otMdmSmkMe+pmiP/bZBjfphyAsTsngyT9RCYwoFzqrveAbux9nYitDTpdgToG0Z0U55+PnH654gCH2GQ1aB6Yw==} + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -648,8 +667,8 @@ packages: dev: false optional: true - /@esbuild/linux-loong64@0.18.10: - resolution: {integrity: sha512-t8tjFuON1koxskzQ4VFoh0T5UDUMiLYjwf9Wktd0tx8AoK6xgU+5ubKOpWpcnhEQ2tESS5u0v6QuN8PX/ftwcQ==} + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -666,8 +685,8 @@ packages: dev: false optional: true - /@esbuild/linux-mips64el@0.18.10: - resolution: {integrity: sha512-+dUkcVzcfEJHz3HEnVpIJu8z8Wdn2n/nWMWdl6FVPFGJAVySO4g3+XPzNKFytVFwf8hPVDwYXzVcu8GMFqsqZw==} + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -684,8 +703,8 @@ packages: dev: false optional: true - /@esbuild/linux-ppc64@0.18.10: - resolution: {integrity: sha512-sO3PjjxEGy+PY2qkGe2gwJbXdZN9wAYpVBZWFD0AwAoKuXRkWK0/zaMQ5ekUFJDRDCRm8x5U0Axaub7ynH/wVg==} + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -702,8 +721,8 @@ packages: dev: false optional: true - /@esbuild/linux-riscv64@0.18.10: - resolution: {integrity: sha512-JDtdbJg3yjDeXLv4lZYE1kiTnxv73/8cbPHY9T/dUKi8rYOM/k5b3W4UJLMUksuQ6nTm5c89W1nADsql6FW75A==} + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -720,8 +739,8 @@ packages: dev: false optional: true - /@esbuild/linux-s390x@0.18.10: - resolution: {integrity: sha512-NLuSKcp8WckjD2a7z5kzLiCywFwBTMlIxDNuud1AUGVuwBBJSkuubp6cNjJ0p5c6CZaA3QqUGwjHJBiG1SoOFw==} + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -738,8 +757,8 @@ packages: dev: false optional: true - /@esbuild/linux-x64@0.18.10: - resolution: {integrity: sha512-wj2KRsCsFusli+6yFgNO/zmmLslislAWryJnodteRmGej7ZzinIbMdsyp13rVGde88zxJd5vercNYK9kuvlZaQ==} + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -756,8 +775,8 @@ packages: dev: false optional: true - /@esbuild/netbsd-x64@0.18.10: - resolution: {integrity: sha512-pQ9QqxEPI3cVRZyUtCoZxhZK3If+7RzR8L2yz2+TDzdygofIPOJFaAPkEJ5rYIbUO101RaiYxfdOBahYexLk5A==} + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -774,8 +793,8 @@ packages: dev: false optional: true - /@esbuild/openbsd-x64@0.18.10: - resolution: {integrity: sha512-k8GTIIW9I8pEEfoOUm32TpPMgSg06JhL5DO+ql66aLTkOQUs0TxCA67Wi7pv6z8iF8STCGcNbm3UWFHLuci+ag==} + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -792,8 +811,8 @@ packages: dev: false optional: true - /@esbuild/sunos-x64@0.18.10: - resolution: {integrity: sha512-vIGYJIdEI6d4JBucAx8py792G8J0GP40qSH+EvSt80A4zvGd6jph+5t1g+eEXcS2aRpgZw6CrssNCFZxTdEsxw==} + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -810,8 +829,8 @@ packages: dev: false optional: true - /@esbuild/win32-arm64@0.18.10: - resolution: {integrity: sha512-kRhNcMZFGMW+ZHCarAM1ypr8OZs0k688ViUCetVCef9p3enFxzWeBg9h/575Y0nsFu0ZItluCVF5gMR2pwOEpA==} + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -828,8 +847,8 @@ packages: dev: false optional: true - /@esbuild/win32-ia32@0.18.10: - resolution: {integrity: sha512-AR9PX1whYaYh9p0EOaKna0h48F/A101Mt/ag72+kMkkBZXPQ7cjbz2syXI/HI3OlBdUytSdHneljfjvUoqwqiQ==} + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -846,8 +865,8 @@ packages: dev: false optional: true - /@esbuild/win32-x64@0.18.10: - resolution: {integrity: sha512-5sTkYhAGHNRr6bVf4RM0PsscqVr6/DBYdrlMh168oph3usid3lKHcHEEHmr34iZ9GHeeg2juFOxtpl6XyC3tpw==} + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -855,26 +874,31 @@ packages: dev: false optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.44.0 - eslint-visitor-keys: 3.4.1 + eslint: 8.47.0 + eslint-visitor-keys: 3.4.3 /@eslint-community/regexpp@4.5.1: resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint-community/regexpp@4.6.2: + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc@2.1.0: - resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.6.0 + espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -884,8 +908,8 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.44.0: - resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + /@eslint/js@8.47.0: + resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@gar/promisify@1.1.3: @@ -985,6 +1009,10 @@ packages: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: false + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: @@ -1040,14 +1068,14 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.3 + semver: 7.5.4 dev: false /@npmcli/fs@3.1.0: resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.3 + semver: 7.5.4 dev: false /@npmcli/git@4.0.4: @@ -1060,7 +1088,7 @@ packages: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.3 + semver: 7.5.4 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -1110,15 +1138,18 @@ packages: - supports-color dev: false - /@nuxt-themes/docus@1.12.3(nuxt@3.6.1)(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-qIdBUnwm/5OEhKtFJ3of+C5HEZzOU/wFx9CuY+Y3jdZVVJcDGjryLY+I1R/N9U+KuS32QevzAY9vJrdJNf8u9A==} + /@nuxt-themes/docus@1.14.6(nuxt@3.6.5)(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4): + resolution: {integrity: sha512-tkSG7j0jhVo53wEpK9V48hIvaK0XEzVU64hXhFfnIMv6LJu99cKOC//boebPbN9qLbJmkBdo4IAIJ0tN5MD0qw==} dependencies: '@nuxt-themes/elements': 0.9.4(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) '@nuxt-themes/tokens': 1.9.1(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) '@nuxt-themes/typography': 0.11.0(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) - '@nuxt/content': 2.6.0(rollup@3.25.1) - '@nuxthq/studio': 0.13.2(rollup@3.25.1) - '@vueuse/nuxt': 10.1.2(nuxt@3.6.1)(rollup@3.25.1)(vue@3.3.4) + '@nuxt/content': 2.7.2(rollup@3.25.1) + '@nuxthq/studio': 0.13.4(rollup@3.25.1) + '@vueuse/integrations': 10.3.0(focus-trap@7.5.2)(fuse.js@6.6.2)(vue@3.3.4) + '@vueuse/nuxt': 10.3.0(nuxt@3.6.5)(rollup@3.25.1)(vue@3.3.4) + focus-trap: 7.5.2 + fuse.js: 6.6.2 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -1126,16 +1157,27 @@ packages: - '@azure/identity' - '@azure/keyvault-secrets' - '@azure/storage-blob' + - '@capacitor/preferences' - '@planetscale/database' - '@upstash/redis' - '@vercel/kv' - '@vue/composition-api' + - async-validator + - axios - bufferutil + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress - nuxt - postcss + - qrcode - rollup - sass + - sortablejs - supports-color + - universal-cookie - utf-8-validate - vue dev: false @@ -1185,43 +1227,44 @@ packages: - vue dev: false - /@nuxt/content@2.6.0(rollup@3.25.1): - resolution: {integrity: sha512-iwZ5NY6m2MNBAFaRp5OSjRdd+vk/XFbBqN0wtmpFtcoYHyzpUxy2fU38KWnXXmgP7Vi4mFOJ8SExZnL0cdlEtQ==} + /@nuxt/content@2.7.2(rollup@3.25.1): + resolution: {integrity: sha512-fP0nrnyjtFbluKltKUtC7jSMFc1xAH+bwweZyLwXb3gkIap2EHlVL+e9ptGt39+4HIkRkLgME7TNr/fUO+CHug==} dependencies: - '@nuxt/kit': 3.4.1(rollup@3.25.1) - consola: 3.1.0 + '@nuxt/kit': 3.6.5(rollup@3.25.1) + consola: 3.2.3 defu: 6.1.2 - destr: 1.2.2 + destr: 2.0.0 detab: 3.0.2 json5: 2.2.3 knitwork: 1.0.0 - listhen: 1.0.4 + listhen: 1.2.2 mdast-util-to-hast: 12.3.0 mdurl: 1.0.1 ohash: 1.1.2 pathe: 1.1.1 property-information: 6.2.0 - rehype-external-links: 2.0.1 + rehype-external-links: 2.1.0 rehype-raw: 6.1.1 rehype-slug: 5.1.0 rehype-sort-attribute-values: 4.0.0 rehype-sort-attributes: 4.0.0 - remark-emoji: 3.1.1 + remark-emoji: 3.1.2 remark-gfm: 3.0.1 remark-mdc: 1.1.3 - remark-parse: 10.0.1 + remark-parse: 10.0.2 remark-rehype: 10.1.0 remark-squeeze-paragraphs: 5.0.1 scule: 1.0.0 - shiki-es: 0.2.0 + shiki-es: 0.14.0 slugify: 1.6.6 - socket.io-client: 4.6.1 + socket.io-client: 4.7.2 ufo: 1.1.2 unified: 10.1.2 - unist-builder: 3.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - unstorage: 1.7.0 + unist-builder: 4.0.0 + unist-util-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + unstorage: 1.9.0 ws: 8.13.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -1230,10 +1273,12 @@ packages: - '@azure/identity' - '@azure/keyvault-secrets' - '@azure/storage-blob' + - '@capacitor/preferences' - '@planetscale/database' - '@upstash/redis' - '@vercel/kv' - bufferutil + - idb-keyval - rollup - supports-color - utf-8-validate @@ -1243,78 +1288,79 @@ packages: resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} dev: false - /@nuxt/devtools-kit@0.6.4(nuxt@3.6.1)(rollup@3.25.1)(vite@4.3.9): - resolution: {integrity: sha512-+NSTULmKIECVBzAmk2/LnzJnUv1hIzkRmtBSPwNTyaHe6KEU45eq32/4OdjlM/Nw4ucc2w7CSbATptcR7lnWVw==} + /@nuxt/devtools-kit@0.7.6(nuxt@3.6.5)(rollup@3.25.1)(vite@4.3.9): + resolution: {integrity: sha512-2jSQ1rgStZifRHtfsdqmmvq/O5NskLCwg34JPchBRAx9Kv5IadABlBIWz1jLuaGarI/jsEEAmA5EpfxI5z/PJQ==} peerDependencies: - nuxt: ^3.5.1 + nuxt: ^3.6.5 vite: '*' dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) - '@nuxt/schema': 3.6.1(rollup@3.25.1) - execa: 7.1.1 - nuxt: 3.6.1(@types/node@18.15.3)(eslint@8.44.0)(rollup@3.25.1)(typescript@5.0.4) + '@nuxt/kit': 3.6.5(rollup@3.25.1) + '@nuxt/schema': 3.6.5(rollup@3.25.1) + execa: 7.2.0 + nuxt: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) vite: 4.3.9(@types/node@18.15.3) transitivePeerDependencies: - rollup - supports-color dev: false - /@nuxt/devtools-wizard@0.6.4: - resolution: {integrity: sha512-bWRs64ThCAPvBpKUi5adIiW1caBMQRL+A142P0cPYf1B4x9ie44VuydGlfdELrshdMiOT8xse+G6Uwoy8Yt03Q==} + /@nuxt/devtools-wizard@0.7.6: + resolution: {integrity: sha512-XCznlUTk66ApYJygGc+6FVborAp2F4PAIvY4b6dVSUf1f47Hs3CPe6eEdatarmEqiTmFMInaX4y8z1hDXrFF0Q==} hasBin: true dependencies: - consola: 3.1.0 + consola: 3.2.3 diff: 5.1.0 - execa: 7.1.1 + execa: 7.2.0 global-dirs: 3.0.1 - magicast: 0.2.9 + magicast: 0.2.10 pathe: 1.1.1 picocolors: 1.0.0 pkg-types: 1.0.3 prompts: 2.4.2 rc9: 2.1.1 - semver: 7.5.3 + semver: 7.5.4 dev: false - /@nuxt/devtools@0.6.4(nuxt@3.6.1)(rollup@3.25.1)(vite@4.3.9): - resolution: {integrity: sha512-Sn+yUMylI0ccpk0v2qfNCVmYMdduHrzLy6GyDZRDN/e0gxzAZqeHZfFD433KuND6cyvcvJ7GFVjlBz+6gYERWA==} + /@nuxt/devtools@0.7.6(nuxt@3.6.5)(rollup@3.25.1)(vite@4.3.9): + resolution: {integrity: sha512-2x/eS0KbzTCK4+OozSZTcbjndM2ySy84MltF/suwLP7Wp/ehY8vzRp+yMTksxLjsf0sbiAa4K8WJCzKd8wLXxA==} hasBin: true peerDependencies: - nuxt: ^3.5.1 + nuxt: ^3.6.5 vite: '*' dependencies: - '@nuxt/devtools-kit': 0.6.4(nuxt@3.6.1)(rollup@3.25.1)(vite@4.3.9) - '@nuxt/devtools-wizard': 0.6.4 - '@nuxt/kit': 3.6.1(rollup@3.25.1) + '@nuxt/devtools-kit': 0.7.6(nuxt@3.6.5)(rollup@3.25.1)(vite@4.3.9) + '@nuxt/devtools-wizard': 0.7.6 + '@nuxt/kit': 3.6.5(rollup@3.25.1) birpc: 0.2.12 - boxen: 7.1.0 - consola: 3.1.0 - execa: 7.1.1 + boxen: 7.1.1 + consola: 3.2.3 + error-stack-parser-es: 0.1.0 + execa: 7.2.0 fast-folder-size: 2.1.0 - fast-glob: 3.2.12 + fast-glob: 3.3.1 get-port-please: 3.0.1 global-dirs: 3.0.1 - h3: 1.7.0 + h3: 1.7.1 hookable: 5.5.3 image-meta: 0.1.1 is-installed-globally: 0.4.0 launch-editor: 2.6.0 local-pkg: 0.4.3 - magicast: 0.2.9 - nuxt: 3.6.1(@types/node@18.15.3)(eslint@8.44.0)(rollup@3.25.1)(typescript@5.0.4) - nypm: 0.2.1 + magicast: 0.2.10 + nuxt: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) + nypm: 0.2.2 pacote: 15.2.0 pathe: 1.1.1 perfect-debounce: 1.0.0 picocolors: 1.0.0 pkg-types: 1.0.3 rc9: 2.1.1 - semver: 7.5.3 + semver: 7.5.4 sirv: 2.0.3 - unimport: 3.0.10(rollup@3.25.1) + unimport: 3.1.3(rollup@3.25.1) vite: 4.3.9(@types/node@18.15.3) - vite-plugin-inspect: 0.7.29(rollup@3.25.1)(vite@4.3.9) - vite-plugin-vue-inspector: 3.4.2(vite@4.3.9) + vite-plugin-inspect: 0.7.36(@nuxt/kit@3.6.5)(rollup@3.25.1)(vite@4.3.9) + vite-plugin-vue-inspector: 3.6.0(vite@4.3.9) wait-on: 7.0.1 which: 3.0.1 ws: 8.13.0 @@ -1407,6 +1453,32 @@ packages: - supports-color dev: false + /@nuxt/kit@3.6.5(rollup@3.25.1): + resolution: {integrity: sha512-uBI5I2Zx6sk+vRHU+nBmifwxg/nyXCGZ1g5hUKrUfgv1ZfiKB8JkN5T9iRoduDOaqbwM6XSnEl1ja73iloDcrw==} + engines: {node: ^14.18.0 || >=16.10.0} + dependencies: + '@nuxt/schema': 3.6.5(rollup@3.25.1) + c12: 1.4.2 + consola: 3.2.3 + defu: 6.1.2 + globby: 13.2.2 + hash-sum: 2.0.0 + ignore: 5.2.4 + jiti: 1.19.1 + knitwork: 1.0.0 + mlly: 1.4.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + scule: 1.0.0 + semver: 7.5.3 + unctx: 2.3.1 + unimport: 3.1.3(rollup@3.25.1) + untyped: 1.3.2 + transitivePeerDependencies: + - rollup + - supports-color + dev: false + /@nuxt/schema@3.4.1(rollup@3.25.1): resolution: {integrity: sha512-xhPh9JfVKXRQVfdUT6BKieDTCljBjbIGgGCQnxplVi4FUTWRKUXR7MFwsobr5D9AJpeE0mg5/kRRh5gUX37vAQ==} engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} @@ -1465,28 +1537,46 @@ packages: - supports-color dev: false - /@nuxt/telemetry@2.2.0(rollup@3.25.1): - resolution: {integrity: sha512-Z2UmPkBy5WjxvHKuUcl1X6vKWnIyWSP+9UGde1F+MzzZxYgAQybFud1uL2B3KCowxZdoqT1hd2WklV7EtyCwrQ==} + /@nuxt/schema@3.6.5(rollup@3.25.1): + resolution: {integrity: sha512-UPUnMB0W5TZ/Pi1fiF71EqIsPlj8LGZqzhSf8wOeh538KHwxbA9r7cuvEUU92eXRksOZaylbea3fJxZWhOITVw==} + engines: {node: ^14.18.0 || >=16.10.0} + dependencies: + defu: 6.1.2 + hookable: 5.5.3 + pathe: 1.1.1 + pkg-types: 1.0.3 + postcss-import-resolver: 2.0.0 + std-env: 3.3.3 + ufo: 1.1.2 + unimport: 3.1.3(rollup@3.25.1) + untyped: 1.3.2 + transitivePeerDependencies: + - rollup + - supports-color + dev: false + + /@nuxt/telemetry@2.4.1(rollup@3.25.1): + resolution: {integrity: sha512-Cj+4sXjO5pZNW2sX7Y+djYpf4pZwgYF3rV/YHLWIOq9nAjo2UcDXjh1z7qnhkoUkvJN3lHnvhnCNhfAioe6k/A==} hasBin: true dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) - chalk: 5.2.0 + '@nuxt/kit': 3.6.5(rollup@3.25.1) + chalk: 5.3.0 ci-info: 3.8.0 - consola: 3.1.0 + consola: 3.2.3 create-require: 1.1.1 defu: 6.1.2 - destr: 1.2.2 - dotenv: 16.0.3 - fs-extra: 10.1.0 + destr: 2.0.0 + dotenv: 16.3.1 + fs-extra: 11.1.1 git-url-parse: 13.1.0 - inquirer: 9.2.2 is-docker: 3.0.0 - jiti: 1.18.2 + jiti: 1.19.1 mri: 1.2.0 nanoid: 4.0.2 node-fetch: 3.3.1 ofetch: 1.1.1 parse-git-config: 3.0.0 + pathe: 1.1.1 rc9: 2.1.1 std-env: 3.3.3 transitivePeerDependencies: @@ -1498,30 +1588,30 @@ packages: resolution: {integrity: sha512-MSZza7dxccNb/p7nuzGF8/m4POaFpHzVhNdR7f4xahOpH7Ja02lFeYR+rHtoHIJC0yym4qriqv0mQ+Qf/R61bQ==} dev: false - /@nuxt/vite-builder@3.6.1(@types/node@18.15.3)(eslint@8.44.0)(rollup@3.25.1)(typescript@5.0.4)(vue@3.3.4): - resolution: {integrity: sha512-KKYSPtizNe5y3gDBBpKRr0xxcs2mCzq8LfCNxbRvYzqjIdWPfTH7elTwfZoxh+kIHQ73yXq4HlKP3F8W40ylmg==} + /@nuxt/vite-builder@3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4)(vue@3.3.4): + resolution: {integrity: sha512-pwSpt257ApCp3XWUs8vrC7X9QHeHUv5PbbIR3+5w0n5f95XPNOQWDJa2fTPX/H6oaRJCPYAsBPqiQhQ7qW/NZQ==} engines: {node: ^14.18.0 || >=16.10.0} peerDependencies: vue: ^3.3.4 dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) + '@nuxt/kit': 3.6.5(rollup@3.25.1) '@rollup/plugin-replace': 5.0.2(rollup@3.25.1) '@vitejs/plugin-vue': 4.2.3(vite@4.3.9)(vue@3.3.4) '@vitejs/plugin-vue-jsx': 3.0.1(vite@4.3.9)(vue@3.3.4) autoprefixer: 10.4.14(postcss@8.4.24) clear: 0.1.0 - consola: 3.1.0 + consola: 3.2.3 cssnano: 6.0.1(postcss@8.4.24) defu: 6.1.2 - esbuild: 0.18.10 + esbuild: 0.18.20 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 externality: 1.0.2 fs-extra: 11.1.1 get-port-please: 3.0.1 - h3: 1.7.0 + h3: 1.7.1 knitwork: 1.0.0 - magic-string: 0.30.0 + magic-string: 0.30.2 mlly: 1.4.0 ohash: 1.1.2 pathe: 1.1.1 @@ -1534,10 +1624,10 @@ packages: std-env: 3.3.3 strip-literal: 1.0.1 ufo: 1.1.2 - unplugin: 1.3.1 + unplugin: 1.4.0 vite: 4.3.9(@types/node@18.15.3) - vite-node: 0.32.2(@types/node@18.15.3) - vite-plugin-checker: 0.6.1(eslint@8.44.0)(typescript@5.0.4)(vite@4.3.9) + vite-node: 0.33.0(@types/node@18.15.3) + vite-plugin-checker: 0.6.1(eslint@8.47.0)(typescript@5.0.4)(vite@4.3.9) vue: 3.3.4 vue-bundle-renderer: 1.0.3 transitivePeerDependencies: @@ -1559,8 +1649,8 @@ packages: - vue-tsc dev: false - /@nuxthq/studio@0.13.2(rollup@3.25.1): - resolution: {integrity: sha512-lSjMDSq0yxX3I3O8EVJWoU+kA9iEwUuTS1sZfyha625FhiU2qDIGGkc7gEeA1ubBNeZmJMXTl2hIauxOVTSfgQ==} + /@nuxthq/studio@0.13.4(rollup@3.25.1): + resolution: {integrity: sha512-+Jn0iN6TvRTTtTBX4qXWhtOMLL4rsyUIX3/9HM+eBAwr5/cELLw3RuI1tgp942QteTi7PvI5Av4nEi6BlLBr+A==} dependencies: '@nuxt/kit': 3.6.1(rollup@3.25.1) defu: 6.1.2 @@ -1586,18 +1676,18 @@ packages: - supports-color dev: false - /@nuxtjs/eslint-config-typescript@12.0.0(eslint@8.44.0)(typescript@5.0.4): + /@nuxtjs/eslint-config-typescript@12.0.0(eslint@8.47.0)(typescript@5.0.4): resolution: {integrity: sha512-HJR0ho5MYuOCFjkL+eMX/VXbUwy36J12DUMVy+dj3Qz1GYHwX92Saxap3urFzr8oPkzzFiuOknDivfCeRBWakg==} peerDependencies: eslint: ^8.23.0 dependencies: - '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) - '@typescript-eslint/eslint-plugin': 5.59.5(@typescript-eslint/parser@5.59.5)(eslint@8.44.0)(typescript@5.0.4) - '@typescript-eslint/parser': 5.59.5(eslint@8.44.0)(typescript@5.0.4) - eslint: 8.44.0 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.5)(eslint-plugin-import@2.27.5)(eslint@8.44.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) - eslint-plugin-vue: 9.11.1(eslint@8.44.0) + '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) + '@typescript-eslint/eslint-plugin': 5.59.5(@typescript-eslint/parser@5.59.5)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': 5.59.5(eslint@8.47.0)(typescript@5.0.4) + eslint: 8.47.0 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.5)(eslint-plugin-import@2.27.5)(eslint@8.47.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) + eslint-plugin-vue: 9.11.1(eslint@8.47.0) transitivePeerDependencies: - eslint-import-resolver-node - eslint-import-resolver-webpack @@ -1605,19 +1695,19 @@ packages: - typescript dev: true - /@nuxtjs/eslint-config@12.0.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0): + /@nuxtjs/eslint-config@12.0.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0): resolution: {integrity: sha512-ewenelo75x0eYEUK+9EBXjc/OopQCvdkmYmlZuoHq5kub/vtiRpyZ/autppwokpHUq8tiVyl2ejMakoiHiDTrg==} peerDependencies: eslint: ^8.23.0 dependencies: - eslint: 8.44.0 - eslint-config-standard: 17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.44.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) - eslint-plugin-n: 15.7.0(eslint@8.44.0) - eslint-plugin-node: 11.1.0(eslint@8.44.0) - eslint-plugin-promise: 6.1.1(eslint@8.44.0) - eslint-plugin-unicorn: 44.0.2(eslint@8.44.0) - eslint-plugin-vue: 9.11.1(eslint@8.44.0) + eslint: 8.47.0 + eslint-config-standard: 17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) + eslint-plugin-n: 15.7.0(eslint@8.47.0) + eslint-plugin-node: 11.1.0(eslint@8.47.0) + eslint-plugin-promise: 6.1.1(eslint@8.47.0) + eslint-plugin-unicorn: 44.0.2(eslint@8.47.0) + eslint-plugin-vue: 9.11.1(eslint@8.47.0) local-pkg: 0.4.3 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -1626,6 +1716,15 @@ packages: - supports-color dev: true + /@parcel/watcher-wasm@2.3.0-alpha.1: + resolution: {integrity: sha512-wo6065l1MQ6SJPPchYw/q8J+pFL40qBXLu4Td2CXeQ/+mUk8NenNqC75P/P1Cyvpam0kfk91iszd+XL+xKDQww==} + engines: {node: '>= 10.0.0'} + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + napi-wasm: 1.1.0 + dev: false + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1661,7 +1760,7 @@ packages: slash: 4.0.0 dev: false - /@rollup/plugin-alias@5.0.0(rollup@3.25.1): + /@rollup/plugin-alias@5.0.0(rollup@3.28.0): resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1670,7 +1769,7 @@ packages: rollup: optional: true dependencies: - rollup: 3.25.1 + rollup: 3.28.0 slash: 4.0.0 dev: false @@ -1692,7 +1791,7 @@ packages: rollup: 3.25.1 dev: false - /@rollup/plugin-commonjs@25.0.2(rollup@3.25.1): + /@rollup/plugin-commonjs@25.0.2(rollup@3.28.0): resolution: {integrity: sha512-NGTwaJxIO0klMs+WSFFtBP7b9TdTJ3K76HZkewT8/+yHzMiUGVQgaPtLQxNVYIgT5F7lxkEyVID+yS3K7bhCow==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1701,16 +1800,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 - rollup: 3.25.1 + rollup: 3.28.0 dev: false - /@rollup/plugin-inject@5.0.3(rollup@3.25.1): + /@rollup/plugin-inject@5.0.3(rollup@3.28.0): resolution: {integrity: sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1719,10 +1818,10 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) estree-walker: 2.0.2 magic-string: 0.27.0 - rollup: 3.25.1 + rollup: 3.28.0 dev: false /@rollup/plugin-json@6.0.0(rollup@3.25.1): @@ -1738,6 +1837,19 @@ packages: rollup: 3.25.1 dev: false + /@rollup/plugin-json@6.0.0(rollup@3.28.0): + resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) + rollup: 3.28.0 + dev: false + /@rollup/plugin-node-resolve@15.1.0(rollup@3.25.1): resolution: {integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==} engines: {node: '>=14.0.0'} @@ -1756,6 +1868,24 @@ packages: rollup: 3.25.1 dev: false + /@rollup/plugin-node-resolve@15.1.0(rollup@3.28.0): + resolution: {integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.0 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.1 + rollup: 3.28.0 + dev: false + /@rollup/plugin-replace@5.0.2(rollup@3.25.1): resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} engines: {node: '>=14.0.0'} @@ -1770,7 +1900,21 @@ packages: rollup: 3.25.1 dev: false - /@rollup/plugin-terser@0.4.3(rollup@3.25.1): + /@rollup/plugin-replace@5.0.2(rollup@3.28.0): + resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) + magic-string: 0.27.0 + rollup: 3.28.0 + dev: false + + /@rollup/plugin-terser@0.4.3(rollup@3.28.0): resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1779,13 +1923,13 @@ packages: rollup: optional: true dependencies: - rollup: 3.25.1 + rollup: 3.28.0 serialize-javascript: 6.0.1 smob: 1.4.0 terser: 5.17.7 dev: false - /@rollup/plugin-wasm@6.1.3(rollup@3.25.1): + /@rollup/plugin-wasm@6.1.3(rollup@3.28.0): resolution: {integrity: sha512-7ItTTeyauE6lwdDtQWceEHZ9+txbi4RRy0mYPFn9BW7rD7YdgBDu7HTHsLtHrRzJc313RM/1m6GKgV3np/aEaw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1794,7 +1938,7 @@ packages: rollup: optional: true dependencies: - rollup: 3.25.1 + rollup: 3.28.0 dev: false /@rollup/pluginutils@4.2.1: @@ -1820,6 +1964,21 @@ packages: rollup: 3.25.1 dev: false + /@rollup/pluginutils@5.0.2(rollup@3.28.0): + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.28.0 + dev: false + /@shuding/opentype.js@1.4.0-beta.0: resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} engines: {node: '>= 8.0.0'} @@ -1875,6 +2034,20 @@ packages: minimatch: 9.0.2 dev: false + /@types/d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} + dev: false + + /@types/d3-scale@4.0.3: + resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} + dependencies: + '@types/d3-time': 3.0.0 + dev: false + + /@types/d3-time@3.0.0: + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} + dev: false + /@types/debug@4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: @@ -1962,6 +2135,10 @@ packages: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: false + /@types/unist@3.0.0: + resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} + dev: false + /@types/web-bluetooth@0.0.16: resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} dev: false @@ -1970,7 +2147,7 @@ packages: resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} dev: false - /@typescript-eslint/eslint-plugin@5.59.5(@typescript-eslint/parser@5.59.5)(eslint@8.44.0)(typescript@5.0.4): + /@typescript-eslint/eslint-plugin@5.59.5(@typescript-eslint/parser@5.59.5)(eslint@8.47.0)(typescript@5.0.4): resolution: {integrity: sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1982,12 +2159,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.59.5(eslint@8.44.0)(typescript@5.0.4) + '@typescript-eslint/parser': 5.59.5(eslint@8.47.0)(typescript@5.0.4) '@typescript-eslint/scope-manager': 5.59.5 - '@typescript-eslint/type-utils': 5.59.5(eslint@8.44.0)(typescript@5.0.4) - '@typescript-eslint/utils': 5.59.5(eslint@8.44.0)(typescript@5.0.4) + '@typescript-eslint/type-utils': 5.59.5(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/utils': 5.59.5(eslint@8.47.0)(typescript@5.0.4) debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.47.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -1998,7 +2175,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.59.5(eslint@8.44.0)(typescript@5.0.4): + /@typescript-eslint/parser@5.59.5(eslint@8.47.0)(typescript@5.0.4): resolution: {integrity: sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2012,7 +2189,7 @@ packages: '@typescript-eslint/types': 5.59.5 '@typescript-eslint/typescript-estree': 5.59.5(typescript@5.0.4) debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.47.0 typescript: 5.0.4 transitivePeerDependencies: - supports-color @@ -2026,7 +2203,7 @@ packages: '@typescript-eslint/visitor-keys': 5.59.5 dev: true - /@typescript-eslint/type-utils@5.59.5(eslint@8.44.0)(typescript@5.0.4): + /@typescript-eslint/type-utils@5.59.5(eslint@8.47.0)(typescript@5.0.4): resolution: {integrity: sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2037,9 +2214,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.59.5(typescript@5.0.4) - '@typescript-eslint/utils': 5.59.5(eslint@8.44.0)(typescript@5.0.4) + '@typescript-eslint/utils': 5.59.5(eslint@8.47.0)(typescript@5.0.4) debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.47.0 tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: @@ -2065,26 +2242,26 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.1 + semver: 7.5.3 tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.59.5(eslint@8.44.0)(typescript@5.0.4): + /@typescript-eslint/utils@5.59.5(eslint@8.47.0)(typescript@5.0.4): resolution: {integrity: sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) '@types/json-schema': 7.0.11 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.59.5 '@typescript-eslint/types': 5.59.5 '@typescript-eslint/typescript-estree': 5.59.5(typescript@5.0.4) - eslint: 8.44.0 + eslint: 8.47.0 eslint-scope: 5.1.1 semver: 7.5.3 transitivePeerDependencies: @@ -2130,6 +2307,13 @@ packages: '@unhead/shared': 1.1.28 dev: false + /@unhead/dom@1.2.2: + resolution: {integrity: sha512-ohganmg4i1Dd4wwQ2A9oLWEkJNpJRoERJNmFgzmScw9Vi3zMqoS4gPIofT20zUR5rhyyAsFojuDPojJ5vKcmqw==} + dependencies: + '@unhead/schema': 1.2.2 + '@unhead/shared': 1.2.2 + dev: false + /@unhead/schema-org-vue@0.6.0(@unhead/vue@1.1.28): resolution: {integrity: sha512-2zTVczJ8iI8jDOzaz2md8fr8j+jWqkmMdo89OI/VVPYWpA6Cy2BFCMvDqrptBZ2h3ieOZ/lhA/y+cTobBZEvaQ==} engines: {node: '>=14.0.0'} @@ -2153,6 +2337,13 @@ packages: zhead: 2.0.7 dev: false + /@unhead/schema@1.2.2: + resolution: {integrity: sha512-cGtNvadL76eGl7QxGjWHZxFqLv9a2VrmRpeEb1d7sm0cvnN0bWngdXDTdUyXzn7RVv/Um+/yae6eiT6A+pyQOw==} + dependencies: + hookable: 5.5.3 + zhead: 2.0.10 + dev: false + /@unhead/shared@1.1.26: resolution: {integrity: sha512-gnUfNrl8w7hQHke9P0au7klcG9bHVOXqbDvya2uARA/8TyxNz87i0uakraO+P6/+zf484dw3b3MYkXq0thK2eg==} dependencies: @@ -2165,6 +2356,12 @@ packages: '@unhead/schema': 1.1.28 dev: false + /@unhead/shared@1.2.2: + resolution: {integrity: sha512-bWRjRyVzFsunih9GbHctvS8Aenj6KBe5ycql1JE4LawBL/NRYvCYUCPpdK5poVOqjYr0yDAf9m4JGaM2HwpVLw==} + dependencies: + '@unhead/schema': 1.2.2 + dev: false + /@unhead/ssr@1.1.28: resolution: {integrity: sha512-gnSVyvpx/R1byQ8mArh2QRI1PdQ9mlRvtnt1Qiy7JUrtkJeqf/Hfn85fwZ+RhHRSDBPhMl7qD24FSlz5EwA9Zw==} dependencies: @@ -2172,6 +2369,13 @@ packages: '@unhead/shared': 1.1.28 dev: false + /@unhead/ssr@1.2.2: + resolution: {integrity: sha512-mpWSNNbrQFJZolAfdVInPPiSGUva08bK9UbNV1zgDScUz+p+FnRg4cj77X+PpVeJ0+KPgjXfOsI8VQKYt+buYA==} + dependencies: + '@unhead/schema': 1.2.2 + '@unhead/shared': 1.2.2 + dev: false + /@unhead/vue@1.1.28(vue@3.3.4): resolution: {integrity: sha512-n/4UusPccA0eyLxeinEagfm7hswzg4Uud+dYNlPByHHThCBobYcHjhnOOeS9YvkMGbdZpG1l7k/kywQIcwYqgg==} peerDependencies: @@ -2184,6 +2388,18 @@ packages: vue: 3.3.4 dev: false + /@unhead/vue@1.2.2(vue@3.3.4): + resolution: {integrity: sha512-AxOmY5JPn4fS34ovaivPnqg2my+InIkZDNSxCKfRkmbBtstFre/Fyf0d92Qfx0u8PJiSRPOjthEHx5vKDgTEJQ==} + peerDependencies: + vue: '>=2.7 || >=3' + dependencies: + '@unhead/schema': 1.2.2 + '@unhead/shared': 1.2.2 + hookable: 5.5.3 + unhead: 1.2.2 + vue: 3.3.4 + dev: false + /@unocss/reset@0.50.5: resolution: {integrity: sha512-nxagkvGAlJa2r5LF3ucfEgV0RpB7PGMJMRiYO+XyvsPdzcCKVaui8VA7Mo+13Z7nDlZ+XOP5YGqowZgoGOCGSg==} dev: false @@ -2195,7 +2411,7 @@ packages: dependencies: '@mapbox/node-pre-gyp': 1.0.10 '@rollup/pluginutils': 4.2.1 - acorn: 8.9.0 + acorn: 8.10.0 async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -2355,7 +2571,7 @@ packages: '@vue/reactivity-transform': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.0 + magic-string: 0.30.2 postcss: 8.4.24 source-map-js: 1.0.2 dev: false @@ -2378,7 +2594,7 @@ packages: '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.0 + magic-string: 0.30.2 dev: false /@vue/reactivity@3.3.4: @@ -2416,13 +2632,13 @@ packages: resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} dev: false - /@vueuse/core@10.1.2(vue@3.3.4): - resolution: {integrity: sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA==} + /@vueuse/core@10.3.0(vue@3.3.4): + resolution: {integrity: sha512-BEM5yxcFKb5btFjTSAFjTu5jmwoW66fyV9uJIP4wUXXU8aR5Hl44gndaaXp7dC5HSObmgbnR2RN+Un1p68Mf5Q==} dependencies: '@types/web-bluetooth': 0.0.17 - '@vueuse/metadata': 10.1.2 - '@vueuse/shared': 10.1.2(vue@3.3.4) - vue-demi: 0.14.0(vue@3.3.4) + '@vueuse/metadata': 10.3.0 + '@vueuse/shared': 10.3.0(vue@3.3.4) + vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -2452,25 +2668,76 @@ packages: vue: 3.3.4 dev: false - /@vueuse/metadata@10.1.2: - resolution: {integrity: sha512-3mc5BqN9aU2SqBeBuWE7ne4OtXHoHKggNgxZR2K+zIW4YLsy6xoZ4/9vErQs6tvoKDX6QAqm3lvsrv0mczAwIQ==} + /@vueuse/integrations@10.3.0(focus-trap@7.5.2)(fuse.js@6.6.2)(vue@3.3.4): + resolution: {integrity: sha512-Jgiv7oFyIgC6BxmDtiyG/fxyGysIds00YaY7sefwbhCZ2/tjEx1W/1WcsISSJPNI30in28+HC2J4uuU8184ekg==} + peerDependencies: + async-validator: '*' + axios: '*' + change-case: '*' + drauu: '*' + focus-trap: '*' + fuse.js: '*' + idb-keyval: '*' + jwt-decode: '*' + nprogress: '*' + qrcode: '*' + sortablejs: '*' + universal-cookie: '*' + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + dependencies: + '@vueuse/core': 10.3.0(vue@3.3.4) + '@vueuse/shared': 10.3.0(vue@3.3.4) + focus-trap: 7.5.2 + fuse.js: 6.6.2 + vue-demi: 0.14.5(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata@10.3.0: + resolution: {integrity: sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==} dev: false /@vueuse/metadata@9.13.0: resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} dev: false - /@vueuse/nuxt@10.1.2(nuxt@3.6.1)(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-X9o5WCmNs1+6XztP1Uh9+H7/jGeIjwSRNQdwCWRKCDkxPlbgi9iLnDRYnKDY++JPY3nbB6jTDOVgZDrpaAU5kg==} + /@vueuse/nuxt@10.3.0(nuxt@3.6.5)(rollup@3.25.1)(vue@3.3.4): + resolution: {integrity: sha512-Dmkm9H5Ubq279+FHhlJtlFP99wKrn2apuo4hk/0GbEi/6+zif7MJRtAjDBBV4VjmY6XV3kO8dQR8940FStbxsA==} peerDependencies: nuxt: ^3.0.0 dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) - '@vueuse/core': 10.1.2(vue@3.3.4) - '@vueuse/metadata': 10.1.2 + '@nuxt/kit': 3.6.5(rollup@3.25.1) + '@vueuse/core': 10.3.0(vue@3.3.4) + '@vueuse/metadata': 10.3.0 local-pkg: 0.4.3 - nuxt: 3.6.1(@types/node@18.15.3)(eslint@8.44.0)(rollup@3.25.1)(typescript@5.0.4) - vue-demi: 0.14.0(vue@3.3.4) + nuxt: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) + vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - rollup @@ -2478,10 +2745,10 @@ packages: - vue dev: false - /@vueuse/shared@10.1.2(vue@3.3.4): - resolution: {integrity: sha512-1uoUTPBlgyscK9v6ScGeVYDDzlPSFXBlxuK7SfrDGyUTBiznb3mNceqhwvZHjtDRELZEN79V5uWPTF1VDV8svA==} + /@vueuse/shared@10.3.0(vue@3.3.4): + resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} dependencies: - vue-demi: 0.14.0(vue@3.3.4) + vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -2507,6 +2774,12 @@ packages: dependencies: acorn: 8.9.0 + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + /acorn@8.9.0: resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} engines: {node: '>=0.4.0'} @@ -2846,8 +3119,8 @@ packages: /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - /boxen@7.1.0: - resolution: {integrity: sha512-ScG8CDo8dj7McqCZ5hz4dIBp20xj4unQ2lXIDa7ff6RcZElCpuNzutdwzKVvRikfNjm7CFAlR3HJHcoHkDOExQ==} + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} dependencies: ansi-align: 3.0.1 @@ -2931,7 +3204,7 @@ packages: /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.5.3 + semver: 7.5.4 /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} @@ -2953,7 +3226,7 @@ packages: defu: 6.1.2 dotenv: 16.3.1 giget: 1.1.2 - jiti: 1.18.2 + jiti: 1.19.1 mlly: 1.4.0 ohash: 1.1.2 pathe: 1.1.1 @@ -3094,6 +3367,11 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: false + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + /change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} dependencies: @@ -3127,10 +3405,6 @@ packages: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} dev: false - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: false - /cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} dependencies: @@ -3200,6 +3474,12 @@ packages: resolution: {integrity: sha512-fL/EEp9TyXlNkgYFQYNqtMJhnAk2tAq8lCST7O5LPn1NrzWPsOKE5wafR7J+8W87oxqolpxNli+w7khq5WP7tg==} dev: false + /citty@0.1.2: + resolution: {integrity: sha512-Me9nf0/BEmMOnuQzMOVXgpzkMUNbd0Am8lTl/13p0aRGAoLGk5T5sdet/42CrIGmWdG67BgHUhcKK1my1ujUEg==} + dependencies: + consola: 3.2.3 + dev: false + /clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -3221,23 +3501,6 @@ packages: engines: {node: '>=10'} dev: false - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: false - - /cli-spinners@2.7.0: - resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} - engines: {node: '>=6'} - dev: false - - /cli-width@4.0.0: - resolution: {integrity: sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==} - engines: {node: '>= 12'} - dev: false - /clipboardy@3.0.0: resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3256,11 +3519,6 @@ packages: wrap-ansi: 7.0.0 dev: false - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: false - /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -3356,6 +3614,11 @@ packages: resolution: {integrity: sha512-rrrJE6rP0qzl/Srg+C9x/AE5Kxfux7reVm1Wh0wCjuXvih6DqZgqDZe8auTD28fzJ9TF0mHlSDrPpWlujQRo1Q==} dev: false + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: false + /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false @@ -3583,6 +3846,12 @@ packages: lodash: 4.17.21 dev: false + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + dependencies: + internmap: 1.0.1 + dev: false + /d3-array@3.2.3: resolution: {integrity: sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==} engines: {node: '>=12'} @@ -3700,6 +3969,10 @@ packages: d3-color: 3.1.0 dev: false + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false + /d3-path@3.1.0: resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} engines: {node: '>=12'} @@ -3720,6 +3993,13 @@ packages: engines: {node: '>=12'} dev: false + /d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + dev: false + /d3-scale-chromatic@3.0.0: resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} engines: {node: '>=12'} @@ -3744,6 +4024,12 @@ packages: engines: {node: '>=12'} dev: false + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: false + /d3-shape@3.2.0: resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} engines: {node: '>=12'} @@ -3969,15 +4255,9 @@ packages: dependencies: bundle-name: 3.0.0 default-browser-id: 3.0.0 - execa: 7.1.1 + execa: 7.2.0 titleize: 3.0.0 - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: false - /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -4028,14 +4308,14 @@ packages: engines: {node: '>=6'} dev: false - /destr@1.2.2: - resolution: {integrity: sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==} - dev: false - /destr@2.0.0: resolution: {integrity: sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==} dev: false + /destr@2.0.1: + resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} + dev: false + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4097,8 +4377,8 @@ packages: domelementtype: 2.3.0 dev: false - /dompurify@3.0.3: - resolution: {integrity: sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==} + /dompurify@3.0.5: + resolution: {integrity: sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==} dev: false /domutils@3.0.1: @@ -4123,11 +4403,6 @@ packages: type-fest: 2.19.0 dev: false - /dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false - /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} @@ -4199,11 +4474,30 @@ packages: - utf-8-validate dev: false + /engine.io-client@6.5.2: + resolution: {integrity: sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-parser: 5.2.1 + ws: 8.11.0 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /engine.io-parser@5.0.6: resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} engines: {node: '>=10.0.0'} dev: false + /engine.io-parser@5.2.1: + resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engines: {node: '>=10.0.0'} + dev: false + /enhanced-resolve@4.5.0: resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} engines: {node: '>=6.9.0'} @@ -4261,6 +4555,10 @@ packages: is-arrayish: 0.2.1 dev: true + /error-stack-parser-es@0.1.0: + resolution: {integrity: sha512-K5/Oncl6ZizGM7tqGUc3Sd82zVKGsZ+l8FqhhnF8+10QujC/xT2VKwdaM/8rAR5F1BouVqgemMrhHG23vhOpMw==} + dev: false + /es-abstract@1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} @@ -4359,34 +4657,34 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: false - /esbuild@0.18.10: - resolution: {integrity: sha512-33WKo67auOXzZHBY/9DTJRo7kIvfU12S+D4sp2wIz39N88MDIaCGyCwbW01RR70pK6Iya0I74lHEpyLfFqOHPA==} + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.18.10 - '@esbuild/android-arm64': 0.18.10 - '@esbuild/android-x64': 0.18.10 - '@esbuild/darwin-arm64': 0.18.10 - '@esbuild/darwin-x64': 0.18.10 - '@esbuild/freebsd-arm64': 0.18.10 - '@esbuild/freebsd-x64': 0.18.10 - '@esbuild/linux-arm': 0.18.10 - '@esbuild/linux-arm64': 0.18.10 - '@esbuild/linux-ia32': 0.18.10 - '@esbuild/linux-loong64': 0.18.10 - '@esbuild/linux-mips64el': 0.18.10 - '@esbuild/linux-ppc64': 0.18.10 - '@esbuild/linux-riscv64': 0.18.10 - '@esbuild/linux-s390x': 0.18.10 - '@esbuild/linux-x64': 0.18.10 - '@esbuild/netbsd-x64': 0.18.10 - '@esbuild/openbsd-x64': 0.18.10 - '@esbuild/sunos-x64': 0.18.10 - '@esbuild/win32-arm64': 0.18.10 - '@esbuild/win32-ia32': 0.18.10 - '@esbuild/win32-x64': 0.18.10 + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 dev: false /escalade@3.1.1: @@ -4411,7 +4709,7 @@ packages: engines: {node: '>=12'} dev: false - /eslint-config-standard@17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.44.0): + /eslint-config-standard@17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0): resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -4419,10 +4717,10 @@ packages: eslint-plugin-n: ^15.0.0 eslint-plugin-promise: ^6.0.0 dependencies: - eslint: 8.44.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) - eslint-plugin-n: 15.7.0(eslint@8.44.0) - eslint-plugin-promise: 6.1.1(eslint@8.44.0) + eslint: 8.47.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) + eslint-plugin-n: 15.7.0(eslint@8.47.0) + eslint-plugin-promise: 6.1.1(eslint@8.47.0) dev: true /eslint-import-resolver-node@0.3.7: @@ -4435,7 +4733,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.5)(eslint-plugin-import@2.27.5)(eslint@8.44.0): + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.5)(eslint-plugin-import@2.27.5)(eslint@8.47.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -4444,11 +4742,11 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.12.0 - eslint: 8.44.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + eslint: 8.47.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) get-tsconfig: 4.5.0 - globby: 13.1.4 + globby: 13.2.0 is-core-module: 2.11.0 is-glob: 4.0.3 synckit: 0.8.5 @@ -4459,7 +4757,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -4480,38 +4778,38 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.59.5(eslint@8.44.0)(typescript@5.0.4) + '@typescript-eslint/parser': 5.59.5(eslint@8.47.0)(typescript@5.0.4) debug: 3.2.7 - eslint: 8.44.0 + eslint: 8.47.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.5)(eslint-plugin-import@2.27.5)(eslint@8.44.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.5)(eslint-plugin-import@2.27.5)(eslint@8.47.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es@3.0.1(eslint@8.44.0): + /eslint-plugin-es@3.0.1(eslint@8.47.0): resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.44.0 + eslint: 8.47.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-es@4.1.0(eslint@8.44.0): + /eslint-plugin-es@4.1.0(eslint@8.47.0): resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.44.0 + eslint: 8.47.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -4521,15 +4819,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.59.5(eslint@8.44.0)(typescript@5.0.4) + '@typescript-eslint/parser': 5.59.5(eslint@8.47.0)(typescript@5.0.4) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.44.0 + eslint: 8.47.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -4544,31 +4842,31 @@ packages: - supports-color dev: true - /eslint-plugin-n@15.7.0(eslint@8.44.0): + /eslint-plugin-n@15.7.0(eslint@8.47.0): resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} engines: {node: '>=12.22.0'} peerDependencies: eslint: '>=7.0.0' dependencies: builtins: 5.0.1 - eslint: 8.44.0 - eslint-plugin-es: 4.1.0(eslint@8.44.0) - eslint-utils: 3.0.0(eslint@8.44.0) + eslint: 8.47.0 + eslint-plugin-es: 4.1.0(eslint@8.47.0) + eslint-utils: 3.0.0(eslint@8.47.0) ignore: 5.2.4 is-core-module: 2.11.0 minimatch: 3.1.2 resolve: 1.22.1 - semver: 7.5.0 + semver: 7.5.3 dev: true - /eslint-plugin-node@11.1.0(eslint@8.44.0): + /eslint-plugin-node@11.1.0(eslint@8.47.0): resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=5.16.0' dependencies: - eslint: 8.44.0 - eslint-plugin-es: 3.0.1(eslint@8.44.0) + eslint: 8.47.0 + eslint-plugin-es: 3.0.1(eslint@8.47.0) eslint-utils: 2.1.0 ignore: 5.2.4 minimatch: 3.1.2 @@ -4576,26 +4874,26 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-promise@6.1.1(eslint@8.44.0): + /eslint-plugin-promise@6.1.1(eslint@8.47.0): resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.44.0 + eslint: 8.47.0 dev: true - /eslint-plugin-unicorn@44.0.2(eslint@8.44.0): + /eslint-plugin-unicorn@44.0.2(eslint@8.47.0): resolution: {integrity: sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==} engines: {node: '>=14.18'} peerDependencies: eslint: '>=8.23.1' dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.5 ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.44.0 - eslint-utils: 3.0.0(eslint@8.44.0) + eslint: 8.47.0 + eslint-utils: 3.0.0(eslint@8.47.0) esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -4604,23 +4902,23 @@ packages: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 safe-regex: 2.1.1 - semver: 7.5.0 + semver: 7.5.3 strip-indent: 3.0.0 dev: true - /eslint-plugin-vue@9.11.1(eslint@8.44.0): + /eslint-plugin-vue@9.11.1(eslint@8.47.0): resolution: {integrity: sha512-SNtBGDrRkPUFsREswPceqdvZ7YVdWY+iCYiDC+RoxwVieeQ7GJU1FLDlkcaYTOD2os/YuVgI1Fdu8YGM7fmoow==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - eslint: 8.44.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + eslint: 8.47.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.11 semver: 7.5.0 - vue-eslint-parser: 9.2.1(eslint@8.44.0) + vue-eslint-parser: 9.2.1(eslint@8.47.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -4640,6 +4938,14 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} @@ -4648,13 +4954,13 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils@3.0.0(eslint@8.44.0): + /eslint-utils@3.0.0(eslint@8.47.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.44.0 + eslint: 8.47.0 eslint-visitor-keys: 2.1.0 dev: true @@ -4671,16 +4977,21 @@ packages: /eslint-visitor-keys@3.4.1: resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint@8.44.0: - resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} + /eslint@8.47.0: + resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.1.0 - '@eslint/js': 8.44.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/regexpp': 4.6.2 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.47.0 '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -4690,9 +5001,9 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.6.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -4702,7 +5013,6 @@ packages: globals: 13.20.0 graphemer: 1.4.0 ignore: 5.2.4 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -4714,7 +5024,6 @@ packages: natural-compare: 1.4.0 optionator: 0.9.3 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color @@ -4733,6 +5042,15 @@ packages: acorn: 8.9.0 acorn-jsx: 5.3.2(acorn@8.9.0) eslint-visitor-keys: 3.4.1 + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.9.0 + acorn-jsx: 5.3.2(acorn@8.9.0) + eslint-visitor-keys: 3.4.3 /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -4811,18 +5129,24 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false /externality@1.0.2: @@ -4858,6 +5182,17 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -4887,14 +5222,6 @@ packages: resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} dev: false - /figures@5.0.0: - resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} - engines: {node: '>=14'} - dependencies: - escape-string-regexp: 5.0.0 - is-unicode-supported: 1.3.0 - dev: false - /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -4956,6 +5283,12 @@ packages: /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + /focus-trap@7.5.2: + resolution: {integrity: sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==} + dependencies: + tabbable: 6.2.0 + dev: false + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -5007,15 +5340,6 @@ packages: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: false - /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} @@ -5076,6 +5400,11 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true + /fuse.js@6.6.2: + resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==} + engines: {node: '>=10'} + dev: false + /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} @@ -5272,8 +5601,8 @@ packages: slash: 3.0.0 dev: true - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + /globby@13.2.0: + resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 @@ -5281,14 +5610,13 @@ packages: ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 - dev: true - /globby@13.2.0: - resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 @@ -5316,8 +5644,8 @@ packages: duplexer: 0.1.2 dev: false - /h3@1.7.0: - resolution: {integrity: sha512-iJJz2Pn2rC0j8CB3rkFMs0K269W7hDVOC7eL3qne5Joy4JZX1W7id7PBFV593GboHDOx0PzgO6ocqsynrIvdxw==} + /h3@1.7.1: + resolution: {integrity: sha512-A9V2NEDNHet7v1gCg7CMwerSigLi0SRbhTy7C3lGb0N4YKIpPmLDjedTUopqp4dnn7COHfqUjjaz3zbtz4QduA==} dependencies: cookie-es: 1.0.0 defu: 6.1.2 @@ -5328,6 +5656,19 @@ packages: uncrypto: 0.1.3 dev: false + /h3@1.8.0-rc.3: + resolution: {integrity: sha512-NhDCNXhrJkt42BDQF57787yXJa2eX2Hl4OMlu+Ym9QBdBaOByUjBrovYaBc+27mtIhHvs2IqPf56to8qcNBI7Q==} + dependencies: + cookie-es: 1.0.0 + defu: 6.1.2 + destr: 2.0.1 + iron-webcrypto: 0.8.0 + radix3: 1.0.1 + ufo: 1.2.0 + uncrypto: 0.1.3 + unenv: 1.7.1 + dev: false + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -5586,13 +5927,6 @@ packages: ms: 2.1.3 dev: false - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false - /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -5662,27 +5996,6 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dev: true - /inquirer@9.2.2: - resolution: {integrity: sha512-VV2ZOZe4ilLlOgEo7drIdzbi+EYJcNty0leF2vJq49zOW8+IoK1miJ+V5FjZY/X21Io29j66T/AiqHvS4tPIrw==} - engines: {node: '>=14.18.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 5.2.0 - cli-cursor: 3.1.0 - cli-width: 4.0.0 - external-editor: 3.1.0 - figures: 5.0.0 - lodash: 4.17.21 - mute-stream: 1.0.0 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 7.0.1 - through: 2.3.8 - wrap-ansi: 6.2.0 - dev: false - /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -5692,6 +6005,10 @@ packages: side-channel: 1.0.4 dev: true + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: false + /internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -5727,6 +6044,10 @@ packages: resolution: {integrity: sha512-WkX32iTcwd79ZsWRPP5wq1Jq6XXfPwO783ZiUBY8uMw4/AByx5WvBmxvYGnpVt6AOVJ0F41Qo420r8lIneT9Wg==} dev: false + /iron-webcrypto@0.8.0: + resolution: {integrity: sha512-gScdcWHjTGclCU15CIv2r069NoQrys1UeUFFfaO1hL++ytLHkVw7N5nXJmFf3J2LEDMz1PkrvC0m62JEeu1axQ==} + dev: false + /is-absolute-url@4.0.1: resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5865,11 +6186,6 @@ packages: is-path-inside: 3.0.3 dev: false - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: false - /is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: false @@ -5987,16 +6303,6 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: false - - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: false - /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -6029,6 +6335,11 @@ packages: hasBin: true dev: false + /jiti@1.19.1: + resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + hasBin: true + dev: false + /joi@17.9.2: resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==} dependencies: @@ -6212,6 +6523,25 @@ packages: ufo: 1.1.2 dev: false + /listhen@1.2.2: + resolution: {integrity: sha512-fQaXe+DAQ5QiYP1B4uXfAgwqIwNS+0WMIwRd5l2a3npQAEhlCJ1pN11d41yHtbeReE7oRtfL+h6Nzxq+Wc4vIg==} + hasBin: true + dependencies: + '@parcel/watcher-wasm': 2.3.0-alpha.1 + citty: 0.1.2 + clipboardy: 3.0.0 + consola: 3.2.3 + defu: 6.1.2 + get-port-please: 3.0.1 + h3: 1.8.0-rc.3 + http-shutdown: 1.2.2 + jiti: 1.19.1 + mlly: 1.4.0 + node-forge: 1.3.1 + pathe: 1.1.1 + ufo: 1.2.0 + dev: false + /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -6293,17 +6623,9 @@ packages: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: false - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: false - + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + /longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} dev: false @@ -6344,7 +6666,7 @@ packages: resolution: {integrity: sha512-P53AZrzq7hclCU6HWj88xNZHmP15DKjMmK/vBytO1qnpYP3ul4IEZlyCE0aU3JRnmgWmZPmoTKj4Bls7v0pMyA==} engines: {node: '>=14.19.0'} dependencies: - magic-string: 0.30.0 + magic-string: 0.30.2 dev: false /magic-string@0.27.0: @@ -6368,12 +6690,19 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: false - /magicast@0.2.9: - resolution: {integrity: sha512-S1WBXLSVKa34X+Bv7pfA8Umqc1BoglsqzWaQcyuexDc0cjgnERaFTSHbne2OfT27lXYxt/B/sV/2Kh0HaSQkfg==} + /magic-string@0.30.2: + resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + engines: {node: '>=12'} dependencies: - '@babel/parser': 7.22.5 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /magicast@0.2.10: + resolution: {integrity: sha512-Ah2qatigknxwmoYCd9hx/mmVyrRNhDKiaWZIuW4gL6dWrAGMoOpCVkQ3VpGWARtkaJVFhe8uIphcsxDzLPQUyg==} + dependencies: + '@babel/parser': 7.22.10 '@babel/types': 7.22.5 - recast: 0.23.2 + recast: 0.23.4 dev: false /make-dir@1.3.0: @@ -6650,17 +6979,20 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /mermaid@10.2.3: - resolution: {integrity: sha512-cMVE5s9PlQvOwfORkyVpr5beMsLdInrycAosdr+tpZ0WFjG4RJ/bUHST7aTgHNJbujHkdBRAm+N50P3puQOfPw==} + /mermaid@10.3.1: + resolution: {integrity: sha512-hkenh7WkuRWPcob3oJtrN3W+yzrrIYuWF1OIfk/d0xGE8UWlvDhfexaHmDwwe8DKQgqMLI8DWEPwGprxkumjuw==} dependencies: '@braintree/sanitize-url': 6.0.2 + '@types/d3-scale': 4.0.3 + '@types/d3-scale-chromatic': 3.0.0 cytoscape: 3.23.0 cytoscape-cose-bilkent: 4.1.0(cytoscape@3.23.0) cytoscape-fcose: 2.2.0(cytoscape@3.23.0) d3: 7.8.2 + d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 dayjs: 1.11.7 - dompurify: 3.0.3 + dompurify: 3.0.5 elkjs: 0.8.2 khroma: 2.0.0 lodash-es: 4.17.21 @@ -7120,7 +7452,7 @@ packages: /mlly@1.4.0: resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} dependencies: - acorn: 8.9.0 + acorn: 8.10.0 pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.1.2 @@ -7150,11 +7482,6 @@ packages: resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==} dev: false - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: false - /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7167,6 +7494,10 @@ packages: hasBin: true dev: false + /napi-wasm@1.1.0: + resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} + dev: false + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -7179,22 +7510,22 @@ packages: engines: {node: '>= 0.6'} dev: false - /nitropack@2.5.1: - resolution: {integrity: sha512-RKq++lLrs7m/hlkEkYezL119Lu7LzseaDh/6UzmXqYD8/fx896Bou4CJpe775iHiHDzASiCmVKtlkBJxSiRi5w==} + /nitropack@2.5.2: + resolution: {integrity: sha512-hXEHY9NJmOOETFFTPCBB9PB0+txoAbU/fB2ovUF6UMRo4ucQZztYnZdX+YSxa6FVz6eONvcxXvf9/9s6t08KWw==} engines: {node: ^14.16.0 || ^16.11.0 || >=17.0.0} hasBin: true dependencies: '@cloudflare/kv-asset-handler': 0.3.0 '@netlify/functions': 1.6.0 - '@rollup/plugin-alias': 5.0.0(rollup@3.25.1) - '@rollup/plugin-commonjs': 25.0.2(rollup@3.25.1) - '@rollup/plugin-inject': 5.0.3(rollup@3.25.1) - '@rollup/plugin-json': 6.0.0(rollup@3.25.1) - '@rollup/plugin-node-resolve': 15.1.0(rollup@3.25.1) - '@rollup/plugin-replace': 5.0.2(rollup@3.25.1) - '@rollup/plugin-terser': 0.4.3(rollup@3.25.1) - '@rollup/plugin-wasm': 6.1.3(rollup@3.25.1) - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/plugin-alias': 5.0.0(rollup@3.28.0) + '@rollup/plugin-commonjs': 25.0.2(rollup@3.28.0) + '@rollup/plugin-inject': 5.0.3(rollup@3.28.0) + '@rollup/plugin-json': 6.0.0(rollup@3.28.0) + '@rollup/plugin-node-resolve': 15.1.0(rollup@3.28.0) + '@rollup/plugin-replace': 5.0.2(rollup@3.28.0) + '@rollup/plugin-terser': 0.4.3(rollup@3.28.0) + '@rollup/plugin-wasm': 6.1.3(rollup@3.28.0) + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) '@types/http-proxy': 1.17.11 '@vercel/nft': 0.22.6 archiver: 5.3.1 @@ -7202,27 +7533,27 @@ packages: chalk: 5.2.0 chokidar: 3.5.3 citty: 0.1.1 - consola: 3.1.0 + consola: 3.2.3 cookie-es: 1.0.0 defu: 6.1.2 destr: 2.0.0 dot-prop: 7.2.0 - esbuild: 0.18.10 + esbuild: 0.18.20 escape-string-regexp: 5.0.0 etag: 1.8.1 fs-extra: 11.1.1 - globby: 13.2.0 + globby: 13.2.2 gzip-size: 7.0.0 - h3: 1.7.0 + h3: 1.7.1 hookable: 5.5.3 http-graceful-shutdown: 3.1.13 http-proxy: 1.18.1 is-primitive: 3.0.1 - jiti: 1.18.2 + jiti: 1.19.1 klona: 2.0.6 knitwork: 1.0.0 listhen: 1.0.4 - magic-string: 0.30.0 + magic-string: 0.30.2 mime: 3.0.0 mlly: 1.4.0 mri: 1.2.0 @@ -7235,8 +7566,8 @@ packages: pkg-types: 1.0.3 pretty-bytes: 6.1.0 radix3: 1.0.1 - rollup: 3.25.1 - rollup-plugin-visualizer: 5.9.2(rollup@3.25.1) + rollup: 3.28.0 + rollup-plugin-visualizer: 5.9.2(rollup@3.28.0) scule: 1.0.0 semver: 7.5.3 serve-placeholder: 2.0.1 @@ -7246,7 +7577,7 @@ packages: ufo: 1.1.2 uncrypto: 0.1.3 unenv: 1.5.1 - unimport: 3.0.10(rollup@3.25.1) + unimport: 3.1.3(rollup@3.28.0) unstorage: 1.7.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7328,7 +7659,7 @@ packages: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.3 + semver: 7.5.4 tar: 6.1.13 which: 2.0.2 transitivePeerDependencies: @@ -7375,7 +7706,7 @@ packages: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.11.0 - semver: 7.5.3 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: false @@ -7400,7 +7731,7 @@ packages: resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.3 + semver: 7.5.4 dev: false /npm-normalize-package-bin@3.0.1: @@ -7414,7 +7745,7 @@ packages: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 - semver: 7.5.3 + semver: 7.5.4 validate-npm-package-name: 5.0.0 dev: false @@ -7432,7 +7763,7 @@ packages: npm-install-checks: 6.1.1 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.5.3 + semver: 7.5.4 dev: false /npm-registry-fetch@14.0.5: @@ -7486,8 +7817,8 @@ packages: dependencies: boolbase: 1.0.0 - /nuxi@3.6.1: - resolution: {integrity: sha512-8kyDHfyiq0oLywon8UlucQWyYj3toE5AU96COjbuQy8ZzyRT6KJlAmMXmFkO/VuIhaMC8qdlcZPYg/NnHTVjaQ==} + /nuxi@3.6.5: + resolution: {integrity: sha512-4XEXYz71UiWWiKC1/cJCzqRSUEImYRmjcvKpSsBKMU58ALYVSx5KIoas5SwLO8tEKO5BS4DAe4u7MYix7hfuHQ==} engines: {node: ^14.18.0 || >=16.10.0} hasBin: true optionalDependencies: @@ -7655,8 +7986,8 @@ packages: - vue dev: false - /nuxt@3.6.1(@types/node@18.15.3)(eslint@8.44.0)(rollup@3.25.1)(typescript@5.0.4): - resolution: {integrity: sha512-IznN+nogCvDuI3IpjXSphdcGBTEeAdpG1iv01inXMWUAeViXhx6FpfPJ2BjQ1WBuahwcUkV2xmMhB3gsv3SLhw==} + /nuxt@3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4): + resolution: {integrity: sha512-0A7V8B1HrIXX9IlqPc2w+5ZPXi+7MYa9QVhtuGYuLvjRKoSFANhCoMPRP6pKdoxigM1MBxhLue2VmHA/VbtJCw==} engines: {node: ^14.18.0 || >=16.10.0} hasBin: true peerDependencies: @@ -7667,38 +7998,38 @@ packages: optional: true dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/kit': 3.6.1(rollup@3.25.1) - '@nuxt/schema': 3.6.1(rollup@3.25.1) - '@nuxt/telemetry': 2.2.0(rollup@3.25.1) + '@nuxt/kit': 3.6.5(rollup@3.25.1) + '@nuxt/schema': 3.6.5(rollup@3.25.1) + '@nuxt/telemetry': 2.4.1(rollup@3.25.1) '@nuxt/ui-templates': 1.2.0 - '@nuxt/vite-builder': 3.6.1(@types/node@18.15.3)(eslint@8.44.0)(rollup@3.25.1)(typescript@5.0.4)(vue@3.3.4) + '@nuxt/vite-builder': 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4)(vue@3.3.4) '@types/node': 18.15.3 - '@unhead/ssr': 1.1.28 - '@unhead/vue': 1.1.28(vue@3.3.4) + '@unhead/ssr': 1.2.2 + '@unhead/vue': 1.2.2(vue@3.3.4) '@vue/shared': 3.3.4 - acorn: 8.9.0 + acorn: 8.10.0 c12: 1.4.2 chokidar: 3.5.3 cookie-es: 1.0.0 defu: 6.1.2 destr: 2.0.0 devalue: 4.3.2 - esbuild: 0.18.10 + esbuild: 0.18.20 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 fs-extra: 11.1.1 - globby: 13.2.0 - h3: 1.7.0 + globby: 13.2.2 + h3: 1.7.1 hookable: 5.5.3 - jiti: 1.18.2 + jiti: 1.19.1 klona: 2.0.6 knitwork: 1.0.0 local-pkg: 0.4.3 - magic-string: 0.30.0 + magic-string: 0.30.2 mlly: 1.4.0 - nitropack: 2.5.1 - nuxi: 3.6.1 - nypm: 0.2.1 + nitropack: 2.5.2 + nuxi: 3.6.5 + nypm: 0.2.2 ofetch: 1.1.1 ohash: 1.1.2 pathe: 1.1.1 @@ -7711,14 +8042,14 @@ packages: uncrypto: 0.1.3 unctx: 2.3.1 unenv: 1.5.1 - unimport: 3.0.10(rollup@3.25.1) - unplugin: 1.3.1 - unplugin-vue-router: 0.6.4(rollup@3.25.1)(vue-router@4.2.2)(vue@3.3.4) + unimport: 3.1.3(rollup@3.25.1) + unplugin: 1.4.0 + unplugin-vue-router: 0.6.4(rollup@3.25.1)(vue-router@4.2.4)(vue@3.3.4) untyped: 1.3.2 vue: 3.3.4 vue-bundle-renderer: 1.0.3 vue-devtools-stub: 0.1.0 - vue-router: 4.2.2(vue@3.3.4) + vue-router: 4.2.4(vue@3.3.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7748,8 +8079,8 @@ packages: - vue-tsc dev: false - /nypm@0.2.1: - resolution: {integrity: sha512-5XKv4OKlnL+qkeWU4ywu35iyT1p8TmFJ5vD9BfVn8tHU3g/X0lDLV8TqZ4dNHwkoo9mtHUpQ8W8ert0XPqwbow==} + /nypm@0.2.2: + resolution: {integrity: sha512-O7bumfWgUXlJefT1Y41SF4vsCvzeUYmnKABuOKStheCObzrkWPDmqJc+RJVU+57oFu9bITcrUq8sKFIHgjCnTg==} engines: {node: ^14.16.0 || >=16.10.0} dependencies: execa: 7.1.1 @@ -7872,26 +8203,6 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.7.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: false - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: false - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -8177,6 +8488,21 @@ packages: hasBin: true dev: false + /playwright-core@1.37.0: + resolution: {integrity: sha512-1c46jhTH/myQw6sesrcuHVtLoSNfJv8Pfy9t3rs6subY7kARv0HRw5PpyfPYPpPtQvBOmgbE6K+qgYUpj81LAA==} + engines: {node: '>=16'} + hasBin: true + dev: false + + /playwright@1.37.0: + resolution: {integrity: sha512-CrAEFfVioamMwDKmygc/HAkzEAxYAwjD+zod2poTxM7ObivkoDsKHu1ned16fnQV/Tf1kDB8KtsyH8Qd3VzJIg==} + engines: {node: '>=16'} + hasBin: true + requiresBuild: true + dependencies: + playwright-core: 1.37.0 + dev: false + /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -8720,8 +9046,8 @@ packages: tslib: 2.5.0 dev: false - /recast@0.23.2: - resolution: {integrity: sha512-Qv6cPfVZyMOtPszK6PgW70pUgm7gPlFitAPf0Q69rlOA0zLw2XdDcNmPbVGYicFGT9O8I7TZ/0ryJD+6COvIPw==} + /recast@0.23.4: + resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} engines: {node: '>= 4'} dependencies: assert: 2.0.0 @@ -8762,11 +9088,12 @@ packages: engines: {node: '>=8'} dev: true - /rehype-external-links@2.0.1: - resolution: {integrity: sha512-u2dNypma+ps12SJWlS23zvbqwNx0Hl24t0YHXSM/6FCZj/pqWETCO3WyyrvALv4JYvRtuPjhiv2Lpen15ESqbA==} + /rehype-external-links@2.1.0: + resolution: {integrity: sha512-2YMJZVM1hxZnwl9IPkbN5Pjn78kXkAX7lq9VEtlaGA29qIls25vZN+ucNIJdbQUe+9NNFck17BiOhGmsD6oLIg==} dependencies: '@types/hast': 2.3.4 extend: 3.0.2 + hast-util-is-element: 2.1.3 is-absolute-url: 4.0.1 space-separated-tokens: 2.0.2 unified: 10.1.2 @@ -8810,8 +9137,8 @@ packages: unist-util-visit: 4.1.2 dev: false - /remark-emoji@3.1.1: - resolution: {integrity: sha512-kVCTaHzX+/ls67mE8JsGd3ZX511p2FlAPmKhdGpRCb5z6GSwp+3sAIB5oTySIetPh7CtqfGf7JBUt5fyMjgOHw==} + /remark-emoji@3.1.2: + resolution: {integrity: sha512-QwhAzNk27Ol64uV4z/3n55MKrNz9bhr8wg+mO5aGqIYDS+jUarS1d8Y0ZIeEBVhfGkXj6gGYM+727sOgAPvV/A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: emoticon: 4.0.1 @@ -8851,8 +9178,8 @@ packages: - supports-color dev: false - /remark-parse@10.0.1: - resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: '@types/mdast': 3.0.10 mdast-util-from-markdown: 1.3.0 @@ -8904,14 +9231,6 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: false - /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -8962,6 +9281,23 @@ packages: yargs: 17.7.1 dev: false + /rollup-plugin-visualizer@5.9.2(rollup@3.28.0): + resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + rollup: 3.28.0 + source-map: 0.7.4 + yargs: 17.7.1 + dev: false + /rollup@3.25.1: resolution: {integrity: sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -8970,17 +9306,20 @@ packages: fsevents: 2.3.2 dev: false + /rollup@3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: false + /run-applescript@5.0.0: resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} engines: {node: '>=12'} dependencies: execa: 5.1.1 - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: false - /run-con@1.2.11: resolution: {integrity: sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==} hasBin: true @@ -9091,16 +9430,15 @@ packages: lru-cache: 6.0.0 dev: true - /semver@7.5.1: - resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -9181,8 +9519,8 @@ packages: resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} dev: false - /shiki-es@0.2.0: - resolution: {integrity: sha512-RbRMD+IuJJseSZljDdne9ThrUYrwBwJR04FvN4VXpfsU3MNID5VJGHLAD5je/HGThCyEKNgH+nEkSFEWKD7C3Q==} + /shiki-es@0.14.0: + resolution: {integrity: sha512-e+/aueHx0YeIEut6RXC6K8gSf0PykwZiHD7q7AHtpTW8Kd8TpFUIWqTwhAnrGjOyOMyrwv+syr5WPagMpDpVYQ==} dev: false /side-channel@1.0.4: @@ -9280,6 +9618,20 @@ packages: - utf-8-validate dev: false + /socket.io-client@4.7.2: + resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-client: 6.5.2 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /socket.io-parser@4.2.2: resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} engines: {node: '>=10.0.0'} @@ -9290,6 +9642,16 @@ packages: - supports-color dev: false + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /socks-proxy-agent@7.0.0: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} engines: {node: '>= 10'} @@ -9494,7 +9856,13 @@ packages: /strip-literal@1.0.1: resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} dependencies: - acorn: 8.9.0 + acorn: 8.10.0 + dev: false + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 dev: false /style-dictionary-esm@1.3.7: @@ -9579,6 +9947,10 @@ packages: tslib: 2.5.0 dev: true + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + dev: false + /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -9630,7 +10002,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.3 - acorn: 8.9.0 + acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 dev: false @@ -9667,13 +10039,6 @@ packages: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: false - /to-buffer@1.1.1: resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} dev: false @@ -9837,6 +10202,10 @@ packages: resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} dev: false + /ufo@1.2.0: + resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + dev: false + /ultrahtml@1.2.0: resolution: {integrity: sha512-vxZM2yNvajRmCj/SknRYGNXk2tqiy6kRNvZjJLaleG3zJbSh/aNkOqD1/CVzypw8tyHyhpzYuwQgMMhUB4ZVNQ==} dev: false @@ -9898,10 +10267,10 @@ packages: /unctx@2.3.1: resolution: {integrity: sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==} dependencies: - acorn: 8.9.0 + acorn: 8.10.0 estree-walker: 3.0.3 - magic-string: 0.30.0 - unplugin: 1.3.1 + magic-string: 0.30.2 + unplugin: 1.4.0 dev: false /undici@5.22.1: @@ -9921,6 +10290,16 @@ packages: pathe: 1.1.1 dev: false + /unenv@1.7.1: + resolution: {integrity: sha512-iINrdDcqoAjGqoIeOW85TIfI13KGgW1VWwqNO/IzcvvZ/JGBApMAQPZhWcKhE5oC/woFSpCSXg5lc7r1UaLPng==} + dependencies: + consola: 3.2.3 + defu: 6.1.2 + mime: 3.0.0 + node-fetch-native: 1.2.0 + pathe: 1.1.1 + dev: false + /unhead@1.1.26: resolution: {integrity: sha512-MshcPoPLXSGRgYtczddGvMgLUISTbt2pxihqD5kZVXKmY2FZLj1OQIY111aX45Xq47XJxjvYavvoyeUFroKQcg==} dependencies: @@ -9939,6 +10318,15 @@ packages: hookable: 5.5.3 dev: false + /unhead@1.2.2: + resolution: {integrity: sha512-9wDuiso7YWNe0BTA5NGsHR0dtqn0YrL/5+NumfuXDxxYykavc6N27pzZxTXiuvVHbod8tFicsxA6pC9WhQvzqg==} + dependencies: + '@unhead/dom': 1.2.2 + '@unhead/schema': 1.2.2 + '@unhead/shared': 1.2.2 + hookable: 5.5.3 + dev: false + /unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} dependencies: @@ -9976,6 +10364,42 @@ packages: - rollup dev: false + /unimport@3.1.3(rollup@3.25.1): + resolution: {integrity: sha512-up4TE2yA+nMyyErGTjbYGVw95MriGa2hVRXQ3/JRp7984cwwqULcnBjHaovVpsO8tZc2j0fvgGu9yiBKOyxvYw==} + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + escape-string-regexp: 5.0.0 + fast-glob: 3.3.1 + local-pkg: 0.4.3 + magic-string: 0.30.2 + mlly: 1.4.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + scule: 1.0.0 + strip-literal: 1.3.0 + unplugin: 1.4.0 + transitivePeerDependencies: + - rollup + dev: false + + /unimport@3.1.3(rollup@3.28.0): + resolution: {integrity: sha512-up4TE2yA+nMyyErGTjbYGVw95MriGa2hVRXQ3/JRp7984cwwqULcnBjHaovVpsO8tZc2j0fvgGu9yiBKOyxvYw==} + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) + escape-string-regexp: 5.0.0 + fast-glob: 3.3.1 + local-pkg: 0.4.3 + magic-string: 0.30.2 + mlly: 1.4.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + scule: 1.0.0 + strip-literal: 1.3.0 + unplugin: 1.4.0 + transitivePeerDependencies: + - rollup + dev: false + /unique-filename@2.0.1: resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -10004,10 +10428,10 @@ packages: imurmurhash: 0.1.4 dev: false - /unist-builder@3.0.1: - resolution: {integrity: sha512-gnpOw7DIpCA0vpr6NqdPvTWnlPTApCTRzr+38E6hCWx3rz/cjo83SsKIlS1Z+L5ttScQ2AwutNnb8+tAvpb6qQ==} + /unist-builder@4.0.0: + resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 3.0.0 dev: false /unist-util-generated@2.0.1: @@ -10020,18 +10444,36 @@ packages: '@types/unist': 2.0.6 dev: false + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.0 + dev: false + /unist-util-position@4.0.4: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: '@types/unist': 2.0.6 dev: false + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.0 + dev: false + /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: '@types/unist': 2.0.6 dev: false + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.0 + dev: false + /unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: @@ -10039,6 +10481,13 @@ packages: unist-util-is: 5.2.1 dev: false + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.0 + dev: false + /unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: @@ -10047,6 +10496,14 @@ packages: unist-util-visit-parents: 5.1.3 dev: false + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -10071,7 +10528,7 @@ packages: - rollup dev: false - /unplugin-vue-router@0.6.4(rollup@3.25.1)(vue-router@4.2.2)(vue@3.3.4): + /unplugin-vue-router@0.6.4(rollup@3.25.1)(vue-router@4.2.4)(vue@3.3.4): resolution: {integrity: sha512-9THVhhtbVFxbsIibjK59oPwMI1UCxRWRPX7azSkTUABsxovlOXJys5SJx0kd/0oKIqNJuYgkRfAgPuO77SqCOg==} peerDependencies: vue-router: ^4.1.0 @@ -10090,8 +10547,8 @@ packages: mlly: 1.4.0 pathe: 1.1.1 scule: 1.0.0 - unplugin: 1.3.1 - vue-router: 4.2.2(vue@3.3.4) + unplugin: 1.4.0 + vue-router: 4.2.4(vue@3.3.4) yaml: 2.3.1 transitivePeerDependencies: - rollup @@ -10107,6 +10564,15 @@ packages: webpack-virtual-modules: 0.5.0 dev: false + /unplugin@1.4.0: + resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} + dependencies: + acorn: 8.10.0 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + dev: false + /unstorage@1.7.0: resolution: {integrity: sha512-f78UtR4HyUGWuET35iNPdKMvCh9YPQpC7WvkGpP6XiLlolT/9wjyAICYN9AMD/tlB8ZdOqWQHZn+j7mXcTSO4w==} peerDependencies: @@ -10142,7 +10608,7 @@ packages: anymatch: 3.1.3 chokidar: 3.5.3 destr: 2.0.0 - h3: 1.7.0 + h3: 1.7.1 ioredis: 5.3.2 listhen: 1.0.4 lru-cache: 10.0.0 @@ -10154,6 +10620,59 @@ packages: - supports-color dev: false + /unstorage@1.9.0: + resolution: {integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==} + peerDependencies: + '@azure/app-configuration': ^1.4.1 + '@azure/cosmos': ^3.17.3 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^3.2.3 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.14.0 + '@capacitor/preferences': ^5.0.0 + '@planetscale/database': ^1.8.0 + '@upstash/redis': ^1.22.0 + '@vercel/kv': ^0.2.2 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.1 + h3: 1.7.1 + ioredis: 5.3.2 + listhen: 1.2.2 + lru-cache: 10.0.0 + mri: 1.2.0 + node-fetch-native: 1.2.0 + ofetch: 1.1.1 + ufo: 1.2.0 + transitivePeerDependencies: + - supports-color + dev: false + /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -10166,7 +10685,7 @@ packages: '@babel/standalone': 7.21.3 '@babel/types': 7.22.5 defu: 6.1.2 - jiti: 1.18.2 + jiti: 1.19.1 mri: 1.2.0 scule: 1.0.0 transitivePeerDependencies: @@ -10266,8 +10785,8 @@ packages: vfile-message: 3.1.4 dev: false - /vite-node@0.32.2(@types/node@18.15.3): - resolution: {integrity: sha512-dTQ1DCLwl2aEseov7cfQ+kDMNJpM1ebpyMMMwWzBvLbis8Nla/6c9WQcqpPssTwS6Rp/+U6KwlIj8Eapw4bLdA==} + /vite-node@0.33.0(@types/node@18.15.3): + resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} engines: {node: '>=v14.18.0'} hasBin: true dependencies: @@ -10287,7 +10806,7 @@ packages: - terser dev: false - /vite-plugin-checker@0.6.1(eslint@8.44.0)(typescript@5.0.4)(vite@4.3.9): + /vite-plugin-checker@0.6.1(eslint@8.47.0)(typescript@5.0.4)(vite@4.3.9): resolution: {integrity: sha512-4fAiu3W/IwRJuJkkUZlWbLunSzsvijDf0eDN6g/MGh6BUK4SMclOTGbLJCPvdAcMOQvVmm8JyJeYLYd4//8CkA==} engines: {node: '>=14.16'} peerDependencies: @@ -10323,7 +10842,7 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 commander: 8.3.0 - eslint: 8.44.0 + eslint: 8.47.0 fast-glob: 3.2.12 fs-extra: 11.1.1 lodash.debounce: 4.0.8 @@ -10340,13 +10859,18 @@ packages: vscode-uri: 3.0.7 dev: false - /vite-plugin-inspect@0.7.29(rollup@3.25.1)(vite@4.3.9): - resolution: {integrity: sha512-vPbwChmLaHXu2ZXAtRlqXS7BTJoTNIhEjwLv55XGoPOtDOCMkh4X+ziy3/Y6ZhFRDvg0AggHLumn8YqEaIlMJg==} + /vite-plugin-inspect@0.7.36(@nuxt/kit@3.6.5)(rollup@3.25.1)(vite@4.3.9): + resolution: {integrity: sha512-zdFTvLAU0Xb0C9B+JepUN353bZxBWqgkE71URe/9kfM38r6PtR5y2mo0CH1lBuX1DHNhKumLMUGXkvJ+z2OJ4w==} engines: {node: '>=14'} peerDependencies: + '@nuxt/kit': '*' vite: ^3.1.0 || ^4.0.0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true dependencies: - '@antfu/utils': 0.7.4 + '@antfu/utils': 0.7.5 + '@nuxt/kit': 3.6.5(rollup@3.25.1) '@rollup/pluginutils': 5.0.2(rollup@3.25.1) debug: 4.3.4 fs-extra: 11.1.1 @@ -10359,8 +10883,8 @@ packages: - supports-color dev: false - /vite-plugin-vue-inspector@3.4.2(vite@4.3.9): - resolution: {integrity: sha512-q5OTkcZJqL78bwGJl1Zk8CNqtxZ9wP2udJYqyFIZzL1lTax0/oq7DhNkLrnPTxkJuf0QPZKdunb1vDyCByn4dQ==} + /vite-plugin-vue-inspector@3.6.0(vite@4.3.9): + resolution: {integrity: sha512-Fi+9JaMx/reuic+MWbrdw8g5TwZM5a/BmdBT8OKKZi3rK4Qw3wND9smT+Ld+Daitbgly17uvuCiull2KV/hEBQ==} peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 dependencies: @@ -10483,30 +11007,45 @@ packages: vue: 3.3.4 dev: false + /vue-demi@0.14.5(vue@3.3.4): + resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.3.4 + dev: false + /vue-devtools-stub@0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} dev: false - /vue-eslint-parser@9.2.1(eslint@8.44.0): + /vue-eslint-parser@9.2.1(eslint@8.47.0): resolution: {integrity: sha512-tPOex4n6jit4E7h68auOEbDMwE58XiP4dylfaVTCOVCouR45g+QFDBjgIdEU52EXJxKyjgh91dLfN2rxUcV0bQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.47.0 eslint-scope: 7.2.0 eslint-visitor-keys: 3.4.1 espree: 9.6.0 esquery: 1.5.0 lodash: 4.17.21 - semver: 7.5.1 + semver: 7.5.3 transitivePeerDependencies: - supports-color dev: true - /vue-router@4.2.2(vue@3.3.4): - resolution: {integrity: sha512-cChBPPmAflgBGmy3tBsjeoe3f3VOSG6naKyY5pjtrqLGbNEXdzCigFUHgBvp9e3ysAtFtEx7OLqcSDh/1Cq2TQ==} + /vue-router@4.2.4(vue@3.3.4): + resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==} peerDependencies: vue: ^3.2.0 dependencies: @@ -10545,12 +11084,6 @@ packages: - debug dev: false - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - dev: false - /web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false @@ -10633,15 +11166,6 @@ packages: string-width: 5.1.2 dev: false - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -10758,6 +11282,10 @@ packages: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} dev: false + /zhead@2.0.10: + resolution: {integrity: sha512-irug8fXNKjqazkA27cFQs7C6/ZD3qNiEzLC56kDyzQART/Z9GMGfg8h2i6fb9c8ZWnIx/QgOgFJxK3A/CYHG0g==} + dev: false + /zhead@2.0.7: resolution: {integrity: sha512-q9iCCXBWndfYNMGCN7S970+e3ILAPzmX78Skblx7+SGlo6x6SXW0GJ5mJzigYsq2mkHCGqEUhe0QGDEDZauw8g==} dev: false From d098848a4143584e5595307c1dfbe8b56582f688 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 17 Aug 2023 15:55:34 +0000 Subject: [PATCH 005/344] chore(deps): pin dependencies --- .github/workflows/ci.yml | 12 ++++++------ .github/workflows/deploy-docs.yml | 6 +++--- .github/workflows/publish-edge.yml | 4 ++-- .github/workflows/release.yml | 8 ++++---- .github/workflows/semantic-pull-request.yml | 4 ++-- .github/workflows/validate-docs-generation.yml | 6 +++--- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e467b028b..c7745a879 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18.x cache: pnpm @@ -83,7 +83,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 with: ref: ${{ github.ref }} fetch-depth: 0 @@ -114,7 +114,7 @@ jobs: if: ${{ failure() && steps.check-diff.conclusion == 'failure' }} run: | git diff > patch-cpp.diff - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 if: ${{ failure() && steps.check-diff.conclusion == 'failure' }} with: name: patch-cpp @@ -149,7 +149,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18.x cache: pnpm @@ -180,7 +180,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18.x cache: pnpm @@ -241,7 +241,7 @@ jobs: timeout-minutes: 30 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 with: ref: ${{ github.ref }} diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 61dbd5bbf..db233eb92 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -26,7 +26,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - name: Setup Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: "18" cache: "pnpm" @@ -78,7 +78,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - name: Setup Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: "18" cache: "pnpm" @@ -110,4 +110,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@ee48c7b82e077d7b8ef30b50a719e6a792a50c9a # v2 + uses: actions/deploy-pages@9dbe3824824f8a1377b8e298bafde1a50ede43e5 # v2 diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index b5085a430..57e6154bf 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -126,7 +126,7 @@ jobs: - run: npm i -g @antfu/ni pnpm - - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18 cache: pnpm @@ -165,7 +165,7 @@ jobs: - run: npm i -g @antfu/ni pnpm - - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18 cache: pnpm diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f7055bca3..5147d05bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18.x cache: pnpm @@ -108,7 +108,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18 cache: pnpm @@ -141,7 +141,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18 cache: pnpm @@ -176,7 +176,7 @@ jobs: fetch-depth: 0 - name: Set node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18 diff --git a/.github/workflows/semantic-pull-request.yml b/.github/workflows/semantic-pull-request.yml index 527e6c9dc..12f02c7e3 100644 --- a/.github/workflows/semantic-pull-request.yml +++ b/.github/workflows/semantic-pull-request.yml @@ -22,7 +22,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - uses: marocchino/sticky-pull-request-comment@f61b6cf21ef2fcc468f4345cdfcc9bda741d2343 # v2 + - uses: marocchino/sticky-pull-request-comment@efaaab3fd41a9c3de579aba759d2552635e590fd # v2 # When the previous steps fails, the workflow would stop. By adding this # condition you can continue the execution with the populated error message. if: always() && (steps.lint_pr_title.outputs.error_message != null) @@ -41,7 +41,7 @@ jobs: # Delete a previous comment when the issue has been resolved - if: ${{ steps.lint_pr_title.outputs.error_message == null }} - uses: marocchino/sticky-pull-request-comment@f61b6cf21ef2fcc468f4345cdfcc9bda741d2343 # v2 + uses: marocchino/sticky-pull-request-comment@efaaab3fd41a9c3de579aba759d2552635e590fd # v2 with: header: pr-title-lint-error delete: true diff --git a/.github/workflows/validate-docs-generation.yml b/.github/workflows/validate-docs-generation.yml index 85b063006..9b6aaa23f 100644 --- a/.github/workflows/validate-docs-generation.yml +++ b/.github/workflows/validate-docs-generation.yml @@ -20,7 +20,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - name: Setup Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18 cache: "pnpm" @@ -44,7 +44,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18 cache: pnpm @@ -62,7 +62,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 + - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18 cache: pnpm From 66ccc1aabd2120eef4d03ceded6e910a3edc3810 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 07:47:34 +0000 Subject: [PATCH 006/344] chore(deps): update web npm packages --- packages/web/package.json | 6 +++--- packages/web/pnpm-lock.yaml | 28 ++++++++++++++++------------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/web/package.json b/packages/web/package.json index e1a7bbc86..4147e8691 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -2,7 +2,7 @@ "name": "@aneoconsultingfr/armonik.api", "version": "3.11.0", "description": "gRPC API to interact with ArmoniK built for the web", - "packageManager": "pnpm@8.6.9", + "packageManager": "pnpm@8.6.12", "exports": { ".": { "import": "./dist/index.mjs", @@ -42,8 +42,8 @@ }, "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", "devDependencies": { - "ts-proto": "^1.156.0", - "tsup": "^7.1.0", + "ts-proto": "^1.156.7", + "tsup": "^7.2.0", "typescript": "^5.1.6" }, "dependencies": { diff --git a/packages/web/pnpm-lock.yaml b/packages/web/pnpm-lock.yaml index 20228404c..27c26f9f5 100644 --- a/packages/web/pnpm-lock.yaml +++ b/packages/web/pnpm-lock.yaml @@ -14,11 +14,11 @@ dependencies: devDependencies: ts-proto: - specifier: ^1.156.0 - version: 1.156.0 + specifier: ^1.156.7 + version: 1.156.7 tsup: - specifier: ^7.1.0 - version: 7.1.0(typescript@5.1.6) + specifier: ^7.2.0 + version: 7.2.0(typescript@5.1.6) typescript: specifier: ^5.1.6 version: 5.1.6 @@ -600,6 +600,10 @@ packages: /long@5.2.1: resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: true + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -862,29 +866,29 @@ packages: dprint-node: 1.0.7 dev: true - /ts-proto-descriptors@1.14.0: - resolution: {integrity: sha512-xqLA6cBTfof+mZ/sIw/pZviyhnWWcWqRBjyjaMW5O4fIogpawT4aa0wI8rKh0rYIrQzoHxLugmFu4+rdiWaGEQ==} + /ts-proto-descriptors@1.15.0: + resolution: {integrity: sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==} dependencies: - long: 5.2.1 + long: 5.2.3 protobufjs: 7.2.4 dev: true - /ts-proto@1.156.0: - resolution: {integrity: sha512-GnOxEAD1mRkiqV9VLv48GrNdps8gXp+vE9rWToCPyIxCIjVjkH3ls8iXxRXOS9LSwueJT8F+N9w7Xy3zftUecA==} + /ts-proto@1.156.7: + resolution: {integrity: sha512-vuSby+Mx0CniXscbHx9ieKCEErGBuie12RmduPA67p27Io5C0gkzlMnyN/j3vKWAJrP/h6+mbAoo6WrlalOt7w==} hasBin: true dependencies: case-anything: 2.1.13 protobufjs: 7.2.4 ts-poet: 6.5.0 - ts-proto-descriptors: 1.14.0 + ts-proto-descriptors: 1.15.0 dev: true /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: false - /tsup@7.1.0(typescript@5.1.6): - resolution: {integrity: sha512-mazl/GRAk70j8S43/AbSYXGgvRP54oQeX8Un4iZxzATHt0roW0t6HYDVZIXMw0ZQIpvr1nFMniIVnN5186lW7w==} + /tsup@7.2.0(typescript@5.1.6): + resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} engines: {node: '>=16.14'} hasBin: true peerDependencies: From 331cd26d6985d1adc897da20d8965c6a5f0e6965 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 18 Aug 2023 15:33:42 +0200 Subject: [PATCH 007/344] Added ci package uploads --- .github/workflows/ci.yml | 20 +++++++++---- .github/workflows/publish-edge.yml | 26 +++++++++++++++++ .github/workflows/release.yml | 31 +++++++++++++++++++++ packages/cpp/tools/Dockerfile.ubuntu | 2 +- packages/cpp/tools/packaging/make-tar.gz.sh | 5 ++++ scripts/versions/_contants.ts | 2 +- 6 files changed, 79 insertions(+), 7 deletions(-) create mode 100755 packages/cpp/tools/packaging/make-tar.gz.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e467b028b..68ba774f0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -218,7 +218,7 @@ jobs: run: python -m pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-report xml:coverage.xml --cov-report html:coverage_report - name: Get Cover - uses: orgoro/coverage@d77626a5fa35d39123e86d6c62907fabe2491496 # v3 + uses: orgoro/coverage@v3.1 with: coverageFile: packages/python/coverage.xml token: ${{ secrets.GITHUB_TOKEN }} @@ -236,9 +236,12 @@ jobs: path: packages/python/coverage.xml build-cpp-packages: - name: Build C++ Packages + strategy: + fail-fast: false + matrix: + type: [tar.gz, deb, rpm] + name: Build C++ Packages [${{ matrix.type }}] runs-on: ubuntu-latest - timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v3 @@ -247,5 +250,12 @@ jobs: - name: Build the package run: | - cd packages/cpp/tools/ - ./compile.sh + cd packages/cpp/tools/packaging + ./make-${{ matrix.type }}.sh + - name: Publish package as artefact + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce + with: + if-no-files-found: error + path: packages/cpp/tools/packaging/*.${{ matrix.type }} + name: libarmonik.${{ matrix.type }} + diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index b5085a430..d4cfc9d88 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -232,3 +232,29 @@ jobs: password: ${{ secrets.PYPI_API_TOKEN }} print-hash: true packages-dir: packages/python/pkg/ + + release-cpp-package: + needs: [version] + strategy: + fail-fast: false + matrix: + type: [tar.gz, deb, rpm] + name: Build C++ Packages [${{ matrix.type }}] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.ref }} + + - name: Build the package + run: | + cd packages/cpp/tools/packaging + ./make-${{ matrix.type }}.sh + - name: Publish package as artefact + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce + with: + if-no-files-found: error + path: packages/cpp/tools/packaging/*.${{ matrix.type }} + name: libarmonik.${{ matrix.type }} + # TODO Upload to a more permanent storage diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f7055bca3..3e3c81ee1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -167,6 +167,37 @@ jobs: env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + release-cpp-package: + needs: [verify-versions] + strategy: + fail-fast: false + matrix: + type: [tar.gz, deb, rpm] + name: Build C++ Packages [${{ matrix.type }}] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.ref }} + + - name: Build the package + run: | + cd packages/cpp/tools/packaging + ./make-${{ matrix.type }}.sh + - name: Publish package as artefact + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce + with: + if-no-files-found: error + path: packages/cpp/tools/packaging/*.${{ matrix.type }} + name: libarmonik-${{ github.ref_name }}.${{ matrix.type }} + - name: Upload to release + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + run: | + gh release upload ${{ github.ref_name }} packages/cpp/tools/packaging/*.${{ matrix.type }} + + update-changelog: needs: [verify-versions] runs-on: ubuntu-latest diff --git a/packages/cpp/tools/Dockerfile.ubuntu b/packages/cpp/tools/Dockerfile.ubuntu index b61f33893..ab2bddf3f 100644 --- a/packages/cpp/tools/Dockerfile.ubuntu +++ b/packages/cpp/tools/Dockerfile.ubuntu @@ -29,7 +29,7 @@ RUN echo $PATH WORKDIR /app/build # Set the default command to build the client using CMake and make -CMD ["bash", "-c", "cmake -DCMAKE_BUILD_TYPE=Debug -DPROTO_FILES_DIR=/app/proto -DCMAKE_INSTALL_PREFIX=/app/install -DBUILD_TEST=OFF /app/source/ && make -j $(nproc) install"] +CMD ["bash", "-c", "cmake -DCMAKE_BUILD_TYPE=Debug -DPROTO_FILES_DIR=/app/proto -DCMAKE_INSTALL_PREFIX=/app/install -DBUILD_TEST=OFF /app/source/ -DCPACK_GENERATOR=TGZ && make -j $(nproc) install && make package -j"] # Uncomment the line below if you want the container to start in the bash shell by default # ENTRYPOINT ["bash"] diff --git a/packages/cpp/tools/packaging/make-tar.gz.sh b/packages/cpp/tools/packaging/make-tar.gz.sh new file mode 100755 index 000000000..37da42b46 --- /dev/null +++ b/packages/cpp/tools/packaging/make-tar.gz.sh @@ -0,0 +1,5 @@ +#!/bin/sh +set -ex +../compile.sh +cp ../../build/*.tar.gz . + diff --git a/scripts/versions/_contants.ts b/scripts/versions/_contants.ts index c172846c4..e04c966f1 100644 --- a/scripts/versions/_contants.ts +++ b/scripts/versions/_contants.ts @@ -10,4 +10,4 @@ export const jsPattern = /"version": "(?.*)"/; export const jsFiles = ["packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json", "packages/web/package.json"]; export const cppPattern = /set\(version (?.*)\)/ -export const cppFiles = ["packages/cpp/CMakeLists.txt"]; \ No newline at end of file +export const cppFiles = ["packages/cpp/CMakeLists.txt"]; From 0ec243e5df3d39fa15786a0278efd544117bffb3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 19:41:23 +0000 Subject: [PATCH 008/344] chore(deps): update angular npm packages --- packages/angular/package.json | 36 +- packages/angular/pnpm-lock.yaml | 2282 ++++++++++++----- .../armonik.api.angular/package.json | 12 +- 3 files changed, 1604 insertions(+), 726 deletions(-) diff --git a/packages/angular/package.json b/packages/angular/package.json index cac1a8458..3fdd150b0 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -8,30 +8,30 @@ "test": "ng test", "proto:generate:linux": "protoc --plugin=protoc-gen-ng=$(which protoc-gen-ng) --ng_out=./projects/aneoconsultingfr/armonik.api.angular/src/lib/generated -I ../../Protos/V1 ../../Protos/V1/*.proto" }, - "packageManager": "pnpm@8.6.10", + "packageManager": "pnpm@8.6.12", "private": true, "dependencies": { - "@angular/animations": "^16.1.6", - "@angular/common": "^16.1.6", - "@angular/compiler": "^16.1.6", - "@angular/core": "^16.1.6", - "@angular/forms": "^16.1.6", - "@angular/platform-browser": "^16.1.6", - "@angular/platform-browser-dynamic": "^16.1.6", - "@angular/router": "^16.1.6", - "@ngx-grpc/common": "^3.1.1", - "@ngx-grpc/core": "^3.1.1", - "@ngx-grpc/well-known-types": "^3.1.1", + "@angular/animations": "^16.2.1", + "@angular/common": "^16.2.1", + "@angular/compiler": "^16.2.1", + "@angular/core": "^16.2.1", + "@angular/forms": "^16.2.1", + "@angular/platform-browser": "^16.2.1", + "@angular/platform-browser-dynamic": "^16.2.1", + "@angular/router": "^16.2.1", + "@ngx-grpc/common": "^3.1.2", + "@ngx-grpc/core": "^3.1.2", + "@ngx-grpc/well-known-types": "^3.1.2", "google-protobuf": "^3.21.2", "rxjs": "~7.8.1", - "tslib": "^2.6.1", + "tslib": "^2.6.2", "zone.js": "~0.13.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.1.5", - "@angular/cli": "~16.1.5", - "@angular/compiler-cli": "^16.1.6", - "@ngx-grpc/protoc-gen-ng": "^3.1.1", + "@angular-devkit/build-angular": "^16.2.0", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "^16.2.1", + "@ngx-grpc/protoc-gen-ng": "^3.1.2", "@types/google-protobuf": "^3.15.6", "@types/jasmine": "~4.3.5", "jasmine-core": "~4.6.0", @@ -40,7 +40,7 @@ "karma-coverage": "~2.2.1", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", - "ng-packagr": "^16.1.0", + "ng-packagr": "^16.2.0", "typescript": "~5.1.6" } } diff --git a/packages/angular/pnpm-lock.yaml b/packages/angular/pnpm-lock.yaml index a4f35bcd7..c8ed96c76 100644 --- a/packages/angular/pnpm-lock.yaml +++ b/packages/angular/pnpm-lock.yaml @@ -6,38 +6,38 @@ settings: dependencies: '@angular/animations': - specifier: ^16.1.6 - version: 16.1.6(@angular/core@16.1.6) + specifier: ^16.2.1 + version: 16.2.1(@angular/core@16.2.1) '@angular/common': - specifier: ^16.1.6 - version: 16.1.6(@angular/core@16.1.6)(rxjs@7.8.1) + specifier: ^16.2.1 + version: 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) '@angular/compiler': - specifier: ^16.1.6 - version: 16.1.6(@angular/core@16.1.6) + specifier: ^16.2.1 + version: 16.2.1(@angular/core@16.2.1) '@angular/core': - specifier: ^16.1.6 - version: 16.1.6(rxjs@7.8.1)(zone.js@0.13.1) + specifier: ^16.2.1 + version: 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) '@angular/forms': - specifier: ^16.1.6 - version: 16.1.6(@angular/common@16.1.6)(@angular/core@16.1.6)(@angular/platform-browser@16.1.6)(rxjs@7.8.1) + specifier: ^16.2.1 + version: 16.2.1(@angular/common@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1)(rxjs@7.8.1) '@angular/platform-browser': - specifier: ^16.1.6 - version: 16.1.6(@angular/animations@16.1.6)(@angular/common@16.1.6)(@angular/core@16.1.6) + specifier: ^16.2.1 + version: 16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1) '@angular/platform-browser-dynamic': - specifier: ^16.1.6 - version: 16.1.6(@angular/common@16.1.6)(@angular/compiler@16.1.6)(@angular/core@16.1.6)(@angular/platform-browser@16.1.6) + specifier: ^16.2.1 + version: 16.2.1(@angular/common@16.2.1)(@angular/compiler@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1) '@angular/router': - specifier: ^16.1.6 - version: 16.1.6(@angular/common@16.1.6)(@angular/core@16.1.6)(@angular/platform-browser@16.1.6)(rxjs@7.8.1) + specifier: ^16.2.1 + version: 16.2.1(@angular/common@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1)(rxjs@7.8.1) '@ngx-grpc/common': - specifier: ^3.1.1 - version: 3.1.1(google-protobuf@3.21.2)(rxjs@7.8.1) + specifier: ^3.1.2 + version: 3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1) '@ngx-grpc/core': - specifier: ^3.1.1 - version: 3.1.1(@angular/core@16.1.6)(@ngx-grpc/common@3.1.1)(rxjs@7.8.1) + specifier: ^3.1.2 + version: 3.1.2(@angular/core@16.2.1)(@ngx-grpc/common@3.1.2)(rxjs@7.8.1) '@ngx-grpc/well-known-types': - specifier: ^3.1.1 - version: 3.1.1(@ngx-grpc/common@3.1.1)(google-protobuf@3.21.2) + specifier: ^3.1.2 + version: 3.1.2(@ngx-grpc/common@3.1.2)(google-protobuf@3.21.2) google-protobuf: specifier: ^3.21.2 version: 3.21.2 @@ -45,25 +45,25 @@ dependencies: specifier: ~7.8.1 version: 7.8.1 tslib: - specifier: ^2.6.1 - version: 2.6.1 + specifier: ^2.6.2 + version: 2.6.2 zone.js: specifier: ~0.13.1 version: 0.13.1 devDependencies: '@angular-devkit/build-angular': - specifier: ^16.1.5 - version: 16.1.5(@angular/compiler-cli@16.1.6)(karma@6.4.2)(ng-packagr@16.1.0)(typescript@5.1.6) + specifier: ^16.2.0 + version: 16.2.0(@angular/compiler-cli@16.2.1)(karma@6.4.2)(ng-packagr@16.2.0)(typescript@5.1.6) '@angular/cli': - specifier: ~16.1.5 - version: 16.1.5 + specifier: ~16.2.0 + version: 16.2.0 '@angular/compiler-cli': - specifier: ^16.1.6 - version: 16.1.6(@angular/compiler@16.1.6)(typescript@5.1.6) + specifier: ^16.2.1 + version: 16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6) '@ngx-grpc/protoc-gen-ng': - specifier: ^3.1.1 - version: 3.1.1 + specifier: ^3.1.2 + version: 3.1.2 '@types/google-protobuf': specifier: ^3.15.6 version: 3.15.6 @@ -89,8 +89,8 @@ devDependencies: specifier: ~2.1.0 version: 2.1.0(jasmine-core@4.6.0)(karma-jasmine@5.1.0)(karma@6.4.2) ng-packagr: - specifier: ^16.1.0 - version: 16.1.0(@angular/compiler-cli@16.1.6)(tslib@2.6.1)(typescript@5.1.6) + specifier: ^16.2.0 + version: 16.2.0(@angular/compiler-cli@16.2.1)(tslib@2.6.2)(typescript@5.1.6) typescript: specifier: ~5.1.6 version: 5.1.6 @@ -105,18 +105,18 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@angular-devkit/architect@0.1601.5(chokidar@3.5.3): - resolution: {integrity: sha512-f6oOXR+0gXdMl2papEkTt28GJJBsYtuuoHSQYM09UltkXPkj4bc9QEOzRXKQ0hDjNYYj3UT00E3CalBO/5uGTA==} + /@angular-devkit/architect@0.1602.0(chokidar@3.5.3): + resolution: {integrity: sha512-ZRmUTBeD+uGr605eOHnsovEn6f1mOBI+kxP64DRvagNweX5TN04s3iyQ8jmLSAHQD9ush31LFxv3dVNxv3ceXQ==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.1.5(chokidar@3.5.3) + '@angular-devkit/core': 16.2.0(chokidar@3.5.3) rxjs: 7.8.1 transitivePeerDependencies: - chokidar dev: true - /@angular-devkit/build-angular@16.1.5(@angular/compiler-cli@16.1.6)(karma@6.4.2)(ng-packagr@16.1.0)(typescript@5.1.6): - resolution: {integrity: sha512-F78nvdDgVknqA9MekZ6xnmwKLH+qIQ5gBuP+/JnUiSZs1u1i8qS/GGNUL+T/Zsxk1HMRbG+erQ7N6nn1sBKMMw==} + /@angular-devkit/build-angular@16.2.0(@angular/compiler-cli@16.2.1)(karma@6.4.2)(ng-packagr@16.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-miylwjOqvlKmYrzS84bjRaJrecZxOXH9xsPVvQE8VBe8UKePJjRAL6yyOqXUOGtzlch2YmT98RAnuni7y0FEAw==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler-cli': ^16.0.0 @@ -151,82 +151,84 @@ packages: optional: true dependencies: '@ampproject/remapping': 2.2.1 - '@angular-devkit/architect': 0.1601.5(chokidar@3.5.3) - '@angular-devkit/build-webpack': 0.1601.5(chokidar@3.5.3)(webpack-dev-server@4.15.0)(webpack@5.86.0) - '@angular-devkit/core': 16.1.5(chokidar@3.5.3) - '@angular/compiler-cli': 16.1.6(@angular/compiler@16.1.6)(typescript@5.1.6) - '@babel/core': 7.22.5 - '@babel/generator': 7.22.7 + '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) + '@angular-devkit/build-webpack': 0.1602.0(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.88.2) + '@angular-devkit/core': 16.2.0(chokidar@3.5.3) + '@angular/compiler-cli': 16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6) + '@babel/core': 7.22.9 + '@babel/generator': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.5) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-runtime': 7.22.5(@babel/core@7.22.5) - '@babel/preset-env': 7.22.5(@babel/core@7.22.5) - '@babel/runtime': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.9) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-runtime': 7.22.9(@babel/core@7.22.9) + '@babel/preset-env': 7.22.9(@babel/core@7.22.9) + '@babel/runtime': 7.22.6 '@babel/template': 7.22.5 '@discoveryjs/json-ext': 0.5.7 - '@ngtools/webpack': 16.1.5(@angular/compiler-cli@16.1.6)(typescript@5.1.6)(webpack@5.86.0) - '@vitejs/plugin-basic-ssl': 1.0.1(vite@4.3.9) + '@ngtools/webpack': 16.2.0(@angular/compiler-cli@16.2.1)(typescript@5.1.6)(webpack@5.88.2) + '@vitejs/plugin-basic-ssl': 1.0.1(vite@4.4.7) ansi-colors: 4.1.3 - autoprefixer: 10.4.14(postcss@8.4.24) - babel-loader: 9.1.2(@babel/core@7.22.5)(webpack@5.86.0) + autoprefixer: 10.4.14(postcss@8.4.27) + babel-loader: 9.1.3(@babel/core@7.22.9)(webpack@5.88.2) babel-plugin-istanbul: 6.1.1 browserslist: 4.21.5 - cacache: 17.1.3 chokidar: 3.5.3 - copy-webpack-plugin: 11.0.0(webpack@5.86.0) - critters: 0.0.19 - css-loader: 6.8.1(webpack@5.86.0) - esbuild-wasm: 0.17.19 - fast-glob: 3.2.12 + copy-webpack-plugin: 11.0.0(webpack@5.88.2) + critters: 0.0.20 + css-loader: 6.8.1(webpack@5.88.2) + esbuild-wasm: 0.18.17 + fast-glob: 3.3.1 + guess-parser: 0.4.22(typescript@5.1.6) https-proxy-agent: 5.0.1 inquirer: 8.2.4 jsonc-parser: 3.2.0 karma: 6.4.2 karma-source-map-support: 1.4.0 less: 4.1.3 - less-loader: 11.1.0(less@4.1.3)(webpack@5.86.0) - license-webpack-plugin: 4.0.2(webpack@5.86.0) + less-loader: 11.1.0(less@4.1.3)(webpack@5.88.2) + license-webpack-plugin: 4.0.2(webpack@5.88.2) loader-utils: 3.2.1 - magic-string: 0.30.0 - mini-css-extract-plugin: 2.7.6(webpack@5.86.0) + magic-string: 0.30.1 + mini-css-extract-plugin: 2.7.6(webpack@5.88.2) mrmime: 1.0.1 - ng-packagr: 16.1.0(@angular/compiler-cli@16.1.6)(tslib@2.6.1)(typescript@5.1.6) + ng-packagr: 16.2.0(@angular/compiler-cli@16.2.1)(tslib@2.6.2)(typescript@5.1.6) open: 8.4.2 ora: 5.4.1 parse5-html-rewriting-stream: 7.0.0 picomatch: 2.3.1 - piscina: 3.2.0 - postcss: 8.4.24 - postcss-loader: 7.3.2(postcss@8.4.24)(webpack@5.86.0) + piscina: 4.0.0 + postcss: 8.4.27 + postcss-loader: 7.3.3(postcss@8.4.27)(webpack@5.88.2) resolve-url-loader: 5.0.0 rxjs: 7.8.1 - sass: 1.63.2 - sass-loader: 13.3.1(sass@1.63.2)(webpack@5.86.0) - semver: 7.5.3 - source-map-loader: 4.0.1(webpack@5.86.0) + sass: 1.64.1 + sass-loader: 13.3.2(sass@1.64.1)(webpack@5.88.2) + semver: 7.5.4 + source-map-loader: 4.0.1(webpack@5.88.2) source-map-support: 0.5.21 - terser: 5.17.7 + terser: 5.19.2 text-table: 0.2.0 tree-kill: 1.2.2 - tslib: 2.5.3 + tslib: 2.6.1 typescript: 5.1.6 - vite: 4.3.9(less@4.1.3)(sass@1.63.2)(terser@5.17.7) - webpack: 5.86.0(esbuild@0.17.19) - webpack-dev-middleware: 6.1.1(webpack@5.86.0) - webpack-dev-server: 4.15.0(webpack@5.86.0) + vite: 4.4.7(less@4.1.3)(sass@1.64.1)(terser@5.19.2) + webpack: 5.88.2(esbuild@0.18.17) + webpack-dev-middleware: 6.1.1(webpack@5.88.2) + webpack-dev-server: 4.15.1(webpack@5.88.2) webpack-merge: 5.9.0 - webpack-subresource-integrity: 5.1.0(webpack@5.86.0) + webpack-subresource-integrity: 5.1.0(webpack@5.88.2) optionalDependencies: - esbuild: 0.17.19 + esbuild: 0.18.17 transitivePeerDependencies: - '@swc/core' - '@types/node' - bufferutil + - canvas - debug - fibers - html-webpack-plugin + - lightningcss - node-sass - sass-embedded - stylus @@ -237,23 +239,23 @@ packages: - webpack-cli dev: true - /@angular-devkit/build-webpack@0.1601.5(chokidar@3.5.3)(webpack-dev-server@4.15.0)(webpack@5.86.0): - resolution: {integrity: sha512-Mc61mrSFFpplBMl11r8ryUrKRDf9Clugnpe8770JcoDe99xEsBFwUUMRS9xNqmVroCgdLMxFijgLSI1ANkUvMg==} + /@angular-devkit/build-webpack@0.1602.0(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.88.2): + resolution: {integrity: sha512-KdSr6iAcO30i/LIGL8mYi+d1buVXuDCp2dptzEJ4vxReOMFJca90KLwb+tVHEqqnDb0WkNfWm8Ii2QYh2FrNyA==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^4.0.0 dependencies: - '@angular-devkit/architect': 0.1601.5(chokidar@3.5.3) + '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) rxjs: 7.8.1 - webpack: 5.86.0(esbuild@0.17.19) - webpack-dev-server: 4.15.0(webpack@5.86.0) + webpack: 5.88.2(esbuild@0.18.17) + webpack-dev-server: 4.15.1(webpack@5.88.2) transitivePeerDependencies: - chokidar dev: true - /@angular-devkit/core@16.1.5(chokidar@3.5.3): - resolution: {integrity: sha512-0Mui2Nuib7kzOLWkz18v1OdxK6wd0SWdSFsAXavrRv03495vv+JUqVq0z0vGMtcbURkjOxIwdj3coj+Y0szkPQ==} + /@angular-devkit/core@16.2.0(chokidar@3.5.3): + resolution: {integrity: sha512-l1k6Rqm3YM16BEn3CWyQKrk9xfu+2ux7Bw3oS+h1TO4/RoxO2PgHj8LLRh/WNrYVarhaqO7QZ5ePBkXNMkzJ1g==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 @@ -269,38 +271,38 @@ packages: source-map: 0.7.4 dev: true - /@angular-devkit/schematics@16.1.5: - resolution: {integrity: sha512-s6D/I0pfJJ7+XaAYyXh6IsS3Tya4WKeBuVcWWE7IK6TMEd5a1yDQ5O9RO2/G8UcxBwlKZmeuFbJkclpF6q3hYA==} + /@angular-devkit/schematics@16.2.0: + resolution: {integrity: sha512-QMDJXPE0+YQJ9Ap3MMzb0v7rx6ZbBEokmHgpdIjN3eILYmbAdsSGE8HTV8NjS9nKmcyE9OGzFCMb7PFrDTlTAw==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.1.5(chokidar@3.5.3) + '@angular-devkit/core': 16.2.0(chokidar@3.5.3) jsonc-parser: 3.2.0 - magic-string: 0.30.0 + magic-string: 0.30.1 ora: 5.4.1 rxjs: 7.8.1 transitivePeerDependencies: - chokidar dev: true - /@angular/animations@16.1.6(@angular/core@16.1.6): - resolution: {integrity: sha512-LsU3/qXom/tLB76Exvjz+7SkifwJ9QG/+gSjWj+DTVlj1+dO7awb8iWQi+YmTmqN7ijTJi9ye6is3iuJSYuCLw==} + /@angular/animations@16.2.1(@angular/core@16.2.1): + resolution: {integrity: sha512-XVabK9fRKJaYPhW5wn8ySL4KL45N5Np+xOssWhLPDRDBdZjl62MExfpvMkamdkos6E1n1IGsy9wSemjnR4WKhg==} engines: {node: ^16.14.0 || >=18.10.0} peerDependencies: - '@angular/core': 16.1.6 + '@angular/core': 16.2.1 dependencies: - '@angular/core': 16.1.6(rxjs@7.8.1)(zone.js@0.13.1) - tslib: 2.6.1 + '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) + tslib: 2.6.2 dev: false - /@angular/cli@16.1.5: - resolution: {integrity: sha512-um9hWEU3HUMRnQnaDfw0QSNdDLbdLA9tSzp81kz3Rx2VFsSssCABq6xQ+7w09xCUx0jg88r1lBPc2pwV7Pu7FQ==} + /@angular/cli@16.2.0: + resolution: {integrity: sha512-xT8vJOyw6Rc2364XDW2jHagLgKu7342ktd/lt+c0u6R+AB2XVFMePR7VceLohX9N/vRUsbQ0nVSZr+ru/hA+HA==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true dependencies: - '@angular-devkit/architect': 0.1601.5(chokidar@3.5.3) - '@angular-devkit/core': 16.1.5(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.5 - '@schematics/angular': 16.1.5 + '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) + '@angular-devkit/core': 16.2.0(chokidar@3.5.3) + '@angular-devkit/schematics': 16.2.0 + '@schematics/angular': 16.2.0 '@yarnpkg/lockfile': 1.1.0 ansi-colors: 4.1.3 ini: 4.1.1 @@ -312,7 +314,7 @@ packages: ora: 5.4.1 pacote: 15.2.0 resolve: 1.22.2 - semver: 7.5.3 + semver: 7.5.4 symbol-observable: 4.0.0 yargs: 17.7.2 transitivePeerDependencies: @@ -321,132 +323,140 @@ packages: - supports-color dev: true - /@angular/common@16.1.6(@angular/core@16.1.6)(rxjs@7.8.1): - resolution: {integrity: sha512-30Y8DGs+oosA+BcDZd1SuZ4HDT+DVZ6lVT4L+mBUH1BSkNna08FrbmrGQxO82CcxU6ZK0q1YLVkkb5cGx8y9ew==} + /@angular/common@16.2.1(@angular/core@16.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-druackA5JQpvfS8cD8DFtPRXGRKbhx3mQ778t1n6x3fXpIdGaAX+nSAgAKhIoF7fxWmu0KuHGzb+3BFlZRyTXw==} engines: {node: ^16.14.0 || >=18.10.0} peerDependencies: - '@angular/core': 16.1.6 + '@angular/core': 16.2.1 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/core': 16.1.6(rxjs@7.8.1)(zone.js@0.13.1) + '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) rxjs: 7.8.1 - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@angular/compiler-cli@16.1.6(@angular/compiler@16.1.6)(typescript@5.1.6): - resolution: {integrity: sha512-unWmH2CcuCkVuEr1fQuzlJtSGzRirsyg8cGQmRh16orx6N8oa/fCvxYRSOed/5aE9YiRpIFZ2TQWT2myY10/6Q==} + /@angular/compiler-cli@16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6): + resolution: {integrity: sha512-A5SyNZTZnXSCL5JVXHKbYj9p2dRYoeFnb6hGQFt2AuCcpUjVIIdwHtre3YzkKe5sFwepPctdoRe2fRXlTfTRjA==} engines: {node: ^16.14.0 || >=18.10.0} hasBin: true peerDependencies: - '@angular/compiler': 16.1.6 + '@angular/compiler': 16.2.1 typescript: '>=4.9.3 <5.2' dependencies: - '@angular/compiler': 16.1.6(@angular/core@16.1.6) + '@angular/compiler': 16.2.1(@angular/core@16.2.1) '@babel/core': 7.22.5 '@jridgewell/sourcemap-codec': 1.4.14 chokidar: 3.5.3 convert-source-map: 1.9.0 reflect-metadata: 0.1.13 semver: 7.5.3 - tslib: 2.6.1 + tslib: 2.6.2 typescript: 5.1.6 yargs: 17.7.2 transitivePeerDependencies: - supports-color dev: true - /@angular/compiler@16.1.6(@angular/core@16.1.6): - resolution: {integrity: sha512-BVDfKZLMb7mmLwdek+ZyzI43Zv0WNNNqnYpMeOI6egmkhtjNCxpQAy2YFKgNPse3bBGP8tKutwAtBB+Lqu/Kcw==} + /@angular/compiler@16.2.1(@angular/core@16.2.1): + resolution: {integrity: sha512-dPauu+ESn79d66U9nBvnunNuBk/UMqnm7iL9Q31J8OKYN/4vrKbsO57pmULOft/GRAYsE3FdLBH0NkocFZKIMQ==} engines: {node: ^16.14.0 || >=18.10.0} peerDependencies: - '@angular/core': 16.1.6 + '@angular/core': 16.2.1 peerDependenciesMeta: '@angular/core': optional: true dependencies: - '@angular/core': 16.1.6(rxjs@7.8.1)(zone.js@0.13.1) - tslib: 2.6.1 + '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) + tslib: 2.6.2 - /@angular/core@16.1.6(rxjs@7.8.1)(zone.js@0.13.1): - resolution: {integrity: sha512-tUXvVLc+Vbl8Se7hajwyUTNmKD9uPq+SZH6x8sRM2n5azzjBZltOoJfzxK5JKAkiFf/KkQhteHkMBfoDLZ2tmw==} + /@angular/core@16.2.1(rxjs@7.8.1)(zone.js@0.13.1): + resolution: {integrity: sha512-Y+0jssQnJPovxMv9cDKYlp6BBHeFBLOHd/+FPv5IIGD1c7NwBP/TImJxCaIV78a57xnO8L0SFacDg/kULzvKrg==} engines: {node: ^16.14.0 || >=18.10.0} peerDependencies: rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.13.0 dependencies: rxjs: 7.8.1 - tslib: 2.6.1 + tslib: 2.6.2 zone.js: 0.13.1 - /@angular/forms@16.1.6(@angular/common@16.1.6)(@angular/core@16.1.6)(@angular/platform-browser@16.1.6)(rxjs@7.8.1): - resolution: {integrity: sha512-6MMQx3qCFrXyX4sSNvQRLRm6smGZshMjuWSCSkyEvvTYpZSA3F7h8ba762PDKYE3vMAON2OczCr8y9MyjBEruA==} + /@angular/forms@16.2.1(@angular/common@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-cCygiLfBAsVHdtKmNptlk2IgXu0wjRc8kSiiSnJkfK6U/NiNg8ADMiN7iYgKW2TD1ZRw+7dYZV856lxEy2n0+A==} engines: {node: ^16.14.0 || >=18.10.0} peerDependencies: - '@angular/common': 16.1.6 - '@angular/core': 16.1.6 - '@angular/platform-browser': 16.1.6 + '@angular/common': 16.2.1 + '@angular/core': 16.2.1 + '@angular/platform-browser': 16.2.1 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/common': 16.1.6(@angular/core@16.1.6)(rxjs@7.8.1) - '@angular/core': 16.1.6(rxjs@7.8.1)(zone.js@0.13.1) - '@angular/platform-browser': 16.1.6(@angular/animations@16.1.6)(@angular/common@16.1.6)(@angular/core@16.1.6) + '@angular/common': 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) + '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) + '@angular/platform-browser': 16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1) rxjs: 7.8.1 - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@angular/platform-browser-dynamic@16.1.6(@angular/common@16.1.6)(@angular/compiler@16.1.6)(@angular/core@16.1.6)(@angular/platform-browser@16.1.6): - resolution: {integrity: sha512-NZ3bcXgWq9k0pJE7EvZsatvY8++5NzAtxCdV9IM+fqgzBzkSR4le0Iud4hdBSNQF1DOwwB8KdU7Xpe9q4YsdqA==} + /@angular/platform-browser-dynamic@16.2.1(@angular/common@16.2.1)(@angular/compiler@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1): + resolution: {integrity: sha512-dKMCSrbD/joOMXM1mhDOKNDZ1BxwO9r9uu5ZxY0L/fWm/ousgMucNikLr38vBudgWM8CN6BuabzkxWKcqi3k4g==} engines: {node: ^16.14.0 || >=18.10.0} peerDependencies: - '@angular/common': 16.1.6 - '@angular/compiler': 16.1.6 - '@angular/core': 16.1.6 - '@angular/platform-browser': 16.1.6 + '@angular/common': 16.2.1 + '@angular/compiler': 16.2.1 + '@angular/core': 16.2.1 + '@angular/platform-browser': 16.2.1 dependencies: - '@angular/common': 16.1.6(@angular/core@16.1.6)(rxjs@7.8.1) - '@angular/compiler': 16.1.6(@angular/core@16.1.6) - '@angular/core': 16.1.6(rxjs@7.8.1)(zone.js@0.13.1) - '@angular/platform-browser': 16.1.6(@angular/animations@16.1.6)(@angular/common@16.1.6)(@angular/core@16.1.6) - tslib: 2.6.1 + '@angular/common': 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) + '@angular/compiler': 16.2.1(@angular/core@16.2.1) + '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) + '@angular/platform-browser': 16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1) + tslib: 2.6.2 dev: false - /@angular/platform-browser@16.1.6(@angular/animations@16.1.6)(@angular/common@16.1.6)(@angular/core@16.1.6): - resolution: {integrity: sha512-qHwQpqhcWFAwroWwe7iiSsJrs38lrW82vHEm/sX/fcbUuLtqEDaNMf90KqzeSPIkFEkX5wwUZxdRwEh2bepf6g==} + /@angular/platform-browser@16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1): + resolution: {integrity: sha512-SH8zRiRAcw0B5/tVlEc5U/lN5F8g+JizSuu7BQvpCAQEDkM6IjF9LP36Bjav7JuadItbWLfT6peWYa1sJvax2w==} engines: {node: ^16.14.0 || >=18.10.0} peerDependencies: - '@angular/animations': 16.1.6 - '@angular/common': 16.1.6 - '@angular/core': 16.1.6 + '@angular/animations': 16.2.1 + '@angular/common': 16.2.1 + '@angular/core': 16.2.1 peerDependenciesMeta: '@angular/animations': optional: true dependencies: - '@angular/animations': 16.1.6(@angular/core@16.1.6) - '@angular/common': 16.1.6(@angular/core@16.1.6)(rxjs@7.8.1) - '@angular/core': 16.1.6(rxjs@7.8.1)(zone.js@0.13.1) - tslib: 2.6.1 + '@angular/animations': 16.2.1(@angular/core@16.2.1) + '@angular/common': 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) + '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) + tslib: 2.6.2 dev: false - /@angular/router@16.1.6(@angular/common@16.1.6)(@angular/core@16.1.6)(@angular/platform-browser@16.1.6)(rxjs@7.8.1): - resolution: {integrity: sha512-4+MniaDghKurV117URJZzCQBNCdMfiu6lRpTdcKWbHgGZqOQRG9N/gcHah5eLYVB0s6mfQ1OQ9HavNyjujF6Fg==} + /@angular/router@16.2.1(@angular/common@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1)(rxjs@7.8.1): + resolution: {integrity: sha512-C0WfcktsC25G37unxdH/5I7PbkVBSEB1o+0DJK9/HG97r1yzEkptF6fbRIzDBTS7dX0NfWN/PTAKF0ep7YlHvA==} engines: {node: ^16.14.0 || >=18.10.0} peerDependencies: - '@angular/common': 16.1.6 - '@angular/core': 16.1.6 - '@angular/platform-browser': 16.1.6 + '@angular/common': 16.2.1 + '@angular/core': 16.2.1 + '@angular/platform-browser': 16.2.1 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/common': 16.1.6(@angular/core@16.1.6)(rxjs@7.8.1) - '@angular/core': 16.1.6(rxjs@7.8.1)(zone.js@0.13.1) - '@angular/platform-browser': 16.1.6(@angular/animations@16.1.6)(@angular/common@16.1.6)(@angular/core@16.1.6) + '@angular/common': 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) + '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) + '@angular/platform-browser': 16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1) rxjs: 7.8.1 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@assemblyscript/loader@0.10.1: resolution: {integrity: sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==} dev: true + /@babel/code-frame@7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + dev: true + /@babel/code-frame@7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} @@ -459,6 +469,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.22.5: resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} engines: {node: '>=6.9.0'} @@ -482,6 +497,39 @@ packages: - supports-color dev: true + /@babel/core@7.22.9: + resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) + '@babel/helpers': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.22.10: + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + dev: true + /@babel/generator@7.22.7: resolution: {integrity: sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==} engines: {node: '>=6.9.0'} @@ -492,6 +540,16 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.22.9: + resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -506,6 +564,17 @@ packages: '@babel/types': 7.22.5 dev: true + /@babel/helper-compilation-targets@7.22.10: + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} engines: {node: '>=6.9.0'} @@ -520,13 +589,13 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.5): + /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 @@ -534,36 +603,35 @@ packages: '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-replace-supers': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - semver: 6.3.0 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin@7.22.5(@babel/core@7.22.5): + /@babel/helper-create-regexp-features-plugin@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 - semver: 6.3.0 + semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.4.0(@babel/core@7.22.5): - resolution: {integrity: sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==} + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.9): + resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} peerDependencies: - '@babel/core': ^7.4.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.2 - semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true @@ -618,6 +686,20 @@ packages: - supports-color dev: true + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} @@ -630,13 +712,13 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.5(@babel/core@7.22.5): + /@babel/helper-remap-async-to-generator@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-wrap-function': 7.22.5 @@ -645,6 +727,18 @@ packages: - supports-color dev: true + /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.9): + resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-wrap-function': 7.22.10 + dev: true + /@babel/helper-replace-supers@7.22.5: resolution: {integrity: sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==} engines: {node: '>=6.9.0'} @@ -680,6 +774,13 @@ packages: '@babel/types': 7.22.5 dev: true + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} @@ -695,6 +796,15 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-wrap-function@7.22.10: + resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.22.5 + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + dev: true + /@babel/helper-wrap-function@7.22.5: resolution: {integrity: sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==} engines: {node: '>=6.9.0'} @@ -707,6 +817,17 @@ packages: - supports-color dev: true + /@babel/helpers@7.22.10: + resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helpers@7.22.5: resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==} engines: {node: '>=6.9.0'} @@ -718,6 +839,15 @@ packages: - supports-color dev: true + /@babel/highlight@7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} @@ -727,6 +857,14 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/parser@7.22.10: + resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/parser@7.22.5: resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} engines: {node: '>=6.0.0'} @@ -735,497 +873,495 @@ packages: '@babel/types': 7.22.5 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.5): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.5): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-optional-chaining': 7.22.10(@babel/core@7.22.9) dev: true - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.5): + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.9): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.5) + '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.5): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.9): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 dev: true - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.5): + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.9): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.5): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.5): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.5): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.9): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.5): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.5): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.5): + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.5): + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.5): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.9): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.5): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.5): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.5): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.5): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.5): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.5): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.5): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.5): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.9): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.5): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.5): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.9): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-async-generator-functions@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==} + /@babel/plugin-transform-async-generator-functions@7.22.10(@babel/core@7.22.9): + resolution: {integrity: sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.5) - transitivePeerDependencies: - - supports-color + '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.5) + '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.9) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-class-static-block@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-class-static-block@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-classes@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==} + /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.9): + resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.5 dev: true - /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dynamic-import@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-dynamic-import@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-export-namespace-from@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-export-namespace-from@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-function-name': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-json-strings@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-json-strings@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-logical-assignment-operators@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-module-transforms': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-module-transforms': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 @@ -1233,13 +1369,13 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-module-transforms': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 @@ -1248,392 +1384,392 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-module-transforms': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-nullish-coalescing-operator@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-numeric-separator@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-numeric-separator@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-object-rest-spread@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-object-rest-spread@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.9 + '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-optional-chaining@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==} + /@babel/plugin-transform-optional-chaining@7.22.10(@babel/core@7.22.9): + resolution: {integrity: sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) dev: true - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-private-property-in-object@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-private-property-in-object@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-runtime@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==} + /@babel/plugin-transform-runtime@7.22.9(@babel/core@7.22.9): + resolution: {integrity: sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.3(@babel/core@7.22.5) - babel-plugin-polyfill-corejs3: 0.8.1(@babel/core@7.22.5) - babel-plugin-polyfill-regenerator: 0.5.0(@babel/core@7.22.5) - semver: 6.3.0 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.9) + babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.9) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.9) + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.5): + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.9): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/preset-env@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==} + /@babel/preset-env@7.22.9(@babel/core@7.22.9): + resolution: {integrity: sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.9 + '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.5) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-async-generator-functions': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-class-static-block': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-dynamic-import': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-export-namespace-from': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-json-strings': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-logical-assignment-operators': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-modules-systemjs': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-numeric-separator': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-object-rest-spread': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-optional-catch-binding': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-optional-chaining': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-private-property-in-object': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-unicode-escapes': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.5) - '@babel/preset-modules': 0.1.5(@babel/core@7.22.5) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.9) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-async-generator-functions': 7.22.10(@babel/core@7.22.9) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-class-static-block': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.9) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-dynamic-import': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-export-namespace-from': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-json-strings': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-logical-assignment-operators': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-modules-systemjs': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-numeric-separator': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-object-rest-spread': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-optional-catch-binding': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-optional-chaining': 7.22.10(@babel/core@7.22.9) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-private-property-in-object': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-unicode-escapes': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.9) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.9) + '@babel/preset-modules': 0.1.5(@babel/core@7.22.9) '@babel/types': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.3(@babel/core@7.22.5) - babel-plugin-polyfill-corejs3: 0.8.1(@babel/core@7.22.5) - babel-plugin-polyfill-regenerator: 0.5.0(@babel/core@7.22.5) + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.9) + babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.9) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.9) core-js-compat: 3.31.0 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.22.5): + /@babel/preset-modules@0.1.5(@babel/core@7.22.9): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.5) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.9) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) '@babel/types': 7.22.5 esutils: 2.0.3 dev: true @@ -1642,8 +1778,8 @@ packages: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime@7.22.5: - resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==} + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 @@ -1658,6 +1794,24 @@ packages: '@babel/types': 7.22.5 dev: true + /@babel/traverse@7.22.10: + resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/traverse@7.22.5: resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} engines: {node: '>=6.9.0'} @@ -1676,6 +1830,15 @@ packages: - supports-color dev: true + /@babel/types@7.22.10: + resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + /@babel/types@7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} @@ -1703,8 +1866,17 @@ packages: engines: {node: '>=10.0.0'} dev: true - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + /@esbuild/android-arm64@0.18.17: + resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.2: + resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1712,8 +1884,17 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + /@esbuild/android-arm@0.18.17: + resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.2: + resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1721,8 +1902,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + /@esbuild/android-x64@0.18.17: + resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -1730,8 +1911,26 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + /@esbuild/android-x64@0.19.2: + resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.17: + resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.2: + resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1739,8 +1938,17 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + /@esbuild/darwin-x64@0.18.17: + resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.2: + resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1748,8 +1956,17 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + /@esbuild/freebsd-arm64@0.18.17: + resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.2: + resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1757,8 +1974,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + /@esbuild/freebsd-x64@0.18.17: + resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1766,8 +1983,17 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + /@esbuild/freebsd-x64@0.19.2: + resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.17: + resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1775,8 +2001,17 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + /@esbuild/linux-arm64@0.19.2: + resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.17: + resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1784,8 +2019,26 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + /@esbuild/linux-arm@0.19.2: + resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.17: + resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.2: + resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1793,8 +2046,17 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + /@esbuild/linux-loong64@0.18.17: + resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.2: + resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1802,8 +2064,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + /@esbuild/linux-mips64el@0.18.17: + resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1811,8 +2073,26 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + /@esbuild/linux-mips64el@0.19.2: + resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.17: + resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.2: + resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1820,8 +2100,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + /@esbuild/linux-riscv64@0.18.17: + resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1829,8 +2109,17 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + /@esbuild/linux-riscv64@0.19.2: + resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.17: + resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1838,8 +2127,17 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + /@esbuild/linux-s390x@0.19.2: + resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.17: + resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1847,8 +2145,17 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + /@esbuild/linux-x64@0.19.2: + resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.17: + resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1856,8 +2163,26 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + /@esbuild/netbsd-x64@0.19.2: + resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.17: + resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.2: + resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1865,8 +2190,17 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + /@esbuild/sunos-x64@0.18.17: + resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.2: + resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1874,8 +2208,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + /@esbuild/win32-arm64@0.18.17: + resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1883,8 +2217,26 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + /@esbuild/win32-arm64@0.19.2: + resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.17: + resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.2: + resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1892,8 +2244,17 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + /@esbuild/win32-x64@0.18.17: + resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.2: + resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -1963,6 +2324,10 @@ packages: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: @@ -1974,61 +2339,62 @@ packages: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} dev: true - /@ngtools/webpack@16.1.5(@angular/compiler-cli@16.1.6)(typescript@5.1.6)(webpack@5.86.0): - resolution: {integrity: sha512-XQkanGAtB9S2EE14xa/04hPNYSkAzJOeaHJkirfqk/p40p8nA2pNsfLYCMd2N7K4kzqcET8UYAZ+wIpQxp12HA==} + /@ngtools/webpack@16.2.0(@angular/compiler-cli@16.2.1)(typescript@5.1.6)(webpack@5.88.2): + resolution: {integrity: sha512-c9jv4r7GnLTpnPOeF+a9yAm/3/2wwl9lMBU32i9hlY+q/Hqde4PiL95bUOLnRRL1I64DV7BFTlSZqSPgDpFXZQ==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler-cli': ^16.0.0 typescript: '>=4.9.3 <5.2' webpack: ^5.54.0 dependencies: - '@angular/compiler-cli': 16.1.6(@angular/compiler@16.1.6)(typescript@5.1.6) + '@angular/compiler-cli': 16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6) typescript: 5.1.6 - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) dev: true - /@ngx-grpc/common@3.1.1(google-protobuf@3.21.2)(rxjs@7.8.1): - resolution: {integrity: sha512-RoTnu1etLPJT1cSJyCXgKCpKKhCR/nrNEdRyZreyLO4RgC8kThlD+akkytoCsDuj5s8NkJI/xDP61E7TLx/y2A==} + /@ngx-grpc/common@3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1): + resolution: {integrity: sha512-8HvfXDNFrY2oFhkxchHQF2pku1+1sA+MUHcnALURkPE0yvTuqYGkuL7XVxTBImJMZaHiiV7YhFMYDUDOC1ISPg==} peerDependencies: google-protobuf: ^3.10.0 rxjs: '>=6.0.0' dependencies: google-protobuf: 3.21.2 rxjs: 7.8.1 - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@ngx-grpc/core@3.1.1(@angular/core@16.1.6)(@ngx-grpc/common@3.1.1)(rxjs@7.8.1): - resolution: {integrity: sha512-GFhO/kpA7kJ3bu6mYwgjspPWjMJPUHxTrLZqxjsXtwNexPNSIQkVO4SOrROp+bZ91LVt+goiSeRz8CUzwiXWdQ==} + /@ngx-grpc/core@3.1.2(@angular/core@16.2.1)(@ngx-grpc/common@3.1.2)(rxjs@7.8.1): + resolution: {integrity: sha512-h4CFRPvTFdvk94M6TkHeGlTA6edbIEDd6o0H5KLWVzrwRH1mUH0oX6+GXjulZfm7u1qY+mhX/913wrd86UTYbg==} peerDependencies: '@angular/core': '>=12.0.0' - '@ngx-grpc/common': 3.1.1 + '@ngx-grpc/common': 3.1.2 rxjs: '>=6.0.0' dependencies: - '@angular/core': 16.1.6(rxjs@7.8.1)(zone.js@0.13.1) - '@ngx-grpc/common': 3.1.1(google-protobuf@3.21.2)(rxjs@7.8.1) + '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) + '@ngx-grpc/common': 3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1) rxjs: 7.8.1 - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@ngx-grpc/protoc-gen-ng@3.1.1: - resolution: {integrity: sha512-xF9CEaazVq+c4PkW+vz1Upt4DoTbCSZbTHNbz8ivp49+GOgusqCAtQG3CRXm/hLNFjh6BF/sY+McAHo1saEpGQ==} + /@ngx-grpc/protoc-gen-ng@3.1.2: + resolution: {integrity: sha512-epOAs0hEXT2l9l4jjXgaxB5TPtg6AWYq3uRl1vIo7vNHj7qsg0sMIOhxV+bPgZ93YOfKCQkemklt7koKDRJyIw==} hasBin: true dependencies: google-protobuf: 3.21.2 prettier: 1.19.1 + tslib: 2.6.2 winston: 3.8.2 dev: true - /@ngx-grpc/well-known-types@3.1.1(@ngx-grpc/common@3.1.1)(google-protobuf@3.21.2): - resolution: {integrity: sha512-iPcUqsgm0s+g8i8sDazPnJya0lPJ8981PdnjzTyqKlc8y97B75K20bRS9/mc2EjKP+FXHUfDejzA+SehjeRzew==} + /@ngx-grpc/well-known-types@3.1.2(@ngx-grpc/common@3.1.2)(google-protobuf@3.21.2): + resolution: {integrity: sha512-otJ8C/NuLwm4JuvqzTT/xAHLJJN/EpkowooKgVGzXOnfTckzp5OWiUmBdxBk/pXo234CTT42KvOnDMtSloa+sA==} peerDependencies: - '@ngx-grpc/common': 3.1.1 + '@ngx-grpc/common': 3.1.2 google-protobuf: ^3.10.0 dependencies: - '@ngx-grpc/common': 3.1.1(google-protobuf@3.21.2)(rxjs@7.8.1) + '@ngx-grpc/common': 3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1) google-protobuf: 3.21.2 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@nodelib/fs.scandir@2.1.5: @@ -2057,7 +2423,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.3 + semver: 7.5.4 dev: true /@npmcli/fs@3.1.0: @@ -2077,7 +2443,7 @@ packages: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.3 + semver: 7.5.4 which: 3.0.0 transitivePeerDependencies: - bluebird @@ -2134,7 +2500,7 @@ packages: dev: true optional: true - /@rollup/plugin-json@6.0.0(rollup@3.20.2): + /@rollup/plugin-json@6.0.0(rollup@3.25.3): resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2143,11 +2509,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) - rollup: 3.20.2 + '@rollup/pluginutils': 5.0.2(rollup@3.25.3) + rollup: 3.25.3 dev: true - /@rollup/plugin-node-resolve@15.0.1(rollup@3.20.2): + /@rollup/plugin-node-resolve@15.0.1(rollup@3.25.3): resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2156,16 +2522,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + '@rollup/pluginutils': 5.0.2(rollup@3.25.3) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.2 - rollup: 3.20.2 + rollup: 3.25.3 dev: true - /@rollup/pluginutils@5.0.2(rollup@3.20.2): + /@rollup/pluginutils@5.0.2(rollup@3.25.3): resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2177,15 +2543,15 @@ packages: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.20.2 + rollup: 3.25.3 dev: true - /@schematics/angular@16.1.5: - resolution: {integrity: sha512-GwSweqKGjMc9oqU6fukqYKlBflCCDA/l2qfA60YIdf4SubaZnIUpkpNXTbWeFRPJh8zQShb8OZE7cVj8MZRruw==} + /@schematics/angular@16.2.0: + resolution: {integrity: sha512-Ib0/ZCkjWt7a5p3209JVwEWwf41v03K3ylvlxLIEo1ZGijAZAlrBj4GrA5YQ+TmPm2hRyt+owss7x91/x+i0Gw==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.1.5(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.5 + '@angular-devkit/core': 16.2.0(chokidar@3.5.3) + '@angular-devkit/schematics': 16.2.0 jsonc-parser: 3.2.0 transitivePeerDependencies: - chokidar @@ -2200,6 +2566,11 @@ packages: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} dev: true + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -2354,19 +2725,19 @@ packages: resolution: {integrity: sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==} dev: true - /@types/ws@8.5.4: - resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} + /@types/ws@8.5.5: + resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: '@types/node': 18.15.11 dev: true - /@vitejs/plugin-basic-ssl@1.0.1(vite@4.3.9): + /@vitejs/plugin-basic-ssl@1.0.1(vite@4.4.7): resolution: {integrity: sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==} engines: {node: '>=14.6.0'} peerDependencies: vite: ^3.0.0 || ^4.0.0 dependencies: - vite: 4.3.9(less@4.1.3)(sass@1.63.2)(terser@5.17.7) + vite: 4.4.7(less@4.1.3)(sass@1.64.1)(terser@5.19.2) dev: true /@webassemblyjs/ast@1.11.6: @@ -2475,6 +2846,25 @@ packages: '@xtuc/long': 4.2.2 dev: true + /@wessberg/ts-evaluator@0.0.27(typescript@5.1.6): + resolution: {integrity: sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==} + engines: {node: '>=10.1.0'} + deprecated: this package has been renamed to ts-evaluator. Please install ts-evaluator instead + peerDependencies: + typescript: '>=3.2.x || >= 4.x' + dependencies: + chalk: 4.1.2 + jsdom: 16.7.0 + object-path: 0.11.8 + tslib: 2.6.2 + typescript: 5.1.6 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} dev: true @@ -2503,6 +2893,13 @@ packages: negotiator: 0.6.3 dev: true + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + /acorn-import-assertions@1.9.0(acorn@8.8.2): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: @@ -2511,6 +2908,17 @@ packages: acorn: 8.8.2 dev: true + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} @@ -2688,6 +3096,10 @@ packages: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + /autoprefixer@10.4.14(postcss@8.4.24): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} @@ -2704,17 +3116,33 @@ packages: postcss-value-parser: 4.2.0 dev: true - /babel-loader@9.1.2(@babel/core@7.22.5)(webpack@5.86.0): - resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} + /autoprefixer@10.4.14(postcss@8.4.27): + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.5 + caniuse-lite: 1.0.30001473 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + dev: true + + /babel-loader@9.1.3(@babel/core@7.22.9)(webpack@5.88.2): + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: '@babel/core': ^7.12.0 webpack: '>=5' dependencies: - '@babel/core': 7.22.5 - find-cache-dir: 3.3.2 + '@babel/core': 7.22.9 + find-cache-dir: 4.0.0 schema-utils: 4.0.0 - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) dev: true /babel-plugin-istanbul@6.1.1: @@ -2730,38 +3158,38 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs2@0.4.3(@babel/core@7.22.5): - resolution: {integrity: sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==} + /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.9): + resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.22.5 - '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.5) - semver: 6.3.0 + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.9 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.1(@babel/core@7.22.5): - resolution: {integrity: sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==} + /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.9): + resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) core-js-compat: 3.31.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.0(@babel/core@7.22.5): - resolution: {integrity: sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==} + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.9): + resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.22.5 - '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.5) + '@babel/core': 7.22.9 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) transitivePeerDependencies: - supports-color dev: true @@ -2873,6 +3301,21 @@ packages: fill-range: 7.0.1 dev: true + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001521 + electron-to-chromium: 1.4.496 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: true + /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -2903,7 +3346,7 @@ packages: /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.5.3 + semver: 7.5.4 dev: true /bytes@3.0.0: @@ -2981,6 +3424,10 @@ packages: resolution: {integrity: sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==} dev: true + /caniuse-lite@1.0.30001521: + resolution: {integrity: sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==} + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3131,15 +3578,26 @@ packages: text-hex: 1.0.0 dev: true - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} dev: true /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true @@ -3231,19 +3689,19 @@ packages: is-what: 3.14.1 dev: true - /copy-webpack-plugin@11.0.0(webpack@5.86.0): + /copy-webpack-plugin@11.0.0(webpack@5.88.2): resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} peerDependencies: webpack: ^5.1.0 dependencies: - fast-glob: 3.2.12 + fast-glob: 3.3.1 glob-parent: 6.0.2 globby: 13.1.3 normalize-path: 3.0.0 schema-utils: 4.0.0 serialize-javascript: 6.0.1 - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) dev: true /core-js-compat@3.31.0: @@ -3264,8 +3722,8 @@ packages: vary: 1.1.2 dev: true - /cosmiconfig@8.1.3: - resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} engines: {node: '>=14'} dependencies: import-fresh: 3.3.0 @@ -3274,15 +3732,15 @@ packages: path-type: 4.0.0 dev: true - /critters@0.0.19: - resolution: {integrity: sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==} + /critters@0.0.20: + resolution: {integrity: sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==} dependencies: chalk: 4.1.2 css-select: 5.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 htmlparser2: 8.0.2 - postcss: 8.4.24 + postcss: 8.4.27 pretty-bytes: 5.6.0 dev: true @@ -3295,21 +3753,21 @@ packages: which: 2.0.2 dev: true - /css-loader@6.8.1(webpack@5.86.0): + /css-loader@6.8.1(webpack@5.88.2): resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.24) - postcss: 8.4.24 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.24) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.24) - postcss-modules-scope: 3.0.0(postcss@8.4.24) - postcss-modules-values: 4.0.0(postcss@8.4.24) + icss-utils: 5.1.0(postcss@8.4.27) + postcss: 8.4.27 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.27) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.27) + postcss-modules-scope: 3.0.0(postcss@8.4.27) + postcss-modules-values: 4.0.0(postcss@8.4.27) postcss-value-parser: 4.2.0 - semver: 7.5.3 - webpack: 5.86.0(esbuild@0.17.19) + semver: 7.5.4 + webpack: 5.88.2(esbuild@0.18.17) dev: true /css-select@5.1.0: @@ -3333,6 +3791,21 @@ packages: hasBin: true dev: true + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + /cuint@0.2.2: resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} dev: true @@ -3341,6 +3814,15 @@ packages: resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} dev: true + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: true + /date-format@4.0.14: resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} engines: {node: '>=4.0'} @@ -3382,6 +3864,10 @@ packages: ms: 2.1.2 dev: true + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -3405,6 +3891,11 @@ packages: engines: {node: '>=8'} dev: true + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true @@ -3476,6 +3967,13 @@ packages: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: true + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + dev: true + /domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} @@ -3503,6 +4001,10 @@ packages: resolution: {integrity: sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==} dev: true + /electron-to-chromium@1.4.496: + resolution: {integrity: sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -3603,41 +4105,78 @@ packages: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true - /esbuild-wasm@0.17.19: - resolution: {integrity: sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==} + /esbuild-wasm@0.18.17: + resolution: {integrity: sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==} + engines: {node: '>=12'} + hasBin: true + dev: true + + /esbuild-wasm@0.19.2: + resolution: {integrity: sha512-ak2XIIJKby+Uo3Iqh8wtw4pn2uZcnfLgtcmBHIgkShpun5ZIJsFigWXp7uLt7gXk3QAOCMmv0TSsIxD5qdn+Vw==} engines: {node: '>=12'} hasBin: true dev: true - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + /esbuild@0.18.17: + resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.17 + '@esbuild/android-arm64': 0.18.17 + '@esbuild/android-x64': 0.18.17 + '@esbuild/darwin-arm64': 0.18.17 + '@esbuild/darwin-x64': 0.18.17 + '@esbuild/freebsd-arm64': 0.18.17 + '@esbuild/freebsd-x64': 0.18.17 + '@esbuild/linux-arm': 0.18.17 + '@esbuild/linux-arm64': 0.18.17 + '@esbuild/linux-ia32': 0.18.17 + '@esbuild/linux-loong64': 0.18.17 + '@esbuild/linux-mips64el': 0.18.17 + '@esbuild/linux-ppc64': 0.18.17 + '@esbuild/linux-riscv64': 0.18.17 + '@esbuild/linux-s390x': 0.18.17 + '@esbuild/linux-x64': 0.18.17 + '@esbuild/netbsd-x64': 0.18.17 + '@esbuild/openbsd-x64': 0.18.17 + '@esbuild/sunos-x64': 0.18.17 + '@esbuild/win32-arm64': 0.18.17 + '@esbuild/win32-ia32': 0.18.17 + '@esbuild/win32-x64': 0.18.17 + dev: true + + /esbuild@0.19.2: + resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 + '@esbuild/android-arm': 0.19.2 + '@esbuild/android-arm64': 0.19.2 + '@esbuild/android-x64': 0.19.2 + '@esbuild/darwin-arm64': 0.19.2 + '@esbuild/darwin-x64': 0.19.2 + '@esbuild/freebsd-arm64': 0.19.2 + '@esbuild/freebsd-x64': 0.19.2 + '@esbuild/linux-arm': 0.19.2 + '@esbuild/linux-arm64': 0.19.2 + '@esbuild/linux-ia32': 0.19.2 + '@esbuild/linux-loong64': 0.19.2 + '@esbuild/linux-mips64el': 0.19.2 + '@esbuild/linux-ppc64': 0.19.2 + '@esbuild/linux-riscv64': 0.19.2 + '@esbuild/linux-s390x': 0.19.2 + '@esbuild/linux-x64': 0.19.2 + '@esbuild/netbsd-x64': 0.19.2 + '@esbuild/openbsd-x64': 0.19.2 + '@esbuild/sunos-x64': 0.19.2 + '@esbuild/win32-arm64': 0.19.2 + '@esbuild/win32-ia32': 0.19.2 + '@esbuild/win32-x64': 0.19.2 dev: true + optional: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -3653,6 +4192,18 @@ packages: engines: {node: '>=0.8.0'} dev: true + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -3793,6 +4344,17 @@ packages: micromatch: 4.0.5 dev: true + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true @@ -3867,6 +4429,14 @@ packages: pkg-dir: 4.2.0 dev: true + /find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + dev: true + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -3875,6 +4445,14 @@ packages: path-exists: 4.0.0 dev: true + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true @@ -3901,6 +4479,15 @@ packages: signal-exit: 4.0.2 dev: true + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -4072,7 +4659,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 @@ -4085,6 +4672,20 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true + /guess-parser@0.4.22(typescript@5.1.6): + resolution: {integrity: sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==} + peerDependencies: + typescript: '>=3.7.5' + dependencies: + '@wessberg/ts-evaluator': 0.0.27(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} dev: true @@ -4143,6 +4744,13 @@ packages: wbuf: 1.7.3 dev: true + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + /html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} dev: true @@ -4193,6 +4801,17 @@ packages: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: true + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -4269,13 +4888,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.24): + /icss-utils@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.24 + postcss: 8.4.27 dev: true /ieee754@1.2.1: @@ -4351,7 +4970,7 @@ packages: /injection-js@2.4.0: resolution: {integrity: sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: true /inquirer@8.2.4: @@ -4470,6 +5089,10 @@ packages: isobject: 3.0.1 dev: true + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -4601,6 +5224,48 @@ packages: argparse: 2.0.1 dev: true + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.8.2 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -4755,7 +5420,7 @@ packages: shell-quote: 1.8.1 dev: true - /less-loader@11.1.0(less@4.1.3)(webpack@5.86.0): + /less-loader@11.1.0(less@4.1.3)(webpack@5.88.2): resolution: {integrity: sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -4764,7 +5429,7 @@ packages: dependencies: klona: 2.0.6 less: 4.1.3 - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) dev: true /less@4.1.3: @@ -4774,7 +5439,7 @@ packages: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.6.1 + tslib: 2.6.2 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -4787,7 +5452,7 @@ packages: - supports-color dev: true - /license-webpack-plugin@4.0.2(webpack@5.86.0): + /license-webpack-plugin@4.0.2(webpack@5.88.2): resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} peerDependencies: webpack: '*' @@ -4797,7 +5462,7 @@ packages: webpack-sources: optional: true dependencies: - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) webpack-sources: 3.2.3 dev: true @@ -4831,6 +5496,13 @@ packages: p-locate: 4.1.0 dev: true + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true @@ -4894,11 +5566,11 @@ packages: engines: {node: 14 || >=16.14} dev: true - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + /magic-string@0.30.1: + resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /make-dir@2.1.0: @@ -5039,14 +5711,14 @@ packages: engines: {node: '>=6'} dev: true - /mini-css-extract-plugin@2.7.6(webpack@5.86.0): + /mini-css-extract-plugin@2.7.6(webpack@5.88.2): resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) dev: true /minimalistic-assert@1.0.1: @@ -5250,12 +5922,12 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /ng-packagr@16.1.0(@angular/compiler-cli@16.1.6)(tslib@2.6.1)(typescript@5.1.6): - resolution: {integrity: sha512-NbgzDRtRiYJi98Ssky7U5GoicZz7VkR3OW5qd9q3dt3H/JNqLh2PwB745NFG2cT00lEvfrY6LJ1NAcOjoWDibA==} + /ng-packagr@16.2.0(@angular/compiler-cli@16.2.1)(tslib@2.6.2)(typescript@5.1.6): + resolution: {integrity: sha512-3u2FVSpKDa0EJRSGOAhYIZwjtnG7SVFBnUf5fk/VfDOxVV4kFRea6DEK7f/mb1D4WV/yqSZB9JmvBZp0uuIGeA==} engines: {node: ^16.14.0 || >=18.10.0} hasBin: true peerDependencies: - '@angular/compiler-cli': ^16.0.0 || ^16.1.0-next.0 + '@angular/compiler-cli': ^16.0.0 || ^16.2.0-next.0 tailwindcss: ^2.0.0 || ^3.0.0 tslib: ^2.3.0 typescript: '>=4.9.3 <5.2' @@ -5263,35 +5935,35 @@ packages: tailwindcss: optional: true dependencies: - '@angular/compiler-cli': 16.1.6(@angular/compiler@16.1.6)(typescript@5.1.6) - '@rollup/plugin-json': 6.0.0(rollup@3.20.2) - '@rollup/plugin-node-resolve': 15.0.1(rollup@3.20.2) + '@angular/compiler-cli': 16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6) + '@rollup/plugin-json': 6.0.0(rollup@3.25.3) + '@rollup/plugin-node-resolve': 15.0.1(rollup@3.25.3) ajv: 8.12.0 ansi-colors: 4.1.3 autoprefixer: 10.4.14(postcss@8.4.24) browserslist: 4.21.5 cacache: 17.1.3 chokidar: 3.5.3 - commander: 10.0.1 + commander: 11.0.0 convert-source-map: 2.0.0 dependency-graph: 0.11.0 - esbuild-wasm: 0.17.19 + esbuild-wasm: 0.19.2 fast-glob: 3.2.12 find-cache-dir: 3.3.2 injection-js: 2.4.0 jsonc-parser: 3.2.0 less: 4.1.3 ora: 5.4.1 - piscina: 3.2.0 + piscina: 4.1.0 postcss: 8.4.24 postcss-url: 10.1.3(postcss@8.4.24) - rollup: 3.20.2 + rollup: 3.25.3 rxjs: 7.8.1 sass: 1.63.2 - tslib: 2.6.1 + tslib: 2.6.2 typescript: 5.1.6 optionalDependencies: - esbuild: 0.17.19 + esbuild: 0.19.2 transitivePeerDependencies: - supports-color dev: true @@ -5336,7 +6008,7 @@ packages: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.3 + semver: 7.5.4 tar: 6.1.13 which: 2.0.2 transitivePeerDependencies: @@ -5348,6 +6020,10 @@ packages: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + /nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -5362,7 +6038,7 @@ packages: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.11.0 - semver: 7.5.3 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -5387,7 +6063,7 @@ packages: resolution: {integrity: sha512-udSGENih/5xKh3Ex+L0PtZcOt0Pa+6ppDLnpG5D49/EhMja3LupaY9E/DtJTxyFBwE09ot7Fc+H4DywnZNWTVA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.3 + semver: 7.5.4 dev: true /npm-normalize-package-bin@3.0.0: @@ -5401,7 +6077,7 @@ packages: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 - semver: 7.5.3 + semver: 7.5.4 validate-npm-package-name: 5.0.0 dev: true @@ -5419,7 +6095,7 @@ packages: npm-install-checks: 6.1.0 npm-normalize-package-bin: 3.0.0 npm-package-arg: 10.1.0 - semver: 7.5.3 + semver: 7.5.4 dev: true /npm-registry-fetch@14.0.3: @@ -5460,6 +6136,10 @@ packages: boolbase: 1.0.0 dev: true + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -5469,6 +6149,11 @@ packages: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true + /object-path@0.11.8: + resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} + engines: {node: '>= 10.12.0'} + dev: true + /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true @@ -5547,6 +6232,13 @@ packages: p-try: 2.2.0 dev: true + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -5554,6 +6246,13 @@ packages: p-limit: 2.3.0 dev: true + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -5642,6 +6341,10 @@ packages: parse5: 7.1.2 dev: true + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -5658,6 +6361,11 @@ packages: engines: {node: '>=8'} dev: true + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -5705,8 +6413,18 @@ packages: dev: true optional: true - /piscina@3.2.0: - resolution: {integrity: sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==} + /piscina@4.0.0: + resolution: {integrity: sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==} + dependencies: + eventemitter-asyncresource: 1.0.0 + hdr-histogram-js: 2.0.3 + hdr-histogram-percentiles-obj: 3.0.0 + optionalDependencies: + nice-napi: 1.0.2 + dev: true + + /piscina@4.1.0: + resolution: {integrity: sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==} dependencies: eventemitter-asyncresource: 1.0.0 hdr-histogram-js: 2.0.3 @@ -5722,60 +6440,66 @@ packages: find-up: 4.1.0 dev: true - /postcss-loader@7.3.2(postcss@8.4.24)(webpack@5.86.0): - resolution: {integrity: sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==} + /pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + dependencies: + find-up: 6.3.0 + dev: true + + /postcss-loader@7.3.3(postcss@8.4.27)(webpack@5.88.2): + resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} engines: {node: '>= 14.15.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 dependencies: - cosmiconfig: 8.1.3 + cosmiconfig: 8.2.0 jiti: 1.18.2 - klona: 2.0.6 - postcss: 8.4.24 - semver: 7.5.3 - webpack: 5.86.0(esbuild@0.17.19) + postcss: 8.4.27 + semver: 7.5.4 + webpack: 5.88.2(esbuild@0.18.17) dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.24): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.27): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.24 + postcss: 8.4.27 dev: true - /postcss-modules-local-by-default@4.0.3(postcss@8.4.24): + /postcss-modules-local-by-default@4.0.3(postcss@8.4.27): resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.24) - postcss: 8.4.24 + icss-utils: 5.1.0(postcss@8.4.27) + postcss: 8.4.27 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.24): + /postcss-modules-scope@3.0.0(postcss@8.4.27): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.24 + postcss: 8.4.27 postcss-selector-parser: 6.0.11 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.24): + /postcss-modules-values@4.0.0(postcss@8.4.27): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.24) - postcss: 8.4.24 + icss-utils: 5.1.0(postcss@8.4.27) + postcss: 8.4.27 dev: true /postcss-selector-parser@6.0.11: @@ -5812,6 +6536,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss@8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /prettier@1.19.1: resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} engines: {node: '>=4'} @@ -5863,6 +6596,10 @@ packages: dev: true optional: true + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -5880,6 +6617,10 @@ packages: side-channel: 1.0.4 dev: true + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -5983,7 +6724,7 @@ packages: /regenerator-transform@0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: - '@babel/runtime': 7.22.5 + '@babel/runtime': 7.22.6 dev: true /regex-parser@2.2.11: @@ -6040,7 +6781,7 @@ packages: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.4.24 + postcss: 8.4.27 source-map: 0.6.1 dev: true @@ -6087,14 +6828,6 @@ packages: glob: 7.2.3 dev: true - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - /rollup@3.25.3: resolution: {integrity: sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -6117,7 +6850,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -6136,8 +6869,8 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sass-loader@13.3.1(sass@1.63.2)(webpack@5.86.0): - resolution: {integrity: sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==} + /sass-loader@13.3.2(sass@1.64.1)(webpack@5.88.2): + resolution: {integrity: sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==} engines: {node: '>= 14.15.0'} peerDependencies: fibers: '>= 3.1.0' @@ -6155,10 +6888,9 @@ packages: sass-embedded: optional: true dependencies: - klona: 2.0.6 neo-async: 2.6.2 - sass: 1.63.2 - webpack: 5.86.0(esbuild@0.17.19) + sass: 1.64.1 + webpack: 5.88.2(esbuild@0.18.17) dev: true /sass@1.63.2: @@ -6171,14 +6903,31 @@ packages: source-map-js: 1.0.2 dev: true + /sass@1.64.1: + resolution: {integrity: sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.0 + source-map-js: 1.0.2 + dev: true + /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} requiresBuild: true dev: true optional: true - /schema-utils@3.1.2: - resolution: {integrity: sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==} + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 @@ -6219,6 +6968,11 @@ packages: hasBin: true dev: true + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + /semver@7.5.3: resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} engines: {node: '>=10'} @@ -6227,6 +6981,14 @@ packages: lru-cache: 6.0.0 dev: true + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -6428,7 +7190,7 @@ packages: engines: {node: '>=0.10.0'} dev: true - /source-map-loader@4.0.1(webpack@5.86.0): + /source-map-loader@4.0.1(webpack@5.88.2): resolution: {integrity: sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -6437,7 +7199,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) dev: true /source-map-support@0.5.21: @@ -6628,6 +7390,10 @@ packages: engines: {node: '>=0.10'} dev: true + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -6645,7 +7411,7 @@ packages: yallist: 4.0.0 dev: true - /terser-webpack-plugin@5.3.7(esbuild@0.17.19)(webpack@5.86.0): + /terser-webpack-plugin@5.3.7(esbuild@0.18.17)(webpack@5.88.2): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -6662,16 +7428,16 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.17 - esbuild: 0.17.19 + esbuild: 0.18.17 jest-worker: 27.5.1 - schema-utils: 3.1.2 + schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.17.7 - webpack: 5.86.0(esbuild@0.17.19) + terser: 5.19.2 + webpack: 5.88.2(esbuild@0.18.17) dev: true - /terser@5.17.7: - resolution: {integrity: sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==} + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -6737,6 +7503,23 @@ packages: engines: {node: '>=0.6'} dev: true + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.0 + dev: true + /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -6746,12 +7529,12 @@ packages: resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} dev: true - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - dev: true - /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} /tuf-js@1.1.6: resolution: {integrity: sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==} @@ -6847,6 +7630,11 @@ packages: engines: {node: '>= 4.0.0'} dev: true + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -6863,12 +7651,30 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true @@ -6902,13 +7708,14 @@ packages: engines: {node: '>= 0.8'} dev: true - /vite@4.3.9(less@4.1.3)(sass@1.63.2)(terser@5.17.7): - resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + /vite@4.4.7(less@4.1.3)(sass@1.64.1)(terser@5.19.2): + resolution: {integrity: sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: '@types/node': '>= 14' less: '*' + lightningcss: ^1.21.0 sass: '*' stylus: '*' sugarss: '*' @@ -6918,6 +7725,8 @@ packages: optional: true less: optional: true + lightningcss: + optional: true sass: optional: true stylus: @@ -6927,12 +7736,12 @@ packages: terser: optional: true dependencies: - esbuild: 0.17.19 + esbuild: 0.18.17 less: 4.1.3 - postcss: 8.4.24 + postcss: 8.4.27 rollup: 3.25.3 - sass: 1.63.2 - terser: 5.17.7 + sass: 1.64.1 + terser: 5.19.2 optionalDependencies: fsevents: 2.3.2 dev: true @@ -6942,6 +7751,20 @@ packages: engines: {node: '>=0.10.0'} dev: true + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: true + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -6962,7 +7785,17 @@ packages: defaults: 1.0.4 dev: true - /webpack-dev-middleware@5.3.3(webpack@5.86.0): + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /webpack-dev-middleware@5.3.3(webpack@5.88.2): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -6973,10 +7806,10 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) dev: true - /webpack-dev-middleware@6.1.1(webpack@5.86.0): + /webpack-dev-middleware@6.1.1(webpack@5.88.2): resolution: {integrity: sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -6990,11 +7823,11 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) dev: true - /webpack-dev-server@4.15.0(webpack@5.86.0): - resolution: {integrity: sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==} + /webpack-dev-server@4.15.1(webpack@5.88.2): + resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} engines: {node: '>= 12.13.0'} hasBin: true peerDependencies: @@ -7012,7 +7845,7 @@ packages: '@types/serve-index': 1.9.1 '@types/serve-static': 1.15.1 '@types/sockjs': 0.3.33 - '@types/ws': 8.5.4 + '@types/ws': 8.5.5 ansi-html-community: 0.0.8 bonjour-service: 1.1.1 chokidar: 3.5.3 @@ -7034,8 +7867,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.86.0(esbuild@0.17.19) - webpack-dev-middleware: 5.3.3(webpack@5.86.0) + webpack: 5.88.2(esbuild@0.18.17) + webpack-dev-middleware: 5.3.3(webpack@5.88.2) ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -7057,7 +7890,7 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack-subresource-integrity@5.1.0(webpack@5.86.0): + /webpack-subresource-integrity@5.1.0(webpack@5.88.2): resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} engines: {node: '>= 12'} peerDependencies: @@ -7068,11 +7901,11 @@ packages: optional: true dependencies: typed-assert: 1.0.9 - webpack: 5.86.0(esbuild@0.17.19) + webpack: 5.88.2(esbuild@0.18.17) dev: true - /webpack@5.86.0(esbuild@0.17.19): - resolution: {integrity: sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==} + /webpack@5.88.2(esbuild@0.18.17): + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -7100,9 +7933,9 @@ packages: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.1.2 + schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(esbuild@0.17.19)(webpack@5.86.0) + terser-webpack-plugin: 5.3.7(esbuild@0.18.17)(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -7125,6 +7958,25 @@ packages: engines: {node: '>=0.8.0'} dev: true + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -7206,6 +8058,19 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} @@ -7232,6 +8097,14 @@ packages: optional: true dev: true + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + /xxhashjs@0.2.2: resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} dependencies: @@ -7287,7 +8160,12 @@ packages: yargs-parser: 21.1.1 dev: true + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zone.js@0.13.1: resolution: {integrity: sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 8ceae0a16..d3fac489b 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -3,16 +3,16 @@ "version": "3.11.0", "description": "gRPC API to interact with ArmoniK built for Angular", "peerDependencies": { - "@angular/common": "^16.1.6", - "@angular/core": "^16.1.6", - "@ngx-grpc/common": "^3.1.1", - "@ngx-grpc/core": "^3.1.1", - "@ngx-grpc/well-known-types": "^3.1.1", + "@angular/common": "^16.2.1", + "@angular/core": "^16.2.1", + "@ngx-grpc/common": "^3.1.2", + "@ngx-grpc/core": "^3.1.2", + "@ngx-grpc/well-known-types": "^3.1.2", "google-protobuf": "^3.21.2", "rxjs": "~7.8.1" }, "dependencies": { - "tslib": "^2.6.1" + "tslib": "^2.6.2" }, "keywords": [ "gRPC", From c62dfa6feedca2bf6185693cf3b7515c12cae477 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 22:30:52 +0000 Subject: [PATCH 009/344] chore(deps): update npm packages --- package.json | 10 +-- pnpm-lock.yaml | 234 ++++++++++++++++++++++++++++++------------------- 2 files changed, 150 insertions(+), 94 deletions(-) diff --git a/package.json b/package.json index 9b43b60ee..da130980b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "armonik.api", - "packageManager": "pnpm@8.6.10", + "packageManager": "pnpm@8.6.12", "scripts": { "ci:publish": "zx scripts/publish.mjs", "ci:publish-edge": "zx scripts/publish-edge.mjs", @@ -10,15 +10,15 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.62.0", "consola": "^2.15.3", - "eslint": "^8.45.0", + "eslint": "^8.47.0", "eslint-config-standard-with-typescript": "^32.0.0", - "eslint-plugin-import": "^2.27.5", + "eslint-plugin-import": "^2.28.1", "eslint-plugin-n": "^15.7.0", "eslint-plugin-promise": "^6.1.1", "glob": "^8.1.0", - "jiti": "^1.19.1", + "jiti": "^1.19.3", "pathe": "^1.1.1", - "tslib": "^2.6.1", + "tslib": "^2.6.2", "typescript": "^4.9.5", "zx": "^7.2.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a570c46af..fa77aaa5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,37 +7,37 @@ settings: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.45.0)(typescript@4.9.5) + version: 5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.47.0)(typescript@4.9.5) consola: specifier: ^2.15.3 version: 2.15.3 eslint: - specifier: ^8.45.0 - version: 8.45.0 + specifier: ^8.47.0 + version: 8.47.0 eslint-config-standard-with-typescript: specifier: ^32.0.0 - version: 32.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.45.0)(typescript@4.9.5) + version: 32.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@4.9.5) eslint-plugin-import: - specifier: ^2.27.5 - version: 2.27.5(@typescript-eslint/parser@5.57.0)(eslint@8.45.0) + specifier: ^2.28.1 + version: 2.28.1(@typescript-eslint/parser@5.57.0)(eslint@8.47.0) eslint-plugin-n: specifier: ^15.7.0 - version: 15.7.0(eslint@8.45.0) + version: 15.7.0(eslint@8.47.0) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.45.0) + version: 6.1.1(eslint@8.47.0) glob: specifier: ^8.1.0 version: 8.1.0 jiti: - specifier: ^1.19.1 - version: 1.19.1 + specifier: ^1.19.3 + version: 1.19.3 pathe: specifier: ^1.1.1 version: 1.1.1 tslib: - specifier: ^2.6.1 - version: 2.6.1 + specifier: ^2.6.2 + version: 2.6.2 typescript: specifier: ^4.9.5 version: 4.9.5 @@ -52,14 +52,14 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.45.0 - eslint-visitor-keys: 3.4.1 + eslint: 8.47.0 + eslint-visitor-keys: 3.4.3 dev: true /@eslint-community/regexpp@4.5.1: @@ -67,13 +67,18 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.0: - resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} + /@eslint-community/regexpp@4.6.2: + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.6.0 + espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -84,8 +89,8 @@ packages: - supports-color dev: true - /@eslint/js@8.44.0: - resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + /@eslint/js@8.47.0: + resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -171,7 +176,7 @@ packages: resolution: {integrity: sha512-ASCxdbsrwNfSMXALlC3Decif9rwDMu+80KGp5zI2RLRotfMsTv7fHL8W8VDp24wymzDyIFudhUeSCugrgRFfHQ==} dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.45.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -183,12 +188,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.57.0(eslint@8.45.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.57.0(eslint@8.47.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.45.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.45.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.47.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -199,7 +204,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.57.0(eslint@8.45.0)(typescript@4.9.5): + /@typescript-eslint/parser@5.57.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -213,7 +218,7 @@ packages: '@typescript-eslint/types': 5.57.0 '@typescript-eslint/typescript-estree': 5.57.0(typescript@4.9.5) debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.47.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -235,7 +240,7 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.45.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -246,9 +251,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.45.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.47.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -307,19 +312,19 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.45.0)(typescript@4.9.5): + /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.45.0 + eslint: 8.47.0 eslint-scope: 5.1.1 semver: 7.3.8 transitivePeerDependencies: @@ -405,6 +410,17 @@ packages: engines: {node: '>=8'} dev: true + /array.prototype.findlastindex@1.2.2: + resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.0 + dev: true + /array.prototype.flat@1.3.1: resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} @@ -647,7 +663,7 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-standard-with-typescript@32.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.45.0)(typescript@4.9.5): + /eslint-config-standard-with-typescript@32.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-SyfzLvyBbPfxr2K/zNphtl5CGIS7FHH7v0TZrpmuyEXe+S1LFgt8hdJcWZHNxFckAGVQqrCxe/8+9T6n8x0gEA==} peerDependencies: '@typescript-eslint/eslint-plugin': ^5.0.0 @@ -657,19 +673,19 @@ packages: eslint-plugin-promise: ^6.0.0 typescript: '*' dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.45.0)(typescript@4.9.5) - '@typescript-eslint/parser': 5.57.0(eslint@8.45.0)(typescript@4.9.5) - eslint: 8.45.0 - eslint-config-standard: 17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.45.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.57.0)(eslint@8.45.0) - eslint-plugin-n: 15.7.0(eslint@8.45.0) - eslint-plugin-promise: 6.1.1(eslint@8.45.0) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.57.0(eslint@8.47.0)(typescript@4.9.5) + eslint: 8.47.0 + eslint-config-standard: 17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.57.0)(eslint@8.47.0) + eslint-plugin-n: 15.7.0(eslint@8.47.0) + eslint-plugin-promise: 6.1.1(eslint@8.47.0) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /eslint-config-standard@17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.45.0): + /eslint-config-standard@17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0): resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -677,24 +693,24 @@ packages: eslint-plugin-n: ^15.0.0 eslint-plugin-promise: ^6.0.0 dependencies: - eslint: 8.45.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.57.0)(eslint@8.45.0) - eslint-plugin-n: 15.7.0(eslint@8.45.0) - eslint-plugin-promise: 6.1.1(eslint@8.45.0) + eslint: 8.47.0 + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.57.0)(eslint@8.47.0) + eslint-plugin-n: 15.7.0(eslint@8.47.0) + eslint-plugin-promise: 6.1.1(eslint@8.47.0) dev: true /eslint-import-resolver-node@0.3.7: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 - is-core-module: 2.11.0 + is-core-module: 2.13.0 resolve: 1.22.1 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-node@0.3.7)(eslint@8.45.0): - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -714,27 +730,27 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.57.0(eslint@8.45.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.57.0(eslint@8.47.0)(typescript@4.9.5) debug: 3.2.7 - eslint: 8.45.0 + eslint: 8.47.0 eslint-import-resolver-node: 0.3.7 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es@4.1.0(eslint@8.45.0): + /eslint-plugin-es@4.1.0(eslint@8.47.0): resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.45.0 + eslint: 8.47.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.57.0)(eslint@8.45.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.57.0)(eslint@8.47.0): + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -743,22 +759,24 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.57.0(eslint@8.45.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.57.0(eslint@8.47.0)(typescript@4.9.5) array-includes: 3.1.6 + array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.45.0 + eslint: 8.47.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-node@0.3.7)(eslint@8.45.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0) has: 1.0.3 - is-core-module: 2.11.0 + is-core-module: 2.13.0 is-glob: 4.0.3 minimatch: 3.1.2 + object.fromentries: 2.0.6 + object.groupby: 1.0.0 object.values: 1.1.6 - resolve: 1.22.1 - semver: 6.3.0 + semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -766,16 +784,16 @@ packages: - supports-color dev: true - /eslint-plugin-n@15.7.0(eslint@8.45.0): + /eslint-plugin-n@15.7.0(eslint@8.47.0): resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} engines: {node: '>=12.22.0'} peerDependencies: eslint: '>=7.0.0' dependencies: builtins: 5.0.1 - eslint: 8.45.0 - eslint-plugin-es: 4.1.0(eslint@8.45.0) - eslint-utils: 3.0.0(eslint@8.45.0) + eslint: 8.47.0 + eslint-plugin-es: 4.1.0(eslint@8.47.0) + eslint-utils: 3.0.0(eslint@8.47.0) ignore: 5.2.4 is-core-module: 2.11.0 minimatch: 3.1.2 @@ -783,13 +801,13 @@ packages: semver: 7.3.8 dev: true - /eslint-plugin-promise@6.1.1(eslint@8.45.0): + /eslint-plugin-promise@6.1.1(eslint@8.47.0): resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.45.0 + eslint: 8.47.0 dev: true /eslint-scope@5.1.1: @@ -800,8 +818,8 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope@7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 @@ -815,13 +833,13 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils@3.0.0(eslint@8.45.0): + /eslint-utils@3.0.0(eslint@8.47.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.45.0 + eslint: 8.47.0 eslint-visitor-keys: 2.1.0 dev: true @@ -840,15 +858,20 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.45.0: - resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.47.0: + resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.1.0 - '@eslint/js': 8.44.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/regexpp': 4.6.2 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.47.0 '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -858,9 +881,9 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.6.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -886,13 +909,13 @@ packages: - supports-color dev: true - /espree@9.6.0: - resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.9.0 acorn-jsx: 5.3.2(acorn@8.9.0) - eslint-visitor-keys: 3.4.1 + eslint-visitor-keys: 3.4.3 dev: true /esquery@1.5.0: @@ -1068,6 +1091,15 @@ packages: has-symbols: 1.0.3 dev: true + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -1273,6 +1305,12 @@ packages: has: 1.0.3 dev: true + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -1363,8 +1401,8 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /jiti@1.19.1: - resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + /jiti@1.19.3: + resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} hasBin: true dev: true @@ -1507,6 +1545,24 @@ packages: object-keys: 1.1.1 dev: true + /object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.groupby@1.0.0: + resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.1 + dev: true + /object.values@1.1.6: resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} engines: {node: '>= 0.4'} @@ -1670,8 +1726,8 @@ packages: is-regex: 1.1.4 dev: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true @@ -1807,8 +1863,8 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true /tsutils@3.21.0(typescript@4.9.5): From ffb1cceeba2238896792aa90af31ef38a56a3224 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 22:30:59 +0000 Subject: [PATCH 010/344] chore(deps): update nuget packages --- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 2 +- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 2 +- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 875ff8607..32a08accb 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -21,7 +21,7 @@ - + diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 70d531454..5b328c85a 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -31,7 +31,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 88d80fd0e..71d909753 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -19,9 +19,9 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index ded863ece..93e2aab01 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -22,7 +22,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index bbeca63b9..78983ac80 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -20,7 +20,7 @@ - + diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 70b057239..936c3f34a 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -31,7 +31,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From 25508bc60d2aab023c87ce67e1de4c3a60e9f5f0 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 21 Aug 2023 10:10:53 +0200 Subject: [PATCH 011/344] Uncomment task service --- packages/cpp/ArmoniK.Api.Client/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt index dab7c558a..109efdbd7 100644 --- a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt @@ -7,7 +7,7 @@ set(PROTO_FILES "submitter_service.proto" "applications_service.proto" "sessions_service.proto" - #"tasks_service.proto" + "tasks_service.proto" "results_service.proto" "auth_service.proto" "partitions_service.proto" From 6a467e55262a8afd20fe7535f3433629af936efe Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 21 Aug 2023 10:12:41 +0200 Subject: [PATCH 012/344] Fix indent --- .github/workflows/publish-edge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index d4cfc9d88..bf0f40bf1 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -233,7 +233,7 @@ jobs: print-hash: true packages-dir: packages/python/pkg/ - release-cpp-package: + release-cpp-package: needs: [version] strategy: fail-fast: false From c5ab813d497315ed409ccd367ba97f1fdecb5a05 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 21 Aug 2023 11:05:49 +0200 Subject: [PATCH 013/344] Use attributes --- .../ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 1 + .../ArmoniK.Api.Mock/CountingService.cs | 142 ++++++++++++ .../csharp/ArmoniK.Api.Mock/FodyWeavers.xml | 3 + packages/csharp/ArmoniK.Api.Mock/ICounter.cs | 50 ----- .../ArmoniK.Api.Mock/ICountingService.cs | 76 ------- packages/csharp/ArmoniK.Api.Mock/Program.cs | 38 ++-- .../ArmoniK.Api.Mock/Services/AgentService.cs | 175 ++++++--------- .../Services/ApplicationsService.cs | 73 +++---- .../ArmoniK.Api.Mock/Services/AuthService.cs | 68 +++--- .../Services/EventsService.cs | 68 +++--- .../Services/PartitionsService.cs | 85 +++----- .../Services/ResultsService.cs | 144 ++++--------- .../Services/SessionsService.cs | 93 +++----- .../Services/SubmitterService.cs | 203 ++++++------------ .../ArmoniK.Api.Mock/Services/TasksService.cs | 122 ++++------- .../Services/VersionsService.cs | 56 ++--- 16 files changed, 543 insertions(+), 854 deletions(-) create mode 100644 packages/csharp/ArmoniK.Api.Mock/CountingService.cs create mode 100644 packages/csharp/ArmoniK.Api.Mock/FodyWeavers.xml delete mode 100644 packages/csharp/ArmoniK.Api.Mock/ICounter.cs delete mode 100644 packages/csharp/ArmoniK.Api.Mock/ICountingService.cs diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 425251ce7..00e545075 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -9,6 +9,7 @@ + diff --git a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs new file mode 100644 index 000000000..0b5c07228 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs @@ -0,0 +1,142 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.Reflection; +using System.Runtime.CompilerServices; + +using JetBrains.Annotations; + +using MethodDecorator.Fody.Interfaces; + +namespace ArmoniK.Api.Mock; + +public static class CountingService +{ + /// + /// Dictionary with all counts of all counting services + /// + internal static readonly Dictionary>> Counts; + + static CountingService() + => Counts = AppDomain.CurrentDomain.GetAssemblies() + // Get all types from assemblies + .SelectMany(s => + { + try + { + return s.GetTypes(); + } + catch (ReflectionTypeLoadException e) + { + return e.Types.Where(t => t is not null); + } + catch + { + return Array.Empty(); + } + }) + // Keep only types that have the [Counting] attribute + .Where(type => type is not null && type.GetCustomAttributes() + .Any()) + // Create a dictionary for all the types to record method calling counts + .ToDictionary(type => type!.Name, + type => type!.GetMethods() + // Get all methods that have the [Count] attribute + .Where(method => method.GetCustomAttributes() + .Any()) + .ToDictionary(method => method.Name, + _ => new StrongBox(0))); + + /// + /// Get the counters for all recorded types and methods. + /// + /// Methods to exclude from the count + /// Counters + public static Dictionary> GetCounters(IDictionary>? exclude = null) + => Counts.ToDictionary(kvType => kvType.Key, + kvType => + { + var typeName = kvType.Key; + HashSet? methodExclude = null; + exclude?.TryGetValue(typeName, + out methodExclude); + methodExclude ??= new HashSet(); + + return kvType.Value.Where(kv => !methodExclude.Contains(kv.Key)) + .ToDictionary(kv => kv.Key, + kv => kv.Value.Value); + }); + + /// + /// Reset all the counters + /// + public static void ResetCounters() + { + foreach (var counts in Counts) + { + foreach (var count in counts.Value) + { + count.Value.Value = 0; + } + } + } +} + +/// +/// Mark a class as being a counting service +/// +[AttributeUsage(AttributeTargets.Class)] +[UsedImplicitly] +public class CountingAttribute : Attribute +{ +} + +/// +/// Mark a method to count the number of calls made to this method. +/// +[AttributeUsage(AttributeTargets.Method)] +[UsedImplicitly] +public class CountAttribute : Attribute, IMethodDecorator +{ + public void Init(object instance, + MethodBase method, + object[] args) + { + _ = args; + Interlocked.Increment(ref CountingService.Counts[instance.GetType() + .Name][method.Name] + .Value); + } + + public void OnException(Exception exception) + => _ = exception; + + public void OnEntry() + { + } + + public void OnExit() + { + } +} diff --git a/packages/csharp/ArmoniK.Api.Mock/FodyWeavers.xml b/packages/csharp/ArmoniK.Api.Mock/FodyWeavers.xml new file mode 100644 index 000000000..51ff8c84d --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + diff --git a/packages/csharp/ArmoniK.Api.Mock/ICounter.cs b/packages/csharp/ArmoniK.Api.Mock/ICounter.cs deleted file mode 100644 index 582644562..000000000 --- a/packages/csharp/ArmoniK.Api.Mock/ICounter.cs +++ /dev/null @@ -1,50 +0,0 @@ -// This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -namespace ArmoniK.Api.Mock; - -public interface ICounter -{ -} - -public static class Counter -{ - public static Dictionary ToDict(this ICounter? counter, - IEnumerable? exclude = null) - { - if (counter is null) - { - return new Dictionary(); - } - - var excludeSet = exclude as HashSet ?? exclude?.ToHashSet() ?? new HashSet(); - return counter.GetType() - .GetFields() - .Select(field => new KeyValuePair(field.Name, - field.GetValue(counter))) - .Where(prop => prop.Value is not null && !excludeSet.Contains(prop.Key)) - .ToDictionary(prop => prop.Key, - prop => (int)(prop.Value ?? 0)); - } -} diff --git a/packages/csharp/ArmoniK.Api.Mock/ICountingService.cs b/packages/csharp/ArmoniK.Api.Mock/ICountingService.cs deleted file mode 100644 index aba6d4c98..000000000 --- a/packages/csharp/ArmoniK.Api.Mock/ICountingService.cs +++ /dev/null @@ -1,76 +0,0 @@ -// This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System.Reflection; - -namespace ArmoniK.Api.Mock; - -public interface ICountingService -{ - public ICounter GetCounter(); -} - -public static class CountingService -{ - public static Dictionary> GetCounters(this IServiceProvider services, - IDictionary>? exclude = null) - => AppDomain.CurrentDomain.GetAssemblies() - // Get all types from assemblies - .SelectMany(s => - { - try - { - return s.GetTypes(); - } - catch (ReflectionTypeLoadException e) - { - return e.Types.Where(t => t is not null); - } - catch - { - return Array.Empty(); - } - }) - // Keep only concrete classes that implement counter - .Where(p => typeof(ICountingService).IsAssignableFrom(p) && !p.IsAbstract) - .Select(type => - { - if (type is null || services.GetService(type) is not ICountingService service) - { - return new KeyValuePair>("", - new Dictionary()); - } - - HashSet? counterExclude = null; - exclude?.TryGetValue(type.Name, - out counterExclude); - - return new KeyValuePair>(type.Name, - service.GetCounter() - .ToDict(counterExclude)); - }) - .Where(kv => !string.IsNullOrEmpty(kv.Key)) - .ToDictionary(kv => kv.Key, - kv => kv.Value); -} diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index 1511168de..f7d48b3d4 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca -// -// This program is free software:you can redistribute it and/or modify +// +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. -// +// // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using System.Text; @@ -88,6 +88,12 @@ Calls); app.MapPost("/calls.json", Calls); +app.MapPost("/reset", + _ => + { + CountingService.ResetCounters(); + return Task.CompletedTask; + }); app.Run(); @@ -104,7 +110,7 @@ async Task Calls(HttpContext context) var exclude = string.IsNullOrWhiteSpace(requestBody) ? null : JsonConvert.DeserializeObject>>(requestBody); - var body = JsonConvert.SerializeObject(app.Services.GetCounters(exclude)); + var body = JsonConvert.SerializeObject(CountingService.GetCounters(exclude)); context.Response.ContentType = "application/json"; await context.Response.Body.WriteAsync(Encoding.ASCII.GetBytes(body)); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs index b3ce221c8..ae31b1bec 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca // -// This program is free software:you can redistribute it and/or modify +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Agent; @@ -29,84 +29,66 @@ namespace ArmoniK.Api.Mock.Services; -public class AgentService : Agent.AgentBase, ICountingService +[Counting] +public class AgentService : Agent.AgentBase { - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - /// + [Count] public override Task CreateTask(IAsyncStreamReader requestStream, ServerCallContext context) - { - Interlocked.Add(ref calls_.CreateTask, - 1); - return Task.FromResult(new CreateTaskReply - { - CommunicationToken = "communication-token", - CreationStatusList = new CreateTaskReply.Types.CreationStatusList(), - }); - } + => Task.FromResult(new CreateTaskReply + { + CommunicationToken = "communication-token", + CreationStatusList = new CreateTaskReply.Types.CreationStatusList(), + }); /// + [Count] public override async Task GetCommonData(DataRequest request, IServerStreamWriter responseStream, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetCommonData, - 1); - await responseStream.WriteAsync(new DataReply - { - Data = new DataChunk - { - DataComplete = true, - }, - }) - .ConfigureAwait(false); - } + => await responseStream.WriteAsync(new DataReply + { + Data = new DataChunk + { + DataComplete = true, + }, + }) + .ConfigureAwait(false); /// + [Count] public override async Task GetDirectData(DataRequest request, IServerStreamWriter responseStream, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetDirectData, - 1); - await responseStream.WriteAsync(new DataReply - { - Data = new DataChunk - { - DataComplete = true, - }, - }) - .ConfigureAwait(false); - } + => await responseStream.WriteAsync(new DataReply + { + Data = new DataChunk + { + DataComplete = true, + }, + }) + .ConfigureAwait(false); /// + [Count] public override async Task GetResourceData(DataRequest request, IServerStreamWriter responseStream, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetResourceData, - 1); - await responseStream.WriteAsync(new DataReply - { - Data = new DataChunk - { - DataComplete = true, - }, - }) - .ConfigureAwait(false); - } + => await responseStream.WriteAsync(new DataReply + { + Data = new DataChunk + { + DataComplete = true, + }, + }) + .ConfigureAwait(false); /// + [Count] public override async Task SendResult(IAsyncStreamReader requestStream, ServerCallContext context) { - Interlocked.Add(ref calls_.SendResult, - 1); await foreach (var _ in requestStream.ReadAllAsync()) { } @@ -118,37 +100,28 @@ public override async Task SendResult(IAsyncStreamReader re } /// + [Count] public override Task CreateResultsMetaData(CreateResultsMetaDataRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CreateResultsMetaData, - 1); - - return Task.FromResult(new CreateResultsMetaDataResponse - { - CommunicationToken = request.CommunicationToken, - }); - } + => Task.FromResult(new CreateResultsMetaDataResponse + { + CommunicationToken = request.CommunicationToken, + }); /// + [Count] public override Task SubmitTasks(SubmitTasksRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.SubmitTasks, - 1); - - return Task.FromResult(new SubmitTasksResponse - { - CommunicationToken = request.CommunicationToken, - }); - } + => Task.FromResult(new SubmitTasksResponse + { + CommunicationToken = request.CommunicationToken, + }); /// + [Count] public override async Task UploadResultData(IAsyncStreamReader requestStream, ServerCallContext context) { - Interlocked.Add(ref calls_.UploadResultData, - 1); await foreach (var _ in requestStream.ReadAllAsync()) { } @@ -161,33 +134,11 @@ public override async Task UploadResultData(IAsyncStre } /// + [Count] public override Task CreateResults(CreateResultsRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CreateResults, - 1); - - return Task.FromResult(new CreateResultsResponse - { - CommunicationToken = request.CommunicationToken, - }); - } - - - private struct CallCount : ICounter - { - public int CreateTask = 0; - public int GetCommonData = 0; - public int GetDirectData = 0; - public int GetResourceData = 0; - public int SendResult = 0; - public int CreateResultsMetaData = 0; - public int SubmitTasks = 0; - public int UploadResultData = 0; - public int CreateResults = 0; - - public CallCount() - { - } - } + => Task.FromResult(new CreateResultsResponse + { + CommunicationToken = request.CommunicationToken, + }); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs index 4e25e85ea..9239c142e 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca -// -// This program is free software:you can redistribute it and/or modify +// +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. -// +// // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using ArmoniK.Api.gRPC.V1.Applications; @@ -28,44 +28,23 @@ namespace ArmoniK.Api.Mock.Services; -public class ApplicationsService : Applications.ApplicationsBase, ICountingService +[Counting] +public class ApplicationsService : Applications.ApplicationsBase { - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - /// + [Count] public override Task ListApplications(ListApplicationsRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.ListApplications, - 1); - return Task.FromResult(new ListApplicationsResponse - { - Page = request.Page, - PageSize = request.PageSize, - Total = 0, - }); - } + => Task.FromResult(new ListApplicationsResponse + { + Page = request.Page, + PageSize = request.PageSize, + Total = 0, + }); /// + [Count] public override Task CountTasksByStatus(CountTasksByStatusRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CountTasksByStatus, - 1); - return Task.FromResult(new CountTasksByStatusResponse()); - } - - private struct CallCount : ICounter - { - public int ListApplications = 0; - public int CountTasksByStatus = 0; - - public CallCount() - { - } - } + => Task.FromResult(new CountTasksByStatusResponse()); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs index 3796fb960..5bc033db8 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca -// -// This program is free software:you can redistribute it and/or modify +// +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. -// +// // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using ArmoniK.Api.gRPC.V1.Auth; @@ -28,36 +28,18 @@ namespace ArmoniK.Api.Mock.Services; -public class AuthService : Authentication.AuthenticationBase, ICountingService +[Counting] +public class AuthService : Authentication.AuthenticationBase { - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - - /// + [Count] public override Task GetCurrentUser(GetCurrentUserRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetCurrentUser, - 1); - return Task.FromResult(new GetCurrentUserResponse - { - User = new User - { - Username = "username", - }, - }); - } - - private struct CallCount : ICounter - { - public int GetCurrentUser = 0; - - public CallCount() - { - } - } + => Task.FromResult(new GetCurrentUserResponse + { + User = new User + { + Username = "username", + }, + }); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs index 618747f3c..4bcc8016e 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca // -// This program is free software:you can redistribute it and/or modify +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Events; @@ -29,41 +29,23 @@ namespace ArmoniK.Api.Mock.Services; -public class EventsService : Events.EventsBase, ICountingService +[Counting] +public class EventsService : Events.EventsBase { - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - - /// + [Count] public override async Task GetEvents(EventSubscriptionRequest request, IServerStreamWriter responseStream, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetEvents, - 1); - await responseStream.WriteAsync(new EventSubscriptionResponse - { - SessionId = "session-id", - NewResult = new EventSubscriptionResponse.Types.NewResult - { - ResultId = "result-id", - OwnerId = "owner-id", - Status = ResultStatus.Created, - }, - }) - .ConfigureAwait(false); - } - - private struct CallCount : ICounter - { - public int GetEvents = 0; - - public CallCount() - { - } - } + => await responseStream.WriteAsync(new EventSubscriptionResponse + { + SessionId = "session-id", + NewResult = new EventSubscriptionResponse.Types.NewResult + { + ResultId = "result-id", + OwnerId = "owner-id", + Status = ResultStatus.Created, + }, + }) + .ConfigureAwait(false); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs index dc08f5dbc..8b91afe22 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca // -// This program is free software:you can redistribute it and/or modify +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using Armonik.Api.Grpc.V1.Partitions; @@ -28,55 +28,34 @@ namespace ArmoniK.Api.Mock.Services; -public class PartitionsService : Partitions.PartitionsBase, ICountingService +[Counting] +public class PartitionsService : Partitions.PartitionsBase { - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - /// + [Count] public override Task GetPartition(GetPartitionRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetPartition, - 1); - return Task.FromResult(new GetPartitionResponse - { - Partition = new PartitionRaw - { - Id = "partition-id", - Priority = 1, - PodMax = 1, - PodReserved = 1, - PreemptionPercentage = 0, - }, - }); - } + => Task.FromResult(new GetPartitionResponse + { + Partition = new PartitionRaw + { + Id = "partition-id", + Priority = 1, + PodMax = 1, + PodReserved = 1, + PreemptionPercentage = 0, + }, + }); /// + [Count] public override Task ListPartitions(ListPartitionsRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.ListPartitions, - 1); - return Task.FromResult(new ListPartitionsResponse - { - PageSize = request.PageSize, - Page = 0, - Total = 0, - }); - } - - private struct CallCount : ICounter - { - public int GetPartition = 0; - public int ListPartitions = 0; - - public CallCount() - { - } - } + => Task.FromResult(new ListPartitionsResponse + { + PageSize = request.PageSize, + Page = 0, + Total = 0, + }); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs index 13b746b03..0f6565d7a 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca // -// This program is free software:you can redistribute it and/or modify +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Results; @@ -31,7 +31,8 @@ namespace ArmoniK.Api.Mock.Services; -public class ResultsService : Results.ResultsBase, ICountingService +[Counting] +public class ResultsService : Results.ResultsBase { private static readonly ResultRaw MockResult = new() { @@ -42,99 +43,69 @@ public class ResultsService : Results.ResultsBase, ICountingService OwnerTaskId = "owner-task-id", }; - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - - /// + [Count] public override Task GetOwnerTaskId(GetOwnerTaskIdRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetOwnerTaskId, - 1); - return Task.FromResult(new GetOwnerTaskIdResponse - { - SessionId = "session-id", - }); - } + => Task.FromResult(new GetOwnerTaskIdResponse + { + SessionId = "session-id", + }); /// + [Count] public override Task ListResults(ListResultsRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.ListResults, - 1); - return Task.FromResult(new ListResultsResponse - { - Page = 0, - Total = 0, - PageSize = request.PageSize, - }); - } + => Task.FromResult(new ListResultsResponse + { + Page = 0, + Total = 0, + PageSize = request.PageSize, + }); /// + [Count] public override Task CreateResultsMetaData(CreateResultsMetaDataRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CreateResultsMetaData, - 1); - return Task.FromResult(new CreateResultsMetaDataResponse()); - } + => Task.FromResult(new CreateResultsMetaDataResponse()); /// + [Count] public override Task CreateResults(CreateResultsRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CreateResults, - 1); - return Task.FromResult(new CreateResultsResponse()); - } + => Task.FromResult(new CreateResultsResponse()); /// + [Count] public override Task DeleteResultsData(DeleteResultsDataRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.DeleteResultsData, - 1); - return Task.FromResult(new DeleteResultsDataResponse - { - SessionId = "session-id", - }); - } + => Task.FromResult(new DeleteResultsDataResponse + { + SessionId = "session-id", + }); /// + [Count] public override Task DownloadResultData(DownloadResultDataRequest request, IServerStreamWriter responseStream, ServerCallContext context) - { - Interlocked.Add(ref calls_.DownloadResultData, - 1); - return Task.CompletedTask; - } + => Task.CompletedTask; /// + [Count] public override Task GetServiceConfiguration(Empty request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetServiceConfiguration, - 1); - return Task.FromResult(new ResultsServiceConfigurationResponse - { - DataChunkMaxSize = 80 * 1024, - }); - } + => Task.FromResult(new ResultsServiceConfigurationResponse + { + DataChunkMaxSize = 80 * 1024, + }); /// + [Count] public override async Task UploadResultData(IAsyncStreamReader requestStream, ServerCallContext context) { - Interlocked.Add(ref calls_.UploadResultData, - 1); - await foreach (var _ in requestStream.ReadAllAsync()) { } @@ -146,32 +117,11 @@ public override async Task UploadResultData(IAsyncStre } /// + [Count] public override Task GetResult(GetResultRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetResult, - 1); - - return Task.FromResult(new GetResultResponse - { - Result = MockResult, - }); - } - - private struct CallCount : ICounter - { - public int GetOwnerTaskId = 0; - public int ListResults = 0; - public int CreateResultsMetaData = 0; - public int CreateResults = 0; - public int DeleteResultsData = 0; - public int DownloadResultData = 0; - public int GetServiceConfiguration = 0; - public int UploadResultData = 0; - public int GetResult = 0; - - public CallCount() - { - } - } + => Task.FromResult(new GetResultResponse + { + Result = MockResult, + }); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs index 49509cbd6..232715d83 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca // -// This program is free software:you can redistribute it and/or modify +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Sessions; @@ -29,7 +29,8 @@ namespace ArmoniK.Api.Mock.Services; -public class SessionsService : Sessions.SessionsBase, ICountingService +[Counting] +public class SessionsService : Sessions.SessionsBase { private static readonly SessionRaw MockSession = new() { @@ -37,68 +38,38 @@ public class SessionsService : Sessions.SessionsBase, ICountingService Status = SessionStatus.Cancelled, }; - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - /// + [Count] public override Task CancelSession(CancelSessionRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CancelSession, - 1); - return Task.FromResult(new CancelSessionResponse - { - Session = MockSession, - }); - } + => Task.FromResult(new CancelSessionResponse + { + Session = MockSession, + }); /// + [Count] public override Task GetSession(GetSessionRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetSession, - 1); - return Task.FromResult(new GetSessionResponse - { - Session = MockSession, - }); - } + => Task.FromResult(new GetSessionResponse + { + Session = MockSession, + }); /// + [Count] public override Task ListSessions(ListSessionsRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.ListSessions, - 1); - return Task.FromResult(new ListSessionsResponse - { - Page = 0, - PageSize = request.PageSize, - Total = 0, - }); - } + => Task.FromResult(new ListSessionsResponse + { + Page = 0, + PageSize = request.PageSize, + Total = 0, + }); /// + [Count] public override Task CountTasksByStatus(CountTasksByStatusRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CountTasksByStatus, - 1); - return Task.FromResult(new CountTasksByStatusResponse()); - } - - private struct CallCount : ICounter - { - public int CancelSession = 0; - public int GetSession = 0; - public int ListSessions = 0; - public int CountTasksByStatus = 0; - - public CallCount() - { - } - } + => Task.FromResult(new CountTasksByStatusResponse()); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs index e2160f2a2..107051331 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca // -// This program is free software:you can redistribute it and/or modify +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Submitter; @@ -29,76 +29,55 @@ namespace ArmoniK.Api.Mock.Services; -public class SubmitterService : Submitter.SubmitterBase, ICountingService +[Counting] +public class SubmitterService : Submitter.SubmitterBase { - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - /// + [Count] public override Task GetServiceConfiguration(Empty request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetServiceConfiguration, - 1); - return Task.FromResult(new Configuration - { - DataChunkMaxSize = 80 * 1024, - }); - } + => Task.FromResult(new Configuration + { + DataChunkMaxSize = 80 * 1024, + }); /// + [Count] public override Task CancelSession(Session request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CancelSession, - 1); - return Task.FromResult(new Empty()); - } + => Task.FromResult(new Empty()); /// + [Count] public override Task CancelTasks(TaskFilter request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CancelTasks, - 1); - return Task.FromResult(new Empty()); - } + => Task.FromResult(new Empty()); /// + [Count] public override Task CreateSession(CreateSessionRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CreateSession, - 1); - return Task.FromResult(new CreateSessionReply - { - SessionId = "session-id", - }); - } + => Task.FromResult(new CreateSessionReply + { + SessionId = "session-id", + }); /// + [Count] public override Task CreateSmallTasks(CreateSmallTaskRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CreateSmallTasks, - 1); - return Task.FromResult(new CreateTaskReply - { - CreationStatusList = new CreateTaskReply.Types.CreationStatusList(), - Error = "", - }); - } + => Task.FromResult(new CreateTaskReply + { + CreationStatusList = new CreateTaskReply.Types.CreationStatusList(), + Error = "", + }); /// + [Count] public override async Task CreateLargeTasks(IAsyncStreamReader requestStream, ServerCallContext context) { - Interlocked.Add(ref calls_.CreateLargeTasks, - 1); await foreach (var _ in requestStream.ReadAllAsync()) { } @@ -111,104 +90,77 @@ public override async Task CreateLargeTasks(IAsyncStreamReader< } /// + [Count] public override Task CountTasks(TaskFilter request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CountTasks, - 1); - return Task.FromResult(new Count()); - } + => Task.FromResult(new Count()); /// + [Count] public override async Task TryGetResultStream(ResultRequest request, IServerStreamWriter responseStream, ServerCallContext context) - { - Interlocked.Add(ref calls_.TryGetResultStream, - 1); - await responseStream.WriteAsync(new ResultReply - { - Result = new DataChunk - { - DataComplete = true, - }, - }) - .ConfigureAwait(false); - } + => await responseStream.WriteAsync(new ResultReply + { + Result = new DataChunk + { + DataComplete = true, + }, + }) + .ConfigureAwait(false); /// + [Count] public override Task WaitForCompletion(WaitRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.WaitForCompletion, - 1); - return Task.FromResult(new Count()); - } + => Task.FromResult(new Count()); /// + [Count] public override Task TryGetTaskOutput(TaskOutputRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.TryGetTaskOutput, - 1); - return Task.FromResult(new Output - { - Ok = new Empty(), - }); - } + => Task.FromResult(new Output + { + Ok = new Empty(), + }); /// [Obsolete] + [Count] public override Task WaitForAvailability(ResultRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.WaitForAvailability, - 1); - return Task.FromResult(new AvailabilityReply - { - Ok = new Empty(), - }); - } + => Task.FromResult(new AvailabilityReply + { + Ok = new Empty(), + }); /// + [Count] public override Task GetTaskStatus(GetTaskStatusRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetTaskStatus, - 1); - return Task.FromResult(new GetTaskStatusReply()); - } + => Task.FromResult(new GetTaskStatusReply()); /// [Obsolete] + [Count] public override Task GetResultStatus(GetResultStatusRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetResultStatus, - 1); - return Task.FromResult(new GetResultStatusReply()); - } + => Task.FromResult(new GetResultStatusReply()); /// + [Count] public override Task ListTasks(TaskFilter request, ServerCallContext context) - { - Interlocked.Add(ref calls_.ListTasks, - 1); - - return Task.FromResult(new TaskIdList()); - } + => Task.FromResult(new TaskIdList()); /// + [Count] public override Task ListSessions(SessionFilter request, ServerCallContext context) - { - Interlocked.Add(ref calls_.ListSessions, - 1); - return Task.FromResult(new SessionIdList()); - } + => Task.FromResult(new SessionIdList()); /// + [Count] public override async Task WatchResults(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) @@ -222,27 +174,4 @@ await responseStream.WriteAsync(new WatchResultStream .ConfigureAwait(false); } } - - private struct CallCount : ICounter - { - public int GetServiceConfiguration = 0; - public int CancelSession = 0; - public int CancelTasks = 0; - public int CreateSession = 0; - public int CreateSmallTasks = 0; - public int CreateLargeTasks = 0; - public int CountTasks = 0; - public int TryGetResultStream = 0; - public int WaitForCompletion = 0; - public int TryGetTaskOutput = 0; - public int WaitForAvailability = 0; - public int GetTaskStatus = 0; - public int GetResultStatus = 0; - public int ListTasks = 0; - public int ListSessions = 0; - - public CallCount() - { - } - } } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs index 1eb276447..c22f9fc0f 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca // -// This program is free software:you can redistribute it and/or modify +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Tasks; @@ -33,7 +33,8 @@ namespace ArmoniK.Api.Mock.Services; -public class TasksService : Tasks.TasksBase, ICountingService +[Counting] +public class TasksService : Tasks.TasksBase { private static readonly TaskRaw MockTask = new() { @@ -57,101 +58,58 @@ public class TasksService : Tasks.TasksBase, ICountingService }, }; - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - - /// + [Count] public override Task GetTask(GetTaskRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetTask, - 1); - return Task.FromResult(new GetTaskResponse - { - Task = MockTask, - }); - } + => Task.FromResult(new GetTaskResponse + { + Task = MockTask, + }); /// + [Count] public override Task ListTasks(ListTasksRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.ListTasks, - 1); - return Task.FromResult(new ListTasksResponse - { - Page = 0, - Total = 0, - PageSize = request.PageSize, - }); - } + => Task.FromResult(new ListTasksResponse + { + Page = 0, + Total = 0, + PageSize = request.PageSize, + }); /// + [Count] public override Task GetResultIds(GetResultIdsRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.GetResultIds, - 1); - return Task.FromResult(new GetResultIdsResponse()); - } + => Task.FromResult(new GetResultIdsResponse()); /// + [Count] public override Task CancelTasks(CancelTasksRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CancelTasks, - 1); - return Task.FromResult(new CancelTasksResponse()); - } + => Task.FromResult(new CancelTasksResponse()); /// + [Count] public override Task CountTasksByStatus(CountTasksByStatusRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.CountTasksByStatus, - 1); - return Task.FromResult(new CountTasksByStatusResponse()); - } + => Task.FromResult(new CountTasksByStatusResponse()); /// + [Count] public override Task ListTasksRaw(ListTasksRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.ListTasksRaw, - 1); - return Task.FromResult(new ListTasksRawResponse - { - Page = 0, - Total = 0, - PageSize = request.PageSize, - }); - } + => Task.FromResult(new ListTasksRawResponse + { + Page = 0, + Total = 0, + PageSize = request.PageSize, + }); /// + [Count] public override Task SubmitTasks(SubmitTasksRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.SubmitTasks, - 1); - return Task.FromResult(new SubmitTasksResponse()); - } - - private struct CallCount : ICounter - { - public int GetTask = 0; - public int ListTasks = 0; - public int GetResultIds = 0; - public int CancelTasks = 0; - public int CountTasksByStatus = 0; - public int ListTasksRaw = 0; - public int SubmitTasks = 0; - - public CallCount() - { - } - } + => Task.FromResult(new SubmitTasksResponse()); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs index f188c0733..a6729768c 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs @@ -1,26 +1,26 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023.All rights reserved. -// W.Kirschenmann -// J.Gurhem -// D.Dubuc -// L.Ziane Khodja -// F.Lemaitre -// S.Djebbar -// J.Fonseca +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca // -// This program is free software:you can redistribute it and/or modify +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License -// along with this program.If not, see . +// along with this program. If not, see . using Armonik.Api.Grpc.V1.Versions; @@ -28,37 +28,19 @@ namespace ArmoniK.Api.Mock.Services; -public class VersionsService : Versions.VersionsBase, ICountingService +[Counting] +public class VersionsService : Versions.VersionsBase { private static readonly string ApiVersion = typeof(Versions.VersionsBase).Assembly.GetName() .Version!.ToString(); - private CallCount calls_ = new(); - - /// - public ICounter GetCounter() - => calls_; - - /// + [Count] public override Task ListVersions(ListVersionsRequest request, ServerCallContext context) - { - Interlocked.Add(ref calls_.ListVersions, - 1); - return Task.FromResult(new ListVersionsResponse - { - Core = "Unknown", - Api = ApiVersion, - }); - } - - private struct CallCount : ICounter - { - public int ListVersions = 0; - - public CallCount() - { - } - } + => Task.FromResult(new ListVersionsResponse + { + Core = "Unknown", + Api = ApiVersion, + }); } From a11920f734e3a6709f53d556039704471de4dd17 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 21 Aug 2023 11:10:03 +0200 Subject: [PATCH 014/344] Fixed headers --- .../ArmoniK.Api.Mock/CountingService.cs | 46 ++++++++----------- packages/csharp/ArmoniK.Api.Mock/Program.cs | 36 ++++++--------- .../ArmoniK.Api.Mock/Services/AgentService.cs | 28 ++++------- .../Services/ApplicationsService.cs | 28 ++++------- .../ArmoniK.Api.Mock/Services/AuthService.cs | 28 ++++------- .../Services/EventsService.cs | 36 ++++++--------- .../Services/PartitionsService.cs | 36 ++++++--------- .../Services/ResultsService.cs | 36 ++++++--------- .../Services/SessionsService.cs | 36 ++++++--------- .../Services/SubmitterService.cs | 36 ++++++--------- .../ArmoniK.Api.Mock/Services/TasksService.cs | 36 ++++++--------- .../Services/VersionsService.cs | 36 ++++++--------- 12 files changed, 161 insertions(+), 257 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs index 0b5c07228..362e9a889 100644 --- a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. using System.Reflection; using System.Runtime.CompilerServices; @@ -34,7 +26,7 @@ namespace ArmoniK.Api.Mock; public static class CountingService { /// - /// Dictionary with all counts of all counting services + /// Dictionary with all counts of all counting services /// internal static readonly Dictionary>> Counts; @@ -69,7 +61,7 @@ static CountingService() _ => new StrongBox(0))); /// - /// Get the counters for all recorded types and methods. + /// Get the counters for all recorded types and methods. /// /// Methods to exclude from the count /// Counters @@ -89,7 +81,7 @@ public static Dictionary> GetCounters(IDictiona }); /// - /// Reset all the counters + /// Reset all the counters /// public static void ResetCounters() { @@ -104,7 +96,7 @@ public static void ResetCounters() } /// -/// Mark a class as being a counting service +/// Mark a class as being a counting service /// [AttributeUsage(AttributeTargets.Class)] [UsedImplicitly] @@ -113,7 +105,7 @@ public class CountingAttribute : Attribute } /// -/// Mark a method to count the number of calls made to this method. +/// Mark a method to count the number of calls made to this method. /// [AttributeUsage(AttributeTargets.Method)] [UsedImplicitly] diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index f7d48b3d4..51e3a0abf 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. using System.Text; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs index ae31b1bec..4e57483f0 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca +// Copyright (C) ANEO, 2021-2023.All rights reserved. // -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// 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 // -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. +// http://www.apache.org/licenses/LICENSE-2.0 // -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// 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. using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Agent; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs index 9239c142e..7f1649f27 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca +// Copyright (C) ANEO, 2021-2023.All rights reserved. // -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// 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 // -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. +// http://www.apache.org/licenses/LICENSE-2.0 // -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// 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. using ArmoniK.Api.gRPC.V1.Applications; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs index 5bc033db8..e2a3b31b0 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca +// Copyright (C) ANEO, 2021-2023.All rights reserved. // -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// 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 // -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. +// http://www.apache.org/licenses/LICENSE-2.0 // -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// 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. using ArmoniK.Api.gRPC.V1.Auth; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs index 4bcc8016e..39dc090f4 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Events; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs index 8b91afe22..d49a555c9 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. using Armonik.Api.Grpc.V1.Partitions; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs index 0f6565d7a..e2ad33a27 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Results; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs index 232715d83..aea52dc1e 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Sessions; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs index 107051331..f082c52c1 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Submitter; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs index c22f9fc0f..9f2c45e65 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Tasks; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs index a6729768c..74c073581 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs @@ -1,26 +1,18 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2023. All rights reserved. -// W. Kirschenmann -// J. Gurhem -// D. Dubuc -// L. Ziane Khodja -// F. Lemaitre -// S. Djebbar -// J. Fonseca -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY, without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. using Armonik.Api.Grpc.V1.Versions; From e81a654693df0acab985c227cb461a528bec08d8 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 21 Aug 2023 11:21:02 +0200 Subject: [PATCH 015/344] Commit hash instead of version --- .github/workflows/ci.yml | 4 ++-- .github/workflows/publish-edge.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68ba774f0..8c671ce7b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -218,7 +218,7 @@ jobs: run: python -m pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-report xml:coverage.xml --cov-report html:coverage_report - name: Get Cover - uses: orgoro/coverage@v3.1 + uses: orgoro/coverage@4e3bc9302f715595336a40f7dd4a3b15c687bdb4 with: coverageFile: packages/python/coverage.xml token: ${{ secrets.GITHUB_TOKEN }} @@ -244,7 +244,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 with: ref: ${{ github.ref }} diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index bf0f40bf1..3a2f0a0c3 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -243,7 +243,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 with: ref: ${{ github.ref }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3e3c81ee1..ed9dddcce 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -177,7 +177,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 with: ref: ${{ github.ref }} From cd71b637ccbd9d273d6e6d64b05ec795ff07f84c Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 21 Aug 2023 11:25:27 +0200 Subject: [PATCH 016/344] Configurable port --- packages/csharp/ArmoniK.Api.Mock/Program.cs | 22 ++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index 51e3a0abf..181ef59ec 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -24,6 +24,19 @@ using Newtonsoft.Json; var builder = WebApplication.CreateBuilder(args); +builder.Configuration.SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", + true, + false) + .AddEnvironmentVariables() + .AddCommandLine(args); + +var httpPort = int.Parse(builder.Configuration.GetSection("Http") + .GetSection("Port") + .Value ?? "5000"); +var grpcPort = int.Parse(builder.Configuration.GetSection("Grpc") + .GetSection("Port") + .Value ?? "5001"); // Additional configuration is required to successfully run gRPC on macOS. // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682 @@ -43,14 +56,9 @@ builder.WebHost.UseKestrel(options => { - options.ListenAnyIP(1080, - listenOptions => - { - listenOptions.Protocols = HttpProtocols.Http2; - }); - options.ListenAnyIP(1081, + options.ListenAnyIP(httpPort, listenOptions => listenOptions.Protocols = HttpProtocols.Http1); - options.ListenAnyIP(5001, + options.ListenAnyIP(grpcPort, listenOptions => listenOptions.Protocols = HttpProtocols.Http2); }); From a8505d7185b508274aea4b89d081bb0a9316b2e4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 09:27:00 +0000 Subject: [PATCH 017/344] chore(deps): update github actions --- .github/workflows/ci.yml | 4 ++-- .github/workflows/publish-edge.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3d87d87ae..02baf6e7b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -218,7 +218,7 @@ jobs: run: python -m pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-report xml:coverage.xml --cov-report html:coverage_report - name: Get Cover - uses: orgoro/coverage@4e3bc9302f715595336a40f7dd4a3b15c687bdb4 + uses: orgoro/coverage@6d7a2607343d2abeab89ef40b54ec9785134e313 with: coverageFile: packages/python/coverage.xml token: ${{ secrets.GITHUB_TOKEN }} @@ -253,7 +253,7 @@ jobs: cd packages/cpp/tools/packaging ./make-${{ matrix.type }}.sh - name: Publish package as artefact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce + uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 with: if-no-files-found: error path: packages/cpp/tools/packaging/*.${{ matrix.type }} diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index d909e8b6a..b5329b345 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -252,7 +252,7 @@ jobs: cd packages/cpp/tools/packaging ./make-${{ matrix.type }}.sh - name: Publish package as artefact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce + uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 with: if-no-files-found: error path: packages/cpp/tools/packaging/*.${{ matrix.type }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c2584e5d9..1f5db940d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -186,7 +186,7 @@ jobs: cd packages/cpp/tools/packaging ./make-${{ matrix.type }}.sh - name: Publish package as artefact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce + uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 with: if-no-files-found: error path: packages/cpp/tools/packaging/*.${{ matrix.type }} From 608eb3b0526935cb3dad2b1aef91509ad6731bef Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 21 Aug 2023 11:33:47 +0200 Subject: [PATCH 018/344] Reflexion for Dependency Injection --- .../ArmoniK.Api.Mock/CountingService.cs | 74 ++++++++++++------- packages/csharp/ArmoniK.Api.Mock/Program.cs | 14 +--- 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs index 362e9a889..abdf780b9 100644 --- a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs @@ -30,35 +30,53 @@ public static class CountingService /// internal static readonly Dictionary>> Counts; + /// + /// List of all counting services + /// + private static readonly List Services; + static CountingService() - => Counts = AppDomain.CurrentDomain.GetAssemblies() - // Get all types from assemblies - .SelectMany(s => - { - try - { - return s.GetTypes(); - } - catch (ReflectionTypeLoadException e) - { - return e.Types.Where(t => t is not null); - } - catch - { - return Array.Empty(); - } - }) - // Keep only types that have the [Counting] attribute - .Where(type => type is not null && type.GetCustomAttributes() - .Any()) - // Create a dictionary for all the types to record method calling counts - .ToDictionary(type => type!.Name, - type => type!.GetMethods() - // Get all methods that have the [Count] attribute - .Where(method => method.GetCustomAttributes() - .Any()) - .ToDictionary(method => method.Name, - _ => new StrongBox(0))); + { + Services = AppDomain.CurrentDomain.GetAssemblies() + // Get all types from assemblies + .SelectMany(s => + { + try + { + return s.GetTypes(); + } + catch (ReflectionTypeLoadException e) + { + return e.Types.Where(t => t is not null); + } + catch + { + return Array.Empty(); + } + }) + // Keep only types that have the [Counting] attribute + .Where(type => type is not null && type.GetCustomAttributes() + .Any()) + .Select(type => type!) + .ToList(); + + Counts = Services + // Create a dictionary for all the types to record method calling counts + .ToDictionary(type => type!.Name, + type => type!.GetMethods() + // Get all methods that have the [Count] attribute + .Where(method => method.GetCustomAttributes() + .Any()) + .ToDictionary(method => method.Name, + _ => new StrongBox(0))); + } + + /// + /// Get a list of all counting services (ie: types that are marked with [Counting] attribute) + /// + /// Enumeration of counting services + public static IEnumerable GetServices() + => Services; /// /// Get the counters for all recorded types and methods. diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index 181ef59ec..ffdebf788 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -43,16 +43,10 @@ // Add services to the container. builder.Services.AddGrpc(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); +foreach (var service in CountingService.GetServices()) +{ + builder.Services.AddSingleton(service); +} builder.WebHost.UseKestrel(options => { From 1a86bc2812f76921c235b2ad3c4f64c1862ec31e Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 21 Aug 2023 11:48:10 +0200 Subject: [PATCH 019/344] Remove Service suffix in service names --- packages/csharp/ArmoniK.Api.Mock/Program.cs | 22 ++++++++++--------- .../Services/{AgentService.cs => Agent.cs} | 2 +- ...ApplicationsService.cs => Applications.cs} | 2 +- .../Services/{AuthService.cs => Auth.cs} | 2 +- .../Services/{EventsService.cs => Events.cs} | 2 +- .../{PartitionsService.cs => Partitions.cs} | 2 +- .../{ResultsService.cs => Results.cs} | 4 +--- .../{SessionsService.cs => Sessions.cs} | 2 +- .../{SubmitterService.cs => Submitter.cs} | 4 ++-- .../Services/{TasksService.cs => Tasks.cs} | 2 +- .../{VersionsService.cs => Versions.cs} | 6 ++--- 11 files changed, 25 insertions(+), 25 deletions(-) rename packages/csharp/ArmoniK.Api.Mock/Services/{AgentService.cs => Agent.cs} (99%) rename packages/csharp/ArmoniK.Api.Mock/Services/{ApplicationsService.cs => Applications.cs} (95%) rename packages/csharp/ArmoniK.Api.Mock/Services/{AuthService.cs => Auth.cs} (95%) rename packages/csharp/ArmoniK.Api.Mock/Services/{EventsService.cs => Events.cs} (97%) rename packages/csharp/ArmoniK.Api.Mock/Services/{PartitionsService.cs => Partitions.cs} (96%) rename packages/csharp/ArmoniK.Api.Mock/Services/{ResultsService.cs => Results.cs} (97%) rename packages/csharp/ArmoniK.Api.Mock/Services/{SessionsService.cs => Sessions.cs} (97%) rename packages/csharp/ArmoniK.Api.Mock/Services/{SubmitterService.cs => Submitter.cs} (98%) rename packages/csharp/ArmoniK.Api.Mock/Services/{TasksService.cs => Tasks.cs} (98%) rename packages/csharp/ArmoniK.Api.Mock/Services/{VersionsService.cs => Versions.cs} (82%) diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index ffdebf788..bfe2451db 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -23,6 +23,8 @@ using Newtonsoft.Json; +using Results = ArmoniK.Api.Mock.Services.Results; + var builder = WebApplication.CreateBuilder(args); builder.Configuration.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", @@ -65,16 +67,16 @@ }); // Configure the HTTP request pipeline. -app.MapGrpcService(); -app.MapGrpcService(); -app.MapGrpcService(); -app.MapGrpcService(); -app.MapGrpcService(); -app.MapGrpcService(); -app.MapGrpcService(); -app.MapGrpcService(); -app.MapGrpcService(); -app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs similarity index 99% rename from packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs index 4e57483f0..b29d8fe1a 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/AgentService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs @@ -22,7 +22,7 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class AgentService : Agent.AgentBase +public class Agent : gRPC.V1.Agent.Agent.AgentBase { /// [Count] diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Applications.cs similarity index 95% rename from packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Applications.cs index 7f1649f27..c631a8025 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/ApplicationsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Applications.cs @@ -21,7 +21,7 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class ApplicationsService : Applications.ApplicationsBase +public class Applications : gRPC.V1.Applications.Applications.ApplicationsBase { /// [Count] diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs similarity index 95% rename from packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs index e2a3b31b0..5904bafb0 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/AuthService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs @@ -21,7 +21,7 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class AuthService : Authentication.AuthenticationBase +public class Auth : Authentication.AuthenticationBase { /// [Count] diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Events.cs similarity index 97% rename from packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Events.cs index 39dc090f4..bf601e513 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/EventsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Events.cs @@ -22,7 +22,7 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class EventsService : Events.EventsBase +public class Events : gRPC.V1.Events.Events.EventsBase { /// [Count] diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Partitions.cs similarity index 96% rename from packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Partitions.cs index d49a555c9..4ea73a5c8 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/PartitionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Partitions.cs @@ -21,7 +21,7 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class PartitionsService : Partitions.PartitionsBase +public class Partitions : Armonik.Api.Grpc.V1.Partitions.Partitions.PartitionsBase { /// [Count] diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs similarity index 97% rename from packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Results.cs index e2ad33a27..dc034188e 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/ResultsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs @@ -19,12 +19,10 @@ using Grpc.Core; -using Results = ArmoniK.Api.gRPC.V1.Results.Results; - namespace ArmoniK.Api.Mock.Services; [Counting] -public class ResultsService : Results.ResultsBase +public class Results : gRPC.V1.Results.Results.ResultsBase { private static readonly ResultRaw MockResult = new() { diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs similarity index 97% rename from packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs index aea52dc1e..46f3373d9 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/SessionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs @@ -22,7 +22,7 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class SessionsService : Sessions.SessionsBase +public class Sessions : gRPC.V1.Sessions.Sessions.SessionsBase { private static readonly SessionRaw MockSession = new() { diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs similarity index 98% rename from packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs index f082c52c1..0961c5fd9 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/SubmitterService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs @@ -22,7 +22,7 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class SubmitterService : Submitter.SubmitterBase +public class Submitter : gRPC.V1.Submitter.Submitter.SubmitterBase { /// [Count] @@ -157,7 +157,7 @@ public override async Task WatchResults(IAsyncStreamReader r IServerStreamWriter responseStream, ServerCallContext context) { - await foreach (var req in requestStream.ReadAllAsync()) + await foreach (var _ in requestStream.ReadAllAsync()) { await responseStream.WriteAsync(new WatchResultStream { diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs similarity index 98% rename from packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs index 9f2c45e65..6de0b4c39 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/TasksService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs @@ -26,7 +26,7 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class TasksService : Tasks.TasksBase +public class Tasks : gRPC.V1.Tasks.Tasks.TasksBase { private static readonly TaskRaw MockTask = new() { diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Versions.cs similarity index 82% rename from packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs rename to packages/csharp/ArmoniK.Api.Mock/Services/Versions.cs index 74c073581..ae01bd286 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/VersionsService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Versions.cs @@ -21,10 +21,10 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class VersionsService : Versions.VersionsBase +public class Versions : Armonik.Api.Grpc.V1.Versions.Versions.VersionsBase { - private static readonly string ApiVersion = typeof(Versions.VersionsBase).Assembly.GetName() - .Version!.ToString(); + private static readonly string ApiVersion = typeof(Armonik.Api.Grpc.V1.Versions.Versions.VersionsBase).Assembly.GetName() + .Version!.ToString(); /// [Count] From cb0d67b860acc0758fffb05136023890da65acf7 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 21 Aug 2023 12:12:22 +0200 Subject: [PATCH 020/344] Fixed csproj --- .../ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 14 +++++++++++++- .../csharp/ArmoniK.Api.Mock/CountingService.cs | 4 ++++ packages/csharp/ArmoniK.Api.Mock/Program.cs | 8 ++++++++ packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs | 2 ++ .../ArmoniK.Api.Mock/Services/Applications.cs | 2 ++ packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs | 2 ++ .../csharp/ArmoniK.Api.Mock/Services/Events.cs | 2 ++ .../csharp/ArmoniK.Api.Mock/Services/Partitions.cs | 2 ++ .../csharp/ArmoniK.Api.Mock/Services/Results.cs | 2 ++ .../csharp/ArmoniK.Api.Mock/Services/Sessions.cs | 2 ++ .../csharp/ArmoniK.Api.Mock/Services/Submitter.cs | 3 +++ packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs | 2 ++ .../csharp/ArmoniK.Api.Mock/Services/Versions.cs | 2 ++ 13 files changed, 46 insertions(+), 1 deletion(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 00e545075..45a87f04f 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -2,8 +2,20 @@ net6.0 + ANEO + Copyright (C) ANEO, 2021-2022 + Apache-2.0 + True + ../publish enable - enable + true + true + full + true + snupkg + ../kp.snk + 3.11.0 + True diff --git a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs index abdf780b9..e9b625596 100644 --- a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs @@ -14,8 +14,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System; +using System.Collections.Generic; +using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; +using System.Threading; using JetBrains.Annotations; diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index bfe2451db..88abc9f89 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -14,12 +14,20 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Collections.Generic; +using System.IO; using System.Text; +using System.Threading.Tasks; using ArmoniK.Api.Mock; using ArmoniK.Api.Mock.Services; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Server.Kestrel.Core; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs index b29d8fe1a..14c59c69d 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Agent; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Applications.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Applications.cs index 9a62c7fa5..dbd4474fc 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Applications.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Applications.cs @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1.Applications; using Grpc.Core; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs index 5904bafb0..d0e29f3c8 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1.Auth; using Grpc.Core; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Events.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Events.cs index bf601e513..1526070ec 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Events.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Events.cs @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Events; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Partitions.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Partitions.cs index 7e37fd5ea..5908cb7db 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Partitions.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Partitions.cs @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1.Partitions; using Grpc.Core; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs index dc034188e..3acc11310 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Results; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs index a336f0165..3b3533717 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Sessions; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs index 0961c5fd9..dd03f5256 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs @@ -14,6 +14,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System; +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Submitter; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs index 08a6e49c1..2fa3a29c0 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Tasks; diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Versions.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Versions.cs index e73a258f5..7e031bf58 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Versions.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Versions.cs @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1.Versions; using Grpc.Core; From f56d0a5f9c3e0b3e098aedadb6b442937f7c9567 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 12:46:29 +0000 Subject: [PATCH 021/344] chore(deps): update nuget packages --- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 2 +- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 2 +- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 5b328c85a..7f18a51d7 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -26,7 +26,7 @@ - + diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 71d909753..e2868b130 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -25,7 +25,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 936c3f34a..7c89121d9 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -28,9 +28,9 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive From 7b66c40cdb0190610d5f1b5d3775bc660a47bbf6 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 21 Aug 2023 17:00:50 +0200 Subject: [PATCH 022/344] tiny fixes --- .../ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 2 +- .../csharp/ArmoniK.Api.Mock/CountingService.cs | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 45a87f04f..aab1d2c6f 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -3,7 +3,7 @@ net6.0 ANEO - Copyright (C) ANEO, 2021-2022 + Copyright (C) ANEO, 2023 Apache-2.0 True ../publish diff --git a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs index e9b625596..019e618d3 100644 --- a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs @@ -30,7 +30,8 @@ namespace ArmoniK.Api.Mock; public static class CountingService { /// - /// Dictionary with all counts of all counting services + /// Dictionary with all counts of all counting services. + /// `StrongBox` is required to get a `ref` on the value, and cal `Interlocked.increment` on it. /// internal static readonly Dictionary>> Counts; @@ -66,13 +67,13 @@ static CountingService() Counts = Services // Create a dictionary for all the types to record method calling counts - .ToDictionary(type => type!.Name, - type => type!.GetMethods() - // Get all methods that have the [Count] attribute - .Where(method => method.GetCustomAttributes() - .Any()) - .ToDictionary(method => method.Name, - _ => new StrongBox(0))); + .ToDictionary(type => type.Name, + type => type.GetMethods() + // Get all methods that have the [Count] attribute + .Where(method => method.GetCustomAttributes() + .Any()) + .ToDictionary(method => method.Name, + _ => new StrongBox(0))); } /// From 66a9a793e1c02a22921a9e0a184c7d389f48c9d7 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 21 Aug 2023 17:14:47 +0200 Subject: [PATCH 023/344] Guaranteed thread safety --- .../ArmoniK.Api.Mock/CountingService.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs index 019e618d3..3cc8dcd5e 100644 --- a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs @@ -31,7 +31,7 @@ public static class CountingService { /// /// Dictionary with all counts of all counting services. - /// `StrongBox` is required to get a `ref` on the value, and cal `Interlocked.increment` on it. + /// `StrongBox` is required to get a `ref` on the value, and call `Interlocked.increment` on it. /// internal static readonly Dictionary>> Counts; @@ -139,9 +139,23 @@ public void Init(object instance, object[] args) { _ = args; - Interlocked.Increment(ref CountingService.Counts[instance.GetType() - .Name][method.Name] - .Value); + var type = instance.GetType(); + + // Usage of `TryGet` ensures no entries are created in the dictionary. + // This is required for thread safety. + if (!CountingService.Counts.TryGetValue(type.Name, + out var serviceCount)) + { + throw new SystemException($"Trying to count on {type.Name} service, but service was not recorded."); + } + + if (!serviceCount.TryGetValue(method.Name, + out var methodCount)) + { + throw new SystemException($"Trying to count {type.Name}.{method.Name} method, but method was not recorded."); + } + + Interlocked.Increment(ref methodCount.Value); } public void OnException(Exception exception) From 94483f192de0111aef808c69c8a82bddbf4cf972 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 23 Aug 2023 10:26:45 +0200 Subject: [PATCH 024/344] Change name in mock to proper name --- packages/csharp/ArmoniK.Api.Mock/CountingService.cs | 2 +- packages/csharp/ArmoniK.Api.Mock/Program.cs | 2 +- packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs index 3cc8dcd5e..e21ec658a 100644 --- a/packages/csharp/ArmoniK.Api.Mock/CountingService.cs +++ b/packages/csharp/ArmoniK.Api.Mock/CountingService.cs @@ -1,4 +1,4 @@ -// This file is part of the ArmoniK project +// This file is part of the ArmoniK project // // Copyright (C) ANEO, 2021-2023.All rights reserved. // diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index 88abc9f89..2aa6effd2 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -77,7 +77,7 @@ // Configure the HTTP request pipeline. app.MapGrpcService(); app.MapGrpcService(); -app.MapGrpcService(); +app.MapGrpcService(); app.MapGrpcService(); app.MapGrpcService(); app.MapGrpcService(); diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs index d0e29f3c8..cc68f8fb2 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Auth.cs @@ -1,4 +1,4 @@ -// This file is part of the ArmoniK project +// This file is part of the ArmoniK project // // Copyright (C) ANEO, 2021-2023.All rights reserved. // @@ -23,7 +23,7 @@ namespace ArmoniK.Api.Mock.Services; [Counting] -public class Auth : Authentication.AuthenticationBase +public class Authentication : gRPC.V1.Auth.Authentication.AuthenticationBase { /// [Count] From a90c1b5b003fd77c0093bc4ed9470843f6610a1f Mon Sep 17 00:00:00 2001 From: esoubiran-aneo Date: Fri, 25 Aug 2023 13:53:41 +0200 Subject: [PATCH 025/344] chore: add lint for js --- .eslintrc | 9 + .eslintrc.js | 15 - .github/workflows/ci.yml | 22 +- .github/workflows/deploy-docs.yml | 10 +- .github/workflows/publish-edge.yml | 2 +- .github/workflows/release.yml | 3 +- .github/workflows/semantic-pull-request.yml | 2 +- .../workflows/validate-docs-generation.yml | 9 +- .vscode/settings.json | 12 +- examples/angular/package.json | 4 +- examples/angular/src/app/app.component.ts | 58 +- examples/angular/src/app/app.config.ts | 13 +- .../app/services/partitions-grpc.service.ts | 17 +- examples/angular/src/main.ts | 8 +- package.json | 5 +- packages/angular/package.json | 4 +- .../armonik.api.angular/ng-package.json | 2 +- .../armonik.api.angular/package.json | 34 +- .../armonik.api.angular/src/lib/index.ts | 94 +- packages/cpp/CMakeSettings.json | 6 +- packages/web/package.json | 46 +- packages/web/tsup.config.ts | 2 +- pnpm-lock.yaml | 1010 ++++++++++++++++- scripts/update-versions.ts | 35 +- scripts/verify-versions.ts | 62 +- scripts/versions/_contants.ts | 16 +- scripts/versions/_readAndFind.ts | 26 +- scripts/versions/_readAndReplace.ts | 16 +- 28 files changed, 1269 insertions(+), 273 deletions(-) create mode 100644 .eslintrc delete mode 100644 .eslintrc.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..29e44415f --- /dev/null +++ b/.eslintrc @@ -0,0 +1,9 @@ +{ + "extends": "@antfu", + "rules": { + "yml/no-empty-mapping-value": "off" + }, + "ignorePatterns": [ + "generated" + ] +} diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index f1203f906..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - env: { - es2021: true, - node: true - }, - extends: 'standard-with-typescript', - overrides: [ - ], - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module' - }, - rules: { - } -} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02baf6e7b..b91cb5cd8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -135,6 +135,21 @@ jobs: - name: Check Diff run: docker run --rm --volume "$(pwd)/Protos/V1:/workspace" --workdir /workspace bufbuild/buf:1.8.0 format -d --exit-code + lint-js: + name: Lint JS + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - run: corepack enable + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: pnpm + + - run: pnpm run lint + build-web: name: Build Web runs-on: ubuntu-latest @@ -210,14 +225,14 @@ jobs: - name: pip update and add build package run: bash proto2python.sh ~/pyvenv - + - name: Install dependencies run: pip install "$(echo pkg/armonik*.whl)[tests]" - name: Run tests run: python -m pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-report xml:coverage.xml --cov-report html:coverage_report - - - name: Get Cover + + - name: Get Cover uses: orgoro/coverage@6d7a2607343d2abeab89ef40b54ec9785134e313 with: coverageFile: packages/python/coverage.xml @@ -258,4 +273,3 @@ jobs: if-no-files-found: error path: packages/cpp/tools/packaging/*.${{ matrix.type }} name: libarmonik.${{ matrix.type }} - diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index db233eb92..e13c9de3b 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -12,7 +12,7 @@ permissions: id-token: write concurrency: - group: "pages" + group: pages cancel-in-progress: true jobs: @@ -28,8 +28,8 @@ jobs: - name: Setup Node uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: - node-version: "18" - cache: "pnpm" + node-version: '18' + cache: pnpm - name: Install dependencies run: nci @@ -80,8 +80,8 @@ jobs: - name: Setup Node uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: - node-version: "18" - cache: "pnpm" + node-version: '18' + cache: pnpm - name: Install dependencies run: cd .docs && nci diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index b5329b345..61432b44f 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -25,7 +25,7 @@ jobs: id: genver run: echo "VERSION=$(npx @aneoconsultingfr/generate-next-version@latest --edge)" >> "$GITHUB_OUTPUT" - name: Summary version - # Print to the summary + # Print to the summary run: echo "VERSION=${{ steps.genver.outputs.version }}" >> $GITHUB_STEP_SUMMARY version: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1f5db940d..9af0adee2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ permissions: on: push: tags: - - "[0-9]+.[0-9]+.[0-9]+" + - '[0-9]+.[0-9]+.[0-9]+' jobs: # We need to verify the version in some packages with the tag in order to have the same version in all packages (python, csharp, angular, web). @@ -197,7 +197,6 @@ jobs: run: | gh release upload ${{ github.ref_name }} packages/cpp/tools/packaging/*.${{ matrix.type }} - update-changelog: needs: [verify-versions] runs-on: ubuntu-latest diff --git a/.github/workflows/semantic-pull-request.yml b/.github/workflows/semantic-pull-request.yml index 12f02c7e3..eb961627b 100644 --- a/.github/workflows/semantic-pull-request.yml +++ b/.github/workflows/semantic-pull-request.yml @@ -1,4 +1,4 @@ -name: "Lint PR" +name: Lint PR on: pull_request_target: diff --git a/.github/workflows/validate-docs-generation.yml b/.github/workflows/validate-docs-generation.yml index 9b6aaa23f..057f26040 100644 --- a/.github/workflows/validate-docs-generation.yml +++ b/.github/workflows/validate-docs-generation.yml @@ -23,8 +23,8 @@ jobs: uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 with: node-version: 18 - cache: "pnpm" - cache-dependency-path: ".docs/pnpm-lock.yaml" + cache: pnpm + cache-dependency-path: .docs/pnpm-lock.yaml - name: Install dependencies run: cd .docs && nci @@ -35,7 +35,6 @@ jobs: - name: Static HTML export with Nuxt run: cd .docs && nr generate - lint-markdown: name: Lint Markdown runs-on: ubuntu-latest @@ -48,7 +47,7 @@ jobs: with: node-version: 18 cache: pnpm - cache-dependency-path: ".docs/pnpm-lock.yaml" + cache-dependency-path: .docs/pnpm-lock.yaml - run: cd .docs && nci @@ -66,7 +65,7 @@ jobs: with: node-version: 18 cache: pnpm - cache-dependency-path: ".docs/pnpm-lock.yaml" + cache-dependency-path: .docs/pnpm-lock.yaml - run: cd .docs && nci diff --git a/.vscode/settings.json b/.vscode/settings.json index ed1d1d92e..bd496efb7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,11 +2,11 @@ "protoc": { "compile_on_save": true, "options": [ - "--proto_path=${workspaceRoot}/Protos/V1", - "--csharp_out=${workspaceRoot}/gen/csharp" + "--proto_path=${workspaceRoot}/Protos/V1", + "--csharp_out=${workspaceRoot}/gen/csharp" ] -}, -"cSpell.words": [ - "Armoni" -] + }, + "cSpell.words": [ + "Armoni" + ] } diff --git a/examples/angular/package.json b/examples/angular/package.json index 91f38f126..6d1d8de45 100644 --- a/examples/angular/package.json +++ b/examples/angular/package.json @@ -1,7 +1,8 @@ { "name": "armonik-api-angular", - "description": "This project is a demo of the ArmoniK API Angular library", "version": "0.0.0", + "private": true, + "description": "This project is a demo of the ArmoniK API Angular library", "scripts": { "ng": "ng", "start": "ng serve", @@ -9,7 +10,6 @@ "watch": "ng build --watch --configuration development", "test": "ng test" }, - "private": true, "dependencies": { "@aneoconsultingfr/armonik.api.angular": "^3.8.1", "@angular/animations": "^16.0.0", diff --git a/examples/angular/src/app/app.component.ts b/examples/angular/src/app/app.component.ts index 3c86f09a6..41b73473f 100644 --- a/examples/angular/src/app/app.component.ts +++ b/examples/angular/src/app/app.component.ts @@ -1,8 +1,9 @@ -import { AfterViewInit, Component, inject } from '@angular/core'; -import { PartitionsGrpcService } from './services/partitions-grpc.service'; -import { PartitionRaw } from '@aneoconsultingfr/armonik.api.angular'; -import { Subject, merge, startWith, switchMap } from 'rxjs'; -import { NgFor, NgIf } from '@angular/common'; +import type { AfterViewInit } from '@angular/core' +import { Component, inject } from '@angular/core' +import type { PartitionRaw } from '@aneoconsultingfr/armonik.api.angular' +import { Subject, merge, startWith, switchMap } from 'rxjs' +import { NgFor, NgIf } from '@angular/common' +import { PartitionsGrpcService } from './services/partitions-grpc.service' @Component({ selector: 'app-root', @@ -21,7 +22,7 @@ import { NgFor, NgIf } from '@angular/common'; `], standalone: true, providers: [ - PartitionsGrpcService + PartitionsGrpcService, ], imports: [ NgIf, @@ -29,39 +30,38 @@ import { NgFor, NgIf } from '@angular/common'; ], }) export class AppComponent implements AfterViewInit { - #partitionsGrpcService = inject(PartitionsGrpcService); + #partitionsGrpcService = inject(PartitionsGrpcService) - #refresh$ = new Subject(); + #refresh$ = new Subject() - loading = true; - partitions: PartitionRaw.AsObject[] = []; + loading = true + partitions: PartitionRaw.AsObject[] = [] ngAfterViewInit(): void { - merge( - this.#refresh$, - ) - .pipe( - startWith({}), - switchMap(() => { - this.loading = true; - return this.#partitionsGrpcService.list$(); - }), - ).subscribe( - (response) => { - this.loading = false; + merge( + this.#refresh$, + ) + .pipe( + startWith({}), + switchMap(() => { + this.loading = true + return this.#partitionsGrpcService.list$() + }), + ).subscribe( + (response) => { + this.loading = false - if (response.partitions) { - this.partitions = response.partitions; - } - } - ); + if (response.partitions) + this.partitions = response.partitions + }, + ) } refresh(): void { - this.#refresh$.next(); + this.#refresh$.next() } trackByPartition(_index_: number, partition: PartitionRaw.AsObject): string { - return partition.id; + return partition.id } } diff --git a/examples/angular/src/app/app.config.ts b/examples/angular/src/app/app.config.ts index 1676b1e77..debccae3e 100644 --- a/examples/angular/src/app/app.config.ts +++ b/examples/angular/src/app/app.config.ts @@ -1,10 +1,11 @@ -import { ApplicationConfig, importProvidersFrom } from '@angular/core'; -import { GrpcCoreModule } from '@ngx-grpc/core'; -import { GrpcWebClientModule } from '@ngx-grpc/grpc-web-client'; +import type { ApplicationConfig } from '@angular/core' +import { importProvidersFrom } from '@angular/core' +import { GrpcCoreModule } from '@ngx-grpc/core' +import { GrpcWebClientModule } from '@ngx-grpc/grpc-web-client' export const appConfig: ApplicationConfig = { providers: [ importProvidersFrom(GrpcCoreModule.forRoot()), - importProvidersFrom(GrpcWebClientModule.forRoot({ settings: { host: '' } })) - ] -}; + importProvidersFrom(GrpcWebClientModule.forRoot({ settings: { host: '' } })), + ], +} diff --git a/examples/angular/src/app/services/partitions-grpc.service.ts b/examples/angular/src/app/services/partitions-grpc.service.ts index a54ed8a7b..8b990e040 100644 --- a/examples/angular/src/app/services/partitions-grpc.service.ts +++ b/examples/angular/src/app/services/partitions-grpc.service.ts @@ -1,10 +1,11 @@ -import { Injectable, inject } from '@angular/core'; -import { ListPartitionsRequest, ListPartitionsResponse, PartitionsClient } from '@aneoconsultingfr/armonik.api.angular'; -import { Observable } from 'rxjs'; +import { Injectable, inject } from '@angular/core' +import type { ListPartitionsResponse } from '@aneoconsultingfr/armonik.api.angular' +import { ListPartitionsRequest, PartitionsClient } from '@aneoconsultingfr/armonik.api.angular' +import type { Observable } from 'rxjs' @Injectable() export class PartitionsGrpcService { - readonly #client = inject(PartitionsClient); + readonly #client = inject(PartitionsClient) list$(): Observable { const options = new ListPartitionsRequest({ @@ -12,7 +13,7 @@ export class PartitionsGrpcService { pageSize: 10, sort: { direction: ListPartitionsRequest.OrderDirection.ORDER_DIRECTION_ASC, - field: ListPartitionsRequest.OrderByField.ORDER_BY_FIELD_ID + field: ListPartitionsRequest.OrderByField.ORDER_BY_FIELD_ID, }, filter: { id: '', @@ -21,9 +22,9 @@ export class PartitionsGrpcService { podReserved: 0, preemptionPercentage: 0, priority: 0, - } - }); + }, + }) - return this.#client.listPartitions(options); + return this.#client.listPartitions(options) } } diff --git a/examples/angular/src/main.ts b/examples/angular/src/main.ts index 35b00f346..a74c853de 100644 --- a/examples/angular/src/main.ts +++ b/examples/angular/src/main.ts @@ -1,6 +1,6 @@ -import { bootstrapApplication } from '@angular/platform-browser'; -import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; +import { bootstrapApplication } from '@angular/platform-browser' +import { appConfig } from './app/app.config' +import { AppComponent } from './app/app.component' bootstrapApplication(AppComponent, appConfig) - .catch((err) => console.error(err)); + .catch(err => console.error(err)) diff --git a/package.json b/package.json index da130980b..e7db86bf4 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,12 @@ "ci:publish": "zx scripts/publish.mjs", "ci:publish-edge": "zx scripts/publish-edge.mjs", "update-versions": "jiti ./scripts/update-versions.ts", - "verify-versions": "jiti ./scripts/verify-versions.ts" + "verify-versions": "jiti ./scripts/verify-versions.ts", + "lint": "eslint .", + "lint:fix": "eslint --fix ." }, "devDependencies": { + "@antfu/eslint-config": "^0.41.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "consola": "^2.15.3", "eslint": "^8.47.0", diff --git a/packages/angular/package.json b/packages/angular/package.json index 2bfd30602..5d7bae2ed 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,5 +1,7 @@ { "name": "armonik.api.angular", + "private": true, + "packageManager": "pnpm@8.6.12", "scripts": { "ng": "ng", "start": "ng serve", @@ -8,8 +10,6 @@ "test": "ng test", "proto:generate:linux": "protoc --plugin=protoc-gen-ng=$(which protoc-gen-ng) --ng_out=./projects/aneoconsultingfr/armonik.api.angular/src/lib/generated -I ../../Protos/V1 ../../Protos/V1/*.proto" }, - "packageManager": "pnpm@8.6.12", - "private": true, "dependencies": { "@angular/animations": "^16.2.1", "@angular/common": "^16.2.1", diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/ng-package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/ng-package.json index ce023c8ff..a5c3b5fc3 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/ng-package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/ng-package.json @@ -4,4 +4,4 @@ "lib": { "entryFile": "src/public-api.ts" } -} \ No newline at end of file +} diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index d3fac489b..7ec4ff515 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -2,6 +2,22 @@ "name": "@aneoconsultingfr/armonik.api.angular", "version": "3.11.0", "description": "gRPC API to interact with ArmoniK built for Angular", + "license": "Apache-2.0", + "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/aneoconsulting/ArmoniK.Api.git" + }, + "bugs": { + "url": "https://github.com/aneoconsulting/ArmoniK.Api/issues" + }, + "keywords": [ + "gRPC", + "API", + "Aneo consulting", + "Angular" + ], + "sideEffects": false, "peerDependencies": { "@angular/common": "^16.2.1", "@angular/core": "^16.2.1", @@ -13,21 +29,5 @@ }, "dependencies": { "tslib": "^2.6.2" - }, - "keywords": [ - "gRPC", - "API", - "Aneo consulting", - "Angular" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/aneoconsulting/ArmoniK.Api.git" - }, - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/aneoconsulting/ArmoniK.Api/issues" - }, - "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", - "sideEffects": false + } } diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts index bfcdafc65..a9f279fac 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts @@ -1,29 +1,29 @@ export { ApplicationRaw, ListApplicationsRequest, - ListApplicationsResponse -} from "./generated/applications-common.pb"; + ListApplicationsResponse, +} from './generated/applications-common.pb' export { ApplicationField, ApplicationRawEnumField, - ApplicationRawField -} from "./generated/applications-fields.pb"; + ApplicationRawField, +} from './generated/applications-fields.pb' export { FilterField as ApplicationFilterField, Filters as ApplicationFilters, FiltersAnd as ApplicationFiltersAnd, -} from "./generated/applications-filters.pb"; -export { ApplicationsClient } from "./generated/applications-service.pbsc"; +} from './generated/applications-filters.pb' +export { ApplicationsClient } from './generated/applications-service.pbsc' export { GetCurrentUserRequest, GetCurrentUserResponse, - User -} from "./generated/auth-common.pb"; -export { AuthenticationClient } from "./generated/auth-service.pbsc"; + User, +} from './generated/auth-common.pb' +export { AuthenticationClient } from './generated/auth-service.pbsc' export { EventSubscriptionRequest, - EventSubscriptionResponse -} from './generated/events-common.pb'; -export { EventsClient } from "./generated/events-service.pbsc"; + EventSubscriptionResponse, +} from './generated/events-common.pb' +export { EventsClient } from './generated/events-service.pbsc' export { FilterArrayOperator, FilterDateOperator, @@ -34,67 +34,67 @@ export { FilterNumber, FilterString, FilterBooleanOperator, -} from "./generated/filters-common.pb"; -export { StatusCount, TaskOptions } from "./generated/objects.pb"; +} from './generated/filters-common.pb' +export { StatusCount, TaskOptions } from './generated/objects.pb' export { GetPartitionRequest, GetPartitionResponse, ListPartitionsRequest, ListPartitionsResponse, - PartitionRaw -} from "./generated/partitions-common.pb"; + PartitionRaw, +} from './generated/partitions-common.pb' export { PartitionField, PartitionRawEnumField, - PartitionRawField -} from "./generated/partitions-fields.pb"; + PartitionRawField, +} from './generated/partitions-fields.pb' export { FilterField as PartitionFilterField, Filters as PartitionFilters, FiltersAnd as PartitionFiltersAnd, -} from "./generated/partitions-filters.pb"; -export { PartitionsClient } from "./generated/partitions-service.pbsc"; -export { ResultStatus } from "./generated/result-status.pb"; +} from './generated/partitions-filters.pb' +export { PartitionsClient } from './generated/partitions-service.pbsc' +export { ResultStatus } from './generated/result-status.pb' export { GetOwnerTaskIdRequest, GetOwnerTaskIdResponse, GetResultRequest, GetResultResponse, ListResultsRequest, - ListResultsResponse, ResultRaw -} from "./generated/results-common.pb"; + ListResultsResponse, ResultRaw, +} from './generated/results-common.pb' export { ResultField, ResultRawEnumField, - ResultRawField -} from "./generated/results-fields.pb"; + ResultRawField, +} from './generated/results-fields.pb' export { FilterField as ResultFilterField, Filters as ResultFilters, FiltersAnd as ResultFiltersAnd, - FilterStatus as ResultFilterStatus -} from "./generated/results-filters.pb"; -export { ResultsClient } from "./generated/results-service.pbsc"; -export { SessionStatus } from "./generated/session-status.pb"; + FilterStatus as ResultFilterStatus, +} from './generated/results-filters.pb' +export { ResultsClient } from './generated/results-service.pbsc' +export { SessionStatus } from './generated/session-status.pb' export { CancelSessionRequest, CancelSessionResponse, GetSessionRequest, GetSessionResponse, ListSessionsRequest, - ListSessionsResponse, SessionRaw -} from "./generated/sessions-common.pb"; + ListSessionsResponse, SessionRaw, +} from './generated/sessions-common.pb' export { SessionField, SessionRawEnumField, SessionRawField, TaskOptionEnumField as SessionTaskOptionEnumField, TaskOptionField as SessionTaskOptionField, - TaskOptionGenericField as SessionTaskOptionGenericField -} from "./generated/sessions-fields.pb"; + TaskOptionGenericField as SessionTaskOptionGenericField, +} from './generated/sessions-fields.pb' export { FilterField as SessionFilterField, Filters as SessionFilters, FiltersAnd as SessionFiltersAnd, - FilterStatus as SessionFilterStatus -} from "./generated/sessions-filters.pb"; -export { SessionsClient } from "./generated/sessions-service.pbsc"; -export { SortDirection } from "./generated/sort-direction.pb"; -export { TaskStatus } from "./generated/task-status.pb"; + FilterStatus as SessionFilterStatus, +} from './generated/sessions-filters.pb' +export { SessionsClient } from './generated/sessions-service.pbsc' +export { SortDirection } from './generated/sort-direction.pb' +export { TaskStatus } from './generated/task-status.pb' export { CancelTasksRequest, CancelTasksResponse, CountTasksByStatusRequest, @@ -104,20 +104,20 @@ export { GetTaskResponse, ListTasksRequest, ListTasksResponse, TaskDetailed, - TaskSummary -} from "./generated/tasks-common.pb"; + TaskSummary, +} from './generated/tasks-common.pb' export { TaskField, TaskOptionEnumField, TaskOptionField, TaskOptionGenericField, TaskSummaryEnumField, - TaskSummaryField -} from "./generated/tasks-fields.pb"; + TaskSummaryField, +} from './generated/tasks-fields.pb' export { FilterField as TaskFilterField, Filters as TaskFilters, FiltersAnd as TaskFiltersAnd, - FilterStatus as TaskFilterStatus -} from "./generated/tasks-filters.pb"; -export { TasksClient } from "./generated/tasks-service.pbsc"; -export { ListVersionsRequest, ListVersionsResponse } from "./generated/versions-common.pb"; -export { VersionsClient } from "./generated/versions-service.pbsc"; + FilterStatus as TaskFilterStatus, +} from './generated/tasks-filters.pb' +export { TasksClient } from './generated/tasks-service.pbsc' +export { ListVersionsRequest, ListVersionsResponse } from './generated/versions-common.pb' +export { VersionsClient } from './generated/versions-service.pbsc' diff --git a/packages/cpp/CMakeSettings.json b/packages/cpp/CMakeSettings.json index a9c794aa7..7fc1135ba 100644 --- a/packages/cpp/CMakeSettings.json +++ b/packages/cpp/CMakeSettings.json @@ -1,10 +1,10 @@ -{ +{ "configurations": [ { "name": "x64-Debug", "generator": "Ninja", "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], + "inheritEnvironments": ["msvc_x64_x64"], "buildRoot": "${projectDir}\\out\\build\\${name}", "installRoot": "${projectDir}\\out\\install\\${name}", "cmakeCommandArgs": "", @@ -12,4 +12,4 @@ "ctestCommandArgs": "" } ] -} \ No newline at end of file +} diff --git a/packages/web/package.json b/packages/web/package.json index 4147e8691..6cba791bd 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,18 +1,33 @@ { "name": "@aneoconsultingfr/armonik.api", "version": "3.11.0", - "description": "gRPC API to interact with ArmoniK built for the web", "packageManager": "pnpm@8.6.12", + "description": "gRPC API to interact with ArmoniK built for the web", + "license": "Apache-2.0", + "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/aneoconsulting/ArmoniK.Api.git" + }, + "bugs": { + "url": "https://github.com/aneoconsulting/ArmoniK.Api/issues" + }, + "keywords": [ + "gRPC", + "API", + "Aneo consulting", + "Web" + ], "exports": { ".": { + "types": "./dist/index.d.ts", "import": "./dist/index.mjs", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" + "require": "./dist/index.js" }, "./*": { + "types": "./dist/generated/*.d.ts", "import": "./dist/generated/*.mjs", - "require": "./dist/generated/*.js", - "types": "./dist/generated/*.d.ts" + "require": "./dist/generated/*.js" } }, "main": "./dist/index.js", @@ -26,28 +41,13 @@ "proto:generate:linux": "protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_opt=esModuleInterop=true,importSuffix=.js --ts_proto_out=./src/generated -I ../../Protos/V1 ../../Protos/V1/*.proto", "prepublish": "cp ../../LICENSE ./LICENSE" }, - "keywords": [ - "gRPC", - "API", - "Aneo consulting", - "Web" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/aneoconsulting/ArmoniK.Api.git" - }, - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/aneoconsulting/ArmoniK.Api/issues" + "dependencies": { + "protobufjs": "^7.2.4", + "rxjs": "^7.8.1" }, - "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", "devDependencies": { "ts-proto": "^1.156.7", "tsup": "^7.2.0", "typescript": "^5.1.6" - }, - "dependencies": { - "protobufjs": "^7.2.4", - "rxjs": "^7.8.1" } } diff --git a/packages/web/tsup.config.ts b/packages/web/tsup.config.ts index 245bc8da6..92b6f3d2f 100644 --- a/packages/web/tsup.config.ts +++ b/packages/web/tsup.config.ts @@ -6,5 +6,5 @@ export default defineConfig({ splitting: true, dts: true, clean: true, - shims: false + shims: false, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa77aaa5d..b85ba2780 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false devDependencies: + '@antfu/eslint-config': + specifier: ^0.41.0 + version: 0.41.0(eslint@8.47.0)(typescript@4.9.5) '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 version: 5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.47.0)(typescript@4.9.5) @@ -52,6 +55,124 @@ packages: engines: {node: '>=0.10.0'} dev: true + /@antfu/eslint-config-basic@0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-zcwFv+nEV/NroeeVWriNdnIGd9soOLRG8wIiVz4VVJ0BjONrqQR56HLG/gDxH/1GUYBnQCEcVxGUmegce08cnw==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + eslint: 8.47.0 + eslint-plugin-antfu: 0.41.0(eslint@8.47.0)(typescript@4.9.5) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.47.0) + eslint-plugin-html: 7.1.0 + eslint-plugin-import: /eslint-plugin-i@2.28.0-2(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) + eslint-plugin-jsonc: 2.9.0(eslint@8.47.0) + eslint-plugin-markdown: 3.0.1(eslint@8.47.0) + eslint-plugin-n: 16.0.2(eslint@8.47.0) + eslint-plugin-no-only-tests: 3.1.0 + eslint-plugin-promise: 6.1.1(eslint@8.47.0) + eslint-plugin-unicorn: 48.0.1(eslint@8.47.0) + eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0) + eslint-plugin-yml: 1.8.0(eslint@8.47.0) + jsonc-eslint-parser: 2.3.0 + yaml-eslint-parser: 1.2.2 + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + - typescript + dev: true + + /@antfu/eslint-config-ts@0.41.0(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-ng3GYpJGZgrxGwBVda/MgUpveH3LbEqdPCFi1+S5e62W4kf8rmEVbhc0I8w7/aKN0uNqir5SInYg8gob2maDAQ==} + peerDependencies: + eslint: '>=7.4.0' + typescript: '>=3.9' + dependencies: + '@antfu/eslint-config-basic': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + eslint: 8.47.0 + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + dev: true + + /@antfu/eslint-config-vue@0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-iJiEGRUgRmT3mQCmGl0hTMwq/ShXRjRPjpgsDcphKJyEF06ZIR/4gxHn+utQRLT2hD39DQN8gk0ZbpV3gWtf/g==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + '@antfu/eslint-config-basic': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) + '@antfu/eslint-config-ts': 0.41.0(eslint@8.47.0)(typescript@4.9.5) + eslint: 8.47.0 + eslint-plugin-vue: 9.17.0(eslint@8.47.0) + local-pkg: 0.4.3 + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript + dev: true + + /@antfu/eslint-config@0.41.0(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-510DginDPdzf45O6HOah3cK6NHXxobBc43IdBQCQmUGb+av9LIJjrd1idThFoyFh6m05iZ4YX/mhnhhJFqLiNw==} + peerDependencies: + eslint: '>=7.4.0' + dependencies: + '@antfu/eslint-config-vue': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + eslint: 8.47.0 + eslint-plugin-eslint-comments: 3.2.0(eslint@8.47.0) + eslint-plugin-html: 7.1.0 + eslint-plugin-import: /eslint-plugin-i@2.28.0-2(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) + eslint-plugin-jsonc: 2.9.0(eslint@8.47.0) + eslint-plugin-n: 16.0.2(eslint@8.47.0) + eslint-plugin-promise: 6.1.1(eslint@8.47.0) + eslint-plugin-unicorn: 48.0.1(eslint@8.47.0) + eslint-plugin-vue: 9.17.0(eslint@8.47.0) + eslint-plugin-yml: 1.8.0(eslint@8.47.0) + jsonc-eslint-parser: 2.3.0 + yaml-eslint-parser: 1.2.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript + dev: true + + /@babel/code-frame@7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + dev: true + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/highlight@7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -146,6 +267,10 @@ packages: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true @@ -156,6 +281,12 @@ packages: '@types/node': 18.16.7 dev: true + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + dependencies: + '@types/unist': 2.0.7 + dev: true + /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true @@ -164,6 +295,10 @@ packages: resolution: {integrity: sha512-MFg7ua/bRtnA1hYE3pVyWxGd/r7aMqjNOdHvlSsXV3n8iaeGKkOaPzpJh6/ovf4bEXWcojkeMJpTsq3mzXW4IQ==} dev: true + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + /@types/ps-tree@1.1.2: resolution: {integrity: sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw==} dev: true @@ -172,6 +307,14 @@ packages: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: true + + /@types/unist@2.0.7: + resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} + dev: true + /@types/which@3.0.0: resolution: {integrity: sha512-ASCxdbsrwNfSMXALlC3Decif9rwDMu+80KGp5zI2RLRotfMsTv7fHL8W8VDp24wymzDyIFudhUeSCugrgRFfHQ==} dev: true @@ -204,6 +347,35 @@ packages: - supports-color dev: true + /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 6.4.1 + '@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 6.4.1 + debug: 4.3.4 + eslint: 8.47.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@5.57.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -224,6 +396,27 @@ packages: - supports-color dev: true + /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.4.1 + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/typescript-estree': 6.4.1(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 6.4.1 + debug: 4.3.4 + eslint: 8.47.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager@5.57.0: resolution: {integrity: sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -240,6 +433,14 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true + /@typescript-eslint/scope-manager@6.4.1: + resolution: {integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/visitor-keys': 6.4.1 + dev: true + /@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -260,6 +461,26 @@ packages: - supports-color dev: true + /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.4.1(typescript@4.9.5) + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.47.0 + ts-api-utils: 1.0.2(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types@5.57.0: resolution: {integrity: sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -270,6 +491,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types@6.4.1: + resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/typescript-estree@5.57.0(typescript@4.9.5): resolution: {integrity: sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -312,6 +538,27 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@6.4.1(typescript@4.9.5): + resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/visitor-keys': 6.4.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -332,12 +579,31 @@ packages: - typescript dev: true + /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 6.4.1 + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/typescript-estree': 6.4.1(typescript@4.9.5) + eslint: 8.47.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys@5.57.0: resolution: {integrity: sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.57.0 - eslint-visitor-keys: 3.4.1 + eslint-visitor-keys: 3.4.3 dev: true /@typescript-eslint/visitor-keys@5.62.0: @@ -345,7 +611,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.1 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@6.4.1: + resolution: {integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.4.1 + eslint-visitor-keys: 3.4.3 dev: true /acorn-jsx@5.3.2(acorn@8.9.0): @@ -376,6 +650,13 @@ packages: engines: {node: '>=8'} dev: true + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -450,6 +731,10 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -470,10 +755,15 @@ packages: fill-range: 7.0.1 dev: true + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.3.8 + semver: 7.5.4 dev: true /call-bind@1.0.2: @@ -488,6 +778,15 @@ packages: engines: {node: '>=6'} dev: true + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -501,6 +800,36 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true + /character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true + + /character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true + + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -508,6 +837,10 @@ packages: color-name: 1.1.4 dev: true + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true @@ -529,6 +862,12 @@ packages: which: 2.0.2 dev: true + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + /data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -590,10 +929,48 @@ packages: esutils: 2.0.3 dev: true + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + /es-abstract@1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} @@ -658,6 +1035,11 @@ packages: is-symbol: 1.0.4 dev: true + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -704,7 +1086,7 @@ packages: dependencies: debug: 3.2.7 is-core-module: 2.13.0 - resolve: 1.22.1 + resolve: 1.22.4 transitivePeerDependencies: - supports-color dev: true @@ -738,6 +1120,56 @@ packages: - supports-color dev: true + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + debug: 3.2.7 + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-antfu@0.41.0(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-JeEeDZgz7oqYPYWYNQHdXrKaW2nhJz/70jeMZUkaNjVp72cpsJPH3idiEhIhGu3wjFdsOMCoEkboT/DQXlCaqA==} + dependencies: + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + dev: true + + /eslint-plugin-es-x@7.2.0(eslint@8.47.0): + resolution: {integrity: sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/regexpp': 4.6.2 + eslint: 8.47.0 + dev: true + /eslint-plugin-es@4.1.0(eslint@8.47.0): resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} @@ -749,6 +1181,46 @@ packages: regexpp: 3.2.0 dev: true + /eslint-plugin-eslint-comments@3.2.0(eslint@8.47.0): + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.47.0 + ignore: 5.2.4 + dev: true + + /eslint-plugin-html@7.1.0: + resolution: {integrity: sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==} + dependencies: + htmlparser2: 8.0.2 + dev: true + + /eslint-plugin-i@2.28.0-2(@typescript-eslint/parser@6.4.1)(eslint@8.47.0): + resolution: {integrity: sha512-z48kG4qmE4TmiLcxbmvxMT5ycwvPkXaWW0XpU1L768uZaTbiDbxsHMEdV24JHlOR1xDsPpKW39BfP/pRdYIwFA==} + engines: {node: '>=12'} + peerDependencies: + eslint: ^7.2.0 || ^8 + dependencies: + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0) + get-tsconfig: 4.7.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + resolve: 1.22.4 + semver: 7.5.4 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.57.0)(eslint@8.47.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} @@ -779,8 +1251,53 @@ packages: semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0)(typescript@4.9.5): + resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) + eslint: 8.47.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-jsonc@2.9.0(eslint@8.47.0): + resolution: {integrity: sha512-RK+LeONVukbLwT2+t7/OY54NJRccTXh/QbnXzPuTLpFMVZhPuq1C9E07+qWenGx7rrQl0kAalAWl7EmB+RjpGA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + eslint: 8.47.0 + jsonc-eslint-parser: 2.3.0 + natural-compare: 1.4.0 + dev: true + + /eslint-plugin-markdown@3.0.1(eslint@8.47.0): + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.47.0 + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: - supports-color dev: true @@ -801,6 +1318,28 @@ packages: semver: 7.3.8 dev: true + /eslint-plugin-n@16.0.2(eslint@8.47.0): + resolution: {integrity: sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==} + engines: {node: '>=16.0.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + builtins: 5.0.1 + eslint: 8.47.0 + eslint-plugin-es-x: 7.2.0(eslint@8.47.0) + ignore: 5.2.4 + is-core-module: 2.13.0 + minimatch: 3.1.2 + resolve: 1.22.4 + semver: 7.5.4 + dev: true + + /eslint-plugin-no-only-tests@3.1.0: + resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + engines: {node: '>=5.0.0'} + dev: true + /eslint-plugin-promise@6.1.1(eslint@8.47.0): resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -810,6 +1349,83 @@ packages: eslint: 8.47.0 dev: true + /eslint-plugin-unicorn@48.0.1(eslint@8.47.0): + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.44.0' + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + ci-info: 3.8.0 + clean-regexp: 1.0.0 + eslint: 8.47.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.5.4 + strip-indent: 3.0.0 + dev: true + + /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0): + resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.0.0 + eslint: ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) + eslint: 8.47.0 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-plugin-vue@9.17.0(eslint@8.47.0): + resolution: {integrity: sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + eslint: 8.47.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.13 + semver: 7.5.4 + vue-eslint-parser: 9.3.1(eslint@8.47.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-yml@1.8.0(eslint@8.47.0): + resolution: {integrity: sha512-fgBiJvXD0P2IN7SARDJ2J7mx8t0bLdG6Zcig4ufOqW5hOvSiFxeUyc2g5I1uIm8AExbo26NNYCcTGZT0MXTsyg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.47.0 + lodash: 4.17.21 + natural-compare: 1.4.0 + yaml-eslint-parser: 1.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -853,11 +1469,6 @@ packages: engines: {node: '>=10'} dev: true - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1010,6 +1621,14 @@ packages: to-regex-range: 5.0.1 dev: true + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1108,6 +1727,12 @@ packages: get-intrinsic: 1.2.0 dev: true + /get-tsconfig@4.7.0: + resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1199,6 +1824,11 @@ packages: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1234,6 +1864,19 @@ packages: function-bind: 1.1.1 dev: true + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -1252,6 +1895,11 @@ packages: engines: {node: '>=0.8.19'} dev: true + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -1272,6 +1920,17 @@ packages: side-channel: 1.0.4 dev: true + /is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true + + /is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: true + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -1280,6 +1939,10 @@ packages: is-typed-array: 1.1.10 dev: true + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -1294,6 +1957,13 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -1318,6 +1988,10 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1330,6 +2004,10 @@ packages: is-extglob: 2.1.1 dev: true + /is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -1406,6 +2084,10 @@ packages: hasBin: true dev: true + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1413,6 +2095,21 @@ packages: argparse: 2.0.1 dev: true + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -1428,6 +2125,16 @@ packages: minimist: 1.2.8 dev: true + /jsonc-eslint-parser@2.3.0: + resolution: {integrity: sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.9.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.5.4 + dev: true + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -1444,6 +2151,22 @@ packages: type-check: 0.4.0 dev: true + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1455,6 +2178,10 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1466,11 +2193,36 @@ packages: resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} dev: true + /mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: true + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true + /micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + dependencies: + debug: 4.3.4 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -1479,6 +2231,11 @@ packages: picomatch: 2.3.1 dev: true + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -1526,6 +2283,21 @@ packages: formdata-polyfill: 4.0.10 dev: true + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.4 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true @@ -1590,6 +2362,13 @@ packages: type-check: 0.4.0 dev: true + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1597,6 +2376,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -1604,6 +2390,11 @@ packages: p-limit: 3.1.0 dev: true + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1611,6 +2402,27 @@ packages: callsites: 3.1.0 dev: true + /parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.10 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1650,6 +2462,19 @@ packages: engines: {node: '>=8.6'} dev: true + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -1672,6 +2497,30 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + dev: true + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} @@ -1686,16 +2535,36 @@ packages: engines: {node: '>=8'} dev: true + /regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true 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 + dev: true + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -1726,6 +2595,11 @@ packages: is-regex: 1.1.4 dev: true + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -1739,6 +2613,14 @@ packages: lru-cache: 6.0.0 dev: true + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1769,6 +2651,28 @@ packages: engines: {node: '>=12'} dev: true + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + /split@0.3.3: resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} dependencies: @@ -1818,11 +2722,25 @@ packages: engines: {node: '>=4'} dev: true + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1850,6 +2768,15 @@ packages: is-number: 7.0.0 dev: true + /ts-api-utils@1.0.2(typescript@4.9.5): + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 4.9.5 + dev: true + /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: @@ -1889,6 +2816,16 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: @@ -1912,6 +2849,12 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + dependencies: + '@types/unist': 2.0.7 + dev: true + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} @@ -1923,6 +2866,35 @@ packages: punycode: 2.3.0 dev: true + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vue-eslint-parser@9.3.1(eslint@8.47.0): + resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.47.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + /web-streams-polyfill@3.2.1: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} @@ -1975,10 +2947,24 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true + /yaml-eslint-parser@1.2.2: + resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} + engines: {node: ^14.17.0 || >=16.0.0} + dependencies: + eslint-visitor-keys: 3.4.3 + lodash: 4.17.21 + yaml: 2.2.2 + dev: true + /yaml@2.2.2: resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} engines: {node: '>= 14'} diff --git a/scripts/update-versions.ts b/scripts/update-versions.ts index 3f113106d..ffb1d1a42 100644 --- a/scripts/update-versions.ts +++ b/scripts/update-versions.ts @@ -1,5 +1,6 @@ -import consola from "consola"; -import { _readAndReplace } from "./versions/_readAndReplace"; +import process from 'node:process' +import consola from 'consola' +import { _readAndReplace } from './versions/_readAndReplace' import { cppFiles, cppPattern, @@ -7,28 +8,26 @@ import { csharpPattern, jsFiles, jsPattern, - pythonFiles, - pythonPattern, -} from "./versions/_contants"; +} from './versions/_contants' -const [, , ...args] = process.argv; +const [, , ...args] = process.argv if (args.length === 0) { - consola.fatal("Please provide a version"); - consola.log("Usage: npm run update-versions "); - consola.log("Example: npm run update-versions 1.0.0"); - process.exit(1); + consola.fatal('Please provide a version') + consola.log('Usage: npm run update-versions ') + consola.log('Example: npm run update-versions 1.0.0') + process.exit(1) } -const version = args[0]; +const version = args[0] -consola.info("Updating C# projects to ", version); +consola.info('Updating C# projects to ', version) csharpFiles.forEach( - _readAndReplace(csharpPattern, `${version}`) -); + _readAndReplace(csharpPattern, `${version}`), +) -consola.info("Updating JS projects to ", version); -jsFiles.forEach(_readAndReplace(jsPattern, `"version": "${version}"`)); +consola.info('Updating JS projects to ', version) +jsFiles.forEach(_readAndReplace(jsPattern, `"version": "${version}"`)) -consola.info("Updating cpp projects to ", version); -cppFiles.forEach(_readAndReplace(cppPattern, `set(version ${version})`)); +consola.info('Updating cpp projects to ', version) +cppFiles.forEach(_readAndReplace(cppPattern, `set(version ${version})`)) diff --git a/scripts/verify-versions.ts b/scripts/verify-versions.ts index 9eccaeab4..9d0a11de9 100644 --- a/scripts/verify-versions.ts +++ b/scripts/verify-versions.ts @@ -1,4 +1,5 @@ -import consola from "consola"; +import process from 'node:process' +import consola from 'consola' import { cppFiles, cppPattern, @@ -6,42 +7,41 @@ import { csharpPattern, jsFiles, jsPattern, - pythonFiles, - pythonPattern, -} from "./versions/_contants"; -import { _readAndFind } from "./versions/_readAndFind"; +} from './versions/_contants' +import { _readAndFind } from './versions/_readAndFind' -const versions = new Map(); -const [, , ...args] = process.argv; +const versions = new Map() +const [, , ...args] = process.argv -consola.info("Finding JS projects versions"); -jsFiles.forEach(_readAndFind(jsPattern, versions)); -consola.info("Finding C# projects versions"); -csharpFiles.forEach(_readAndFind(csharpPattern, versions)); -consola.info("Finding Cpp projects versions"); -cppFiles.forEach(_readAndFind(cppPattern, versions)); +consola.info('Finding JS projects versions') +jsFiles.forEach(_readAndFind(jsPattern, versions)) +consola.info('Finding C# projects versions') +csharpFiles.forEach(_readAndFind(csharpPattern, versions)) +consola.info('Finding Cpp projects versions') +cppFiles.forEach(_readAndFind(cppPattern, versions)) -const versionsArray = [...versions.values()]; -const uniqueVersions = [...new Set(versionsArray)]; +const versionsArray = [...versions.values()] +const uniqueVersions = [...new Set(versionsArray)] -const filesPerVersion = new Map(); +const filesPerVersion = new Map() versions.forEach((version, file) => { - const files = filesPerVersion.get(version) || []; - files.push(file); - filesPerVersion.set(version, files); -}); - + const files = filesPerVersion.get(version) || [] + files.push(file) + filesPerVersion.set(version, files) +}) if (uniqueVersions.length > 1) { - consola.fatal(`Found multiple versions`); + consola.fatal('Found multiple versions') uniqueVersions.forEach((version) => { - consola.info(version, filesPerVersion.get(version)); - }); - process.exit(1); -} else if(args.length > 0 && uniqueVersions[0] != args[0]) { - consola.fatal(`Found ${uniqueVersions[0]} for all projects but does not match expected ${args[0]}`); - process.exit(1); -} else { - consola.success(`Found ${uniqueVersions[0]} for all projects`); - process.exit(0); + consola.info(version, filesPerVersion.get(version)) + }) + process.exit(1) +} +else if (args.length > 0 && uniqueVersions[0] !== args[0]) { + consola.fatal(`Found ${uniqueVersions[0]} for all projects but does not match expected ${args[0]}`) + process.exit(1) +} +else { + consola.success(`Found ${uniqueVersions[0]} for all projects`) + process.exit(0) } diff --git a/scripts/versions/_contants.ts b/scripts/versions/_contants.ts index e04c966f1..bf4af5599 100644 --- a/scripts/versions/_contants.ts +++ b/scripts/versions/_contants.ts @@ -1,13 +1,13 @@ -import glob from "glob"; +import glob from 'glob' -export const csharpPattern = /(?.*)<\/PackageVersion>/; -export const csharpFiles = glob.sync(`**/*.csproj`); +export const csharpPattern = /(?.*)<\/PackageVersion>/ +export const csharpFiles = glob.sync('**/*.csproj') -export const pythonPattern = /version = "(?.*)"/g; -export const pythonFiles = ["packages/python/pyproject.toml"]; +export const pythonPattern = /version = "(?.*)"/g +export const pythonFiles = ['packages/python/pyproject.toml'] -export const jsPattern = /"version": "(?.*)"/; -export const jsFiles = ["packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json", "packages/web/package.json"]; +export const jsPattern = /"version": "(?.*)"/ +export const jsFiles = ['packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json', 'packages/web/package.json'] export const cppPattern = /set\(version (?.*)\)/ -export const cppFiles = ["packages/cpp/CMakeLists.txt"]; +export const cppFiles = ['packages/cpp/CMakeLists.txt'] diff --git a/scripts/versions/_readAndFind.ts b/scripts/versions/_readAndFind.ts index d094cc849..d01a78b66 100644 --- a/scripts/versions/_readAndFind.ts +++ b/scripts/versions/_readAndFind.ts @@ -1,23 +1,23 @@ -import { resolve } from "pathe"; -import consola from "consola"; -import fs from "node:fs"; +import fs from 'node:fs' +import process from 'node:process' +import { resolve } from 'pathe' +import consola from 'consola' export function _readAndFind(pattern: RegExp, versions: Map) { return (file: string) => { const data = fs.readFileSync(resolve(file), { - encoding: "utf8", - flag: "r", - }); + encoding: 'utf8', + flag: 'r', + }) - const version = pattern.exec(data)?.groups?.version; + const version = pattern.exec(data)?.groups?.version if (!version) { - consola.fatal(`Could not find version in ${file}`); - process.exit(1); + consola.fatal(`Could not find version in ${file}`) + process.exit(1) } - versions.set(file, version); - consola.log(`Found ${file.split("/").pop()}@${version}`); - - }; + versions.set(file, version) + consola.log(`Found ${file.split('/').pop()}@${version}`) + } } diff --git a/scripts/versions/_readAndReplace.ts b/scripts/versions/_readAndReplace.ts index 080277f2b..56a357c87 100644 --- a/scripts/versions/_readAndReplace.ts +++ b/scripts/versions/_readAndReplace.ts @@ -1,15 +1,15 @@ -import { resolve } from "pathe"; -import consola from "consola"; -import fs from "node:fs"; +import fs from 'node:fs' +import { resolve } from 'pathe' +import consola from 'consola' export function _readAndReplace(pattern: RegExp, replace: string) { return (file: string) => { - const data = fs.readFileSync(resolve(file), "utf8"); + const data = fs.readFileSync(resolve(file), 'utf8') - const result = data.replace(pattern, replace); + const result = data.replace(pattern, replace) - fs.writeFileSync(resolve(file), result, "utf8"); + fs.writeFileSync(resolve(file), result, 'utf8') - consola.success(`Update ${file.split("/").pop()}`); - }; + consola.success(`Update ${file.split('/').pop()}`) + } } From 9c01cce12cd1d628ea757a33a313c774c244aa37 Mon Sep 17 00:00:00 2001 From: esoubiran-aneo Date: Fri, 25 Aug 2023 13:56:04 +0200 Subject: [PATCH 026/344] ci: install deps --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b91cb5cd8..8dada8d1e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -148,6 +148,8 @@ jobs: node-version: 20 cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm run lint build-web: From 86e6256e4ba41d17c75788d0ceda5ecb6086dcc4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:57:33 +0200 Subject: [PATCH 027/344] chore(deps): update web npm packages (#389) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/web/package.json | 4 ++-- packages/web/pnpm-lock.yaml | 32 ++++++++++++++------------------ 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/web/package.json b/packages/web/package.json index 4147e8691..3fb5d73e9 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -44,10 +44,10 @@ "devDependencies": { "ts-proto": "^1.156.7", "tsup": "^7.2.0", - "typescript": "^5.1.6" + "typescript": "^5.2.2" }, "dependencies": { - "protobufjs": "^7.2.4", + "protobufjs": "^7.2.5", "rxjs": "^7.8.1" } } diff --git a/packages/web/pnpm-lock.yaml b/packages/web/pnpm-lock.yaml index 27c26f9f5..633794a44 100644 --- a/packages/web/pnpm-lock.yaml +++ b/packages/web/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: protobufjs: - specifier: ^7.2.4 - version: 7.2.4 + specifier: ^7.2.5 + version: 7.2.5 rxjs: specifier: ^7.8.1 version: 7.8.1 @@ -18,10 +18,10 @@ devDependencies: version: 1.156.7 tsup: specifier: ^7.2.0 - version: 7.2.0(typescript@5.1.6) + version: 7.2.0(typescript@5.2.2) typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.2.2 + version: 5.2.2 packages: @@ -597,12 +597,8 @@ packages: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /long@5.2.1: - resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} - /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: true /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -715,8 +711,8 @@ packages: yaml: 2.3.1 dev: true - /protobufjs@7.2.4: - resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + /protobufjs@7.2.5: + resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: @@ -731,7 +727,7 @@ packages: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/node': 18.15.11 - long: 5.2.1 + long: 5.2.3 /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} @@ -870,7 +866,7 @@ packages: resolution: {integrity: sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==} dependencies: long: 5.2.3 - protobufjs: 7.2.4 + protobufjs: 7.2.5 dev: true /ts-proto@1.156.7: @@ -878,7 +874,7 @@ packages: hasBin: true dependencies: case-anything: 2.1.13 - protobufjs: 7.2.4 + protobufjs: 7.2.5 ts-poet: 6.5.0 ts-proto-descriptors: 1.15.0 dev: true @@ -887,7 +883,7 @@ packages: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: false - /tsup@7.2.0(typescript@5.1.6): + /tsup@7.2.0(typescript@5.2.2): resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} engines: {node: '>=16.14'} hasBin: true @@ -917,14 +913,14 @@ packages: source-map: 0.8.0-beta.0 sucrase: 3.31.0 tree-kill: 1.2.2 - typescript: 5.1.6 + typescript: 5.2.2 transitivePeerDependencies: - supports-color - ts-node dev: true - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true dev: true From ec2d855e8aec73509dbe85320d92dee1efdb3988 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:58:05 +0200 Subject: [PATCH 028/344] chore(deps): update actions/checkout digest to f43a0e5 (#394) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 16 ++++++++-------- .github/workflows/deploy-docs.yml | 4 ++-- .github/workflows/publish-edge.yml | 14 +++++++------- .github/workflows/release.yml | 14 +++++++------- .github/workflows/validate-docs-generation.yml | 6 +++--- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02baf6e7b..ff918a201 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -37,7 +37,7 @@ jobs: timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.ref }} fetch-depth: 0 @@ -83,7 +83,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.ref }} fetch-depth: 0 @@ -126,7 +126,7 @@ jobs: timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.ref }} fetch-depth: 0 @@ -142,7 +142,7 @@ jobs: run: working-directory: packages/web steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -173,7 +173,7 @@ jobs: run: working-directory: packages/angular steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -204,7 +204,7 @@ jobs: run: working-directory: packages/python steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -244,7 +244,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.ref }} diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index db233eb92..8b97e470e 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 - run: npm i -g pnpm @antfu/ni @@ -65,7 +65,7 @@ jobs: needs: [generate-proto-docs] steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 # Restore API proto documentation - name: Cache Generated Docs from Protos diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index b5329b345..880228af3 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -17,7 +17,7 @@ jobs: version: ${{ steps.genver.outputs.version }} steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.head_ref }} fetch-depth: 0 @@ -51,7 +51,7 @@ jobs: - packages/csharp/ArmoniK.Api.Tests steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.head_ref }} fetch-depth: 0 @@ -91,7 +91,7 @@ jobs: - packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.head_ref }} fetch-depth: 0 @@ -119,7 +119,7 @@ jobs: name: Release Angular Package runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.head_ref }} fetch-depth: 0 @@ -158,7 +158,7 @@ jobs: name: Release Web Package runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.head_ref }} fetch-depth: 0 @@ -203,7 +203,7 @@ jobs: run: working-directory: packages/python steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -243,7 +243,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.ref }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1f5db940d..3508270cc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -49,7 +49,7 @@ jobs: - packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -75,7 +75,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -102,7 +102,7 @@ jobs: needs: [verify-versions] runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -135,7 +135,7 @@ jobs: needs: [verify-versions] runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 @@ -177,7 +177,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: ref: ${{ github.ref }} @@ -202,7 +202,7 @@ jobs: needs: [verify-versions] runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 with: fetch-depth: 0 diff --git a/.github/workflows/validate-docs-generation.yml b/.github/workflows/validate-docs-generation.yml index 9b6aaa23f..dc4b9492d 100644 --- a/.github/workflows/validate-docs-generation.yml +++ b/.github/workflows/validate-docs-generation.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 - run: npm i -g pnpm @antfu/ni @@ -40,7 +40,7 @@ jobs: name: Lint Markdown runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 - run: npm i -g pnpm @antfu/ni @@ -58,7 +58,7 @@ jobs: name: Lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3 + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 - run: npm i -g pnpm @antfu/ni From 4ba5769a9234c8c2838719e9b68f5b0371d36f70 Mon Sep 17 00:00:00 2001 From: esoubiran-aneo Date: Fri, 25 Aug 2023 13:59:38 +0200 Subject: [PATCH 029/344] chore: update renovate config for ArmoniK.Utils --- renovate.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/renovate.json b/renovate.json index 85e23cf8a..56c37f04c 100644 --- a/renovate.json +++ b/renovate.json @@ -52,6 +52,16 @@ "nuget" ] }, + { + "groupName": "nuget armonik utils package", + "groupSlug": "nuget", + "matchDatasources": [ + "nuget" + ], + "matchPackagePatterns": [ + "ArmoniK\\.Utils" + ] + }, { "groupName": "python packages", "groupSlug": "pypi", From 6330e9bb16d31d020005818827faac44ae295f6b Mon Sep 17 00:00:00 2001 From: esoubiran-aneo Date: Fri, 25 Aug 2023 14:00:28 +0200 Subject: [PATCH 030/344] chore: fix group slug --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 56c37f04c..b048c0d19 100644 --- a/renovate.json +++ b/renovate.json @@ -54,7 +54,7 @@ }, { "groupName": "nuget armonik utils package", - "groupSlug": "nuget", + "groupSlug": "nuget-armonik-utils", "matchDatasources": [ "nuget" ], From 7889e84c9165e2e52fa12096715f1ec635babfcf Mon Sep 17 00:00:00 2001 From: esoubiran-aneo Date: Fri, 25 Aug 2023 14:03:12 +0200 Subject: [PATCH 031/344] chore: update gen csharp path --- .vscode/settings.json | 12 ++++++------ {gen/csharp => packages/csharp/generated}/.gitkeep | 0 2 files changed, 6 insertions(+), 6 deletions(-) rename {gen/csharp => packages/csharp/generated}/.gitkeep (100%) diff --git a/.vscode/settings.json b/.vscode/settings.json index ed1d1d92e..bdbe81553 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,11 +2,11 @@ "protoc": { "compile_on_save": true, "options": [ - "--proto_path=${workspaceRoot}/Protos/V1", - "--csharp_out=${workspaceRoot}/gen/csharp" + "--proto_path=${workspaceRoot}/Protos/V1", + "--csharp_out=${workspaceRoot}/packages/csharp/generated/" ] -}, -"cSpell.words": [ - "Armoni" -] + }, + "cSpell.words": [ + "Armoni" + ] } diff --git a/gen/csharp/.gitkeep b/packages/csharp/generated/.gitkeep similarity index 100% rename from gen/csharp/.gitkeep rename to packages/csharp/generated/.gitkeep From c5cde92e786488d0b27fab1230f33a1c13b9787c Mon Sep 17 00:00:00 2001 From: esoubiran-aneo Date: Fri, 25 Aug 2023 14:26:08 +0200 Subject: [PATCH 032/344] docs: update angular guide --- .../use-armonik-api-in-an-angular-app.md | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/.docs/content/2.usage/use-armonik-api-in-an-angular-app.md b/.docs/content/2.usage/use-armonik-api-in-an-angular-app.md index 3d06cc07c..800410bf7 100644 --- a/.docs/content/2.usage/use-armonik-api-in-an-angular-app.md +++ b/.docs/content/2.usage/use-armonik-api-in-an-angular-app.md @@ -43,7 +43,7 @@ npm install -g @angular/cli Then, you can create a new Angular App using the following command: ```bash -ng new --standalone --routing=false --inline-style --inline-template --skip-tests --style=css --skip-install armonik-api-angular +ng new --standalone --routing=false --inline-style --inline-template --skip-tests --skip-git --style=css --skip-install --package-manager=pnpm armonik-api-angular ``` Then, go to the newly created folder: @@ -249,7 +249,8 @@ import { NgFor } from '@angular/common'; // ... imports: [ NgFor - ] + ], + // ... }) ``` @@ -330,7 +331,8 @@ Now that you've created our service and our component, you are ready to use them First, you need to inject the service in the component: ```typescript [app.component.ts] -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; +import { PartitionsGrpcService } from './services/partitions-grpc.service'; @Component({ providers: [ @@ -377,7 +379,6 @@ export class AppComponent implements AfterViewInit { } } ); - } } ``` @@ -461,17 +462,14 @@ For simplicity, you will update the service directly. In a real world scenario, + page: 0, + pageSize: 10, + sort: { -+ direction: ListPartitionsRequest.OrderDirection.ORDER_DIRECTION_ASC, -+ field: ListPartitionsRequest.OrderByField.ORDER_BY_FIELD_ID ++ direction: SortDirection.SORT_DIRECTION_ASC, ++ field: { ++ partitionRawField: { ++ field: PartitionRawEnumField.PARTITION_RAW_ENUM_FIELD_ID ++ } ++ } + }, -+ filter: { -+ id: '', -+ parentPartitionId: '', -+ podMax: 0, -+ podReserved: 0, -+ preemptionPercentage: 0, -+ priority: 0, -+ } ++ filters: {} + }); return this.#client.listPartitions(options); From 0fc03510d307c12a5631ad9e0059095a6c58f78b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:57:04 +0000 Subject: [PATCH 033/344] chore(deps): update npm packages --- package.json | 12 +- pnpm-lock.yaml | 581 ++++++++++++++++++++----------------------------- 2 files changed, 243 insertions(+), 350 deletions(-) diff --git a/package.json b/package.json index e7db86bf4..04593a733 100644 --- a/package.json +++ b/package.json @@ -11,18 +11,18 @@ }, "devDependencies": { "@antfu/eslint-config": "^0.41.0", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "consola": "^2.15.3", + "@typescript-eslint/eslint-plugin": "^6.4.1", + "consola": "^3.2.3", "eslint": "^8.47.0", - "eslint-config-standard-with-typescript": "^32.0.0", + "eslint-config-standard-with-typescript": "^38.0.0", "eslint-plugin-import": "^2.28.1", - "eslint-plugin-n": "^15.7.0", + "eslint-plugin-n": "^16.0.2", "eslint-plugin-promise": "^6.1.1", - "glob": "^8.1.0", + "glob": "^10.3.3", "jiti": "^1.19.3", "pathe": "^1.1.1", "tslib": "^2.6.2", - "typescript": "^4.9.5", + "typescript": "^5.2.2", "zx": "^7.2.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b85ba2780..fbad354b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,31 +7,31 @@ settings: devDependencies: '@antfu/eslint-config': specifier: ^0.41.0 - version: 0.41.0(eslint@8.47.0)(typescript@4.9.5) + version: 0.41.0(eslint@8.47.0)(typescript@5.2.2) '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.47.0)(typescript@4.9.5) + specifier: ^6.4.1 + version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) consola: - specifier: ^2.15.3 - version: 2.15.3 + specifier: ^3.2.3 + version: 3.2.3 eslint: specifier: ^8.47.0 version: 8.47.0 eslint-config-standard-with-typescript: - specifier: ^32.0.0 - version: 32.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@4.9.5) + specifier: ^38.0.0 + version: 38.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.0.2)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@5.2.2) eslint-plugin-import: specifier: ^2.28.1 - version: 2.28.1(@typescript-eslint/parser@5.57.0)(eslint@8.47.0) + version: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) eslint-plugin-n: - specifier: ^15.7.0 - version: 15.7.0(eslint@8.47.0) + specifier: ^16.0.2 + version: 16.0.2(eslint@8.47.0) eslint-plugin-promise: specifier: ^6.1.1 version: 6.1.1(eslint@8.47.0) glob: - specifier: ^8.1.0 - version: 8.1.0 + specifier: ^10.3.3 + version: 10.3.3 jiti: specifier: ^1.19.3 version: 1.19.3 @@ -42,8 +42,8 @@ devDependencies: specifier: ^2.6.2 version: 2.6.2 typescript: - specifier: ^4.9.5 - version: 4.9.5 + specifier: ^5.2.2 + version: 5.2.2 zx: specifier: ^7.2.3 version: 7.2.3 @@ -55,13 +55,13 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@antfu/eslint-config-basic@0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5): + /@antfu/eslint-config-basic@0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-zcwFv+nEV/NroeeVWriNdnIGd9soOLRG8wIiVz4VVJ0BjONrqQR56HLG/gDxH/1GUYBnQCEcVxGUmegce08cnw==} peerDependencies: eslint: '>=7.4.0' dependencies: eslint: 8.47.0 - eslint-plugin-antfu: 0.41.0(eslint@8.47.0)(typescript@4.9.5) + eslint-plugin-antfu: 0.41.0(eslint@8.47.0)(typescript@5.2.2) eslint-plugin-eslint-comments: 3.2.0(eslint@8.47.0) eslint-plugin-html: 7.1.0 eslint-plugin-import: /eslint-plugin-i@2.28.0-2(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) @@ -84,18 +84,18 @@ packages: - typescript dev: true - /@antfu/eslint-config-ts@0.41.0(eslint@8.47.0)(typescript@4.9.5): + /@antfu/eslint-config-ts@0.41.0(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-ng3GYpJGZgrxGwBVda/MgUpveH3LbEqdPCFi1+S5e62W4kf8rmEVbhc0I8w7/aKN0uNqir5SInYg8gob2maDAQ==} peerDependencies: eslint: '>=7.4.0' typescript: '>=3.9' dependencies: - '@antfu/eslint-config-basic': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@antfu/eslint-config-basic': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) eslint: 8.47.0 - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0)(typescript@4.9.5) - typescript: 4.9.5 + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0)(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -103,13 +103,13 @@ packages: - supports-color dev: true - /@antfu/eslint-config-vue@0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5): + /@antfu/eslint-config-vue@0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-iJiEGRUgRmT3mQCmGl0hTMwq/ShXRjRPjpgsDcphKJyEF06ZIR/4gxHn+utQRLT2hD39DQN8gk0ZbpV3gWtf/g==} peerDependencies: eslint: '>=7.4.0' dependencies: - '@antfu/eslint-config-basic': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) - '@antfu/eslint-config-ts': 0.41.0(eslint@8.47.0)(typescript@4.9.5) + '@antfu/eslint-config-basic': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) + '@antfu/eslint-config-ts': 0.41.0(eslint@8.47.0)(typescript@5.2.2) eslint: 8.47.0 eslint-plugin-vue: 9.17.0(eslint@8.47.0) local-pkg: 0.4.3 @@ -123,14 +123,14 @@ packages: - typescript dev: true - /@antfu/eslint-config@0.41.0(eslint@8.47.0)(typescript@4.9.5): + /@antfu/eslint-config@0.41.0(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-510DginDPdzf45O6HOah3cK6NHXxobBc43IdBQCQmUGb+av9LIJjrd1idThFoyFh6m05iZ4YX/mhnhhJFqLiNw==} peerDependencies: eslint: '>=7.4.0' dependencies: - '@antfu/eslint-config-vue': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@antfu/eslint-config-vue': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) eslint: 8.47.0 eslint-plugin-eslint-comments: 3.2.0(eslint@8.47.0) eslint-plugin-html: 7.1.0 @@ -183,11 +183,6 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.5.1: - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - /@eslint-community/regexpp@4.6.2: resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -235,6 +230,18 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -256,6 +263,13 @@ packages: fastq: 1.15.0 dev: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + /@types/fs-extra@11.0.1: resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} dependencies: @@ -263,10 +277,6 @@ packages: '@types/node': 18.16.7 dev: true - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - dev: true - /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true @@ -303,10 +313,6 @@ packages: resolution: {integrity: sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw==} dev: true - /@types/semver@7.3.13: - resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} - dev: true - /@types/semver@7.5.0: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true @@ -319,35 +325,7 @@ packages: resolution: {integrity: sha512-ASCxdbsrwNfSMXALlC3Decif9rwDMu+80KGp5zI2RLRotfMsTv7fHL8W8VDp24wymzDyIFudhUeSCugrgRFfHQ==} dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.47.0)(typescript@4.9.5): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.57.0(eslint@8.47.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) - debug: 4.3.4 - eslint: 8.47.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -359,10 +337,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.4.1 - '@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@4.9.5) - '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.4.1 debug: 4.3.4 eslint: 8.47.0 @@ -370,33 +348,13 @@ packages: ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@4.9.5) - typescript: 4.9.5 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.57.0(eslint@8.47.0)(typescript@4.9.5): - resolution: {integrity: sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.57.0 - '@typescript-eslint/types': 5.57.0 - '@typescript-eslint/typescript-estree': 5.57.0(typescript@4.9.5) - debug: 4.3.4 - eslint: 8.47.0 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@4.9.5): + /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -408,23 +366,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.4.1 '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/typescript-estree': 6.4.1(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.4.1 debug: 4.3.4 eslint: 8.47.0 - typescript: 4.9.5 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.57.0: - resolution: {integrity: sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.57.0 - '@typescript-eslint/visitor-keys': 5.57.0 - dev: true - /@typescript-eslint/scope-manager@5.62.0: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -441,27 +391,7 @@ packages: '@typescript-eslint/visitor-keys': 6.4.1 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) - debug: 4.3.4 - eslint: 8.47.0 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -471,21 +401,16 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.4.1(typescript@4.9.5) - '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2) debug: 4.3.4 eslint: 8.47.0 - ts-api-utils: 1.0.2(typescript@4.9.5) - typescript: 4.9.5 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.57.0: - resolution: {integrity: sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -496,28 +421,7 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.57.0(typescript@4.9.5): - resolution: {integrity: sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.57.0 - '@typescript-eslint/visitor-keys': 5.57.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -531,14 +435,14 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.4.1(typescript@4.9.5): + /@typescript-eslint/typescript-estree@6.4.1(typescript@5.2.2): resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -553,33 +457,33 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@4.9.5) - typescript: 4.9.5 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): + /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) eslint: 8.47.0 eslint-scope: 5.1.1 - semver: 7.3.8 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@4.9.5): + /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -590,7 +494,7 @@ packages: '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 6.4.1 '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/typescript-estree': 6.4.1(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) eslint: 8.47.0 semver: 7.5.4 transitivePeerDependencies: @@ -598,14 +502,6 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@5.57.0: - resolution: {integrity: sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@5.62.0: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -650,6 +546,11 @@ packages: engines: {node: '>=8'} dev: true + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -664,6 +565,11 @@ packages: color-convert: 2.0.1 dev: true + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -849,8 +755,9 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} dev: true /cross-spawn@7.0.3: @@ -960,6 +867,18 @@ packages: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1045,39 +964,40 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-standard-with-typescript@32.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@4.9.5): - resolution: {integrity: sha512-SyfzLvyBbPfxr2K/zNphtl5CGIS7FHH7v0TZrpmuyEXe+S1LFgt8hdJcWZHNxFckAGVQqrCxe/8+9T6n8x0gEA==} + /eslint-config-standard-with-typescript@38.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.0.2)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@5.2.2): + resolution: {integrity: sha512-G7JR6I8tmWEQjzbESo/9gVq4AQctbVO4J8PINQj8l2lgbJF/W9KCJ4uDLiKmLMjWszW/F5SsucoA/5VpHvfwOQ==} peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 + '@typescript-eslint/eslint-plugin': ^6.1.0 eslint: ^8.0.1 eslint-plugin-import: ^2.25.2 - eslint-plugin-n: ^15.0.0 + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 typescript: '*' dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.57.0)(eslint@8.47.0)(typescript@4.9.5) - '@typescript-eslint/parser': 5.57.0(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) eslint: 8.47.0 - eslint-config-standard: 17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.57.0)(eslint@8.47.0) - eslint-plugin-n: 15.7.0(eslint@8.47.0) + eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.0.2)(eslint-plugin-promise@6.1.1)(eslint@8.47.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) + eslint-plugin-n: 16.0.2(eslint@8.47.0) eslint-plugin-promise: 6.1.1(eslint@8.47.0) - typescript: 4.9.5 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /eslint-config-standard@17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0): - resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} + /eslint-config-standard@17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.0.2)(eslint-plugin-promise@6.1.1)(eslint@8.47.0): + resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} + engines: {node: '>=12.0.0'} peerDependencies: eslint: ^8.0.1 eslint-plugin-import: ^2.25.2 - eslint-plugin-n: ^15.0.0 + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 dependencies: eslint: 8.47.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.57.0)(eslint@8.47.0) - eslint-plugin-n: 15.7.0(eslint@8.47.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) + eslint-plugin-n: 16.0.2(eslint@8.47.0) eslint-plugin-promise: 6.1.1(eslint@8.47.0) dev: true @@ -1091,35 +1011,6 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.57.0(eslint@8.47.0)(typescript@4.9.5) - debug: 3.2.7 - eslint: 8.47.0 - eslint-import-resolver-node: 0.3.7 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} @@ -1141,7 +1032,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) debug: 3.2.7 eslint: 8.47.0 eslint-import-resolver-node: 0.3.7 @@ -1149,10 +1040,10 @@ packages: - supports-color dev: true - /eslint-plugin-antfu@0.41.0(eslint@8.47.0)(typescript@4.9.5): + /eslint-plugin-antfu@0.41.0(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-JeEeDZgz7oqYPYWYNQHdXrKaW2nhJz/70jeMZUkaNjVp72cpsJPH3idiEhIhGu3wjFdsOMCoEkboT/DQXlCaqA==} dependencies: - '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2) transitivePeerDependencies: - eslint - supports-color @@ -1170,17 +1061,6 @@ packages: eslint: 8.47.0 dev: true - /eslint-plugin-es@4.1.0(eslint@8.47.0): - resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 8.47.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@8.47.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} @@ -1221,7 +1101,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.57.0)(eslint@8.47.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -1231,7 +1111,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.57.0(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 @@ -1240,7 +1120,7 @@ packages: doctrine: 2.1.0 eslint: 8.47.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.57.0)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -1256,7 +1136,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0)(typescript@4.9.5): + /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0)(typescript@5.2.2): resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1269,8 +1149,8 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.2.2) eslint: 8.47.0 transitivePeerDependencies: - supports-color @@ -1301,23 +1181,6 @@ packages: - supports-color dev: true - /eslint-plugin-n@15.7.0(eslint@8.47.0): - resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} - engines: {node: '>=12.22.0'} - peerDependencies: - eslint: '>=7.0.0' - dependencies: - builtins: 5.0.1 - eslint: 8.47.0 - eslint-plugin-es: 4.1.0(eslint@8.47.0) - eslint-utils: 3.0.0(eslint@8.47.0) - ignore: 5.2.4 - is-core-module: 2.11.0 - minimatch: 3.1.2 - resolve: 1.22.1 - semver: 7.3.8 - dev: true - /eslint-plugin-n@16.0.2(eslint@8.47.0): resolution: {integrity: sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==} engines: {node: '>=16.0.0'} @@ -1383,7 +1246,7 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) eslint: 8.47.0 eslint-rule-composer: 0.3.0 dev: true @@ -1442,33 +1305,6 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.47.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.47.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1655,6 +1491,14 @@ packages: is-callable: 1.2.7 dev: true + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -1747,6 +1591,18 @@ packages: is-glob: 4.0.3 dev: true + /glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.0 + minimatch: 9.0.3 + minipass: 7.0.3 + path-scurry: 1.10.1 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -1758,17 +1614,6 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} @@ -1969,12 +1814,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - dependencies: - has: 1.0.3 - dev: true - /is-core-module@2.13.0: resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: @@ -1997,6 +1836,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2079,6 +1923,15 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /jackspeak@2.3.0: + resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /jiti@1.19.3: resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} hasBin: true @@ -2182,6 +2035,11 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true + /lru-cache@10.0.1: + resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + engines: {node: 14 || >=16.14} + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2242,9 +2100,9 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true @@ -2253,6 +2111,11 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /minipass@7.0.3: + resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -2261,10 +2124,6 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -2442,6 +2301,14 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.1 + minipass: 7.0.3 + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -2530,11 +2397,6 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - /regjsparser@0.10.0: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true @@ -2551,15 +2413,6 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve@1.22.4: resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true @@ -2605,14 +2458,6 @@ packages: hasBin: true dev: true - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -2641,6 +2486,11 @@ packages: object-inspect: 1.12.3 dev: true + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -2685,6 +2535,24 @@ packages: duplexer: 0.1.2 dev: true + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string.prototype.trim@1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} @@ -2717,6 +2585,13 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -2768,13 +2643,13 @@ packages: is-number: 7.0.0 dev: true - /ts-api-utils@1.0.2(typescript@4.9.5): + /ts-api-utils@1.0.2(typescript@5.2.2): resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 4.9.5 + typescript: 5.2.2 dev: true /tsconfig-paths@3.14.2: @@ -2794,14 +2669,14 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsutils@3.21.0(typescript@4.9.5): + /tsutils@3.21.0(typescript@5.2.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.9.5 + typescript: 5.2.2 dev: true /type-check@0.4.0: @@ -2834,9 +2709,9 @@ packages: is-typed-array: 1.1.10 dev: true - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} hasBin: true dev: true @@ -2943,6 +2818,24 @@ packages: isexe: 2.0.0 dev: true + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true From 7254166f09daed8fdcd321c61bd69e603df7fbb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Sat, 26 Aug 2023 23:15:57 +0200 Subject: [PATCH 034/344] fix: use the new methods from glob --- scripts/versions/_contants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/versions/_contants.ts b/scripts/versions/_contants.ts index bf4af5599..58b59d727 100644 --- a/scripts/versions/_contants.ts +++ b/scripts/versions/_contants.ts @@ -1,7 +1,7 @@ -import glob from 'glob' +import {glob, globSync} from "glob" export const csharpPattern = /(?.*)<\/PackageVersion>/ -export const csharpFiles = glob.sync('**/*.csproj') +export const csharpFiles = glob.globSync(`**/*.csproj`) export const pythonPattern = /version = "(?.*)"/g export const pythonFiles = ['packages/python/pyproject.toml'] From 5e7f3edee4868e97bca8b0143e97a67c6995ca2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Sat, 26 Aug 2023 23:21:33 +0200 Subject: [PATCH 035/344] style: format code --- scripts/versions/_contants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/versions/_contants.ts b/scripts/versions/_contants.ts index 58b59d727..d7e5ec4c5 100644 --- a/scripts/versions/_contants.ts +++ b/scripts/versions/_contants.ts @@ -1,7 +1,7 @@ -import {glob, globSync} from "glob" +import { glob } from 'glob' export const csharpPattern = /(?.*)<\/PackageVersion>/ -export const csharpFiles = glob.globSync(`**/*.csproj`) +export const csharpFiles = glob.globSync('**/*.csproj') export const pythonPattern = /version = "(?.*)"/g export const pythonFiles = ['packages/python/pyproject.toml'] From be25db5e3bea7f75476a622be68f3a8ef09253f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 28 Aug 2023 07:33:08 +0200 Subject: [PATCH 036/344] feat: Add filters in events api --- Protos/V1/events_common.proto | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Protos/V1/events_common.proto b/Protos/V1/events_common.proto index 62d6b37a2..2013a5c32 100644 --- a/Protos/V1/events_common.proto +++ b/Protos/V1/events_common.proto @@ -4,14 +4,31 @@ package armonik.api.grpc.v1.events; import "result_status.proto"; import "task_status.proto"; +import "tasks_filters.proto"; +import "results_filters.proto"; option csharp_namespace = "ArmoniK.Api.gRPC.V1.Events"; + +/** + * Represents the events that can be returned in the EventSubscriptionResponse + */ +enum EventsEnum { + EVENTS_ENUM_NEW_TASK = 0; /** New task */ + EVENTS_ENUM_TASK_STATUS_UPDATE = 1; /** Task status update */ + EVENTS_ENUM_NEW_RESULT = 2; /** New restult */ + EVENTS_ENUM_RESULT_STATUS_UPDATE = 3; /** Result status update */ + EVENTS_ENUM_RESULT_OWNER_UPDATE = 4; /** Result owner update */ +} + /** * Request to subscribe to the event stream. */ message EventSubscriptionRequest { string session_id = 1; /** Id of the session that will be used to subscribe events for. **/ + tasks.Filters tasks_filters = 2; /** Filter for task related events. */ + results.Filters results_filters = 3; /** Filter for result related events. */ + repeated EventsEnum returned_events = 4; /** Filter the type of events to return. Empty means all. */ } /** From a3ec86b46aa9cee7a92b1d91dc058fc6acb298da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 28 Aug 2023 07:35:29 +0200 Subject: [PATCH 037/344] style: reformat proto --- Protos/V1/events_common.proto | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Protos/V1/events_common.proto b/Protos/V1/events_common.proto index 2013a5c32..af1c106b3 100644 --- a/Protos/V1/events_common.proto +++ b/Protos/V1/events_common.proto @@ -3,13 +3,12 @@ syntax = "proto3"; package armonik.api.grpc.v1.events; import "result_status.proto"; +import "results_filters.proto"; import "task_status.proto"; import "tasks_filters.proto"; -import "results_filters.proto"; option csharp_namespace = "ArmoniK.Api.gRPC.V1.Events"; - /** * Represents the events that can be returned in the EventSubscriptionResponse */ From 85ad7b2cb31ff971eb57aae1dabc66f0a2c5ddb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 28 Aug 2023 09:06:52 +0200 Subject: [PATCH 038/344] feat: include doc from proto in C# packages --- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 1 + .../ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj | 1 + packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 1 + packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 1 + packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 1 + 5 files changed, 5 insertions(+) diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 7f18a51d7..c7771b9c1 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -15,6 +15,7 @@ ../kp.snk true 3.11.0 + True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index eb507087e..adabc80bb 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -7,6 +7,7 @@ 3.11.0 ../publish True + True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index e2868b130..b191e112e 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -15,6 +15,7 @@ ../kp.snk true 3.11.0 + True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index 93e2aab01..0f18c2111 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -18,6 +18,7 @@ ../kp.snk 3.11.0 True + True diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 7c89121d9..dca8338f0 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -18,6 +18,7 @@ ../kp.snk 3.11.0 True + True From 16c675e32900fadfdfc502f9d55403bbc167e825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 28 Aug 2023 10:11:32 +0200 Subject: [PATCH 039/344] Add unspecified in the events enum --- Protos/V1/events_common.proto | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Protos/V1/events_common.proto b/Protos/V1/events_common.proto index af1c106b3..4c3171882 100644 --- a/Protos/V1/events_common.proto +++ b/Protos/V1/events_common.proto @@ -13,11 +13,12 @@ option csharp_namespace = "ArmoniK.Api.gRPC.V1.Events"; * Represents the events that can be returned in the EventSubscriptionResponse */ enum EventsEnum { - EVENTS_ENUM_NEW_TASK = 0; /** New task */ - EVENTS_ENUM_TASK_STATUS_UPDATE = 1; /** Task status update */ - EVENTS_ENUM_NEW_RESULT = 2; /** New restult */ - EVENTS_ENUM_RESULT_STATUS_UPDATE = 3; /** Result status update */ - EVENTS_ENUM_RESULT_OWNER_UPDATE = 4; /** Result owner update */ + EVENTS_ENUM_UNSPECIFIED = 0; /** Unspecified */ + EVENTS_ENUM_NEW_TASK = 1; /** New task */ + EVENTS_ENUM_TASK_STATUS_UPDATE = 2; /** Task status update */ + EVENTS_ENUM_NEW_RESULT = 3; /** New restult */ + EVENTS_ENUM_RESULT_STATUS_UPDATE = 4; /** Result status update */ + EVENTS_ENUM_RESULT_OWNER_UPDATE = 5; /** Result owner update */ } /** From b25843b8c001a2d4c8376c76cdd3d5dace46a6e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 4 Sep 2023 11:05:00 +0200 Subject: [PATCH 040/344] feat: new overloads for worker server creation --- .../ArmoniK.Api.Tests/WorkerServerTest.cs | 48 ++++++++++++++----- .../ArmoniK.Api.Worker/Utils/WorkerServer.cs | 45 +++++++++++++++-- 2 files changed, 77 insertions(+), 16 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Tests/WorkerServerTest.cs b/packages/csharp/ArmoniK.Api.Tests/WorkerServerTest.cs index 9a20e1ff0..0b0128522 100644 --- a/packages/csharp/ArmoniK.Api.Tests/WorkerServerTest.cs +++ b/packages/csharp/ArmoniK.Api.Tests/WorkerServerTest.cs @@ -56,17 +56,17 @@ public virtual void TearDown() [Test] public Task BuildServer() { - var collection = new List>(); - - collection.Add(new KeyValuePair($"{nameof(ComputePlane)}:{nameof(ComputePlane.WorkerChannel)}:{nameof(ComputePlane.WorkerChannel.Address)}", - "/tmp/worker.sock")); - collection.Add(new KeyValuePair($"{nameof(ComputePlane)}:{nameof(ComputePlane.WorkerChannel)}:{nameof(ComputePlane.WorkerChannel.SocketType)}", - GrpcSocketType.UnixDomainSocket.ToString())); - - collection.Add(new KeyValuePair($"{nameof(ComputePlane)}:{nameof(ComputePlane.AgentChannel)}:{nameof(ComputePlane.AgentChannel.Address)}", - "/tmp/agent.sock")); - collection.Add(new KeyValuePair($"{nameof(ComputePlane)}:{nameof(ComputePlane.AgentChannel)}:{nameof(ComputePlane.AgentChannel.SocketType)}", - GrpcSocketType.UnixDomainSocket.ToString())); + var collection = new List> + { + new($"{nameof(ComputePlane)}:{nameof(ComputePlane.WorkerChannel)}:{nameof(ComputePlane.WorkerChannel.Address)}", + "/tmp/worker.sock"), + new($"{nameof(ComputePlane)}:{nameof(ComputePlane.WorkerChannel)}:{nameof(ComputePlane.WorkerChannel.SocketType)}", + GrpcSocketType.UnixDomainSocket.ToString()), + new($"{nameof(ComputePlane)}:{nameof(ComputePlane.AgentChannel)}:{nameof(ComputePlane.AgentChannel.Address)}", + "/tmp/agent.sock"), + new($"{nameof(ComputePlane)}:{nameof(ComputePlane.AgentChannel)}:{nameof(ComputePlane.AgentChannel.SocketType)}", + GrpcSocketType.UnixDomainSocket.ToString()), + }; var configuration = new ConfigurationBuilder().AddInMemoryCollection(collection) .Build(); @@ -80,6 +80,32 @@ public Task BuildServer() return Task.CompletedTask; } + [Test] + public Task BuildServerConfigurator() + { + var collection = new List> + { + new($"{nameof(ComputePlane)}:{nameof(ComputePlane.WorkerChannel)}:{nameof(ComputePlane.WorkerChannel.Address)}", + "/tmp/worker.sock"), + new($"{nameof(ComputePlane)}:{nameof(ComputePlane.WorkerChannel)}:{nameof(ComputePlane.WorkerChannel.SocketType)}", + GrpcSocketType.UnixDomainSocket.ToString()), + new($"{nameof(ComputePlane)}:{nameof(ComputePlane.AgentChannel)}:{nameof(ComputePlane.AgentChannel.Address)}", + "/tmp/agent.sock"), + new($"{nameof(ComputePlane)}:{nameof(ComputePlane.AgentChannel)}:{nameof(ComputePlane.AgentChannel.SocketType)}", + GrpcSocketType.UnixDomainSocket.ToString()), + }; + + var app = WorkerServer.Create((_, + configuration) => + { + foreach (var pair in collection) + { + configuration[pair.Key] = pair.Value; + } + }); + return Task.CompletedTask; + } + [Test] public Task BuildServerNoArgs() { diff --git a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs index f1e06de99..45915d18b 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs @@ -48,6 +48,18 @@ namespace ArmoniK.Api.Worker.Utils; [PublicAPI] public static class WorkerServer { + /// + /// Create a web application for the given ArmoniK Worker gRPC Service + /// + /// gRPC Service to add to the web application + /// + /// The web application initialized + /// + public static WebApplication Create() + where T : gRPC.V1.Worker.Worker.WorkerBase + => Create(null); + + /// /// Create a web application for the given ArmoniK Worker gRPC Service /// @@ -57,9 +69,35 @@ public static class WorkerServer /// /// The web application initialized /// + // ReSharper disable once MethodOverloadWithOptionalParameter public static WebApplication Create(IConfiguration? configuration = null, Action? serviceConfigurator = null) where T : gRPC.V1.Worker.Worker.WorkerBase + => Create((collection, + configuration1) => + { + if (configuration != null) + { + foreach (var pair in configuration.AsEnumerable()) + { + configuration1[pair.Key] = pair.Value; + } + } + + serviceConfigurator?.Invoke(collection); + }); + + + /// + /// Create a web application for the given ArmoniK Worker gRPC Service + /// + /// gRPC Service to add to the web application + /// Lambda to configure server services + /// + /// The web application initialized + /// + public static WebApplication Create(Action? configurator) + where T : gRPC.V1.Worker.Worker.WorkerBase { try { @@ -71,10 +109,8 @@ public static WebApplication Create(IConfiguration? configuration false) .AddEnvironmentVariables(); - if (configuration is not null) - { - builder.Configuration.AddConfiguration(configuration); - } + configurator?.Invoke(builder.Services, + builder.Configuration); Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(builder.Configuration) .WriteTo.Console(new CompactJsonFormatter()) @@ -114,7 +150,6 @@ public static WebApplication Create(IConfiguration? configuration .AddGrpcReflection() .AddGrpc(options => options.MaxReceiveMessageSize = null); - serviceConfigurator?.Invoke(builder.Services); var app = builder.Build(); From 02d28bcb4635d7d84315dac71fd5627985e3a934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 4 Sep 2023 09:46:50 +0200 Subject: [PATCH 041/344] feat: migrate Watch Result rpc in results service --- Protos/V1/results_common.proto | 29 +++++++++++++++++++++++++++++ Protos/V1/results_service.proto | 11 +++++++++++ 2 files changed, 40 insertions(+) diff --git a/Protos/V1/results_common.proto b/Protos/V1/results_common.proto index 8c9436480..650be0a73 100644 --- a/Protos/V1/results_common.proto +++ b/Protos/V1/results_common.proto @@ -218,3 +218,32 @@ message DeleteResultsDataResponse { string session_id = 1; /** The session of the results. */ repeated string result_id = 2; /** The ID of the deleted results. */ } + +/** + * Request to watch result states + * It contains the list of result ids you want to watch + * and some options to filter out some events. + * Chunking is achieved by sending multiple messages with different result ids. + * It is the responsability of the client to chunk the messages properly and avoid messages too large. + */ +message WatchResultRequest { + // list of statuses to check results against for the initial fetch + repeated result_status.ResultStatus fetch_statuses = 1; + // list of statuses to check results against for the watch + repeated result_status.ResultStatus watch_statuses = 2; + // result ids to fetch/watch + repeated string result_ids = 3; +} + +/** + * List of Result statuses + * Result Ids are grouped by status. One message contains result Ids that have the same status. + * Chunking is achieved by receiving several messages with the same status and the list of ids in multiple parts. + * As chunking is implicit, there is no way to distinguish between chunked messages and actually separate messages. + */ +message WatchResultResponse { + // Status of the results + result_status.ResultStatus status = 1; + // List of result ids that triggered the event + repeated string result_ids = 2; +} diff --git a/Protos/V1/results_service.proto b/Protos/V1/results_service.proto index 9c09e2dd1..4a76f9ff7 100644 --- a/Protos/V1/results_service.proto +++ b/Protos/V1/results_service.proto @@ -56,4 +56,15 @@ service Results { * Get the configuration of the service */ rpc GetServiceConfiguration(Empty) returns (ResultsServiceConfigurationResponse); + + /** + * This endpoint allows a user to watch a list of results and be notified when there is any change. + * The user sends the list of ids they want to watch. + * The submitter will then send the statuses for all requested ids immediately and keep the stream open. + * Ids not present in DB will be returned at that time with the special state NOTFOUND. + * The submitter will send updates to the client via the opened stream. + * Any reply can be implicitely chunked if there are too many event to report at the same time (or for the first reply). + * It is possible to filter out specific statuses from events. + */ + rpc WatchResults(stream WatchResultRequest) returns (stream WatchResultResponse); } From dc1a6e7905c51a01320912b5d951e07ea60df028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 4 Sep 2023 12:33:54 +0200 Subject: [PATCH 042/344] feat: update mock --- .../csharp/ArmoniK.Api.Mock/Services/Results.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs index 3acc11310..b317d9251 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs @@ -116,4 +116,20 @@ public override Task GetResult(GetResultRequest request, { Result = MockResult, }); + + /// + [Count] + public override async Task WatchResults(IAsyncStreamReader requestStream, + IServerStreamWriter responseStream, + ServerCallContext context) + { + await foreach (var _ in requestStream.ReadAllAsync()) + { + await responseStream.WriteAsync(new WatchResultResponse + { + Status = ResultStatus.Unspecified, + }) + .ConfigureAwait(false); + } + } } From 692024d9ecb2860c4a05ef05f215bf90329b072c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Tue, 5 Sep 2023 10:06:43 +0200 Subject: [PATCH 043/344] refactor: remove unneeded overload --- .../csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs index 45915d18b..aaeaa7495 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs @@ -48,18 +48,6 @@ namespace ArmoniK.Api.Worker.Utils; [PublicAPI] public static class WorkerServer { - /// - /// Create a web application for the given ArmoniK Worker gRPC Service - /// - /// gRPC Service to add to the web application - /// - /// The web application initialized - /// - public static WebApplication Create() - where T : gRPC.V1.Worker.Worker.WorkerBase - => Create(null); - - /// /// Create a web application for the given ArmoniK Worker gRPC Service /// @@ -69,7 +57,6 @@ public static WebApplication Create() /// /// The web application initialized /// - // ReSharper disable once MethodOverloadWithOptionalParameter public static WebApplication Create(IConfiguration? configuration = null, Action? serviceConfigurator = null) where T : gRPC.V1.Worker.Worker.WorkerBase From 533515ab4e8d5bc07b6ed0cae14553621761e891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Tue, 5 Sep 2023 10:55:38 +0200 Subject: [PATCH 044/344] chore: update versions to 3.12.0 --- .../projects/aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 2 +- .../ArmoniK.Api.Common.Channel.csproj | 2 +- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 2 +- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 2 +- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 2 +- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 2 +- packages/web/package.json | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 7ec4ff515..af93c4b85 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.11.0", + "version": "3.12.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 82e17d634..9c7437ec0 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.11.0) +set(version 3.12.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 32a08accb..8b608d4a1 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.11.0 + 3.12.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index c7771b9c1..38b74b44e 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.11.0 + 3.12.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index adabc80bb..b75181220 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - 3.11.0 + 3.12.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index b191e112e..089ffad69 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.11.0 + 3.12.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index 0f18c2111..d95259962 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.11.0 + 3.12.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index aab1d2c6f..0683573ba 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,7 +14,7 @@ true snupkg ../kp.snk - 3.11.0 + 3.12.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 78983ac80..6c9b2c2e5 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.11.0 + 3.12.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index dca8338f0..3096634fd 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.11.0 + 3.12.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index d48952d34..80bdaa15f 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.11.0", + "version": "3.12.0", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From 389e236105d082736170020b42832eddea37d8e1 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 11 Sep 2023 11:06:46 +0200 Subject: [PATCH 045/344] Fix worker --- packages/python/src/armonik/worker/worker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index 89078d449..9ac1a6884 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -49,7 +49,7 @@ def Process(self, request_iterator, context) -> Union[ProcessReply, None]: try: self._logger.debug("Received task") task_handler = TaskHandler.create(request_iterator, self._client) - return ProcessReply(output=self.processing_function(task_handler).to_message()) + return ProcessReply(communication_token=task_handler.token, output=self.processing_function(task_handler).to_message()) except Exception as e: self._logger.exception(f"Failed task {''.join(traceback.format_exception(type(e) ,e, e.__traceback__))}", exc_info=e) From 9bc3a2028fa85b995e69a0c9ea1630f3bf272f07 Mon Sep 17 00:00:00 2001 From: ddubuc Date: Thu, 7 Sep 2023 17:29:00 +0200 Subject: [PATCH 046/344] Fix: Need to manage download with powershell to avoid proxy issues with fetchcontent_declare --- .../cpp/ArmoniK.Api.Common/CMakeLists.txt | 27 ++++++++++++- packages/cpp/CMakeLists.txt | 9 ++++- packages/cpp/cmake/downloader.cmake | 38 +++++++++++++++++++ packages/cpp/cmake/downloader.ps1 | 13 +++++++ 4 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 packages/cpp/cmake/downloader.cmake create mode 100644 packages/cpp/cmake/downloader.ps1 diff --git a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt index d6f0b8d04..ddbbc03c2 100644 --- a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt @@ -34,10 +34,26 @@ find_package(gRPC CONFIG REQUIRED) find_package(Threads) include(FetchContent) +include(downloader) + +SET(SRC_FMT "https://github.com/fmtlib/fmt/archive/refs/tags/10.1.0.tar.gz") +SET(SRC_SIMDJSON "https://github.com/simdjson/simdjson/archive/refs/tags/v3.2.2.tar.gz") + +#To fix proxy issue with FETCHCONTENT, we need to trust to a powershell script to downlad file with webbrowser credentials +if (WIN32) +file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/_deps/") + + download_windows_file_https("${SRC_FMT}" "${CMAKE_BINARY_DIR}/_deps/10.1.0.tar.gz" TRUE) + + SET(SRC_FMT "${CMAKE_BINARY_DIR}/_deps/10.1.0.tar.gz") + +endif() + FETCHCONTENT_DECLARE( fmt - URL https://github.com/fmtlib/fmt/archive/refs/tags/10.1.0.tar.gz + URL ${SRC_FMT} + TIMEOUT 180 ) FetchContent_GetProperties(fmt) @@ -45,9 +61,16 @@ if(NOT fmt_POPULATED) FetchContent_Populate(fmt) endif() +if (WIN32) + download_windows_file_https(${SRC_SIMDJSON} "${CMAKE_BINARY_DIR}/_deps/v3.2.2.tar.gz" TRUE) + + SET(SRC_SIMDJSON "${CMAKE_BINARY_DIR}/_deps/v3.2.2.tar.gz") +endif() + FETCHCONTENT_DECLARE( simdjson - URL https://github.com/simdjson/simdjson/archive/refs/tags/v3.2.2.tar.gz + URL "${SRC_SIMDJSON}" + TIMEOUT 180 ) FetchContent_GetProperties(simdjson) diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 9c7437ec0..5aefe758e 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -23,6 +23,8 @@ if (WIN32) set(Protobuf_USE_STATIC_LIBS ON) endif () +LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + option(BUILD_TEST "Build tests" OFF) option(BUILD_CLIENT "Build client" ON) option(BUILD_WORKER "Build worker" ON) @@ -36,12 +38,15 @@ set(CMAKE_CXX_STANDARD 17) function(setup_options project_name_param) -file(READ /etc/issue ${PROJECT_NAME}_ETCISSUE_CONTENT) -string(FIND "${${project_name_param}_ETCISSUE_CONTENT}" "Alpine" IS_ALPINE) + if(MSVC) target_compile_options(${project_name_param} PRIVATE /W4) else() + + file(READ /etc/issue ${PROJECT_NAME}_ETCISSUE_CONTENT) + string(FIND "${${project_name_param}_ETCISSUE_CONTENT}" "Alpine" IS_ALPINE) + if(CMAKE_BUILD_TYPE MATCHES DEBUG AND IS_ALPINE EQUAL -1) target_compile_options(${project_name_param} PRIVATE -Wall -Wextra -Wpedantic -fsanitize=undefined,address) else () diff --git a/packages/cpp/cmake/downloader.cmake b/packages/cpp/cmake/downloader.cmake new file mode 100644 index 000000000..8a01f18af --- /dev/null +++ b/packages/cpp/cmake/downloader.cmake @@ -0,0 +1,38 @@ +# Downloads a file from a URL. The URL may be https, and things will still work. +# URL - the URL to dowload the file from +# DESTFILE - the location to save the download to. The file there will be overwritten if it exists. +# FAIL_ON_ERROR - whether or not to print a FATAL_ERROR if the download fails. +function(download_windows_file_https URL DESTFILE FAIL_ON_ERROR) + + #Fixe issue with PROXY on windows to avoid env variable HTTP_PROXY with pwd + find_program(POWERSHELL NAMES powershell DOC "Path to the Windows Powershell executable. Used to download files") + set(HAVE_DOWNLOADER_PROGRAM TRUE) + + set(DOWNLOADER_PROGRAM ${POWERSHELL}) + + # from http://superuser.com/questions/25538/how-to-download-files-from-command-line-in-windows-like-wget-is-doing + + set(DOWNLOAD_COMMAND "") + if(NOT HAVE_DOWNLOADER_PROGRAM) + message(FATAL_ERROR "A downloader program, either curl, wget, or powershell, is required to download files. Please set CURL, WGET, or POWERSHELL to the location of the respective program.") + endif() + + SET(SCRIPT_DOWNLOAD "${CMAKE_SOURCE_DIR}/cmake/downloader.ps1") + + cmake_path(NATIVE_PATH SCRIPT_DOWNLOAD script_download) + cmake_path(NATIVE_PATH DESTFILE dest_win_file) + #${URL} ${dest_win_file} + SET(CONFIGURED_DOWNLOAD_COMMAND "${script_download}") + + #message("Executing command: ${DOWNLOADER_PROGRAM} ${CONFIGURED_DOWNLOAD_COMMAND}") + + execute_process(COMMAND "${DOWNLOADER_PROGRAM}" -ExecutionPolicy Bypass -File "${CONFIGURED_DOWNLOAD_COMMAND}" ${URL} ${dest_win_file} RESULT_VARIABLE DOWNLOAD_RESULT OUTPUT_VARIABLE out_var ERROR_VARIABLE err_var) + + + if((NOT ${DOWNLOAD_RESULT} EQUAL 0 OR NOT "${err_var}" STREQUAL "") AND FAIL_ON_ERROR) + message(STATUS "Unable to download file ${URL} msg ${DOWNLOAD_RESULT} : ${out_var} error : ${err_var}") + message(FATAL_ERROR "${DOWNLOADER_PROGRAM} ${CONFIGURED_DOWNLOAD_COMMAND}") + else() + message(STATUS "Info sucess to download file ${URL} msg ${DOWNLOAD_RESULT} : [${out_var}] error : [${err_var}]") + endif() +endfunction(download_windows_file_https URL DESTFILE FAIL_ON_ERROR) diff --git a/packages/cpp/cmake/downloader.ps1 b/packages/cpp/cmake/downloader.ps1 new file mode 100644 index 000000000..f64b6447b --- /dev/null +++ b/packages/cpp/cmake/downloader.ps1 @@ -0,0 +1,13 @@ +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + +$browser = New-Object System.Net.WebClient + +$browser.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials; + +$url=$args[0] + +$dest=$args[1] + +write-output "Download file [$url] to [$dest]" + +Invoke-WebRequest $url -OutFile $dest From 46d20b20ee913309ab779e6cb001c434492e94a0 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 13 Sep 2023 16:10:53 +0200 Subject: [PATCH 047/344] Fixed missing namespace in raw headers. Moved src links to some variables --- .../cpp/ArmoniK.Api.Client/CMakeLists.txt | 15 ++-- .../header/submitter/ResultsClient.h | 4 +- .../header/submitter/SubmitterClient.h | 5 +- .../source/submitter/ResultsClient.cpp | 20 ++--- .../source/submitter/SubmitterClient.cpp | 34 ++++----- .../cpp/ArmoniK.Api.Common/CMakeLists.txt | 33 ++------- .../cpp/ArmoniK.Api.Common/Config.cmake.in | 6 +- .../header/exceptions/ArmoniKApiException.h | 4 +- .../header/exceptions/ArmoniKTaskError.h | 4 +- .../ArmoniKTaskNotCompletedException.h | 4 +- .../ArmoniK.Api.Common/header/logger/base.h | 4 +- .../header/logger/context.h | 4 +- .../header/logger/formatter.h | 4 +- .../ArmoniK.Api.Common/header/logger/fwd.h | 4 +- .../ArmoniK.Api.Common/header/logger/level.h | 4 +- .../header/logger/local_logger.h | 4 +- .../ArmoniK.Api.Common/header/logger/logger.h | 4 +- .../ArmoniK.Api.Common/header/logger/writer.h | 4 +- .../header/options/ComputePlane.h | 4 +- .../header/options/ControlPlane.h | 4 +- .../header/options/GrpcSocketType.h | 6 +- .../header/utils/Configuration.h | 8 +- .../header/utils/EnvConfiguration.h | 4 +- .../ArmoniK.Api.Common/header/utils/GuuId.h | 6 +- .../header/utils/JsonConfiguration.h | 4 +- .../source/logger/formatter.cpp | 4 +- .../source/logger/local_logger.cpp | 4 +- .../source/logger/logger.cpp | 4 +- .../source/logger/writer.cpp | 4 +- .../source/utils/Configuration.cpp | 4 +- .../source/utils/JsonConfiguration.cpp | 6 +- packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt | 3 - .../source/SubmitterClientTest.cpp | 30 ++++---- .../ArmoniK.Api.Worker.Tests/CMakeLists.txt | 5 -- .../ArmoniK.Api.Worker.Tests/source/main.cpp | 19 ++--- .../cpp/ArmoniK.Api.Worker/CMakeLists.txt | 10 +-- .../header/Worker/ArmoniKWorker.h | 18 +++-- .../header/Worker/ProcessStatus.h | 4 +- .../header/Worker/TaskHandler.h | 9 +-- .../header/utils/WorkerServer.h | 14 ++-- .../source/Worker/ArmoniKWorker.cpp | 26 ++++--- .../source/Worker/ProcessStatus.cpp | 4 +- .../source/Worker/TaskHandler.cpp | 73 ++++++++++--------- packages/cpp/CMakeLists.txt | 8 +- packages/cpp/Dependencies.cmake | 9 +++ 45 files changed, 218 insertions(+), 237 deletions(-) create mode 100644 packages/cpp/Dependencies.cmake diff --git a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt index 109efdbd7..f9960cac7 100644 --- a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt @@ -1,5 +1,4 @@ set(PROJECT_NAME ArmoniK.Api.Client) -set(NAMESPACE ArmoniK::Api::Client) set(ARMONIK_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/armonik/client) set(PROJECT_BUILD_DIR ${BUILD_DIR}/${PROJECT_NAME}) @@ -28,16 +27,20 @@ set(PROTO_MESSAGES list(TRANSFORM PROTO_FILES PREPEND "${PROTO_FILES_DIR}/") list(TRANSFORM PROTO_MESSAGES PREPEND "${PROTO_FILES_DIR}/") -find_package(Protobuf REQUIRED) -find_package(gRPC CONFIG REQUIRED) -find_package(Threads) - SET(SOURCES_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/source") SET(HEADER_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/header") FILE(GLOB_RECURSE SRC_CLIENT_FILES ${SOURCES_FILES_DIR}/*.cpp) FILE(GLOB_RECURSE HEADER_CLIENT_FILES ${HEADER_FILES_DIR}/*.h) +# Trouver les packages requis +if (UNIX) + find_package(Protobuf REQUIRED) +else() + find_package(Protobuf CONFIG REQUIRED) +endif() +find_package(gRPC CONFIG REQUIRED) +find_package(Threads) file(MAKE_DIRECTORY ${PROJECT_BUILD_DIR}) @@ -76,8 +79,6 @@ target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_ setup_options(${PROJECT_NAME}) -target_compile_definitions(${PROJECT_NAME} PUBLIC API_CLIENT_NAMESPACE=${NAMESPACE}) - target_include_directories(${PROJECT_NAME} PUBLIC "$" diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h index 5b8df675b..c3b3bceed 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h @@ -3,7 +3,7 @@ #include -namespace API_CLIENT_NAMESPACE { +namespace armonik::api::client { class ResultsClient { public: explicit ResultsClient(std::unique_ptr stub) @@ -15,6 +15,6 @@ class ResultsClient { private: std::unique_ptr stub; }; -} // namespace API_CLIENT_NAMESPACE +} // namespace armonik::api::client #endif // ARMONIK_API_RESULTSCLIENT_H diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h index adc98c484..2d50abf81 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h @@ -10,7 +10,7 @@ #include "submitter_common.pb.h" #include "submitter_service.grpc.pb.h" -namespace API_CLIENT_NAMESPACE { +namespace armonik::api::client { /** * @brief Data structure for task payload @@ -30,7 +30,6 @@ struct payload_data { */ class SubmitterClient { private: - grpc::ClientContext context_; std::unique_ptr stub_; public: @@ -105,4 +104,4 @@ class SubmitterClient { get_result_status(const std::string &session_id, const std::vector &result_ids); }; -} // namespace API_CLIENT_NAMESPACE \ No newline at end of file +} // namespace armonik::api::client \ No newline at end of file diff --git a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp index 6efe6847e..9bc73e5fd 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp @@ -2,12 +2,12 @@ #include "exceptions/ArmoniKApiException.h" #include -namespace API_CLIENT_NAMESPACE { +namespace armonik::api::client { std::map ResultsClient::create_results(std::string_view session_id, const std::vector &names) { std::map mapping; - grpc::ClientContext context; + ::grpc::ClientContext context; armonik::api::grpc::v1::results::CreateResultsMetaDataRequest results_request; armonik::api::grpc::v1::results::CreateResultsMetaDataResponse results_response; @@ -32,7 +32,7 @@ std::map ResultsClient::create_results(std::string_vie << ". details : " << status.error_details() << std::endl; auto str = message.str(); std::cerr << "Could not create results for submit: " << str << std::endl; - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException(str); + throw armonik::api::common::exceptions::ArmoniKApiException(str); } for (auto &&res : results_response.results()) { @@ -42,11 +42,11 @@ std::map ResultsClient::create_results(std::string_vie } void ResultsClient::upload_result_data(const std::string &session_id, const std::string &result_id, std::string_view payload) { - grpc::ClientContext context; + ::grpc::ClientContext context; armonik::api::grpc::v1::results::ResultsServiceConfigurationResponse configuration; auto status = stub->GetServiceConfiguration(&context, armonik::api::grpc::v1::Empty(), &configuration); if (!status.ok()) { - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException("Unable to get result configuration : " + + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to get result configuration : " + status.error_message()); } @@ -54,7 +54,7 @@ void ResultsClient::upload_result_data(const std::string &session_id, const std: armonik::api::grpc::v1::results::UploadResultDataResponse response; // response.set_allocated_result(new armonik::api::grpc::v1::results::ResultRaw()); - grpc::ClientContext streamContext; + ::grpc::ClientContext streamContext; auto stream = stub->UploadResultData(&streamContext, &response); armonik::api::grpc::v1::results::UploadResultDataRequest request; request.mutable_id()->set_session_id(session_id); @@ -67,18 +67,18 @@ void ResultsClient::upload_result_data(const std::string &session_id, const std: *request.mutable_data_chunk() = payload.substr(offset, chunkSize); if (!stream->Write(request)) { - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException("Unable to continue upload result"); + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to continue upload result"); } offset += chunkSize; } if (!stream->WritesDone()) { - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException("Unable to upload result"); + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to upload result"); } status = stream->Finish(); if (!status.ok()) { - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException("Unable to finish upload result " + + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to finish upload result " + status.error_message()); } } -} // namespace API_CLIENT_NAMESPACE \ No newline at end of file +} // namespace armonik::api::client \ No newline at end of file diff --git a/packages/cpp/ArmoniK.Api.Client/source/submitter/SubmitterClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/submitter/SubmitterClient.cpp index e0b21230f..10541b9df 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/submitter/SubmitterClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/submitter/SubmitterClient.cpp @@ -31,7 +31,7 @@ using namespace armonik::api::grpc::v1::submitter; * * @param stub the gRPC client stub */ -API_CLIENT_NAMESPACE::SubmitterClient::SubmitterClient(std::unique_ptr stub) { +armonik::api::client::SubmitterClient::SubmitterClient(std::unique_ptr stub) { stub_ = std::move(stub); } @@ -40,7 +40,7 @@ API_CLIENT_NAMESPACE::SubmitterClient::SubmitterClient(std::unique_ptr &partition_ids = {}) { CreateSessionRequest request; *request.mutable_default_task_option() = std::move(default_task_options); @@ -48,8 +48,8 @@ std::string API_CLIENT_NAMESPACE::SubmitterClient::create_session(TaskOptions de request.add_partition_ids(partition_id); } CreateSessionReply reply; - - Status status = stub_->CreateSession(&context_, request, &reply); + ::grpc::ClientContext context; + Status status = stub_->CreateSession(&context, request, &reply); if (!status.ok()) { std::stringstream message; message << "Error: " << status.error_code() << ": " << status.error_message() @@ -70,7 +70,7 @@ std::string API_CLIENT_NAMESPACE::SubmitterClient::create_session(TaskOptions de * @return A vector of futures containing CreateLargeTaskRequest objects. */ std::vector>> -API_CLIENT_NAMESPACE::SubmitterClient::to_request_stream(const std::vector &task_requests, +armonik::api::client::SubmitterClient::to_request_stream(const std::vector &task_requests, std::string session_id, TaskOptions task_options, const size_t chunk_max_size) { std::vector>> async_chunk_payload_tasks; @@ -104,7 +104,7 @@ API_CLIENT_NAMESPACE::SubmitterClient::to_request_stream(const std::vector> -API_CLIENT_NAMESPACE::SubmitterClient::task_chunk_stream(const TaskRequest &task_request, bool is_last, +armonik::api::client::SubmitterClient::task_chunk_stream(const TaskRequest &task_request, bool is_last, size_t chunk_max_size) { return std::async(std::launch::async, [&task_request, chunk_max_size, is_last]() { std::vector requests; @@ -180,7 +180,7 @@ API_CLIENT_NAMESPACE::SubmitterClient::task_chunk_stream(const TaskRequest &task * @return A future containing a CreateTaskReply object. */ std::future -API_CLIENT_NAMESPACE::SubmitterClient::create_tasks_async(std::string session_id, TaskOptions task_options, +armonik::api::client::SubmitterClient::create_tasks_async(std::string session_id, TaskOptions task_options, const std::vector &task_requests) { return std::async(std::launch::async, [this, task_requests, session_id = std::move(session_id), task_options = std::move(task_options)]() mutable { @@ -238,7 +238,7 @@ API_CLIENT_NAMESPACE::SubmitterClient::create_tasks_async(std::string session_id * @return A vector of task IDs. */ std::tuple, std::vector> -API_CLIENT_NAMESPACE::SubmitterClient::submit_tasks_with_dependencies( +armonik::api::client::SubmitterClient::submit_tasks_with_dependencies( std::string session_id, TaskOptions task_options, const std::vector &payloads_with_dependencies, int max_retries = 5) { std::vector task_ids; @@ -290,7 +290,7 @@ API_CLIENT_NAMESPACE::SubmitterClient::submit_tasks_with_dependencies( * @param result_request A vector of ResultRequest objects. * @return A future containing data result. */ -std::future API_CLIENT_NAMESPACE::SubmitterClient::get_result_async(const ResultRequest &result_request) { +std::future armonik::api::client::SubmitterClient::get_result_async(const ResultRequest &result_request) { return std::async(std::launch::async, [this, &result_request]() { ResultReply reply; ClientContext context_result; @@ -313,30 +313,30 @@ std::future API_CLIENT_NAMESPACE::SubmitterClient::get_result_async dataComplete = true; break; case armonik::api::grpc::v1::DataChunk::TYPE_NOT_SET: - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException("Issue with server, invalid data chunk"); + throw armonik::api::common::exceptions::ArmoniKApiException("Issue with server, invalid data chunk"); } break; case ResultReply::kError: - throw ArmoniK::Api::Common::exceptions::ArmoniKTaskError("Can't get result because it's in error", + throw armonik::api::common::exceptions::ArmoniKTaskError("Can't get result because it's in error", reply.error()); case ResultReply::kNotCompletedTask: - throw ArmoniK::Api::Common::exceptions::ArmoniKTaskNotCompletedException(reply.not_completed_task()); + throw armonik::api::common::exceptions::ArmoniKTaskNotCompletedException(reply.not_completed_task()); case ResultReply::TYPE_NOT_SET: - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException("Issue with server, invalid reply"); + throw armonik::api::common::exceptions::ArmoniKApiException("Issue with server, invalid reply"); } } if (!dataComplete) { - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException("Retrieved data is incomplete"); + throw armonik::api::common::exceptions::ArmoniKApiException("Retrieved data is incomplete"); } return result_data; }); } std::map -ArmoniK::Api::Client::SubmitterClient::get_result_status(const std::string &session_id, +armonik::api::client::SubmitterClient::get_result_status(const std::string &session_id, const std::vector &result_ids) { - grpc::ClientContext context; + ::grpc::ClientContext context; armonik::api::grpc::v1::submitter::GetResultStatusRequest request; armonik::api::grpc::v1::submitter::GetResultStatusReply reply; @@ -345,7 +345,7 @@ ArmoniK::Api::Client::SubmitterClient::get_result_status(const std::string &sess auto status = stub_->GetResultStatus(&context, request, &reply); if (!status.ok()) { - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException("Couldn't get result status : " + + throw armonik::api::common::exceptions::ArmoniKApiException("Couldn't get result status : " + status.error_message()); } diff --git a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt index ddbbc03c2..7df317bc9 100644 --- a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt @@ -3,7 +3,6 @@ include(GNUInstallDirs) include(CMakePackageConfigHelpers) set(PROJECT_NAME ArmoniK.Api.Common) -set(NAMESPACE ArmoniK::Api::Common) set(ARMONIK_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/armonik/common) set(PROJECT_BUILD_DIR ${BUILD_DIR}/${PROJECT_NAME}) @@ -27,28 +26,16 @@ set(PROTO_FILES list(TRANSFORM PROTO_FILES PREPEND "${PROTO_FILES_DIR}/") -set(CMAKE_FIND_DEBUG_MODE FALSE) # Trouver les packages requis -find_package(Protobuf REQUIRED) +if (UNIX) + find_package(Protobuf REQUIRED) +else() + find_package(Protobuf CONFIG REQUIRED) +endif() find_package(gRPC CONFIG REQUIRED) find_package(Threads) include(FetchContent) -include(downloader) - -SET(SRC_FMT "https://github.com/fmtlib/fmt/archive/refs/tags/10.1.0.tar.gz") -SET(SRC_SIMDJSON "https://github.com/simdjson/simdjson/archive/refs/tags/v3.2.2.tar.gz") - -#To fix proxy issue with FETCHCONTENT, we need to trust to a powershell script to downlad file with webbrowser credentials -if (WIN32) -file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/_deps/") - - download_windows_file_https("${SRC_FMT}" "${CMAKE_BINARY_DIR}/_deps/10.1.0.tar.gz" TRUE) - - SET(SRC_FMT "${CMAKE_BINARY_DIR}/_deps/10.1.0.tar.gz") - -endif() - FETCHCONTENT_DECLARE( fmt @@ -61,12 +48,6 @@ if(NOT fmt_POPULATED) FetchContent_Populate(fmt) endif() -if (WIN32) - download_windows_file_https(${SRC_SIMDJSON} "${CMAKE_BINARY_DIR}/_deps/v3.2.2.tar.gz" TRUE) - - SET(SRC_SIMDJSON "${CMAKE_BINARY_DIR}/_deps/v3.2.2.tar.gz") -endif() - FETCHCONTENT_DECLARE( simdjson URL "${SRC_SIMDJSON}" @@ -78,8 +59,6 @@ if(NOT simdjson_POPULATED) FetchContent_Populate(simdjson) endif() -set(CMAKE_FIND_DEBUG_MODE FALSE) - SET(SOURCES_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/source") SET(HEADER_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/header") @@ -91,7 +70,7 @@ file(MAKE_DIRECTORY ${PROJECT_BUILD_DIR}) add_library(${PROJECT_NAME} ${PROTO_GENERATED_FILES} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES} ${simdjson_SOURCE_DIR}/singleheader/simdjson.cpp ${simdjson_SOURCE_DIR}/singleheader/simdjson.h) target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure) -target_compile_definitions(${PROJECT_NAME} PUBLIC API_COMMON_NAMESPACE=${NAMESPACE} FMT_HEADER_ONLY=1) +target_compile_definitions(${PROJECT_NAME} PUBLIC FMT_HEADER_ONLY=1) setup_options(${PROJECT_NAME}) diff --git a/packages/cpp/ArmoniK.Api.Common/Config.cmake.in b/packages/cpp/ArmoniK.Api.Common/Config.cmake.in index 5b2d09d17..442f21fb4 100644 --- a/packages/cpp/ArmoniK.Api.Common/Config.cmake.in +++ b/packages/cpp/ArmoniK.Api.Common/Config.cmake.in @@ -4,7 +4,11 @@ set_and_check(ARMONIK_API_COMMON_PREFIX "@PACKAGE_CMAKE_INSTALL_PREFIX@") set_and_check(ARMONIK_API_COMMON_LIBPATH "@PACKAGE_CMAKE_INSTALL_LIBDIR@") include(CMakeFindDependencyMacro) -find_dependency(Protobuf REQUIRED) +if (UNIX) + find_dependency(Protobuf REQUIRED) +else() + find_dependency(Protobuf CONFIG REQUIRED) +endif() find_dependency(gRPC CONFIG REQUIRED) find_dependency(Threads) diff --git a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h index e9fcd49a3..661f78c54 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h +++ b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h @@ -2,12 +2,12 @@ #define ARMONIK_API_ARMONIKAPIEXCEPTION_H #include -namespace API_COMMON_NAMESPACE::exceptions { +namespace armonik::api::common::exceptions { class ArmoniKApiException : public std::runtime_error { public: explicit ArmoniKApiException(const std::string &message) : runtime_error(message) {} }; -} // namespace API_COMMON_NAMESPACE::exceptions +} // namespace armonik::api::common::exceptions #endif // ARMONIK_API_ARMONIKAPIEXCEPTION_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h index b22b80b92..f0f47440b 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h +++ b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h @@ -5,7 +5,7 @@ #include #include #include -namespace API_COMMON_NAMESPACE::exceptions { +namespace armonik::api::common::exceptions { class ArmoniKTaskError : public ArmoniKApiException { public: @@ -31,6 +31,6 @@ class ArmoniKTaskError : public ArmoniKApiException { std::vector> status_details; }; -} // namespace API_COMMON_NAMESPACE::exceptions +} // namespace armonik::api::common::exceptions #endif // ARMONIK_API_ARMONIKTASKERROR_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h index 67bf2927e..43437c2d3 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h +++ b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h @@ -2,7 +2,7 @@ #define ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H #include "ArmoniKApiException.h" -namespace API_COMMON_NAMESPACE::exceptions { +namespace armonik::api::common::exceptions { class ArmoniKTaskNotCompletedException : public ArmoniKApiException { public: @@ -10,6 +10,6 @@ class ArmoniKTaskNotCompletedException : public ArmoniKApiException { : ArmoniKApiException("Task " + taskId + " not completed. " + message), taskId(taskId) {} const std::string taskId; }; -} // namespace API_COMMON_NAMESPACE::exceptions +} // namespace armonik::api::common::exceptions #endif // ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/base.h b/packages/cpp/ArmoniK.Api.Common/header/logger/base.h index 0694e7f09..09521c480 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/base.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/base.h @@ -9,7 +9,7 @@ #include "context.h" #include "level.h" -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { /** * @interface ILogger * @brief Logger interface. @@ -107,4 +107,4 @@ class ILogger { log(Level::Fatal, message, message_context); } }; -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/context.h b/packages/cpp/ArmoniK.Api.Common/header/logger/context.h index da0dddf7e..07cc9278d 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/context.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/context.h @@ -7,7 +7,7 @@ #include #include -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { /** * @class Context * @brief Logger context. @@ -17,4 +17,4 @@ class Context : public std::map { using std::map::map; using std::map::operator=; }; -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/formatter.h b/packages/cpp/ArmoniK.Api.Common/header/logger/formatter.h index 7d5e04a0e..daeb69e43 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/formatter.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/formatter.h @@ -10,7 +10,7 @@ #include "fwd.h" #include "level.h" -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { /** * @interface IFormatter * @brief Formatter interface to use by a logger. @@ -46,4 +46,4 @@ std::unique_ptr formatter_clef(); * @return Pointer to the formatter. */ std::unique_ptr formatter_plain(bool styling = false); -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/fwd.h b/packages/cpp/ArmoniK.Api.Common/header/logger/fwd.h index 4ee0de957..cb6ce7ee3 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/fwd.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/fwd.h @@ -4,7 +4,7 @@ * @brief Forward declarations for logger classes. */ -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { class ILogger; class IFormatter; class IWriter; @@ -14,4 +14,4 @@ class Logger; class LocalLogger; enum class Level; -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/level.h b/packages/cpp/ArmoniK.Api.Common/header/logger/level.h index f060d83f0..d087d5073 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/level.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/level.h @@ -6,7 +6,7 @@ #include -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { /** * @enum Level * @brief Logging Level datatype. @@ -43,4 +43,4 @@ constexpr std::string_view level_name(Level level) { return "Unknown"; } } -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/local_logger.h b/packages/cpp/ArmoniK.Api.Common/header/logger/local_logger.h index d4243fed7..9f6612fad 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/local_logger.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/local_logger.h @@ -11,7 +11,7 @@ #include "fwd.h" #include "level.h" -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { /** * @class LocalLogger @@ -74,4 +74,4 @@ class LocalLogger : ILogger { */ void log(Level level, std::string_view message, const Context &message_context = {}) override; }; -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/logger.h b/packages/cpp/ArmoniK.Api.Common/header/logger/logger.h index 572037e34..f81d19561 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/logger.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/logger.h @@ -13,7 +13,7 @@ #include "level.h" #include "local_logger.h" -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { /** * @brief Default Logger. */ @@ -108,4 +108,4 @@ class Logger : public ILogger { */ void log(Level level, std::string_view message, const Context &message_context = {}) override; }; -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/writer.h b/packages/cpp/ArmoniK.Api.Common/header/logger/writer.h index 8666c9d92..7ffded2e5 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/writer.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/writer.h @@ -10,7 +10,7 @@ #include "level.h" -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { /** * @interface IWriter * @brief Writer interface to use by a logger. @@ -41,4 +41,4 @@ std::unique_ptr writer_console(); * @return Pointer to the writer. */ std::unique_ptr writer_file(std::ostream &out); -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h b/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h index 90eb2a512..f1f513d03 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h +++ b/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h @@ -5,7 +5,7 @@ /** * @brief The armonik namespace contains classes and functions related to the ArmoniK API. */ -namespace API_COMMON_NAMESPACE::options { +namespace armonik::api::common::options { /** * @brief The ComputePlane class manages the communication addresses for workers and agents. */ @@ -58,4 +58,4 @@ class ComputePlane { std::string worker_address_; ///< The worker address string. std::string agent_address_; ///< The agent address string. }; -} // namespace API_COMMON_NAMESPACE::options +} // namespace armonik::api::common::options diff --git a/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h b/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h index 2bf455949..32f1e0af9 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h +++ b/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h @@ -3,7 +3,7 @@ #include "utils/Configuration.h" -namespace API_COMMON_NAMESPACE::options { +namespace armonik::api::common::options { class ControlPlane { public: ControlPlane(const utils::Configuration &config) { @@ -37,6 +37,6 @@ class ControlPlane { std::string ca_cert_pem_path_; bool sslValidation_; }; -} // namespace API_COMMON_NAMESPACE::options +} // namespace armonik::api::common::options #endif // ARMONIK_API_CONTROLPLANE_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/options/GrpcSocketType.h b/packages/cpp/ArmoniK.Api.Common/header/options/GrpcSocketType.h index c833ee8e7..73c7d2c30 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/options/GrpcSocketType.h +++ b/packages/cpp/ArmoniK.Api.Common/header/options/GrpcSocketType.h @@ -1,10 +1,10 @@ #pragma once /** - * @namespace API_COMMON_NAMESPACE::options + * @namespace armonik::api::common::options * @brief This namespace contains common options for the armonik API. */ -namespace API_COMMON_NAMESPACE::options { +namespace armonik::api::common::options { /** * @enum grpc_socket_type * @brief Enumerates the types of gRPC sockets supported by armonik API. @@ -13,4 +13,4 @@ enum grpc_socket_type { tcp = 1, /**< @brief TCP/IP socket type */ UnixDomainSocket = 2 /**< @brief Unix domain socket type */ }; -} // namespace API_COMMON_NAMESPACE::options +} // namespace armonik::api::common::options diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/Configuration.h b/packages/cpp/ArmoniK.Api.Common/header/utils/Configuration.h index efb60b715..a5825ecd7 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/utils/Configuration.h +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/Configuration.h @@ -11,12 +11,12 @@ #include #include -namespace API_COMMON_NAMESPACE::options { +namespace armonik::api::common::options { class ComputePlane; class ControlPlane; -} // namespace API_COMMON_NAMESPACE::options +} // namespace armonik::api::common::options -namespace API_COMMON_NAMESPACE::utils { +namespace armonik::api::common::utils { /** * @class Configuration * @brief Interface for a configuration class that stores and manages key-value pairs. @@ -89,4 +89,4 @@ class Configuration { std::set above_env_keys_; bool use_environment_ = false; }; -} // namespace API_COMMON_NAMESPACE::utils +} // namespace armonik::api::common::utils diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/EnvConfiguration.h b/packages/cpp/ArmoniK.Api.Common/header/utils/EnvConfiguration.h index 496bfe853..67974f15b 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/utils/EnvConfiguration.h +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/EnvConfiguration.h @@ -7,11 +7,11 @@ #include "utils/Configuration.h" -namespace API_COMMON_NAMESPACE::utils::EnvConfiguration { +namespace armonik::api::common::utils::EnvConfiguration { inline void fromEnv(Configuration &config) { config.add_env_configuration(); } inline Configuration fromEnv() { Configuration config; config.add_env_configuration(); return config; } -} // namespace API_COMMON_NAMESPACE::utils::EnvConfiguration +} // namespace armonik::api::common::utils::EnvConfiguration diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/GuuId.h b/packages/cpp/ArmoniK.Api.Common/header/utils/GuuId.h index d8c8bac30..ada30259d 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/utils/GuuId.h +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/GuuId.h @@ -10,9 +10,9 @@ #include /** - * @brief The API_COMMON_NAMESPACE::utils namespace provides utility classes and functions for the ArmoniK API. + * @brief The armonik::api::common::utils namespace provides utility classes and functions for the ArmoniK API. */ -namespace API_COMMON_NAMESPACE::utils { +namespace armonik::api::common::utils { /** * @class GuuId * @brief The GuuId class provides a static method for generating UUIDs. @@ -44,4 +44,4 @@ class GuuId { return uuid; } }; -} // namespace API_COMMON_NAMESPACE::utils +} // namespace armonik::api::common::utils diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/JsonConfiguration.h b/packages/cpp/ArmoniK.Api.Common/header/utils/JsonConfiguration.h index 2a4c8b238..b5adcd498 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/utils/JsonConfiguration.h +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/JsonConfiguration.h @@ -5,7 +5,7 @@ */ #include "utils/Configuration.h" -namespace API_COMMON_NAMESPACE::utils::JsonConfiguration { +namespace armonik::api::common::utils::JsonConfiguration { void fromPath(Configuration &config, std::string_view filepath); void fromString(Configuration &config, std::string_view json_string); inline Configuration fromPath(std::string_view filepath) { @@ -18,4 +18,4 @@ inline Configuration fromString(std::string_view json_string) { fromString(config, json_string); return config; } -} // namespace API_COMMON_NAMESPACE::utils::JsonConfiguration +} // namespace armonik::api::common::utils::JsonConfiguration diff --git a/packages/cpp/ArmoniK.Api.Common/source/logger/formatter.cpp b/packages/cpp/ArmoniK.Api.Common/source/logger/formatter.cpp index 7af918d73..16dcc4c79 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/logger/formatter.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/logger/formatter.cpp @@ -10,7 +10,7 @@ #include "logger/formatter.h" -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { /** * @brief Formatter for CLEF (Compact Log Event Format) */ @@ -98,4 +98,4 @@ std::unique_ptr formatter_plain(bool styling) { return std::make_uni // Interface destructor IFormatter::~IFormatter() = default; -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/source/logger/local_logger.cpp b/packages/cpp/ArmoniK.Api.Common/source/logger/local_logger.cpp index 316405217..ac4b4acfc 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/logger/local_logger.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/logger/local_logger.cpp @@ -6,7 +6,7 @@ #include "logger/local_logger.h" -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { namespace { // Empty string to return when key is not found @@ -51,4 +51,4 @@ void LocalLogger::log(Level level, std::string_view message, const Context &mess auto formatted = formatter_->format(level_, message, *global_context_, local_context_, message_context); writer_->write(level_, formatted); } -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/source/logger/logger.cpp b/packages/cpp/ArmoniK.Api.Common/source/logger/logger.cpp index 090ce7ace..4895de7cf 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/logger/logger.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/logger/logger.cpp @@ -6,7 +6,7 @@ #include "logger/logger.h" -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { namespace { // Empty string to return when key is not found @@ -78,4 +78,4 @@ void Logger::log(Level level, std::string_view message, const Context &message_c // Interface destructor ILogger::~ILogger() = default; -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/source/logger/writer.cpp b/packages/cpp/ArmoniK.Api.Common/source/logger/writer.cpp index 9236c9183..81d8b095c 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/logger/writer.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/logger/writer.cpp @@ -3,7 +3,7 @@ #include "logger/writer.h" -namespace API_COMMON_NAMESPACE::logger { +namespace armonik::api::common::logger { /** * @brief std::ostream -baked Writer @@ -56,4 +56,4 @@ std::unique_ptr writer_file(std::ostream &out) { return std::make_uniqu // Interface destructor IWriter::~IWriter() = default; -} // namespace API_COMMON_NAMESPACE::logger +} // namespace armonik::api::common::logger diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp index 5ac8cdbfd..1a449d781 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp @@ -4,7 +4,7 @@ #include "options/ControlPlane.h" #include "utils/JsonConfiguration.h" -namespace API_COMMON_NAMESPACE::utils { +namespace armonik::api::common::utils { Configuration &Configuration::add_json_configuration(std::string_view file_path) { JsonConfiguration::fromPath(*this, file_path); return *this; @@ -44,4 +44,4 @@ std::string Configuration::get(const std::string &string) const { const std::map &Configuration::list() const { return options_; } options::ControlPlane Configuration::get_control_plane() const { return *this; } -} // namespace API_COMMON_NAMESPACE::utils +} // namespace armonik::api::common::utils diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/JsonConfiguration.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/JsonConfiguration.cpp index a639be866..61aa7149d 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/utils/JsonConfiguration.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/JsonConfiguration.cpp @@ -11,7 +11,7 @@ using namespace simdjson; * @param prefix Prefix for the key * @param element json element */ -void populate(API_COMMON_NAMESPACE::utils::Configuration &config, const std::string &prefix, +void populate(armonik::api::common::utils::Configuration &config, const std::string &prefix, const dom::element &element) { switch (element.type()) { case dom::element_type::ARRAY: { @@ -33,7 +33,7 @@ void populate(API_COMMON_NAMESPACE::utils::Configuration &config, const std::str } } -void API_COMMON_NAMESPACE::utils::JsonConfiguration::fromPath(API_COMMON_NAMESPACE::utils::Configuration &config, +void armonik::api::common::utils::JsonConfiguration::fromPath(armonik::api::common::utils::Configuration &config, std::string_view filepath) { dom::parser parser; dom::element elem; @@ -44,7 +44,7 @@ void API_COMMON_NAMESPACE::utils::JsonConfiguration::fromPath(API_COMMON_NAMESPA std::cerr << "Unable to load json file " << filepath << " : " << e.what(); } } -void API_COMMON_NAMESPACE::utils::JsonConfiguration::fromString(API_COMMON_NAMESPACE::utils::Configuration &config, +void armonik::api::common::utils::JsonConfiguration::fromString(armonik::api::common::utils::Configuration &config, std::string_view json_string) { dom::parser parser; populate(config, "", parser.parse(padded_string(json_string))); diff --git a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt index bdf0fa933..ef6ad2dc3 100644 --- a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt @@ -1,5 +1,4 @@ set(PROJECT_NAME ArmoniK.Api.Tests) -set(NAMESPACE ArmoniK::Api::Tests) # Trouver les packages requis find_package(Protobuf REQUIRED) @@ -29,8 +28,6 @@ endif() set(PROTO_BINARY_DIR "${BUILD_DIR}/${PROJECT_NAME}/") set(PROTO_IMPORT_DIRS "${PROTO_FILES_DIR}") -target_compile_definitions(${PROJECT_NAME} PUBLIC API_TEST_NAMESPACE=${NAMESPACE}) - target_include_directories(${PROJECT_NAME} PUBLIC "$" diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index e0ea56ff6..857277dc2 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -24,7 +24,7 @@ #include "results_service.grpc.pb.h" #include "submitter/ResultsClient.h" -using ArmoniK::Api::Common::utils::Configuration; +using armonik::api::common::utils::Configuration; using armonik::api::grpc::v1::TaskOptions; using armonik::api::grpc::v1::submitter::CreateSessionReply; using armonik::api::grpc::v1::submitter::CreateSessionRequest; @@ -32,12 +32,12 @@ using armonik::api::grpc::v1::submitter::Submitter; using grpc::Channel; using grpc::ClientContext; using grpc::Status; -using namespace ArmoniK::Api::Common::utils; +using namespace armonik::api::common::utils; using ::testing::_; using ::testing::AtLeast; -namespace logger = ArmoniK::Api::Common::logger; +namespace logger = armonik::api::common::logger; /** * @brief Initializes task options creates channel with server address @@ -91,7 +91,7 @@ TEST(testMock, createSession) { std::unique_ptr stub = Submitter::NewStub(channel); // EXPECT_CALL(*stub, CreateSession(_, _, _)).Times(AtLeast(1)); - ArmoniK::Api::Client::SubmitterClient submitter(std::move(stub)); + armonik::api::client::SubmitterClient submitter(std::move(stub)); std::string session_id = submitter.create_session(task_options, partition_ids); std::cout << "create_session response: " << session_id << std::endl; @@ -141,17 +141,17 @@ TEST(testMock, submitTask) { CreateSessionReply reply; grpc::ClientContext context; - ArmoniK::Api::Client::SubmitterClient submitter(std::move(stub)); + armonik::api::client::SubmitterClient submitter(std::move(stub)); const std::vector &partition_ids = {""}; std::string session_id = submitter.create_session(task_options, partition_ids); ASSERT_FALSE(session_id.empty()); - ArmoniK::Api::Client::ResultsClient results(armonik::api::grpc::v1::results::Results::NewStub(channel)); + armonik::api::client::ResultsClient results(armonik::api::grpc::v1::results::Results::NewStub(channel)); std::vector names; names.reserve(10); for (int i = 0; i < 10; i++) { - names.push_back(ArmoniK::Api::Common::utils::GuuId::generate_uuid()); + names.push_back(armonik::api::common::utils::GuuId::generate_uuid()); } auto result_mapping = results.create_results(session_id, names); int j = 0; @@ -160,10 +160,10 @@ TEST(testMock, submitTask) { } try { - std::vector payloads; + std::vector payloads; for (int i = 0; i < 10; i++) { - ArmoniK::Api::Client::payload_data data; + armonik::api::client::payload_data data; data.keys = names[i]; data.payload = {'a', 'r', 'm', 'o', 'n', 'i', 'k'}; data.dependencies = {}; @@ -207,19 +207,19 @@ TEST(testMock, testWorker) { grpc::ClientContext context; std::unique_ptr stub_client = Submitter::NewStub(channel); - ArmoniK::Api::Client::SubmitterClient submitter(std::move(stub_client)); + armonik::api::client::SubmitterClient submitter(std::move(stub_client)); std::string session_id = submitter.create_session(task_options, partition_ids); auto name = "test"; armonik::api::grpc::v1::results::CreateResultsMetaDataRequest request_create; request_create.set_session_id(session_id); - ArmoniK::Api::Client::ResultsClient results(armonik::api::grpc::v1::results::Results::NewStub(channel)); + armonik::api::client::ResultsClient results(armonik::api::grpc::v1::results::Results::NewStub(channel)); auto mapping = results.create_results(session_id, {name}); ASSERT_TRUE(mapping.size() == 1); - std::vector payloads; - ArmoniK::Api::Client::payload_data data; + std::vector payloads; + armonik::api::client::payload_data data; data.keys = mapping[name]; data.payload = "armonik"; data.dependencies = {}; @@ -261,14 +261,14 @@ TEST(testMock, getResult) { grpc::ClientContext context; std::unique_ptr stub_client = Submitter::NewStub(channel); - ArmoniK::Api::Client::SubmitterClient submitter(std::move(stub_client)); + armonik::api::client::SubmitterClient submitter(std::move(stub_client)); std::string session_id = submitter.create_session(task_options, partition_ids); auto name = "test"; armonik::api::grpc::v1::results::CreateResultsMetaDataRequest request_create; request_create.set_session_id(session_id); - ArmoniK::Api::Client::ResultsClient results(armonik::api::grpc::v1::results::Results::NewStub(channel)); + armonik::api::client::ResultsClient results(armonik::api::grpc::v1::results::Results::NewStub(channel)); auto mapping = results.create_results(session_id, {name}); ASSERT_TRUE(mapping.size() == 1); diff --git a/packages/cpp/ArmoniK.Api.Worker.Tests/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Worker.Tests/CMakeLists.txt index 9b6221cc7..7eeae3f99 100644 --- a/packages/cpp/ArmoniK.Api.Worker.Tests/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Worker.Tests/CMakeLists.txt @@ -1,5 +1,4 @@ set(PROJECT_NAME ArmoniK.Api.Worker.Tests) -set(NAMESPACE ArmoniK::Api::Worker::Tests) # Trouver les packages requis find_package(Protobuf REQUIRED) @@ -13,8 +12,6 @@ SET(HEADER_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/header") FILE(GLOB_RECURSE SRC_CLIENT_FILES ${SOURCES_FILES_DIR}/*.cpp) FILE(GLOB_RECURSE HEADER_CLIENT_FILES ${HEADER_FILES_DIR}/*.h) -#file(MAKE_DIRECTORY ${BUILD_DIR}/${PROJECT_NAME}) - add_executable(${PROJECT_NAME} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES}) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17) @@ -23,8 +20,6 @@ target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_ set(PROTO_BINARY_DIR "${BUILD_DIR}/${PROJECT_NAME}/") set(PROTO_IMPORT_DIRS "${PROTO_FILES_DIR}") -target_compile_definitions(${PROJECT_NAME} PUBLIC API_WORKER_TEST_NAMESPACE=${NAMESPACE}) - target_include_directories(${PROJECT_NAME} PUBLIC "$" diff --git a/packages/cpp/ArmoniK.Api.Worker.Tests/source/main.cpp b/packages/cpp/ArmoniK.Api.Worker.Tests/source/main.cpp index d69e888ba..39558d0e7 100644 --- a/packages/cpp/ArmoniK.Api.Worker.Tests/source/main.cpp +++ b/packages/cpp/ArmoniK.Api.Worker.Tests/source/main.cpp @@ -1,6 +1,5 @@ #include #include -#include #include @@ -8,8 +7,6 @@ #include "objects.pb.h" #include "utils/WorkerServer.h" -#include "worker_common.pb.h" -#include "worker_service.grpc.pb.h" #include "Worker/ArmoniKWorker.h" #include "Worker/ProcessStatus.h" @@ -20,18 +17,18 @@ using grpc::Channel; using grpc::ClientContext; using grpc::Status; -using ArmoniK::Api::Common::utils::Configuration; +using armonik::api::common::utils::Configuration; using armonik::api::grpc::v1::TaskOptions; using namespace armonik::api::grpc::v1::worker; -using namespace ArmoniK::Api::Common::utils; +using namespace armonik::api::common::utils; -class TestWorker : public ArmoniK::Api::Worker::ArmoniKWorker { +class TestWorker : public armonik::api::worker::ArmoniKWorker { public: explicit TestWorker(std::unique_ptr agent) : ArmoniKWorker(std::move(agent)) {} - ArmoniK::Api::Worker::ProcessStatus Execute(ArmoniK::Api::Worker::TaskHandler &taskHandler) override { + armonik::api::worker::ProcessStatus Execute(armonik::api::worker::TaskHandler &taskHandler) override { std::cout << "Call computer" << std::endl; std::cout << "SizePayload : " << taskHandler.getPayload().size() << "\nSize DD : " << taskHandler.getDataDependencies().size() @@ -41,16 +38,16 @@ class TestWorker : public ArmoniK::Api::Worker::ArmoniKWorker { if (!taskHandler.getExpectedResults().empty()) { auto res = taskHandler.send_result(taskHandler.getExpectedResults()[0], taskHandler.getPayload()).get(); if (res.has_error()) { - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException(res.error()); + throw armonik::api::common::exceptions::ArmoniKApiException(res.error()); } } } catch (const std::exception &e) { std::cout << "Error sending result " << e.what() << std::endl; - return ArmoniK::Api::Worker::ProcessStatus(e.what()); + return armonik::api::worker::ProcessStatus(e.what()); } - return ArmoniK::Api::Worker::ProcessStatus::Ok; + return armonik::api::worker::ProcessStatus::Ok; } }; @@ -64,7 +61,7 @@ int main(int argc, char **argv) { config.set("ComputePlane__AgentChannel__Address", "/cache/armonik_agent.sock"); try { - ArmoniK::Api::Worker::WorkerServer::create(config)->run(); + armonik::api::worker::WorkerServer::create(config)->run(); } catch (const std::exception &e) { std::cout << "Error in worker" << e.what() << std::endl; } diff --git a/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt index 9d45cd04d..a9438e86f 100644 --- a/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt @@ -1,5 +1,4 @@ set(PROJECT_NAME ArmoniK.Api.Worker) -set(NAMESPACE ArmoniK::Api::Worker) set(ARMONIK_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/armonik/worker) set(PROJECT_BUILD_DIR ${BUILD_DIR}/${PROJECT_NAME}) @@ -14,9 +13,12 @@ set(PROTO_MESSAGES list(TRANSFORM PROTO_FILES PREPEND ${PROTO_FILES_DIR}/) list(TRANSFORM PROTO_MESSAGES PREPEND ${PROTO_FILES_DIR}/) -set(CMAKE_FIND_DEBUG_MODE FALSE) # Trouver les packages requis -find_package(Protobuf REQUIRED) +if (UNIX) + find_package(Protobuf REQUIRED) +else() + find_package(Protobuf CONFIG REQUIRED) +endif() find_package(gRPC CONFIG REQUIRED) find_package(Threads) @@ -32,8 +34,6 @@ add_library(${PROJECT_NAME} ${PROTO_GENERATED_FILES} ${SRC_CLIENT_FILES} ${HEADE target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure ArmoniK.Api.Common ${PROTO_TARGET}) -target_compile_definitions(${PROJECT_NAME} PUBLIC API_WORKER_NAMESPACE=${NAMESPACE}) - target_include_directories(${PROJECT_NAME} PUBLIC "$" diff --git a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h index 98fdde775..c395443a6 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h @@ -16,11 +16,11 @@ #include "ProcessStatus.h" #include "Worker/TaskHandler.h" -namespace API_WORKER_NAMESPACE { +namespace armonik::api::worker { class ArmoniKWorker : public armonik::api::grpc::v1::worker::Worker::Service { private: - ArmoniK::Api::Common::logger::Logger logger_; + armonik::api::common::logger::Logger logger_; std::unique_ptr agent_; public: @@ -38,9 +38,10 @@ class ArmoniKWorker : public armonik::api::grpc::v1::worker::Worker::Service { * * @return The status of the method. */ - grpc::Status Process(::grpc::ServerContext *context, - ::grpc::ServerReader<::armonik::api::grpc::v1::worker::ProcessRequest> *reader, - ::armonik::api::grpc::v1::worker::ProcessReply *response) override; + [[maybe_unused]] ::grpc::Status + Process(::grpc::ServerContext *context, + ::grpc::ServerReader<::armonik::api::grpc::v1::worker::ProcessRequest> *reader, + ::armonik::api::grpc::v1::worker::ProcessReply *response) override; /** * @brief Function which does the actual work @@ -58,8 +59,9 @@ class ArmoniKWorker : public armonik::api::grpc::v1::worker::Worker::Service { * * @return The status of the method. */ - grpc::Status HealthCheck(::grpc::ServerContext *context, const ::armonik::api::grpc::v1::Empty *request, - ::armonik::api::grpc::v1::worker::HealthCheckReply *response) override; + [[maybe_unused]] ::grpc::Status HealthCheck(::grpc::ServerContext *context, + const ::armonik::api::grpc::v1::Empty *request, + ::armonik::api::grpc::v1::worker::HealthCheckReply *response) override; }; -} // namespace API_WORKER_NAMESPACE +} // namespace armonik::api::worker diff --git a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ProcessStatus.h b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ProcessStatus.h index 4b2536499..2c40fd8b7 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ProcessStatus.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ProcessStatus.h @@ -4,7 +4,7 @@ #include #include -namespace API_WORKER_NAMESPACE { +namespace armonik::api::worker { class ProcessStatus { public: ProcessStatus() : ProcessStatus(true, "") {} @@ -34,6 +34,6 @@ class ProcessStatus { bool ok_ = true; std::string details_; }; -} // namespace API_WORKER_NAMESPACE +} // namespace armonik::api::worker #endif // ARMONIK_API_PROCESSSTATUS_H diff --git a/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h b/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h index 1f799286a..2732ee254 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h @@ -8,7 +8,7 @@ #include "worker_common.pb.h" #include "worker_service.grpc.pb.h" -namespace API_WORKER_NAMESPACE { +namespace armonik::api::worker { // #include "SessionContext.h" @@ -19,9 +19,8 @@ namespace API_WORKER_NAMESPACE { class TaskHandler { private: - grpc::ClientContext context_; armonik::api::grpc::v1::agent::Agent::Stub &stub_; - grpc::ServerReader &request_iterator_; + ::grpc::ServerReader &request_iterator_; std::string session_id_; std::string task_id_; armonik::api::grpc::v1::TaskOptions task_options_; @@ -39,7 +38,7 @@ class TaskHandler { * @param request_iterator The request iterator */ TaskHandler(armonik::api::grpc::v1::agent::Agent::Stub &client, - grpc::ServerReader &request_iterator); + ::grpc::ServerReader &request_iterator); /** * @brief Initialise the task handler @@ -147,4 +146,4 @@ class TaskHandler { const armonik::api::grpc::v1::Configuration &getConfiguration() const; }; -} // namespace API_WORKER_NAMESPACE +} // namespace armonik::api::worker diff --git a/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h b/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h index fce57027a..baf04120f 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h @@ -25,14 +25,14 @@ using namespace armonik::api::grpc::v1::agent; -namespace API_WORKER_NAMESPACE { +namespace armonik::api::worker { /** * @class WorkerServer * @brief Represents the worker server for ArmoniK API. */ class WorkerServer { public: - Common::logger::Logger logger; + common::logger::Logger logger; private: ::grpc::ServerBuilder builder_; @@ -44,8 +44,8 @@ class WorkerServer { * @brief Constructor for the WorkerServer class. * @param configuration A shared pointer to the Configuration object. */ - explicit WorkerServer(const Common::utils::Configuration &configuration) - : logger(Common::logger::writer_console(), Common::logger::formatter_clef()) { + explicit WorkerServer(const common::utils::Configuration &configuration) + : logger(common::logger::writer_console(), common::logger::formatter_clef()) { logger.local_context_generator_add("threadId", []() { std::stringstream ss; ss << std::this_thread::get_id(); @@ -53,7 +53,7 @@ class WorkerServer { }); logger.global_context_add("container", "ArmoniK.Worker"); logger.info("Creating worker"); - Common::options::ComputePlane compute_plane(configuration); + common::options::ComputePlane compute_plane(configuration); builder_.AddListeningPort(compute_plane.get_server_address(), ::grpc::InsecureServerCredentials()); builder_.SetMaxReceiveMessageSize(-1); @@ -73,7 +73,7 @@ class WorkerServer { * @return A shared pointer to the created WorkerServer instance */ template - static std::shared_ptr create(Common::utils::Configuration configuration, Args &&...args) { + static std::shared_ptr create(common::utils::Configuration configuration, Args &&...args) { auto worker_server = std::make_shared(std::move(configuration)); worker_server->builder_.RegisterService( new Worker(Agent::NewStub(worker_server->channel), static_cast(args)...)); @@ -87,4 +87,4 @@ class WorkerServer { instance_server->Wait(); } }; -} // namespace API_WORKER_NAMESPACE +} // namespace armonik::api::worker diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp index 37911f5a0..082a03873 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp @@ -20,17 +20,17 @@ using grpc::Channel; using grpc::ClientContext; using grpc::Status; -using ArmoniK::Api::Common::utils::Configuration; +using armonik::api::common::utils::Configuration; using armonik::api::grpc::v1::TaskOptions; using namespace armonik::api::grpc::v1::worker; -using namespace ArmoniK::Api::Common::utils; +using namespace armonik::api::common::utils; /** * @brief Constructs a ArmoniKWorker object. */ -API_WORKER_NAMESPACE::ArmoniKWorker::ArmoniKWorker(std::unique_ptr agent) - : logger_(ArmoniK::Api::Common::logger::writer_console(), ArmoniK::Api::Common::logger::formatter_clef()) { +armonik::api::worker::ArmoniKWorker::ArmoniKWorker(std::unique_ptr agent) + : logger_(armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_clef()) { logger_.info("Build Service ArmoniKWorker"); logger_.global_context_add("class", "ArmoniKWorker"); logger_.global_context_add("Worker", "ArmoniK.Api.Cpp"); @@ -46,9 +46,10 @@ API_WORKER_NAMESPACE::ArmoniKWorker::ArmoniKWorker(std::unique_ptr *reader, - ::armonik::api::grpc::v1::worker::ProcessReply *response) { +[[maybe_unused]] Status +armonik::api::worker::ArmoniKWorker::Process([[maybe_unused]] ::grpc::ServerContext *context, + ::grpc::ServerReader *reader, + ::armonik::api::grpc::v1::worker::ProcessReply *response) { logger_.debug("Receive new request From C++ Worker"); @@ -68,10 +69,10 @@ Status API_WORKER_NAMESPACE::ArmoniKWorker::Process([[maybe_unused]] ::grpc::Ser } *response->mutable_output() = std::move(output); } catch (const std::exception &e) { - return {grpc::StatusCode::UNAVAILABLE, "Error processing task", e.what()}; + return {::grpc::StatusCode::UNAVAILABLE, "Error processing task", e.what()}; } - return grpc::Status::OK; + return ::grpc::Status::OK; } /** @@ -83,9 +84,10 @@ Status API_WORKER_NAMESPACE::ArmoniKWorker::Process([[maybe_unused]] ::grpc::Ser * * @return The status of the method. */ -Status API_WORKER_NAMESPACE::ArmoniKWorker::HealthCheck([[maybe_unused]] ::grpc::ServerContext *context, - [[maybe_unused]] const ::armonik::api::grpc::v1::Empty *request, - ::armonik::api::grpc::v1::worker::HealthCheckReply *response) { +[[maybe_unused]] Status +armonik::api::worker::ArmoniKWorker::HealthCheck([[maybe_unused]] ::grpc::ServerContext *context, + [[maybe_unused]] const ::armonik::api::grpc::v1::Empty *request, + ::armonik::api::grpc::v1::worker::HealthCheckReply *response) { // Implementation of the HealthCheck method logger_.debug("HealthCheck request OK"); diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ProcessStatus.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ProcessStatus.cpp index 7c9a685d1..48bc205b9 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ProcessStatus.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ProcessStatus.cpp @@ -1,4 +1,4 @@ #include "Worker/ProcessStatus.h" -const API_WORKER_NAMESPACE::ProcessStatus API_WORKER_NAMESPACE::ProcessStatus::Ok; -const API_WORKER_NAMESPACE::ProcessStatus API_WORKER_NAMESPACE::ProcessStatus::Error(false); +const armonik::api::worker::ProcessStatus armonik::api::worker::ProcessStatus::Ok; +const armonik::api::worker::ProcessStatus armonik::api::worker::ProcessStatus::Error(false); diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp index 5f524e049..2d1d75454 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp @@ -17,11 +17,10 @@ using armonik::api::grpc::v1::agent::Agent; using armonik::api::grpc::v1::agent::CreateTaskReply; using armonik::api::grpc::v1::agent::CreateTaskRequest; using armonik::api::grpc::v1::worker::ProcessRequest; -using grpc::Channel; -using grpc::ChannelInterface; -using grpc::ClientContext; -using grpc::Status; -using namespace armonik::api::grpc::v1::agent; +using ::grpc::Channel; +using ::grpc::ChannelInterface; +using ::grpc::ClientContext; +using ::grpc::Status; /** * @brief Construct a new Task Handler object @@ -29,15 +28,15 @@ using namespace armonik::api::grpc::v1::agent; * @param client the agent client * @param request_iterator The request iterator */ -API_WORKER_NAMESPACE::TaskHandler::TaskHandler(Agent::Stub &client, - grpc::ServerReader &request_iterator) +armonik::api::worker::TaskHandler::TaskHandler(Agent::Stub &client, + ::grpc::ServerReader &request_iterator) : stub_(client), request_iterator_(request_iterator) {} /** * @brief Initialise the task handler * */ -void API_WORKER_NAMESPACE::TaskHandler::init() { +void armonik::api::worker::TaskHandler::init() { ProcessRequest Request; if (!request_iterator_.Read(&Request)) { throw std::runtime_error("Request stream ended unexpectedly."); @@ -55,8 +54,6 @@ void API_WORKER_NAMESPACE::TaskHandler::init() { token_ = Request.communication_token(); config_ = std::move(*init_request->mutable_configuration()); - std::vector chunks; - auto *datachunk = &init_request->payload(); payload_.resize(datachunk->data().size()); std::memcpy(payload_.data(), datachunk->data().data(), datachunk->data().size()); @@ -129,7 +126,7 @@ void API_WORKER_NAMESPACE::TaskHandler::init() { * @return std::future> */ std::future> -API_WORKER_NAMESPACE::TaskHandler::task_chunk_stream(TaskRequest task_request, bool is_last, const std::string &token, +armonik::api::worker::TaskHandler::task_chunk_stream(TaskRequest task_request, bool is_last, const std::string &token, size_t chunk_max_size) { return std::async(std::launch::async, [task_request = std::move(task_request), chunk_max_size, is_last, token]() { std::vector requests; @@ -209,13 +206,13 @@ API_WORKER_NAMESPACE::TaskHandler::task_chunk_stream(TaskRequest task_request, b * @return std::vector>> */ std::vector>> -API_WORKER_NAMESPACE::TaskHandler::to_request_stream(const std::vector &task_requests, +armonik::api::worker::TaskHandler::to_request_stream(const std::vector &task_requests, TaskOptions task_options, const std::string &token, const size_t chunk_max_size) { std::vector>> async_chunk_payload_tasks; async_chunk_payload_tasks.push_back(std::async([task_options = std::move(task_options), token]() mutable { - CreateTaskRequest_InitRequest create_task_request_init; + grpc::v1::agent::CreateTaskRequest_InitRequest create_task_request_init; *create_task_request_init.mutable_task_options() = std::move(task_options); CreateTaskRequest create_task_request; @@ -241,7 +238,7 @@ API_WORKER_NAMESPACE::TaskHandler::to_request_stream(const std::vector -API_WORKER_NAMESPACE::TaskHandler::create_tasks_async(TaskOptions task_options, +armonik::api::worker::TaskHandler::create_tasks_async(TaskOptions task_options, const std::vector &task_requests) { return std::async(std::launch::async, [this, &task_requests, &task_options]() mutable { size_t chunk = config_.data_chunk_max_size(); @@ -249,7 +246,7 @@ API_WORKER_NAMESPACE::TaskHandler::create_tasks_async(TaskOptions task_options, CreateTaskReply reply{}; reply.set_allocated_creation_status_list(new armonik::api::grpc::v1::agent::CreateTaskReply_CreationStatusList()); - grpc::ClientContext context_client_writer; + ::grpc::ClientContext context_client_writer; auto stream(stub_.CreateTask(&context_client_writer, &reply)); auto create_task_request_async = to_request_stream(task_requests, std::move(task_options), token_, chunk); @@ -261,7 +258,7 @@ API_WORKER_NAMESPACE::TaskHandler::create_tasks_async(TaskOptions task_options, } stream->WritesDone(); - grpc::Status status = stream->Finish(); + ::grpc::Status status = stream->Finish(); if (!status.ok()) { std::stringstream message; message << "Error: " << status.error_code() << ": " << status.error_message() @@ -280,11 +277,12 @@ API_WORKER_NAMESPACE::TaskHandler::create_tasks_async(TaskOptions task_options, * @param data The result data * @return A future containing a vector of ResultReply */ -std::future API_WORKER_NAMESPACE::TaskHandler::send_result(std::string key, std::string_view data) { +std::future +armonik::api::worker::TaskHandler::send_result(std::string key, std::string_view data) { return std::async(std::launch::async, [this, key = std::move(key), data]() mutable { - grpc::ClientContext context_client_writer; + ::grpc::ClientContext context_client_writer; - ResultReply reply; + armonik::api::grpc::v1::agent::ResultReply reply; size_t max_chunk = config_.data_chunk_max_size(); const size_t data_size = data.size(); @@ -292,7 +290,7 @@ std::future API_WORKER_NAMESPACE::TaskHandler::send_result(std::str auto stream = stub_.SendResult(&context_client_writer, &reply); - Result init_msg; + armonik::api::grpc::v1::agent::Result init_msg; init_msg.mutable_init()->set_key(std::move(key)); init_msg.set_communication_token(token_); @@ -301,7 +299,7 @@ std::future API_WORKER_NAMESPACE::TaskHandler::send_result(std::str while (start < data_size) { size_t chunkSize = std::min(max_chunk, data_size - start); - Result msg; + armonik::api::grpc::v1::agent::Result msg; msg.set_communication_token(token_); auto chunk = msg.mutable_data(); chunk->mutable_data()->resize(chunkSize); @@ -312,19 +310,19 @@ std::future API_WORKER_NAMESPACE::TaskHandler::send_result(std::str start += chunkSize; } - Result end_msg; + armonik::api::grpc::v1::agent::Result end_msg; end_msg.set_communication_token(token_); end_msg.mutable_data()->set_data_complete(true); stream->Write(end_msg); stream->WritesDone(); - grpc::Status status = stream->Finish(); + ::grpc::Status status = stream->Finish(); if (!status.ok()) { std::stringstream message; message << "Error: " << status.error_code() << ": " << status.error_message() << ". details: " << status.error_details() << std::endl; - throw ArmoniK::Api::Common::exceptions::ArmoniKApiException(message.str()); + throw armonik::api::common::exceptions::ArmoniKApiException(message.str()); } return reply; }); @@ -336,18 +334,21 @@ std::future API_WORKER_NAMESPACE::TaskHandler::send_result(std::str * @param results The results data * @return std::vector list of result ids */ -std::vector -API_WORKER_NAMESPACE::TaskHandler::get_result_ids(std::vector results) { +std::vector armonik::api::worker::TaskHandler::get_result_ids( + std::vector results) { std::vector result_ids; - grpc::ClientContext context_client_writer; - CreateResultsMetaDataRequest request; - CreateResultsMetaDataResponse reply; + ::grpc::ClientContext context_client_writer; + armonik::api::grpc::v1::agent::CreateResultsMetaDataRequest request; + armonik::api::grpc::v1::agent::CreateResultsMetaDataResponse reply; *request.mutable_results() = {results.begin(), results.end()}; request.set_session_id(session_id_); Status status = stub_.CreateResultsMetaData(&context_client_writer, request, &reply); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException(status.error_message()); + } auto results_reply = reply.results(); @@ -363,28 +364,28 @@ API_WORKER_NAMESPACE::TaskHandler::get_result_ids(std::vector */ -const std::string &API_WORKER_NAMESPACE::TaskHandler::getPayload() const { return payload_; } +const std::string &armonik::api::worker::TaskHandler::getPayload() const { return payload_; } /** * @brief Get the Data Dependencies object * * @return std::vector */ -const std::map &API_WORKER_NAMESPACE::TaskHandler::getDataDependencies() const { +const std::map &armonik::api::worker::TaskHandler::getDataDependencies() const { return data_dependencies_; } @@ -393,7 +394,7 @@ const std::map &API_WORKER_NAMESPACE::TaskHandler::get * * @return armonik::api::grpc::v1::TaskOptions */ -const armonik::api::grpc::v1::TaskOptions &API_WORKER_NAMESPACE::TaskHandler::getTaskOptions() const { +const armonik::api::grpc::v1::TaskOptions &armonik::api::worker::TaskHandler::getTaskOptions() const { return task_options_; } @@ -402,7 +403,7 @@ const armonik::api::grpc::v1::TaskOptions &API_WORKER_NAMESPACE::TaskHandler::ge * * @return google::protobuf::RepeatedPtrField */ -const std::vector &API_WORKER_NAMESPACE::TaskHandler::getExpectedResults() const { +const std::vector &armonik::api::worker::TaskHandler::getExpectedResults() const { return expected_result_; } @@ -411,6 +412,6 @@ const std::vector &API_WORKER_NAMESPACE::TaskHandler::getExpectedRe * * @return armonik::api::grpc::v1::Configuration */ -const armonik::api::grpc::v1::Configuration &API_WORKER_NAMESPACE::TaskHandler::getConfiguration() const { +const armonik::api::grpc::v1::Configuration &armonik::api::worker::TaskHandler::getConfiguration() const { return config_; } diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 5aefe758e..74f4ea033 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -7,7 +7,7 @@ string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) list(GET version_list 2 version_patch) -message(STATUS "Version ${version}") +message(STATUS "ArmoniK Version ${version}") set(SOLUTION_NAME ArmoniK.Api) project(${SOLUTION_NAME} C CXX) @@ -23,8 +23,6 @@ if (WIN32) set(Protobuf_USE_STATIC_LIBS ON) endif () -LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") - option(BUILD_TEST "Build tests" OFF) option(BUILD_CLIENT "Build client" ON) option(BUILD_WORKER "Build worker" ON) @@ -33,13 +31,11 @@ option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) # make cache variables for install destinations include(GNUInstallDirs) include(CMakePackageConfigHelpers) - -set(CMAKE_CXX_STANDARD 17) +include(Dependencies.cmake) function(setup_options project_name_param) - if(MSVC) target_compile_options(${project_name_param} PRIVATE /W4) else() diff --git a/packages/cpp/Dependencies.cmake b/packages/cpp/Dependencies.cmake new file mode 100644 index 000000000..459e07763 --- /dev/null +++ b/packages/cpp/Dependencies.cmake @@ -0,0 +1,9 @@ +if(NOT DEFINED SRC_FMT) + set(SRC_FMT "https://github.com/fmtlib/fmt/archive/refs/tags/10.1.0.tar.gz") +endif() +if(NOT DEFINED SRC_SIMDJSON) + set(SRC_SIMDJSON "https://github.com/simdjson/simdjson/archive/refs/tags/v3.2.2.tar.gz") +endif() +if(NOT DEFINED SRC_GTEST) + set(SRC_GTEST "https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip") +endif() \ No newline at end of file From 8a3b3adb753abb49d746e43868c2059ae84493f2 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 13 Sep 2023 16:40:04 +0200 Subject: [PATCH 048/344] Better build/dependencies documentation --- .../cpp/ArmoniK.Api.Common/CMakeLists.txt | 2 +- packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt | 2 +- packages/cpp/README.md | 17 +++++++++ packages/cpp/cmake/downloader.cmake | 38 ------------------- packages/cpp/cmake/downloader.ps1 | 13 ------- 5 files changed, 19 insertions(+), 53 deletions(-) create mode 100644 packages/cpp/README.md delete mode 100644 packages/cpp/cmake/downloader.cmake delete mode 100644 packages/cpp/cmake/downloader.ps1 diff --git a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt index 7df317bc9..d639e543b 100644 --- a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt @@ -39,7 +39,7 @@ include(FetchContent) FETCHCONTENT_DECLARE( fmt - URL ${SRC_FMT} + URL "${SRC_FMT}" TIMEOUT 180 ) diff --git a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt index ef6ad2dc3..9fa363c76 100644 --- a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt @@ -45,7 +45,7 @@ set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY include(FetchContent) FetchContent_Declare( googletest - URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip + URL "${SRC_GTEST}" ) # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) diff --git a/packages/cpp/README.md b/packages/cpp/README.md new file mode 100644 index 000000000..ac34e1f34 --- /dev/null +++ b/packages/cpp/README.md @@ -0,0 +1,17 @@ +# ArmoniK Api Cpp + +## Build requirements +- cmake 3.22+ +- C++ compiler with C++17 support +- grpc 1.54 - 1.56.2 +- protobuf +- fmt 10.1.0 (https://github.com/fmtlib/fmt/archive/refs/tags/10.1.0.tar.gz) +- simdjson 3.2.2 (https://github.com/simdjson/simdjson/archive/refs/tags/v3.2.2.tar.gz) +- gtest (https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip) (if BUILD_TEST=ON) + +## How to build +```shell +cmake -S . -B out +cmake --build out +cmake --install out +``` diff --git a/packages/cpp/cmake/downloader.cmake b/packages/cpp/cmake/downloader.cmake deleted file mode 100644 index 8a01f18af..000000000 --- a/packages/cpp/cmake/downloader.cmake +++ /dev/null @@ -1,38 +0,0 @@ -# Downloads a file from a URL. The URL may be https, and things will still work. -# URL - the URL to dowload the file from -# DESTFILE - the location to save the download to. The file there will be overwritten if it exists. -# FAIL_ON_ERROR - whether or not to print a FATAL_ERROR if the download fails. -function(download_windows_file_https URL DESTFILE FAIL_ON_ERROR) - - #Fixe issue with PROXY on windows to avoid env variable HTTP_PROXY with pwd - find_program(POWERSHELL NAMES powershell DOC "Path to the Windows Powershell executable. Used to download files") - set(HAVE_DOWNLOADER_PROGRAM TRUE) - - set(DOWNLOADER_PROGRAM ${POWERSHELL}) - - # from http://superuser.com/questions/25538/how-to-download-files-from-command-line-in-windows-like-wget-is-doing - - set(DOWNLOAD_COMMAND "") - if(NOT HAVE_DOWNLOADER_PROGRAM) - message(FATAL_ERROR "A downloader program, either curl, wget, or powershell, is required to download files. Please set CURL, WGET, or POWERSHELL to the location of the respective program.") - endif() - - SET(SCRIPT_DOWNLOAD "${CMAKE_SOURCE_DIR}/cmake/downloader.ps1") - - cmake_path(NATIVE_PATH SCRIPT_DOWNLOAD script_download) - cmake_path(NATIVE_PATH DESTFILE dest_win_file) - #${URL} ${dest_win_file} - SET(CONFIGURED_DOWNLOAD_COMMAND "${script_download}") - - #message("Executing command: ${DOWNLOADER_PROGRAM} ${CONFIGURED_DOWNLOAD_COMMAND}") - - execute_process(COMMAND "${DOWNLOADER_PROGRAM}" -ExecutionPolicy Bypass -File "${CONFIGURED_DOWNLOAD_COMMAND}" ${URL} ${dest_win_file} RESULT_VARIABLE DOWNLOAD_RESULT OUTPUT_VARIABLE out_var ERROR_VARIABLE err_var) - - - if((NOT ${DOWNLOAD_RESULT} EQUAL 0 OR NOT "${err_var}" STREQUAL "") AND FAIL_ON_ERROR) - message(STATUS "Unable to download file ${URL} msg ${DOWNLOAD_RESULT} : ${out_var} error : ${err_var}") - message(FATAL_ERROR "${DOWNLOADER_PROGRAM} ${CONFIGURED_DOWNLOAD_COMMAND}") - else() - message(STATUS "Info sucess to download file ${URL} msg ${DOWNLOAD_RESULT} : [${out_var}] error : [${err_var}]") - endif() -endfunction(download_windows_file_https URL DESTFILE FAIL_ON_ERROR) diff --git a/packages/cpp/cmake/downloader.ps1 b/packages/cpp/cmake/downloader.ps1 deleted file mode 100644 index f64b6447b..000000000 --- a/packages/cpp/cmake/downloader.ps1 +++ /dev/null @@ -1,13 +0,0 @@ -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - -$browser = New-Object System.Net.WebClient - -$browser.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials; - -$url=$args[0] - -$dest=$args[1] - -write-output "Download file [$url] to [$dest]" - -Invoke-WebRequest $url -OutFile $dest From e06c5e2cfa487092e2d38653a41a29fcdf6bef56 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 13 Sep 2023 16:56:17 +0200 Subject: [PATCH 049/344] Fixed missing checks --- packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt | 17 +++++++++-------- packages/cpp/Dependencies.cmake | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt index a9438e86f..1f14608ea 100644 --- a/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt @@ -13,14 +13,6 @@ set(PROTO_MESSAGES list(TRANSFORM PROTO_FILES PREPEND ${PROTO_FILES_DIR}/) list(TRANSFORM PROTO_MESSAGES PREPEND ${PROTO_FILES_DIR}/) -# Trouver les packages requis -if (UNIX) - find_package(Protobuf REQUIRED) -else() - find_package(Protobuf CONFIG REQUIRED) -endif() -find_package(gRPC CONFIG REQUIRED) -find_package(Threads) SET(SOURCES_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/source") SET(HEADER_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/header") @@ -32,6 +24,15 @@ file(MAKE_DIRECTORY ${PROJECT_BUILD_DIR}/proto) add_library(${PROJECT_NAME} ${PROTO_GENERATED_FILES} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES}) +# Trouver les packages requis +if (UNIX) + find_package(Protobuf REQUIRED) +else() + find_package(Protobuf CONFIG REQUIRED) +endif() +find_package(gRPC CONFIG REQUIRED) +find_package(Threads) + target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure ArmoniK.Api.Common ${PROTO_TARGET}) target_include_directories(${PROJECT_NAME} diff --git a/packages/cpp/Dependencies.cmake b/packages/cpp/Dependencies.cmake index 459e07763..36e8eabed 100644 --- a/packages/cpp/Dependencies.cmake +++ b/packages/cpp/Dependencies.cmake @@ -6,4 +6,4 @@ if(NOT DEFINED SRC_SIMDJSON) endif() if(NOT DEFINED SRC_GTEST) set(SRC_GTEST "https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip") -endif() \ No newline at end of file +endif() From bf5677714569dbe126fb201a1e937f1b41372245 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 13 Sep 2023 16:59:35 +0200 Subject: [PATCH 050/344] Fixed missing file in docker --- packages/cpp/tools/Dockerfile.worker | 1 + packages/cpp/tools/packaging/deb.Dockerfile | 1 + packages/cpp/tools/packaging/ubi7.Dockerfile | 2 ++ 3 files changed, 4 insertions(+) diff --git a/packages/cpp/tools/Dockerfile.worker b/packages/cpp/tools/Dockerfile.worker index 287dae88b..66b02ce54 100644 --- a/packages/cpp/tools/Dockerfile.worker +++ b/packages/cpp/tools/Dockerfile.worker @@ -38,6 +38,7 @@ COPY ./packages/cpp/ArmoniK.Api.Common ./ArmoniK.Api.Common COPY ./packages/cpp/ArmoniK.Api.Worker ./ArmoniK.Api.Worker COPY ./packages/cpp/ArmoniK.Api.Worker.Tests ./ArmoniK.Api.Worker.Tests COPY ./packages/cpp/CMakeLists.txt ./ +COPY ./packages/cpp/Dependencies.cmake ./ # Copy the Protocol Buffer definition files into the image WORKDIR /app/proto diff --git a/packages/cpp/tools/packaging/deb.Dockerfile b/packages/cpp/tools/packaging/deb.Dockerfile index 51b27b5c3..d18b14d03 100644 --- a/packages/cpp/tools/packaging/deb.Dockerfile +++ b/packages/cpp/tools/packaging/deb.Dockerfile @@ -17,6 +17,7 @@ COPY packages/cpp/ArmoniK.Api.Client/. ./ArmoniK.Api.Client/ COPY packages/cpp/ArmoniK.Api.Worker/. ./ArmoniK.Api.Worker/ COPY packages/cpp/CMakeLists.txt . COPY packages/cpp/Packaging.cmake . +COPY packages/cpp/Dependencies.cmake . WORKDIR /app/libarmonik/build RUN cmake -DBUILD_SHARED_LIBS=ON -DBUILD_CLIENT:BOOL=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_WORKER:BOOL=ON -DPROTO_FILES_DIR=/app/libarmonik/Protos -DCPACK_GENERATOR=DEB .. && make package -j && make clean diff --git a/packages/cpp/tools/packaging/ubi7.Dockerfile b/packages/cpp/tools/packaging/ubi7.Dockerfile index 58df393e3..a185637cd 100644 --- a/packages/cpp/tools/packaging/ubi7.Dockerfile +++ b/packages/cpp/tools/packaging/ubi7.Dockerfile @@ -28,6 +28,8 @@ COPY packages/cpp/ArmoniK.Api.Client/. ./ArmoniK.Api.Client/. COPY packages/cpp/ArmoniK.Api.Worker/. ./ArmoniK.Api.Worker/. COPY packages/cpp/CMakeLists.txt . COPY packages/cpp/Packaging.cmake . +COPY packages/cpp/Dependencies.cmake . + WORKDIR /rpm/build RUN cmake -DBUILD_SHARED_LIBS=ON -DBUILD_CLIENT:BOOL=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_WORKER:BOOL=ON -DPROTO_FILES_DIR=/rpm/Protos -DCPACK_GENERATOR=RPM -DCMAKE_PREFIX_PATH=/usr/local/grpc .. && make package -j ENTRYPOINT ["bash"] From 45d16bc657e743a9ae9701b40c2c3f03c51d42fc Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Thu, 14 Sep 2023 10:41:00 +0200 Subject: [PATCH 051/344] C++14 support --- .../cpp/ArmoniK.Api.Client/CMakeLists.txt | 1 + .../header/submitter/ResultsClient.h | 13 ++++--- .../header/submitter/SubmitterClient.h | 10 ++++-- .../source/submitter/ResultsClient.cpp | 18 ++++++---- .../source/submitter/SubmitterClient.cpp | 12 +++---- .../cpp/ArmoniK.Api.Common/CMakeLists.txt | 1 + .../header/exceptions/ArmoniKApiException.h | 10 ++++-- .../header/exceptions/ArmoniKTaskError.h | 10 ++++-- .../ArmoniKTaskNotCompletedException.h | 10 ++++-- .../ArmoniK.Api.Common/header/logger/base.h | 26 ++++++++------ .../header/logger/context.h | 10 ++++-- .../header/logger/formatter.h | 13 ++++--- .../ArmoniK.Api.Common/header/logger/fwd.h | 10 ++++-- .../ArmoniK.Api.Common/header/logger/level.h | 16 ++++++--- .../header/logger/local_logger.h | 14 +++++--- .../ArmoniK.Api.Common/header/logger/logger.h | 13 ++++--- .../ArmoniK.Api.Common/header/logger/util.h | 6 ++++ .../ArmoniK.Api.Common/header/logger/writer.h | 13 ++++--- .../header/options/ComputePlane.h | 10 ++++-- .../header/options/ControlPlane.h | 20 +++++++---- .../header/utils/Configuration.h | 17 ++++++--- .../header/utils/JsonConfiguration.h | 20 +++++++---- .../source/logger/formatter.cpp | 35 +++++++++++-------- .../source/logger/local_logger.cpp | 12 +++++-- .../source/logger/logger.cpp | 20 +++++++---- .../source/logger/writer.cpp | 14 +++++--- .../source/utils/Configuration.cpp | 24 ++++++++++--- .../source/utils/JsonConfiguration.cpp | 6 ++-- packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt | 2 +- .../source/SubmitterClientTest.cpp | 13 ++++--- .../ArmoniK.Api.Worker.Tests/CMakeLists.txt | 2 +- .../cpp/ArmoniK.Api.Worker/CMakeLists.txt | 1 + .../header/Worker/ArmoniKWorker.h | 8 +++-- .../header/Worker/ProcessStatus.h | 8 +++-- .../header/Worker/TaskHandler.h | 10 ++++-- .../header/utils/WorkerServer.h | 8 +++-- .../source/Worker/TaskHandler.cpp | 20 ++++------- packages/cpp/README.md | 2 +- 38 files changed, 306 insertions(+), 152 deletions(-) create mode 100644 packages/cpp/ArmoniK.Api.Common/header/logger/util.h diff --git a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt index f9960cac7..cc602013b 100644 --- a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt @@ -76,6 +76,7 @@ set_source_files_properties(${PROTO_GENERATED_FILES} PROPERTIES SKIP_UNITY_BUILD list(APPEND PROTO_GENERATED_FILES ${PROTO_GENERATED_MESSAGES}) target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure ArmoniK.Api.Common) +set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) setup_options(${PROJECT_NAME}) diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h index c3b3bceed..fe4a8e943 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h @@ -3,18 +3,23 @@ #include -namespace armonik::api::client { +namespace armonik { +namespace api { +namespace client { class ResultsClient { public: explicit ResultsClient(std::unique_ptr stub) : stub(std::move(stub)) {} - std::map create_results(std::string_view session_id, const std::vector &names); - void upload_result_data(const std::string &session_id, const std::string &result_id, std::string_view payload); + std::map create_results(absl::string_view session_id, + const std::vector &names); + void upload_result_data(const std::string &session_id, const std::string &result_id, absl::string_view payload); private: std::unique_ptr stub; }; -} // namespace armonik::api::client +} // namespace client +} // namespace api +} // namespace armonik #endif // ARMONIK_API_RESULTSCLIENT_H diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h index 2d50abf81..fadff0205 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h @@ -10,7 +10,9 @@ #include "submitter_common.pb.h" #include "submitter_service.grpc.pb.h" -namespace armonik::api::client { +namespace armonik { +namespace api { +namespace client { /** * @brief Data structure for task payload @@ -88,7 +90,7 @@ class SubmitterClient { * @param max_retries The maximum number of retries for submitting tasks. * @return A vector of submitted task IDs. */ - std::tuple, std::vector> + std::pair, std::vector> submit_tasks_with_dependencies(std::string session_id, armonik::api::grpc::v1::TaskOptions task_options, const std::vector &payloads_with_dependencies, [[maybe_unused]] int max_retries); @@ -104,4 +106,6 @@ class SubmitterClient { get_result_status(const std::string &session_id, const std::vector &result_ids); }; -} // namespace armonik::api::client \ No newline at end of file +} // namespace client +} // namespace api +} // namespace armonik \ No newline at end of file diff --git a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp index 9bc73e5fd..b8c3ae3c1 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp @@ -2,9 +2,11 @@ #include "exceptions/ArmoniKApiException.h" #include -namespace armonik::api::client { +namespace armonik { +namespace api { +namespace client { -std::map ResultsClient::create_results(std::string_view session_id, +std::map ResultsClient::create_results(absl::string_view session_id, const std::vector &names) { std::map mapping; ::grpc::ClientContext context; @@ -21,7 +23,7 @@ std::map ResultsClient::create_results(std::string_vie } results_request.mutable_results()->Add(results_create.begin(), results_create.end()); - *results_request.mutable_session_id() = session_id; + results_request.mutable_session_id()->assign(session_id.data(), session_id.size()); // Creates the results auto status = stub->CreateResultsMetaData(&context, results_request, &results_response); @@ -41,7 +43,7 @@ std::map ResultsClient::create_results(std::string_vie return mapping; } void ResultsClient::upload_result_data(const std::string &session_id, const std::string &result_id, - std::string_view payload) { + absl::string_view payload) { ::grpc::ClientContext context; armonik::api::grpc::v1::results::ResultsServiceConfigurationResponse configuration; auto status = stub->GetServiceConfiguration(&context, armonik::api::grpc::v1::Empty(), &configuration); @@ -64,8 +66,8 @@ void ResultsClient::upload_result_data(const std::string &session_id, const std: while (offset < payload.size()) { size_t chunkSize = std::min(maxChunkSize, payload.size() - offset); - - *request.mutable_data_chunk() = payload.substr(offset, chunkSize); + auto chunk = payload.substr(offset, chunkSize); + request.mutable_data_chunk()->assign(chunk.data(), chunk.size()); if (!stream->Write(request)) { throw armonik::api::common::exceptions::ArmoniKApiException("Unable to continue upload result"); } @@ -81,4 +83,6 @@ void ResultsClient::upload_result_data(const std::string &session_id, const std: status.error_message()); } } -} // namespace armonik::api::client \ No newline at end of file +} // namespace client +} // namespace api +} // namespace armonik \ No newline at end of file diff --git a/packages/cpp/ArmoniK.Api.Client/source/submitter/SubmitterClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/submitter/SubmitterClient.cpp index 10541b9df..f88900b06 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/submitter/SubmitterClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/submitter/SubmitterClient.cpp @@ -83,7 +83,7 @@ armonik::api::client::SubmitterClient::to_request_stream(const std::vector{std::move(create_large_task_request)}; })); for (auto task_request = task_requests.begin(); task_request != task_requests.end(); ++task_request) { @@ -200,7 +200,7 @@ armonik::api::client::SubmitterClient::create_tasks_async(std::string session_id reply.set_allocated_creation_status_list(new CreateTaskReply_CreationStatusList()); ClientContext context_client_writer; - std::unique_ptr stream(stub_->CreateLargeTasks(&context_client_writer, &reply)); + auto stream(stub_->CreateLargeTasks(&context_client_writer, &reply)); // task_chunk_stream(task_requests, ) std::vector> async_task_requests; @@ -237,7 +237,7 @@ armonik::api::client::SubmitterClient::create_tasks_async(std::string session_id * @param max_retries Maximum number of retries. * @return A vector of task IDs. */ -std::tuple, std::vector> +std::pair, std::vector> armonik::api::client::SubmitterClient::submit_tasks_with_dependencies( std::string session_id, TaskOptions task_options, const std::vector &payloads_with_dependencies, int max_retries = 5) { @@ -281,7 +281,7 @@ armonik::api::client::SubmitterClient::submit_tasks_with_dependencies( message << "Error while creating tasks ! : Error Message : " << createTaskReply.error() << std::endl; throw std::runtime_error(message.str().c_str()); } - return std::make_tuple(std::move(task_ids), std::move(failed_task_ids)); + return std::make_pair(std::move(task_ids), std::move(failed_task_ids)); } /** @@ -300,13 +300,11 @@ std::future armonik::api::client::SubmitterClient::get_result_async std::string result_data; bool dataComplete = false; while (streamingCall->Read(&reply)) { - size_t offset = result_data.size(); switch (reply.type_case()) { case ResultReply::kResult: switch (reply.result().type_case()) { case armonik::api::grpc::v1::DataChunk::kData: - result_data.resize(offset + reply.result().data().size()); - std::memcpy(result_data.data() + offset, reply.result().data().data(), reply.result().data().size()); + result_data.append(reply.result().data()); dataComplete = false; // Setting to false in case we receive stuff out of order break; case armonik::api::grpc::v1::DataChunk::kDataComplete: diff --git a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt index d639e543b..b57c565c0 100644 --- a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt @@ -71,6 +71,7 @@ add_library(${PROJECT_NAME} ${PROTO_GENERATED_FILES} ${SRC_CLIENT_FILES} ${HEADE target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure) target_compile_definitions(${PROJECT_NAME} PUBLIC FMT_HEADER_ONLY=1) +set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) setup_options(${PROJECT_NAME}) diff --git a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h index 661f78c54..a8fe30996 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h +++ b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h @@ -2,12 +2,18 @@ #define ARMONIK_API_ARMONIKAPIEXCEPTION_H #include -namespace armonik::api::common::exceptions { +namespace armonik { +namespace api { +namespace common { +namespace exceptions { class ArmoniKApiException : public std::runtime_error { public: explicit ArmoniKApiException(const std::string &message) : runtime_error(message) {} }; -} // namespace armonik::api::common::exceptions +} // namespace exceptions +} // namespace common +} // namespace api +} // namespace armonik #endif // ARMONIK_API_ARMONIKAPIEXCEPTION_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h index f0f47440b..a968074f7 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h +++ b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h @@ -5,7 +5,10 @@ #include #include #include -namespace armonik::api::common::exceptions { +namespace armonik { +namespace api { +namespace common { +namespace exceptions { class ArmoniKTaskError : public ArmoniKApiException { public: @@ -31,6 +34,9 @@ class ArmoniKTaskError : public ArmoniKApiException { std::vector> status_details; }; -} // namespace armonik::api::common::exceptions +} // namespace exceptions +} // namespace common +} // namespace api +} // namespace armonik #endif // ARMONIK_API_ARMONIKTASKERROR_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h index 43437c2d3..9b33e129b 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h +++ b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h @@ -2,7 +2,10 @@ #define ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H #include "ArmoniKApiException.h" -namespace armonik::api::common::exceptions { +namespace armonik { +namespace api { +namespace common { +namespace exceptions { class ArmoniKTaskNotCompletedException : public ArmoniKApiException { public: @@ -10,6 +13,9 @@ class ArmoniKTaskNotCompletedException : public ArmoniKApiException { : ArmoniKApiException("Task " + taskId + " not completed. " + message), taskId(taskId) {} const std::string taskId; }; -} // namespace armonik::api::common::exceptions +} // namespace exceptions +} // namespace common +} // namespace api +} // namespace armonik #endif // ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/base.h b/packages/cpp/ArmoniK.Api.Common/header/logger/base.h index 09521c480..c099bdaa8 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/base.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/base.h @@ -4,12 +4,13 @@ * @brief Logger interface */ -#include - #include "context.h" #include "level.h" -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { /** * @interface ILogger * @brief Logger interface. @@ -41,7 +42,7 @@ class ILogger { * @param message Message to log. * @param message_context Context specific for this message. */ - virtual void log(Level level, std::string_view message, const Context &message_context = {}) = 0; + virtual void log(Level level, absl::string_view message, const Context &message_context = {}) = 0; public: /** @@ -63,7 +64,7 @@ class ILogger { * @param message Message to log. * @param message_context Context specific for this message. */ - void verbose(std::string_view message, const Context &message_context = {}) { + void verbose(absl::string_view message, const Context &message_context = {}) { log(Level::Verbose, message, message_context); } /** @@ -71,7 +72,7 @@ class ILogger { * @param message Message to log. * @param message_context Context specific for this message. */ - void debug(std::string_view message, const Context &message_context = {}) { + void debug(absl::string_view message, const Context &message_context = {}) { log(Level::Debug, message, message_context); } /** @@ -79,7 +80,7 @@ class ILogger { * @param message Message to log. * @param message_context Context specific for this message. */ - void info(std::string_view message, const Context &message_context = {}) { + void info(absl::string_view message, const Context &message_context = {}) { log(Level::Info, message, message_context); } /** @@ -87,7 +88,7 @@ class ILogger { * @param message Message to log. * @param message_context Context specific for this message. */ - void warning(std::string_view message, const Context &message_context = {}) { + void warning(absl::string_view message, const Context &message_context = {}) { log(Level::Warning, message, message_context); } /** @@ -95,7 +96,7 @@ class ILogger { * @param message Message to log. * @param message_context Context specific for this message. */ - void error(std::string_view message, const Context &message_context = {}) { + void error(absl::string_view message, const Context &message_context = {}) { log(Level::Error, message, message_context); } /** @@ -103,8 +104,11 @@ class ILogger { * @param message Message to log. * @param message_context Context specific for this message. */ - void fatal(std::string_view message, const Context &message_context = {}) { + void fatal(absl::string_view message, const Context &message_context = {}) { log(Level::Fatal, message, message_context); } }; -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/context.h b/packages/cpp/ArmoniK.Api.Common/header/logger/context.h index 07cc9278d..fbce586bf 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/context.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/context.h @@ -7,7 +7,10 @@ #include #include -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { /** * @class Context * @brief Logger context. @@ -17,4 +20,7 @@ class Context : public std::map { using std::map::map; using std::map::operator=; }; -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/formatter.h b/packages/cpp/ArmoniK.Api.Common/header/logger/formatter.h index daeb69e43..03a902d2a 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/formatter.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/formatter.h @@ -5,12 +5,14 @@ */ #include -#include #include "fwd.h" #include "level.h" -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { /** * @interface IFormatter * @brief Formatter interface to use by a logger. @@ -31,7 +33,7 @@ class IFormatter { * @param message_context Context specific to this very message. * @return The formatted message. */ - virtual std::string format(Level level, std::string_view message, const Context &global_context, + virtual std::string format(Level level, absl::string_view message, const Context &global_context, const Context &local_context, const Context &message_context) = 0; }; @@ -46,4 +48,7 @@ std::unique_ptr formatter_clef(); * @return Pointer to the formatter. */ std::unique_ptr formatter_plain(bool styling = false); -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/fwd.h b/packages/cpp/ArmoniK.Api.Common/header/logger/fwd.h index cb6ce7ee3..3332c3a1a 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/fwd.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/fwd.h @@ -4,7 +4,10 @@ * @brief Forward declarations for logger classes. */ -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { class ILogger; class IFormatter; class IWriter; @@ -14,4 +17,7 @@ class Logger; class LocalLogger; enum class Level; -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/level.h b/packages/cpp/ArmoniK.Api.Common/header/logger/level.h index d087d5073..18ede9b0a 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/level.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/level.h @@ -1,12 +1,15 @@ #pragma once + +#include /** * @file level.h * @brief Logging levels. */ -#include - -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { /** * @enum Level * @brief Logging Level datatype. @@ -25,7 +28,7 @@ enum class Level { * @param level Log level to convert. * @return String view representing the log level. */ -constexpr std::string_view level_name(Level level) { +constexpr absl::string_view level_name(Level level) { switch (level) { case Level::Verbose: return "Verbose"; @@ -43,4 +46,7 @@ constexpr std::string_view level_name(Level level) { return "Unknown"; } } -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/local_logger.h b/packages/cpp/ArmoniK.Api.Common/header/logger/local_logger.h index 9f6612fad..a21e651eb 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/local_logger.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/local_logger.h @@ -4,14 +4,15 @@ * @brief Logger with a local context. */ -#include - #include "base.h" #include "context.h" #include "fwd.h" #include "level.h" -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { /** * @class LocalLogger @@ -72,6 +73,9 @@ class LocalLogger : ILogger { /** * @copydoc ILogger::log() */ - void log(Level level, std::string_view message, const Context &message_context = {}) override; + void log(Level level, absl::string_view message, const Context &message_context = {}) override; }; -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/logger.h b/packages/cpp/ArmoniK.Api.Common/header/logger/logger.h index f81d19561..f58b5af4e 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/logger.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/logger.h @@ -5,7 +5,6 @@ #include #include -#include #include "base.h" #include "context.h" @@ -13,7 +12,10 @@ #include "level.h" #include "local_logger.h" -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { /** * @brief Default Logger. */ @@ -106,6 +108,9 @@ class Logger : public ILogger { * @copydoc ILogger::log() * @details Thread-safe. */ - void log(Level level, std::string_view message, const Context &message_context = {}) override; + void log(Level level, absl::string_view message, const Context &message_context = {}) override; }; -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/util.h b/packages/cpp/ArmoniK.Api.Common/header/logger/util.h new file mode 100644 index 000000000..3256601be --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/util.h @@ -0,0 +1,6 @@ +#pragma once + +#include +#include + +const fmt::string_view to_fmt(const absl::string_view sv) { return fmt::string_view(sv.data(), sv.size()); } \ No newline at end of file diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/writer.h b/packages/cpp/ArmoniK.Api.Common/header/logger/writer.h index 7ffded2e5..79a15583f 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/writer.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/writer.h @@ -6,11 +6,13 @@ #include #include -#include #include "level.h" -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { /** * @interface IWriter * @brief Writer interface to use by a logger. @@ -27,7 +29,7 @@ class IWriter { * @param level Log level to use for this message. * @param formatted formatted message to write. */ - virtual void write(Level level, std::string_view formatted) = 0; + virtual void write(Level level, absl::string_view formatted) = 0; }; /** @@ -41,4 +43,7 @@ std::unique_ptr writer_console(); * @return Pointer to the writer. */ std::unique_ptr writer_file(std::ostream &out); -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h b/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h index f1f513d03..8466f692a 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h +++ b/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h @@ -5,7 +5,10 @@ /** * @brief The armonik namespace contains classes and functions related to the ArmoniK API. */ -namespace armonik::api::common::options { +namespace armonik { +namespace api { +namespace common { +namespace options { /** * @brief The ComputePlane class manages the communication addresses for workers and agents. */ @@ -58,4 +61,7 @@ class ComputePlane { std::string worker_address_; ///< The worker address string. std::string agent_address_; ///< The agent address string. }; -} // namespace armonik::api::common::options +} // namespace options +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h b/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h index 32f1e0af9..7a977aadc 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h +++ b/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h @@ -3,7 +3,10 @@ #include "utils/Configuration.h" -namespace armonik::api::common::options { +namespace armonik { +namespace api { +namespace common { +namespace options { class ControlPlane { public: ControlPlane(const utils::Configuration &config) { @@ -15,11 +18,11 @@ class ControlPlane { sslValidation_ = config.get(SSLValidationKey) != "disable"; } - [[nodiscard]] std::string_view getEndpoint() const { return endpoint_; } - [[nodiscard]] std::string_view getUserCertPemPath() const { return user_cert_pem_path_; } - [[nodiscard]] std::string_view getUserKeyPemPath() const { return user_key_pem_path_; } - [[nodiscard]] std::string_view getUserP12Path() const { return user_p12_path_; } - [[nodiscard]] std::string_view getCaCertPemPath() const { return ca_cert_pem_path_; } + [[nodiscard]] absl::string_view getEndpoint() const { return endpoint_; } + [[nodiscard]] absl::string_view getUserCertPemPath() const { return user_cert_pem_path_; } + [[nodiscard]] absl::string_view getUserKeyPemPath() const { return user_key_pem_path_; } + [[nodiscard]] absl::string_view getUserP12Path() const { return user_p12_path_; } + [[nodiscard]] absl::string_view getCaCertPemPath() const { return ca_cert_pem_path_; } [[nodiscard]] bool isSslValidation() const { return sslValidation_; } static constexpr char EndpointKey[] = "Grpc__EndPoint"; @@ -37,6 +40,9 @@ class ControlPlane { std::string ca_cert_pem_path_; bool sslValidation_; }; -} // namespace armonik::api::common::options +} // namespace options +} // namespace common +} // namespace api +} // namespace armonik #endif // ARMONIK_API_CONTROLPLANE_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/Configuration.h b/packages/cpp/ArmoniK.Api.Common/header/utils/Configuration.h index a5825ecd7..d5140a8cc 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/utils/Configuration.h +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/Configuration.h @@ -5,18 +5,22 @@ #pragma once +#include #include #include #include #include #include -namespace armonik::api::common::options { +namespace armonik { +namespace api { +namespace common { +namespace options { class ComputePlane; class ControlPlane; -} // namespace armonik::api::common::options +} // namespace options -namespace armonik::api::common::utils { +namespace utils { /** * @class Configuration * @brief Interface for a configuration class that stores and manages key-value pairs. @@ -61,7 +65,7 @@ class Configuration { * @param file_path Path to the JSON file. * @return Reference to the current Configuration object. */ - Configuration &add_json_configuration(std::string_view file_path); + Configuration &add_json_configuration(absl::string_view file_path); /** * @brief Add environment variable configuration. @@ -89,4 +93,7 @@ class Configuration { std::set above_env_keys_; bool use_environment_ = false; }; -} // namespace armonik::api::common::utils +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/JsonConfiguration.h b/packages/cpp/ArmoniK.Api.Common/header/utils/JsonConfiguration.h index b5adcd498..67b5c9440 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/utils/JsonConfiguration.h +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/JsonConfiguration.h @@ -5,17 +5,25 @@ */ #include "utils/Configuration.h" -namespace armonik::api::common::utils::JsonConfiguration { -void fromPath(Configuration &config, std::string_view filepath); -void fromString(Configuration &config, std::string_view json_string); -inline Configuration fromPath(std::string_view filepath) { +namespace armonik { +namespace api { +namespace common { +namespace utils { +namespace JsonConfiguration { +void fromPath(Configuration &config, absl::string_view filepath); +void fromString(Configuration &config, absl::string_view json_string); +inline Configuration fromPath(absl::string_view filepath) { Configuration config; fromPath(config, filepath); return config; } -inline Configuration fromString(std::string_view json_string) { +inline Configuration fromString(absl::string_view json_string) { Configuration config; fromString(config, json_string); return config; } -} // namespace armonik::api::common::utils::JsonConfiguration +} // namespace JsonConfiguration +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/source/logger/formatter.cpp b/packages/cpp/ArmoniK.Api.Common/source/logger/formatter.cpp index 16dcc4c79..eb2901f0a 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/logger/formatter.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/logger/formatter.cpp @@ -9,8 +9,12 @@ #include "logger/level.h" #include "logger/formatter.h" +#include "logger/util.h" -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { /** * @brief Formatter for CLEF (Compact Log Event Format) */ @@ -19,8 +23,8 @@ class ClefFormatter : public IFormatter { /** * @copydoc IFormatter::format() */ - std::string format(Level level, std::string_view message, const Context &global_context, const Context &local_context, - const Context &message_context) override { + std::string format(Level level, absl::string_view message, const Context &global_context, + const Context &local_context, const Context &message_context) override { // Buffer to store the formatted string std::string buf; auto out = std::back_inserter(buf); @@ -30,13 +34,13 @@ class ClefFormatter : public IFormatter { auto ns = std::chrono::duration_cast(time.time_since_epoch()).count() % 1'000'000'000; // Format message with timestamp and level - fmt::format_to(out, R"({{"@t": "{:%FT%T}.{:09}Z", "@mt": {:?}, "@l": {:?})", fmt::gmtime(time), ns, message, - level_name(level)); + fmt::format_to(out, R"({{"@t": "{:%FT%T}.{:09}Z", "@mt": {:?}, "@l": {:?})", fmt::gmtime(time), ns, to_fmt(message), + to_fmt(level_name(level))); // Add contexts to the formatted message for (auto context : {&global_context, &local_context, &message_context}) { - for (auto &[key, val] : *context) { - fmt::format_to(out, ", {:?}: {:?}", key, val); + for (auto &kv : *context) { + fmt::format_to(out, ", {:?}: {:?}", kv.first, kv.second); } } @@ -65,8 +69,8 @@ class PlainFormatter : public IFormatter { /** * @copydoc IFormatter::format() */ - std::string format(Level level, std::string_view message, const Context &global_context, const Context &local_context, - const Context &message_context) override { + std::string format(Level level, absl::string_view message, const Context &global_context, + const Context &local_context, const Context &message_context) override { // Buffer to store the formatted string std::string buf; auto out = std::back_inserter(buf); @@ -79,13 +83,13 @@ class PlainFormatter : public IFormatter { auto message_style = styling_ ? fmt::emphasis::bold : fmt::text_style{}; // Format message with timestamp and level - fmt::format_to(out, "{:%FT%T}.{:09}z\t[{}]\t{}", fmt::gmtime(time), ns, level_name(level), - fmt::styled(message, message_style)); + fmt::format_to(out, "{:%FT%T}.{:09}z\t[{}]\t{}", fmt::gmtime(time), ns, to_fmt(level_name(level)), + fmt::styled(to_fmt(message), message_style)); // Add contexts to the formatted message for (auto context : {&global_context, &local_context, &message_context}) { - for (auto &[key, val] : *context) { - fmt::format_to(out, "\t{}={}", key, val); + for (auto &kv : *context) { + fmt::format_to(out, "\t{}={}", kv.first, kv.second); } } @@ -98,4 +102,7 @@ std::unique_ptr formatter_plain(bool styling) { return std::make_uni // Interface destructor IFormatter::~IFormatter() = default; -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/source/logger/local_logger.cpp b/packages/cpp/ArmoniK.Api.Common/source/logger/local_logger.cpp index ac4b4acfc..c766cd139 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/logger/local_logger.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/logger/local_logger.cpp @@ -6,7 +6,10 @@ #include "logger/local_logger.h" -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { namespace { // Empty string to return when key is not found @@ -43,7 +46,7 @@ const std::string &LocalLogger::context_get(const std::string &key) const { void LocalLogger::context_remove(const std::string &key) { local_context_.erase(key); } // Write a new message to the log -void LocalLogger::log(Level level, std::string_view message, const Context &message_context) { +void LocalLogger::log(Level level, absl::string_view message, const Context &message_context) { if (level < level_) { return; } @@ -51,4 +54,7 @@ void LocalLogger::log(Level level, std::string_view message, const Context &mess auto formatted = formatter_->format(level_, message, *global_context_, local_context_, message_context); writer_->write(level_, formatted); } -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/source/logger/logger.cpp b/packages/cpp/ArmoniK.Api.Common/source/logger/logger.cpp index 4895de7cf..36cc8f242 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/logger/logger.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/logger/logger.cpp @@ -6,13 +6,16 @@ #include "logger/logger.h" -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { namespace { // Empty string to return when key is not found -static const std::string empty_string{}; +const std::string empty_string; // Empty string generator when key is not found -static const std::function empty_func = []() { return std::string(); }; +const std::function empty_func = []() { return std::string(); }; } // namespace // Construct a Logger @@ -61,15 +64,15 @@ void Logger::local_context_generator_remove(const std::string &key) { local_cont // Create a logger with a local context that references this logger LocalLogger Logger::local(Context local_context) const { // Populate local context from generator - for (auto &&[key, generator] : local_context_generator_) { - local_context[key] = generator(); + for (auto &&kg : local_context_generator_) { + local_context[kg.first] = kg.second(); } return LocalLogger(writer_.get(), formatter_.get(), &global_context_, std::move(local_context), level_); } // ILogger::log() -void Logger::log(Level level, std::string_view message, const Context &message_context) { +void Logger::log(Level level, absl::string_view message, const Context &message_context) { if (level < level_) { return; } @@ -78,4 +81,7 @@ void Logger::log(Level level, std::string_view message, const Context &message_c // Interface destructor ILogger::~ILogger() = default; -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/source/logger/writer.cpp b/packages/cpp/ArmoniK.Api.Common/source/logger/writer.cpp index 81d8b095c..70d98ade2 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/logger/writer.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/logger/writer.cpp @@ -3,7 +3,10 @@ #include "logger/writer.h" -namespace armonik::api::common::logger { +namespace armonik { +namespace api { +namespace common { +namespace logger { /** * @brief std::ostream -baked Writer @@ -25,7 +28,7 @@ class FileWriter : public IWriter { * @copydoc IWriter::write() * @details Thread-safe. */ - void write(Level, std::string_view message) override { + void write(Level, absl::string_view message) override { // Lock the writer to ensure the message is written all-at-once std::lock_guard lock_guard{mutex_}; out_ << message << std::endl; @@ -44,7 +47,7 @@ class ConsoleWriter : public IWriter { * @copydoc IWriter::write() * @details Thread-safe. */ - void write(Level level, std::string_view message) override { + void write(Level level, absl::string_view message) override { // Lock the writer to ensure the message is written all-at-once std::lock_guard lock_guard{mutex_}; (level < Level::Warning ? std::cout : std::cerr) << message << std::endl; @@ -56,4 +59,7 @@ std::unique_ptr writer_file(std::ostream &out) { return std::make_uniqu // Interface destructor IWriter::~IWriter() = default; -} // namespace armonik::api::common::logger +} // namespace logger +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp index 1a449d781..97451187f 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp @@ -4,8 +4,19 @@ #include "options/ControlPlane.h" #include "utils/JsonConfiguration.h" -namespace armonik::api::common::utils { -Configuration &Configuration::add_json_configuration(std::string_view file_path) { +constexpr char armonik::api::common::options::ControlPlane::CaCertKey[]; +constexpr char armonik::api::common::options::ControlPlane::EndpointKey[]; +constexpr char armonik::api::common::options::ControlPlane::SSLValidationKey[]; +constexpr char armonik::api::common::options::ControlPlane::UserCertKey[]; +constexpr char armonik::api::common::options::ControlPlane::UserKeyKey[]; +constexpr char armonik::api::common::options::ControlPlane::UserP12Key[]; + +namespace armonik { +namespace api { +namespace common { +namespace utils { + +Configuration &Configuration::add_json_configuration(absl::string_view file_path) { JsonConfiguration::fromPath(*this, file_path); return *this; } @@ -19,8 +30,8 @@ Configuration &Configuration::add_env_configuration() { options::ComputePlane Configuration::get_compute_plane() const { return *this; } void Configuration::set(const Configuration &other) { - for (auto &&[key, value] : other.list()) { - set(key, value); + for (auto &&kv : other.list()) { + set(kv.first, kv.second); } } void Configuration::set(const std::string &key, const std::string &value) { @@ -44,4 +55,7 @@ std::string Configuration::get(const std::string &string) const { const std::map &Configuration::list() const { return options_; } options::ControlPlane Configuration::get_control_plane() const { return *this; } -} // namespace armonik::api::common::utils +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/JsonConfiguration.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/JsonConfiguration.cpp index 61aa7149d..1ae866931 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/utils/JsonConfiguration.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/JsonConfiguration.cpp @@ -34,7 +34,7 @@ void populate(armonik::api::common::utils::Configuration &config, const std::str } void armonik::api::common::utils::JsonConfiguration::fromPath(armonik::api::common::utils::Configuration &config, - std::string_view filepath) { + absl::string_view filepath) { dom::parser parser; dom::element elem; try { @@ -45,7 +45,7 @@ void armonik::api::common::utils::JsonConfiguration::fromPath(armonik::api::comm } } void armonik::api::common::utils::JsonConfiguration::fromString(armonik::api::common::utils::Configuration &config, - std::string_view json_string) { + absl::string_view json_string) { dom::parser parser; - populate(config, "", parser.parse(padded_string(json_string))); + populate(config, "", parser.parse(padded_string(json_string.data(), json_string.size()))); } diff --git a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt index 9fa363c76..931ea3406 100644 --- a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt @@ -15,7 +15,7 @@ FILE(GLOB_RECURSE HEADER_CLIENT_FILES ${HEADER_FILES_DIR}/*.h) add_executable(${PROJECT_NAME} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES}) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17) +set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure ArmoniK.Api.Client ArmoniK.Api.Common GTest::gtest_main GTest::gmock_main) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index 857277dc2..4391d1575 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -155,8 +155,8 @@ TEST(testMock, submitTask) { } auto result_mapping = results.create_results(session_id, names); int j = 0; - for (auto &&[k, v] : result_mapping) { - names[j++] = v; + for (auto &&kv : result_mapping) { + names[j++] = kv.second; } try { @@ -169,15 +169,14 @@ TEST(testMock, submitTask) { data.dependencies = {}; payloads.push_back(data); } - const auto [task_ids, failed_task_ids] = - submitter.submit_tasks_with_dependencies(session_id, task_options, payloads, 5); - for (const auto &task_id : task_ids) { + const auto taskId_failedTaskId = submitter.submit_tasks_with_dependencies(session_id, task_options, payloads, 5); + for (const auto &task_id : taskId_failedTaskId.first) { std::stringstream out; out << "Generate task_ids : " << task_id; log.info(out.str()); } - for (const auto &failed_task_id : failed_task_ids) { + for (const auto &failed_task_id : taskId_failedTaskId.second) { std::stringstream out; out << "Failed task_ids : " << failed_task_id; log.info(out.str()); @@ -224,7 +223,7 @@ TEST(testMock, testWorker) { data.payload = "armonik"; data.dependencies = {}; payloads.push_back(data); - const auto [task_ids, failed] = submitter.submit_tasks_with_dependencies(session_id, task_options, payloads, 5); + const auto task_id_failed = submitter.submit_tasks_with_dependencies(session_id, task_options, payloads, 5); while (true) { auto status = submitter.get_result_status(session_id, {mapping[name]})[mapping[name]]; diff --git a/packages/cpp/ArmoniK.Api.Worker.Tests/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Worker.Tests/CMakeLists.txt index 7eeae3f99..af46aa18a 100644 --- a/packages/cpp/ArmoniK.Api.Worker.Tests/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Worker.Tests/CMakeLists.txt @@ -14,7 +14,7 @@ FILE(GLOB_RECURSE HEADER_CLIENT_FILES ${HEADER_FILES_DIR}/*.h) add_executable(${PROJECT_NAME} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES}) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17) +set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure ArmoniK.Api.Worker ArmoniK.Api.Common) set(PROTO_BINARY_DIR "${BUILD_DIR}/${PROJECT_NAME}/") diff --git a/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt index 1f14608ea..9f0821f53 100644 --- a/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt @@ -87,6 +87,7 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPATIBLE_INTERFACE_STRING ${PROJECT_NAME}_MAJOR_VERSION ) +set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) # generate the version file for the config file write_basic_package_version_file( diff --git a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h index c395443a6..ff06921bd 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h @@ -16,7 +16,9 @@ #include "ProcessStatus.h" #include "Worker/TaskHandler.h" -namespace armonik::api::worker { +namespace armonik { +namespace api { +namespace worker { class ArmoniKWorker : public armonik::api::grpc::v1::worker::Worker::Service { private: @@ -64,4 +66,6 @@ class ArmoniKWorker : public armonik::api::grpc::v1::worker::Worker::Service { ::armonik::api::grpc::v1::worker::HealthCheckReply *response) override; }; -} // namespace armonik::api::worker +} // namespace worker +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ProcessStatus.h b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ProcessStatus.h index 2c40fd8b7..76056e8c4 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ProcessStatus.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ProcessStatus.h @@ -4,7 +4,9 @@ #include #include -namespace armonik::api::worker { +namespace armonik { +namespace api { +namespace worker { class ProcessStatus { public: ProcessStatus() : ProcessStatus(true, "") {} @@ -34,6 +36,8 @@ class ProcessStatus { bool ok_ = true; std::string details_; }; -} // namespace armonik::api::worker +} // namespace worker +} // namespace api +} // namespace armonik #endif // ARMONIK_API_PROCESSSTATUS_H diff --git a/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h b/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h index 2732ee254..e50d753ae 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h @@ -8,7 +8,9 @@ #include "worker_common.pb.h" #include "worker_service.grpc.pb.h" -namespace armonik::api::worker { +namespace armonik { +namespace api { +namespace worker { // #include "SessionContext.h" @@ -87,7 +89,7 @@ class TaskHandler { * @param data The result data * @return A future containing a vector of ResultReply */ - std::future send_result(std::string key, std::string_view data); + std::future send_result(std::string key, absl::string_view data); /** * @brief Get the result ids object @@ -146,4 +148,6 @@ class TaskHandler { const armonik::api::grpc::v1::Configuration &getConfiguration() const; }; -} // namespace armonik::api::worker +} // namespace worker +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h b/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h index baf04120f..3ca818957 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h @@ -25,7 +25,9 @@ using namespace armonik::api::grpc::v1::agent; -namespace armonik::api::worker { +namespace armonik { +namespace api { +namespace worker { /** * @class WorkerServer * @brief Represents the worker server for ArmoniK API. @@ -87,4 +89,6 @@ class WorkerServer { instance_server->Wait(); } }; -} // namespace armonik::api::worker +} // namespace worker +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp index 2d1d75454..aa888b3c6 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp @@ -55,8 +55,8 @@ void armonik::api::worker::TaskHandler::init() { config_ = std::move(*init_request->mutable_configuration()); auto *datachunk = &init_request->payload(); - payload_.resize(datachunk->data().size()); - std::memcpy(payload_.data(), datachunk->data().data(), datachunk->data().size()); + payload_.clear(); + payload_.append(datachunk->data()); while (!datachunk->data_complete()) { if (!request_iterator_.Read(&Request)) { @@ -68,9 +68,7 @@ void armonik::api::worker::TaskHandler::init() { datachunk = &Request.compute().payload(); if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::kData) { - size_t prev_size = payload_.size(); - payload_.resize(payload_.size() + datachunk->data().size()); - std::memcpy(payload_.data() + prev_size, datachunk->data().data(), datachunk->data().size()); + payload_.append(datachunk->data()); } else if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::TYPE_NOT_SET) { throw std::runtime_error("Expected a Compute request type with a DataChunk Payload to continue the stream."); } else if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::kDataComplete) { @@ -103,9 +101,7 @@ void armonik::api::worker::TaskHandler::init() { auto chunk = dep_request.compute().data(); if (chunk.type_case() == armonik::api::grpc::v1::DataChunk::kData) { - size_t prevSize = data_dep.size(); - data_dep.resize(prevSize + chunk.data().size()); - std::memcpy(data_dep.data() + prevSize, chunk.data().data(), chunk.data().size()); + data_dep.append(chunk.data()); } else if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::TYPE_NOT_SET) { throw std::runtime_error("Expected a Compute request type with a DataChunk Payload to continue the stream."); } else if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::kDataComplete) { @@ -219,7 +215,7 @@ armonik::api::worker::TaskHandler::to_request_stream(const std::vector{std::move(create_task_request)}; })); for (auto task_request = task_requests.begin(); task_request != task_requests.end(); ++task_request) { @@ -278,7 +274,7 @@ armonik::api::worker::TaskHandler::create_tasks_async(TaskOptions task_options, * @return A future containing a vector of ResultReply */ std::future -armonik::api::worker::TaskHandler::send_result(std::string key, std::string_view data) { +armonik::api::worker::TaskHandler::send_result(std::string key, absl::string_view data) { return std::async(std::launch::async, [this, key = std::move(key), data]() mutable { ::grpc::ClientContext context_client_writer; @@ -301,9 +297,7 @@ armonik::api::worker::TaskHandler::send_result(std::string key, std::string_view armonik::api::grpc::v1::agent::Result msg; msg.set_communication_token(token_); - auto chunk = msg.mutable_data(); - chunk->mutable_data()->resize(chunkSize); - std::memcpy(chunk->mutable_data()->data(), data.data() + start, chunkSize); + msg.mutable_data()->mutable_data()->assign(data.data() + start, chunkSize); stream->Write(msg); diff --git a/packages/cpp/README.md b/packages/cpp/README.md index ac34e1f34..333572380 100644 --- a/packages/cpp/README.md +++ b/packages/cpp/README.md @@ -2,7 +2,7 @@ ## Build requirements - cmake 3.22+ -- C++ compiler with C++17 support +- C++ compiler with C++14 support - grpc 1.54 - 1.56.2 - protobuf - fmt 10.1.0 (https://github.com/fmtlib/fmt/archive/refs/tags/10.1.0.tar.gz) From b05644c4fdc436c7d1ecda6dcb773ac696354bfa Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 15 Sep 2023 12:52:05 +0200 Subject: [PATCH 052/344] Fixed some namespaces and warnings --- .../header/submitter/SubmitterClient.h | 3 +-- packages/cpp/ArmoniK.Api.Common/header/logger/util.h | 2 +- .../header/options/GrpcSocketType.h | 10 ++++++++-- .../header/utils/EnvConfiguration.h | 12 ++++++++++-- packages/cpp/ArmoniK.Api.Common/header/utils/GuuId.h | 10 ++++++++-- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h index fadff0205..5f4e7e735 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h @@ -92,8 +92,7 @@ class SubmitterClient { */ std::pair, std::vector> submit_tasks_with_dependencies(std::string session_id, armonik::api::grpc::v1::TaskOptions task_options, - const std::vector &payloads_with_dependencies, - [[maybe_unused]] int max_retries); + const std::vector &payloads_with_dependencies, int max_retries); /** * @brief Get result without streaming. diff --git a/packages/cpp/ArmoniK.Api.Common/header/logger/util.h b/packages/cpp/ArmoniK.Api.Common/header/logger/util.h index 3256601be..a2c706991 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/logger/util.h +++ b/packages/cpp/ArmoniK.Api.Common/header/logger/util.h @@ -3,4 +3,4 @@ #include #include -const fmt::string_view to_fmt(const absl::string_view sv) { return fmt::string_view(sv.data(), sv.size()); } \ No newline at end of file +fmt::string_view to_fmt(const absl::string_view sv) { return {sv.data(), sv.size()}; } diff --git a/packages/cpp/ArmoniK.Api.Common/header/options/GrpcSocketType.h b/packages/cpp/ArmoniK.Api.Common/header/options/GrpcSocketType.h index 73c7d2c30..0e5bb04eb 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/options/GrpcSocketType.h +++ b/packages/cpp/ArmoniK.Api.Common/header/options/GrpcSocketType.h @@ -4,7 +4,10 @@ * @namespace armonik::api::common::options * @brief This namespace contains common options for the armonik API. */ -namespace armonik::api::common::options { +namespace armonik { +namespace api { +namespace common { +namespace options { /** * @enum grpc_socket_type * @brief Enumerates the types of gRPC sockets supported by armonik API. @@ -13,4 +16,7 @@ enum grpc_socket_type { tcp = 1, /**< @brief TCP/IP socket type */ UnixDomainSocket = 2 /**< @brief Unix domain socket type */ }; -} // namespace armonik::api::common::options +} // namespace options +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/EnvConfiguration.h b/packages/cpp/ArmoniK.Api.Common/header/utils/EnvConfiguration.h index 67974f15b..f7c4b6898 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/utils/EnvConfiguration.h +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/EnvConfiguration.h @@ -7,11 +7,19 @@ #include "utils/Configuration.h" -namespace armonik::api::common::utils::EnvConfiguration { +namespace armonik { +namespace api { +namespace common { +namespace utils { +namespace EnvConfiguration { inline void fromEnv(Configuration &config) { config.add_env_configuration(); } inline Configuration fromEnv() { Configuration config; config.add_env_configuration(); return config; } -} // namespace armonik::api::common::utils::EnvConfiguration +} // namespace EnvConfiguration +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/GuuId.h b/packages/cpp/ArmoniK.Api.Common/header/utils/GuuId.h index ada30259d..f4abb4ee4 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/utils/GuuId.h +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/GuuId.h @@ -12,7 +12,10 @@ /** * @brief The armonik::api::common::utils namespace provides utility classes and functions for the ArmoniK API. */ -namespace armonik::api::common::utils { +namespace armonik { +namespace api { +namespace common { +namespace utils { /** * @class GuuId * @brief The GuuId class provides a static method for generating UUIDs. @@ -44,4 +47,7 @@ class GuuId { return uuid; } }; -} // namespace armonik::api::common::utils +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik From de4eafaf2b75f84b3e557ce634b8f5c1b03ddebb Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 15 Sep 2023 13:13:26 +0200 Subject: [PATCH 053/344] Added PR suggestions --- .../header/submitter/ResultsClient.h | 50 ++--- .../header/submitter/SubmitterClient.h | 2 +- .../source/submitter/ResultsClient.cpp | 174 +++++++++--------- .../header/exceptions/ArmoniKApiException.h | 38 ++-- .../header/exceptions/ArmoniKTaskError.h | 84 ++++----- .../ArmoniKTaskNotCompletedException.h | 42 ++--- .../source/Worker/TaskHandler.cpp | 2 +- 7 files changed, 195 insertions(+), 197 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h index fe4a8e943..93b07631d 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h @@ -1,25 +1,25 @@ -#ifndef ARMONIK_API_RESULTSCLIENT_H -#define ARMONIK_API_RESULTSCLIENT_H - -#include - -namespace armonik { -namespace api { -namespace client { -class ResultsClient { -public: - explicit ResultsClient(std::unique_ptr stub) - : stub(std::move(stub)) {} - - std::map create_results(absl::string_view session_id, - const std::vector &names); - void upload_result_data(const std::string &session_id, const std::string &result_id, absl::string_view payload); - -private: - std::unique_ptr stub; -}; -} // namespace client -} // namespace api -} // namespace armonik - -#endif // ARMONIK_API_RESULTSCLIENT_H +#ifndef ARMONIK_API_RESULTSCLIENT_H +#define ARMONIK_API_RESULTSCLIENT_H + +#include + +namespace armonik { +namespace api { +namespace client { +class ResultsClient { +public: + explicit ResultsClient(std::unique_ptr stub) + : stub(std::move(stub)) {} + + std::map create_results(absl::string_view session_id, + const std::vector &names); + void upload_result_data(const std::string &session_id, const std::string &result_id, absl::string_view payload); + +private: + std::unique_ptr stub; +}; +} // namespace client +} // namespace api +} // namespace armonik + +#endif // ARMONIK_API_RESULTSCLIENT_H diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h index 5f4e7e735..9eefa6857 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h @@ -107,4 +107,4 @@ class SubmitterClient { } // namespace client } // namespace api -} // namespace armonik \ No newline at end of file +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp index b8c3ae3c1..ad354fdd2 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp @@ -1,88 +1,86 @@ -#include "submitter/ResultsClient.h" -#include "exceptions/ArmoniKApiException.h" -#include - -namespace armonik { -namespace api { -namespace client { - -std::map ResultsClient::create_results(absl::string_view session_id, - const std::vector &names) { - std::map mapping; - ::grpc::ClientContext context; - armonik::api::grpc::v1::results::CreateResultsMetaDataRequest results_request; - armonik::api::grpc::v1::results::CreateResultsMetaDataResponse results_response; - - // Creates the result creation requests - std::vector results_create; - results_create.reserve(names.size()); - for (auto &&name : names) { - armonik::api::grpc::v1::results::CreateResultsMetaDataRequest_ResultCreate result_create; - result_create.set_name(name); - results_create.push_back(result_create); - } - - results_request.mutable_results()->Add(results_create.begin(), results_create.end()); - results_request.mutable_session_id()->assign(session_id.data(), session_id.size()); - - // Creates the results - auto status = stub->CreateResultsMetaData(&context, results_request, &results_response); - - if (!status.ok()) { - std::stringstream message; - message << "Error: " << status.error_code() << ": " << status.error_message() - << ". details : " << status.error_details() << std::endl; - auto str = message.str(); - std::cerr << "Could not create results for submit: " << str << std::endl; - throw armonik::api::common::exceptions::ArmoniKApiException(str); - } - - for (auto &&res : results_response.results()) { - mapping.insert({res.name(), res.result_id()}); - } - return mapping; -} -void ResultsClient::upload_result_data(const std::string &session_id, const std::string &result_id, - absl::string_view payload) { - ::grpc::ClientContext context; - armonik::api::grpc::v1::results::ResultsServiceConfigurationResponse configuration; - auto status = stub->GetServiceConfiguration(&context, armonik::api::grpc::v1::Empty(), &configuration); - if (!status.ok()) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to get result configuration : " + - status.error_message()); - } - - size_t maxChunkSize = configuration.data_chunk_max_size(); - - armonik::api::grpc::v1::results::UploadResultDataResponse response; - // response.set_allocated_result(new armonik::api::grpc::v1::results::ResultRaw()); - ::grpc::ClientContext streamContext; - auto stream = stub->UploadResultData(&streamContext, &response); - armonik::api::grpc::v1::results::UploadResultDataRequest request; - request.mutable_id()->set_session_id(session_id); - request.mutable_id()->set_result_id(result_id); - stream->Write(request); - size_t offset = 0; - - while (offset < payload.size()) { - size_t chunkSize = std::min(maxChunkSize, payload.size() - offset); - auto chunk = payload.substr(offset, chunkSize); - request.mutable_data_chunk()->assign(chunk.data(), chunk.size()); - if (!stream->Write(request)) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to continue upload result"); - } - offset += chunkSize; - } - - if (!stream->WritesDone()) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to upload result"); - } - status = stream->Finish(); - if (!status.ok()) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to finish upload result " + - status.error_message()); - } -} -} // namespace client -} // namespace api -} // namespace armonik \ No newline at end of file +#include "submitter/ResultsClient.h" +#include "exceptions/ArmoniKApiException.h" +#include + +namespace armonik { +namespace api { +namespace client { + +std::map ResultsClient::create_results(absl::string_view session_id, + const std::vector &names) { + std::map mapping; + ::grpc::ClientContext context; + armonik::api::grpc::v1::results::CreateResultsMetaDataRequest results_request; + armonik::api::grpc::v1::results::CreateResultsMetaDataResponse results_response; + + // Creates the result creation requests + std::vector results_create; + results_create.reserve(names.size()); + for (auto &&name : names) { + armonik::api::grpc::v1::results::CreateResultsMetaDataRequest_ResultCreate result_create; + result_create.set_name(name); + results_create.push_back(result_create); + } + + results_request.mutable_results()->Add(results_create.begin(), results_create.end()); + results_request.mutable_session_id()->assign(session_id.data(), session_id.size()); + + // Creates the results + auto status = stub->CreateResultsMetaData(&context, results_request, &results_response); + + if (!status.ok()) { + std::stringstream message; + message << "Error: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + std::cerr << "Could not create results for submit: " << str << std::endl; + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + for (auto &&res : results_response.results()) { + mapping.insert({res.name(), res.result_id()}); + } + return mapping; +} +void ResultsClient::upload_result_data(const std::string &session_id, const std::string &result_id, + absl::string_view payload) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::results::ResultsServiceConfigurationResponse configuration; + auto status = stub->GetServiceConfiguration(&context, armonik::api::grpc::v1::Empty(), &configuration); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to get result configuration : " + + status.error_message()); + } + + size_t maxChunkSize = configuration.data_chunk_max_size(); + + armonik::api::grpc::v1::results::UploadResultDataResponse response; + // response.set_allocated_result(new armonik::api::grpc::v1::results::ResultRaw()); + ::grpc::ClientContext streamContext; + auto stream = stub->UploadResultData(&streamContext, &response); + armonik::api::grpc::v1::results::UploadResultDataRequest request; + request.mutable_id()->set_session_id(session_id); + request.mutable_id()->set_result_id(result_id); + stream->Write(request); + + while (!payload.empty()) { + auto chunk = payload.substr(0, maxChunkSize); + request.mutable_data_chunk()->assign(chunk.data(), chunk.size()); + if (!stream->Write(request)) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to continue upload result"); + } + payload = payload.substr(maxChunkSize); + } + + if (!stream->WritesDone()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to upload result"); + } + status = stream->Finish(); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to finish upload result " + + status.error_message()); + } +} +} // namespace client +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h index a8fe30996..d26fe9a3d 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h +++ b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKApiException.h @@ -1,19 +1,19 @@ -#ifndef ARMONIK_API_ARMONIKAPIEXCEPTION_H -#define ARMONIK_API_ARMONIKAPIEXCEPTION_H - -#include -namespace armonik { -namespace api { -namespace common { -namespace exceptions { - -class ArmoniKApiException : public std::runtime_error { -public: - explicit ArmoniKApiException(const std::string &message) : runtime_error(message) {} -}; -} // namespace exceptions -} // namespace common -} // namespace api -} // namespace armonik - -#endif // ARMONIK_API_ARMONIKAPIEXCEPTION_H +#ifndef ARMONIK_API_ARMONIKAPIEXCEPTION_H +#define ARMONIK_API_ARMONIKAPIEXCEPTION_H + +#include +namespace armonik { +namespace api { +namespace common { +namespace exceptions { + +class ArmoniKApiException : public std::runtime_error { +public: + explicit ArmoniKApiException(const std::string &message) : runtime_error(message) {} +}; +} // namespace exceptions +} // namespace common +} // namespace api +} // namespace armonik + +#endif // ARMONIK_API_ARMONIKAPIEXCEPTION_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h index a968074f7..5118cf15f 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h +++ b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskError.h @@ -1,42 +1,42 @@ -#ifndef ARMONIK_API_ARMONIKTASKERROR_H -#define ARMONIK_API_ARMONIKTASKERROR_H - -#include "ArmoniKApiException.h" -#include -#include -#include -namespace armonik { -namespace api { -namespace common { -namespace exceptions { - -class ArmoniKTaskError : public ArmoniKApiException { -public: - explicit ArmoniKTaskError(const std::string &message, const armonik::api::grpc::v1::TaskError &task_error) - : ArmoniKApiException(message) { - std::stringstream ss; - ss << "TaskId : " << task_error.task_id() << " Errors : "; - for (auto &&e : task_error.errors()) { - std::string status = armonik::api::grpc::v1::task_status::TaskStatus_Name(e.task_status()); - status_details.emplace_back(status, e.detail()); - ss << '\n' << status << " : " << e.detail(); - } - details = std::string(ArmoniKApiException::what()) + " : " + ss.str(); - taskId_ = task_error.task_id(); - } - [[nodiscard]] const char *what() const noexcept override { return details.c_str(); } - const std::string &taskId() { return taskId_; } - const std::vector> &error_details() { return status_details; } - -private: - std::string details; - std::string taskId_; - std::vector> status_details; -}; - -} // namespace exceptions -} // namespace common -} // namespace api -} // namespace armonik - -#endif // ARMONIK_API_ARMONIKTASKERROR_H +#ifndef ARMONIK_API_ARMONIKTASKERROR_H +#define ARMONIK_API_ARMONIKTASKERROR_H + +#include "ArmoniKApiException.h" +#include +#include +#include +namespace armonik { +namespace api { +namespace common { +namespace exceptions { + +class ArmoniKTaskError : public ArmoniKApiException { +public: + explicit ArmoniKTaskError(const std::string &message, const armonik::api::grpc::v1::TaskError &task_error) + : ArmoniKApiException(message) { + std::stringstream ss; + ss << "TaskId : " << task_error.task_id() << " Errors : "; + for (auto &&e : task_error.errors()) { + std::string status = armonik::api::grpc::v1::task_status::TaskStatus_Name(e.task_status()); + status_details.emplace_back(status, e.detail()); + ss << '\n' << status << " : " << e.detail(); + } + details = std::string(ArmoniKApiException::what()) + " : " + ss.str(); + taskId_ = task_error.task_id(); + } + [[nodiscard]] const char *what() const noexcept override { return details.c_str(); } + const std::string &taskId() { return taskId_; } + const std::vector> &error_details() { return status_details; } + +private: + std::string details; + std::string taskId_; + std::vector> status_details; +}; + +} // namespace exceptions +} // namespace common +} // namespace api +} // namespace armonik + +#endif // ARMONIK_API_ARMONIKTASKERROR_H diff --git a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h index 9b33e129b..800a6ceeb 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h +++ b/packages/cpp/ArmoniK.Api.Common/header/exceptions/ArmoniKTaskNotCompletedException.h @@ -1,21 +1,21 @@ -#ifndef ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H -#define ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H - -#include "ArmoniKApiException.h" -namespace armonik { -namespace api { -namespace common { -namespace exceptions { - -class ArmoniKTaskNotCompletedException : public ArmoniKApiException { -public: - explicit ArmoniKTaskNotCompletedException(const std::string &taskId, const std::string &message = "") - : ArmoniKApiException("Task " + taskId + " not completed. " + message), taskId(taskId) {} - const std::string taskId; -}; -} // namespace exceptions -} // namespace common -} // namespace api -} // namespace armonik - -#endif // ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H +#ifndef ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H +#define ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H + +#include "ArmoniKApiException.h" +namespace armonik { +namespace api { +namespace common { +namespace exceptions { + +class ArmoniKTaskNotCompletedException : public ArmoniKApiException { +public: + explicit ArmoniKTaskNotCompletedException(const std::string &taskId, const std::string &message = "") + : ArmoniKApiException("Task " + taskId + " not completed. " + message), taskId(taskId) {} + const std::string taskId; +}; +} // namespace exceptions +} // namespace common +} // namespace api +} // namespace armonik + +#endif // ARMONIK_API_ARMONIKTASKNOTCOMPLETEDEXCEPTION_H diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp index aa888b3c6..8b2820d92 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp @@ -55,7 +55,7 @@ void armonik::api::worker::TaskHandler::init() { config_ = std::move(*init_request->mutable_configuration()); auto *datachunk = &init_request->payload(); - payload_.clear(); + assert(payload_.empty()); payload_.append(datachunk->data()); while (!datachunk->data_complete()) { From 167623127c4c9ccb3a13f93c37bcc55d4fc5d99f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Fri, 15 Sep 2023 18:55:32 +0200 Subject: [PATCH 054/344] feat: send data between agent and worker through files instead of stream-based requests --- Protos/V1/agent_common.proto | 64 +- Protos/V1/agent_service.proto | 33 +- Protos/V1/worker_common.proto | 34 +- Protos/V1/worker_service.proto | 2 +- .../csharp/ArmoniK.Api.Mock/Services/Agent.cs | 113 ++-- .../ArmoniK.Api.Tests/TaskHandlerTest.cs | 560 +++--------------- .../ArmoniK.Api.Worker/Worker/ITaskHandler.cs | 16 +- .../ArmoniK.Api.Worker/Worker/TaskHandler.cs | 437 +++++--------- .../Worker/WorkerStreamWrapper.cs | 17 +- 9 files changed, 315 insertions(+), 961 deletions(-) diff --git a/Protos/V1/agent_common.proto b/Protos/V1/agent_common.proto index 0a35ea048..520e399eb 100644 --- a/Protos/V1/agent_common.proto +++ b/Protos/V1/agent_common.proto @@ -47,41 +47,17 @@ message CreateTaskReply { string communication_token = 4; /** Communication token received by the worker during task processing */ } +// Request to retrieve data message DataRequest { string communication_token = 1; /** Communication token received by the worker during task processing */ - string key = 2; + // Id of the result that will be retrieved + string result_id = 2; } -message DataReply { - message Init { - string key = 1; - oneof has_result { - DataChunk data = 2; - string error = 3; - } - } - string communication_token = 1; /** Communication token received by the worker during task processing */ - oneof type { - Init init = 2; - DataChunk data = 3; - string error = 4; - } -} - -message Result { - oneof type { - InitKeyedDataStream init = 1; - DataChunk data = 2; - } - string communication_token = 3; /** Communication token received by the worker during task processing */ -} - -message ResultReply { - string communication_token = 3; /** Communication token received by the worker during task processing */ - oneof type { - Empty Ok = 1; - string Error = 2; - } +// Response when data is available in the shared folder +message DataResponse { + // Id of the result that will be retrieved + string result_id = 2; } /* @@ -156,7 +132,7 @@ message SubmitTasksResponse { } /* -* Request for creating results without data +* Request for creating results with data */ message CreateResultsRequest { /** @@ -180,11 +156,9 @@ message CreateResultsResponse { } /* -* Request for uploading results data through stream. -* Data must be sent in multiple chunks. -* Only one result can be uploaded. +* Request for notifying results data are available in files. */ -message UploadResultDataRequest { +message NotifyResultDataRequest { /** * The metadata to identify the result to update. */ @@ -195,23 +169,15 @@ message UploadResultDataRequest { /** * The possible messages that constitute a UploadResultDataRequest - * They should be sent in the following order: - * - id - * - data_chunk (stream can have multiple data_chunk messages that represent data divided in several parts) - * - * Data chunk cannot exceed the size returned by the GetServiceConfiguration rpc method */ - oneof type { - ResultIdentifier id = 1; /** The identifier of the result to which add data. */ - bytes data_chunk = 2; /** A chunk of data. */ - } + repeated ResultIdentifier ids = 1; /** The identifier of the result to which add data. */ string communication_token = 4; /** Communication token received by the worker during task processing */ } /* -* Response for uploading data with stream for result +* Response for notifying data file availability for result +* Received when data are successfully copied to the ObjectStorage */ -message UploadResultDataResponse { - string result_id = 1; /** The Id of the result to which data were added */ - string communication_token = 2; /** Communication token received by the worker during task processing */ +message NotifyResultDataResponse { + repeated string result_ids = 1; /** The Id of the result to which data were added */ } diff --git a/Protos/V1/agent_service.proto b/Protos/V1/agent_service.proto index 7badffc2b..739396d2e 100644 --- a/Protos/V1/agent_service.proto +++ b/Protos/V1/agent_service.proto @@ -7,6 +7,8 @@ import "agent_common.proto"; option csharp_namespace = "ArmoniK.Api.gRPC.V1.Agent"; service Agent { + rpc CreateTask(stream CreateTaskRequest) returns (CreateTaskReply); + /** * Create the metadata of multiple results at once * Data have to be uploaded separately @@ -19,18 +21,35 @@ service Agent { rpc CreateResults(CreateResultsRequest) returns (CreateResultsResponse) {} /** - * Upload data for result with stream + * Notify Agent that a data file representing the Result to upload is available in the shared folder + * The name of the file should be the result id + * Blocks until data are stored in Object Storage */ - rpc UploadResultData(stream UploadResultDataRequest) returns (UploadResultDataResponse) {} + rpc NotifyResultData(NotifyResultDataRequest) returns (NotifyResultDataResponse) {} /** * Create tasks metadata and submit task for processing. */ rpc SubmitTasks(SubmitTasksRequest) returns (SubmitTasksResponse) {} - rpc CreateTask(stream CreateTaskRequest) returns (CreateTaskReply); - rpc GetResourceData(DataRequest) returns (stream DataReply); - rpc GetCommonData(DataRequest) returns (stream DataReply); - rpc GetDirectData(DataRequest) returns (stream DataReply); - rpc SendResult(stream Result) returns (ResultReply); + /** + * Retrieve Resource Data from the Agent + * Data is stored in the shared folder between Agent and Worker as a file with the result id as name + * Blocks until data are available in the shared folder + */ + rpc GetResourceData(DataRequest) returns (DataResponse); + + /** + * Retrieve Resource Data from the Agent + * Data is stored in the shared folder between Agent and Worker as a file with the result id as name + * Blocks until data are available in the shared folder + */ + rpc GetCommonData(DataRequest) returns (DataResponse); + + /** + * Retrieve Resource Data from the Agent + * Data is stored in the shared folder between Agent and Worker as a file with the result id as name + * Blocks until data are available in the shared folder + */ + rpc GetDirectData(DataRequest) returns (DataResponse); } diff --git a/Protos/V1/worker_common.proto b/Protos/V1/worker_common.proto index a4a704040..9ac8469e9 100644 --- a/Protos/V1/worker_common.proto +++ b/Protos/V1/worker_common.proto @@ -7,35 +7,19 @@ import "objects.proto"; option csharp_namespace = "ArmoniK.Api.gRPC.V1.Worker"; message ProcessRequest { - message ComputeRequest { - message InitRequest { - Configuration configuration = 1; - string session_id = 2; - string task_id = 3; - TaskOptions task_options = 4; - repeated string expected_output_keys = 5; - DataChunk payload = 6; - } - message InitData { - oneof type { - string key = 1; - bool last_data = 2; - } - } - oneof type { - InitRequest init_request = 1; - DataChunk payload = 2; - InitData init_data = 3; - DataChunk data = 4; - } - } string communication_token = 1; - ComputeRequest compute = 2; + string session_id = 2; + string task_id = 3; + TaskOptions task_options = 4; + repeated string expected_output_keys = 5; + string payload_id = 6; + repeated string data_dependencies = 7; + string data_folder = 8; + Configuration configuration = 9; } message ProcessReply { - string communication_token = 1; - Output output = 2; + Output output = 1; } message HealthCheckReply { diff --git a/Protos/V1/worker_service.proto b/Protos/V1/worker_service.proto index 31465afce..2a5a3fb1f 100644 --- a/Protos/V1/worker_service.proto +++ b/Protos/V1/worker_service.proto @@ -8,6 +8,6 @@ import "worker_common.proto"; option csharp_namespace = "ArmoniK.Api.gRPC.V1.Worker"; service Worker { - rpc Process(stream ProcessRequest) returns (ProcessReply); + rpc Process(ProcessRequest) returns (ProcessReply); rpc HealthCheck(Empty) returns (HealthCheckReply); } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs index 14c59c69d..22075a27c 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Agent.cs @@ -14,9 +14,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Linq; using System.Threading.Tasks; -using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Agent; using Grpc.Core; @@ -36,63 +36,6 @@ public override Task CreateTask(IAsyncStreamReader - [Count] - public override async Task GetCommonData(DataRequest request, - IServerStreamWriter responseStream, - ServerCallContext context) - => await responseStream.WriteAsync(new DataReply - { - Data = new DataChunk - { - DataComplete = true, - }, - }) - .ConfigureAwait(false); - - /// - [Count] - public override async Task GetDirectData(DataRequest request, - IServerStreamWriter responseStream, - ServerCallContext context) - => await responseStream.WriteAsync(new DataReply - { - Data = new DataChunk - { - DataComplete = true, - }, - }) - .ConfigureAwait(false); - - /// - [Count] - public override async Task GetResourceData(DataRequest request, - IServerStreamWriter responseStream, - ServerCallContext context) - => await responseStream.WriteAsync(new DataReply - { - Data = new DataChunk - { - DataComplete = true, - }, - }) - .ConfigureAwait(false); - - /// - [Count] - public override async Task SendResult(IAsyncStreamReader requestStream, - ServerCallContext context) - { - await foreach (var _ in requestStream.ReadAllAsync()) - { - } - - return new ResultReply - { - Ok = new Empty(), - }; - } - /// [Count] public override Task CreateResultsMetaData(CreateResultsMetaDataRequest request, @@ -111,21 +54,6 @@ public override Task SubmitTasks(SubmitTasksRequest request CommunicationToken = request.CommunicationToken, }); - /// - [Count] - public override async Task UploadResultData(IAsyncStreamReader requestStream, - ServerCallContext context) - { - await foreach (var _ in requestStream.ReadAllAsync()) - { - } - - return new UploadResultDataResponse - { - ResultId = "result-id", - CommunicationToken = "communication-token", - }; - } /// [Count] @@ -135,4 +63,43 @@ public override Task CreateResults(CreateResultsRequest r { CommunicationToken = request.CommunicationToken, }); + + /// + [Count] + public override Task GetCommonData(DataRequest request, + ServerCallContext context) + => Task.FromResult(new DataResponse + { + ResultId = request.ResultId, + }); + + /// + [Count] + public override Task GetDirectData(DataRequest request, + ServerCallContext context) + => Task.FromResult(new DataResponse + { + ResultId = request.ResultId, + }); + + /// + [Count] + public override Task GetResourceData(DataRequest request, + ServerCallContext context) + => Task.FromResult(new DataResponse + { + ResultId = request.ResultId, + }); + + /// + [Count] + public override Task NotifyResultData(NotifyResultDataRequest request, + ServerCallContext context) + => Task.FromResult(new NotifyResultDataResponse + { + ResultIds = + { + request.Ids.Select(identifier => identifier.ResultId), + }, + }); } diff --git a/packages/csharp/ArmoniK.Api.Tests/TaskHandlerTest.cs b/packages/csharp/ArmoniK.Api.Tests/TaskHandlerTest.cs index da55dd12d..af4ff1992 100644 --- a/packages/csharp/ArmoniK.Api.Tests/TaskHandlerTest.cs +++ b/packages/csharp/ArmoniK.Api.Tests/TaskHandlerTest.cs @@ -25,6 +25,7 @@ using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading; @@ -35,8 +36,6 @@ using ArmoniK.Api.gRPC.V1.Worker; using ArmoniK.Api.Worker.Worker; -using Google.Protobuf; - using Grpc.Core; using Microsoft.Extensions.Logging; @@ -48,32 +47,6 @@ namespace ArmoniK.Api.Worker.Tests; [TestFixture] public class TaskHandlerTest { - [SetUp] - public void SetUp() - { - } - - [TearDown] - public virtual void TearDown() - { - } - - private class MyAsyncStreamReader : IAsyncStreamReader - { - private readonly IAsyncEnumerator asyncEnumerator_; - - public MyAsyncStreamReader(IEnumerable requests) - => asyncEnumerator_ = requests.ToAsyncEnumerable() - .GetAsyncEnumerator(); - - public async Task MoveNext(CancellationToken cancellationToken) - => await asyncEnumerator_.MoveNextAsync(cancellationToken) - .ConfigureAwait(false); - - public ProcessRequest Current - => asyncEnumerator_.Current; - } - private class MyClientStreamWriter : IClientStreamWriter { public readonly ConcurrentBag Messages = new(); @@ -104,26 +77,8 @@ public Task CompleteAsync() private class MyAgent : Agent.AgentClient { - private readonly MyClientStreamWriter resultStream_; - private readonly MyClientStreamWriter taskStream_; - - public MyAgent() - { - resultStream_ = new MyClientStreamWriter(); - taskStream_ = new MyClientStreamWriter(); - } + private readonly MyClientStreamWriter taskStream_ = new(); - public override AsyncClientStreamingCall SendResult(Metadata headers = null, - DateTime? deadline = null, - CancellationToken cancellationToken = default) - => new(resultStream_, - Task.FromResult(new ResultReply()), - Task.FromResult(new Metadata()), - () => Status.DefaultSuccess, - () => new Metadata(), - () => - { - }); public override AsyncClientStreamingCall CreateTask(Metadata headers = null, DateTime? deadline = null, @@ -137,9 +92,6 @@ public override AsyncClientStreamingCall Cre { }); - public List GetResults() - => resultStream_.Messages.ToList(); - public List GetTaskRequests() => taskStream_.Messages.ToList(); } @@ -147,452 +99,96 @@ public List GetTaskRequests() [Test] [TestCaseSource(typeof(TaskHandlerTest), - nameof(TaskHandlerCreateShouldThrowTestCases))] - public void TaskHandlerCreateShouldThrow(IEnumerable requests) + nameof(InvalidRequests))] + public void NewTaskHandlerShouldThrow(ProcessRequest request) { - var stream = new MyAsyncStreamReader(requests); - var agent = new MyAgent(); - Assert.ThrowsAsync(async () => await TaskHandler.Create(stream, - agent, - new LoggerFactory(), - CancellationToken.None) - .ConfigureAwait(false)); + Assert.Throws(() => new TaskHandler(request, + agent, + new LoggerFactory(), + CancellationToken.None)); } - [Test] - [TestCaseSource(typeof(TaskHandlerTest), - nameof(TaskHandlerCreateShouldSucceedTestCases))] - public async Task TaskHandlerCreateShouldSucceed(IEnumerable requests) + public static IEnumerable InvalidRequests { - var stream = new MyAsyncStreamReader(requests); - - var agent = new MyAgent(); - - var taskHandler = await TaskHandler.Create(stream, - agent, - new LoggerFactory(), - CancellationToken.None) - .ConfigureAwait(false); - - Assert.NotNull(taskHandler.Token); - Assert.IsNotEmpty(taskHandler.Token); - Assert.IsNotEmpty(taskHandler.Payload); - Assert.IsNotEmpty(taskHandler.SessionId); - Assert.IsNotEmpty(taskHandler.TaskId); + get { yield return new TestCaseData(new ProcessRequest()).SetArgDisplayNames("Empty request"); } } [Test] - public async Task CheckTaskHandlerDataAreCorrect() + public async Task NewTaskHandlerShouldSucceed() { - var stream = new MyAsyncStreamReader(WorkingRequest1); - var agent = new MyAgent(); - var taskHandler = await TaskHandler.Create(stream, - agent, - new LoggerFactory(), - CancellationToken.None) - .ConfigureAwait(false); - - Assert.IsNotEmpty(taskHandler.Payload); - Assert.AreEqual("testPayload1Payload2", - ByteString.CopyFrom(taskHandler.Payload) - .ToStringUtf8()); - Assert.AreEqual(2, - taskHandler.DataDependencies.Count); - Assert.AreEqual("Data1Data2", - ByteString.CopyFrom(taskHandler.DataDependencies.Values.First()) - .ToStringUtf8()); - Assert.AreEqual("Data1Data2Data2Data2", - ByteString.CopyFrom(taskHandler.DataDependencies.Values.Last()) - .ToStringUtf8()); - Assert.AreEqual("TaskId", - taskHandler.TaskId); - Assert.AreEqual("SessionId", - taskHandler.SessionId); - Assert.AreEqual("Token", - taskHandler.Token); - - await taskHandler.SendResult("test", - Encoding.ASCII.GetBytes("TestData")); - - var results = agent.GetResults(); - foreach (var r in results) - { - Console.WriteLine(r); - } - - Assert.AreEqual(4, - results.Count); - - Assert.AreEqual(Result.TypeOneofCase.Init, - results[0] - .TypeCase); - Assert.AreEqual(true, - results[0] - .Init.LastResult); - - Assert.AreEqual(Result.TypeOneofCase.Data, - results[1] - .TypeCase); - Assert.AreEqual(true, - results[1] - .Data.DataComplete); - - Assert.AreEqual(Result.TypeOneofCase.Data, - results[2] - .TypeCase); - Assert.AreEqual("TestData", - results[2] - .Data.Data); - - Assert.AreEqual(Result.TypeOneofCase.Init, - results[3] - .TypeCase); - Assert.AreEqual("test", - results[3] - .Init.Key); - - - await taskHandler.CreateTasksAsync(new List - { - new() - { - Payload = ByteString.CopyFromUtf8("Payload"), - DataDependencies = - { - "DD", - }, - ExpectedOutputKeys = - { - "EOK", - }, - }, - }); - - var tasks = agent.GetTaskRequests(); - Console.WriteLine(); - foreach (var t in tasks) - { - Console.WriteLine(t); - } - - Assert.AreEqual(5, - tasks.Count); - - Assert.AreEqual(CreateTaskRequest.TypeOneofCase.InitTask, - tasks[0] - .TypeCase); - Assert.AreEqual(true, - tasks[0] - .InitTask.LastTask); - - Assert.AreEqual(CreateTaskRequest.TypeOneofCase.TaskPayload, - tasks[1] - .TypeCase); - Assert.AreEqual(true, - tasks[1] - .TaskPayload.DataComplete); - - Assert.AreEqual(CreateTaskRequest.TypeOneofCase.TaskPayload, - tasks[2] - .TypeCase); - Assert.AreEqual("Payload", - tasks[2] - .TaskPayload.Data); - - Assert.AreEqual(CreateTaskRequest.TypeOneofCase.InitTask, - tasks[3] - .TypeCase); - Assert.AreEqual("DD", - tasks[3] - .InitTask.Header.DataDependencies.Single()); - Assert.AreEqual("EOK", - tasks[3] - .InitTask.Header.ExpectedOutputKeys.Single()); - - Assert.AreEqual(CreateTaskRequest.TypeOneofCase.InitRequest, - tasks[4] - .TypeCase); - } - - private static readonly ProcessRequest InitData1 = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - InitData = new ProcessRequest.Types.ComputeRequest.Types.InitData - { - Key = "DataKey1", - }, - }, - }; - - private static readonly ProcessRequest InitData2 = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - InitData = new ProcessRequest.Types.ComputeRequest.Types.InitData - { - Key = "DataKey2", - }, - }, - }; - - private static readonly ProcessRequest LastDataTrue = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - InitData = new ProcessRequest.Types.ComputeRequest.Types.InitData - { - LastData = true, - }, - }, - }; - - private static readonly ProcessRequest LastDataFalse = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - InitData = new ProcessRequest.Types.ComputeRequest.Types.InitData - { - LastData = false, - }, - }, - }; - - private static readonly ProcessRequest InitRequestPayload = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - InitRequest = new ProcessRequest.Types.ComputeRequest.Types.InitRequest - { - Payload = new DataChunk - { - Data = ByteString.CopyFromUtf8("test"), - }, - Configuration = new Configuration - { - DataChunkMaxSize = 100, - }, - ExpectedOutputKeys = - { - "EOK", - }, - SessionId = "SessionId", - TaskId = "TaskId", - }, - }, - }; - - private static readonly ProcessRequest InitRequestEmptyPayload = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - InitRequest = new ProcessRequest.Types.ComputeRequest.Types.InitRequest - { - Configuration = new Configuration - { - DataChunkMaxSize = 100, - }, - ExpectedOutputKeys = - { - "EOK", - }, - SessionId = "SessionId", - TaskId = "TaskId", - }, - }, - }; - - private static readonly ProcessRequest Payload1 = new() + var payloadId = Guid.NewGuid() + .ToString(); + var taskId = Guid.NewGuid() + .ToString(); + var token = Guid.NewGuid() + .ToString(); + var sessionId = Guid.NewGuid() + .ToString(); + var dd1 = Guid.NewGuid() + .ToString(); + var eok1 = Guid.NewGuid() + .ToString(); + + var folder = Path.Combine(Path.GetTempPath(), + token); + + Directory.CreateDirectory(folder); + + var payloadBytes = Encoding.ASCII.GetBytes("payload"); + var dd1Bytes = Encoding.ASCII.GetBytes("DataDependency1"); + var eok1Bytes = Encoding.ASCII.GetBytes("ExpectedOutput1"); + + await File.WriteAllBytesAsync(Path.Combine(folder, + payloadId), + payloadBytes); + await File.WriteAllBytesAsync(Path.Combine(folder, + dd1), + dd1Bytes); + + var handler = new TaskHandler(new ProcessRequest + { + CommunicationToken = token, + DataFolder = folder, + PayloadId = payloadId, + SessionId = sessionId, + Configuration = new Configuration { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - Payload = new DataChunk - { - Data = ByteString.CopyFromUtf8("Payload1"), - }, - }, - }; - - private static readonly ProcessRequest Payload2 = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - Payload = new DataChunk - { - Data = ByteString.CopyFromUtf8("Payload2"), - }, - }, - }; - - private static readonly ProcessRequest PayloadComplete = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - Payload = new DataChunk - { - DataComplete = true, - }, - }, - }; - - private static readonly ProcessRequest Data1 = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - Data = new DataChunk - { - Data = ByteString.CopyFromUtf8("Data1"), - }, - }, - }; - - private static readonly ProcessRequest Data2 = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - Data = new DataChunk - { - Data = ByteString.CopyFromUtf8("Data2"), - }, - }, - }; - - private static readonly ProcessRequest DataComplete = new() - { - CommunicationToken = "Token", - Compute = new ProcessRequest.Types.ComputeRequest - { - Data = new DataChunk - { - DataComplete = true, - }, - }, - }; - - public static IEnumerable TaskHandlerCreateShouldThrowTestCases - { - get - { - yield return new TestCaseData(new ProcessRequest[] - { - }.AsEnumerable()); - yield return new TestCaseData(new[] - { - InitData1, - }.AsEnumerable()); - yield return new TestCaseData(new[] - { - InitData2, - }.AsEnumerable()); - yield return new TestCaseData(new[] - { - LastDataTrue, - }.AsEnumerable()); - yield return new TestCaseData(new[] - { - LastDataFalse, - }.AsEnumerable()); - yield return new TestCaseData(new[] - { - InitRequestPayload, - }.AsEnumerable()).SetArgDisplayNames(nameof(InitRequestPayload)); - yield return new TestCaseData(new[] - { - DataComplete, - }.AsEnumerable()).SetArgDisplayNames(nameof(DataComplete)); - yield return new TestCaseData(new[] - { - InitRequestEmptyPayload, - }.AsEnumerable()).SetArgDisplayNames(nameof(InitRequestEmptyPayload)); - yield return new TestCaseData(new[] + DataChunkMaxSize = 84, + }, + DataDependencies = { - InitRequestPayload, - PayloadComplete, - InitData1, - Data1, - LastDataTrue, - }.AsEnumerable()).SetArgDisplayNames("NotWorkingRequest1"); - yield return new TestCaseData(new[] + dd1, + }, + ExpectedOutputKeys = { - InitRequestPayload, - InitData1, - Data1, - DataComplete, - LastDataTrue, - }.AsEnumerable()).SetArgDisplayNames("NotWorkingRequest2"); - yield return new TestCaseData(new[] - { - InitRequestPayload, - PayloadComplete, - Data1, - DataComplete, - LastDataTrue, - }.AsEnumerable()).SetArgDisplayNames("NotWorkingRequest3"); - } - } - - private static readonly IEnumerable WorkingRequest1 = new[] - { - InitRequestPayload, - Payload1, - Payload2, - PayloadComplete, - InitData1, - Data1, - Data2, - DataComplete, - InitData2, - Data1, - Data2, - Data2, - Data2, - DataComplete, - LastDataTrue, - }.AsEnumerable(); - - private static readonly IEnumerable WorkingRequest2 = new[] - { - InitRequestPayload, - Payload1, - PayloadComplete, - InitData1, - Data1, - DataComplete, - LastDataTrue, - }.AsEnumerable(); - - private static readonly IEnumerable WorkingRequest3 = new[] - { - InitRequestPayload, - PayloadComplete, - InitData1, - Data1, - DataComplete, - LastDataTrue, - }.AsEnumerable(); - - public static IEnumerable TaskHandlerCreateShouldSucceedTestCases - { - get - { - yield return new TestCaseData(WorkingRequest1).SetArgDisplayNames(nameof(WorkingRequest1)); - yield return new TestCaseData(WorkingRequest2).SetArgDisplayNames(nameof(WorkingRequest2)); - yield return new TestCaseData(WorkingRequest3).SetArgDisplayNames(nameof(WorkingRequest3)); - } + eok1, + }, + TaskId = taskId, + }, + agent, + new LoggerFactory(), + CancellationToken.None); + + Assert.ThrowsAsync(() => handler.SendResult(eok1, + eok1Bytes)); + + Assert.Multiple(() => + { + Assert.AreEqual(payloadBytes, + handler.Payload); + Assert.AreEqual(sessionId, + handler.SessionId); + Assert.AreEqual(taskId, + handler.TaskId); + Assert.AreEqual(dd1Bytes, + handler.DataDependencies[dd1]); + Assert.AreEqual(eok1Bytes, + File.ReadAllBytes(Path.Combine(folder, + eok1))); + }); } } diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/ITaskHandler.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/ITaskHandler.cs index 91abcef06..8d0ff3e89 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/ITaskHandler.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/ITaskHandler.cs @@ -32,6 +32,9 @@ namespace ArmoniK.Api.Worker.Worker; +/// +/// Higher level interface to implement to create tasks and populate results +/// [PublicAPI] public interface ITaskHandler : IAsyncDisposable { @@ -68,7 +71,7 @@ public interface ITaskHandler : IAsyncDisposable /// /// The configuration parameters for the interaction with ArmoniK. /// - Configuration? Configuration { get; } + Configuration Configuration { get; } /// /// This method allows to create subtasks. @@ -140,15 +143,4 @@ Task SubmitTasksAsync(IEnumerable Task CreateResultsAsync(IEnumerable results); - - /// - /// Upload data to an existing result - /// - /// The result Id - /// The data to submit for the given result - /// - /// The upload data response - /// - Task UploadResultData(string key, - byte[] data); } diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs index 62158608a..5f287396e 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs @@ -22,7 +22,10 @@ // limitations under the License. using System; +using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -31,77 +34,147 @@ using ArmoniK.Api.gRPC.V1.Agent; using ArmoniK.Api.gRPC.V1.Worker; -using Google.Protobuf; - -using Grpc.Core; - using Microsoft.Extensions.Logging; namespace ArmoniK.Api.Worker.Worker; +public class ReadFromFolderDict : IReadOnlyDictionary +{ + private readonly Dictionary data_ = new(); + private readonly IList dataDependencies_; + private readonly string folder_; + + public ReadFromFolderDict(string folder, + IList dataDependencies) + { + folder_ = folder; + dataDependencies_ = dataDependencies; + } + + /// + public IEnumerator> GetEnumerator() + => dataDependencies_.Select(key => new KeyValuePair(key, + this[key])) + .GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); + + /// + public int Count + => dataDependencies_.Count; + + /// + public bool ContainsKey(string key) + => dataDependencies_.Contains(key); + + /// + public bool TryGetValue(string key, + [MaybeNullWhen(false)] out byte[] value) + { + var r = ContainsKey(key); + if (r) + { + value = this[key]; + return r; + } + + value = null; + return r; + } + + /// + public byte[] this[string key] + { + get + { + if (data_.TryGetValue(key, + out var value)) + { + return value; + } + + var bytes = File.ReadAllBytes(Path.Combine(folder_, + key)); + data_.Add(key, + bytes); + return bytes; + } + } + + /// + public IEnumerable Keys + => dataDependencies_; + + /// + public IEnumerable Values + => dataDependencies_.Select(key => this[key]); +} + public class TaskHandler : ITaskHandler { private readonly CancellationToken cancellationToken_; private readonly Agent.AgentClient client_; + private readonly string folder_; private readonly ILogger logger_; private readonly ILoggerFactory loggerFactory_; - private readonly IAsyncStreamReader requestStream_; - - private IReadOnlyDictionary? dataDependencies_; - private IList? expectedResults_; - - private bool isInitialized_; - private byte[]? payload_; - private string? sessionId_; - private string? taskId_; - private TaskOptions? taskOptions_; - private string? token_; - - - private TaskHandler(IAsyncStreamReader requestStream, - Agent.AgentClient client, - CancellationToken cancellationToken, - ILoggerFactory loggerFactory) + public TaskHandler(ProcessRequest processRequest, + Agent.AgentClient client, + ILoggerFactory loggerFactory, + CancellationToken cancellationToken) { - requestStream_ = requestStream; client_ = client; cancellationToken_ = cancellationToken; loggerFactory_ = loggerFactory; logger_ = loggerFactory.CreateLogger(); + folder_ = processRequest.DataFolder; + + Token = processRequest.CommunicationToken; + SessionId = processRequest.SessionId; + TaskId = processRequest.TaskId; + TaskOptions = processRequest.TaskOptions; + ExpectedResults = processRequest.ExpectedOutputKeys; + DataDependencies = new ReadFromFolderDict(processRequest.DataFolder, + processRequest.DataDependencies); + Configuration = processRequest.Configuration; + + + try + { + Payload = File.ReadAllBytes(Path.Combine(processRequest.DataFolder, + processRequest.PayloadId)); + } + catch (ArgumentException e) + { + throw new InvalidOperationException("Payload not found", + e); + } } - public string Token - => token_ ?? throw TaskHandlerException(nameof(Token)); + public string Token { get; } /// - public string SessionId - => sessionId_ ?? throw TaskHandlerException(nameof(SessionId)); + public Configuration Configuration { get; } /// - public string TaskId - => taskId_ ?? throw TaskHandlerException(nameof(TaskId)); + public string SessionId { get; } /// - public TaskOptions TaskOptions - => taskOptions_ ?? throw TaskHandlerException(nameof(TaskOptions)); + public string TaskId { get; } /// - public byte[] Payload - => payload_ ?? throw TaskHandlerException(nameof(Payload)); + public TaskOptions TaskOptions { get; } /// - public IReadOnlyDictionary DataDependencies - => dataDependencies_ ?? throw TaskHandlerException(nameof(DataDependencies)); + public byte[] Payload { get; } /// - public IList ExpectedResults - => expectedResults_ ?? throw TaskHandlerException(nameof(ExpectedResults)); + public IReadOnlyDictionary DataDependencies { get; } - // this ? was added due to the initialization pattern with the Create method /// - public Configuration? Configuration { get; private set; } + public IList ExpectedResults { get; } /// public async Task CreateTasksAsync(IEnumerable tasks, @@ -144,7 +217,7 @@ public async Task CreateResultsMetaDataAsync(IEnu { results, }, - SessionId = sessionId_, + SessionId = SessionId, }) .ConfigureAwait(false); @@ -153,70 +226,30 @@ public async Task CreateResultsMetaDataAsync(IEnu public async Task SendResult(string key, byte[] data) { - using var stream = client_.SendResult(); - - await stream.RequestStream.WriteAsync(new Result - { - CommunicationToken = Token, - Init = new InitKeyedDataStream - { - Key = key, - }, - }) - .ConfigureAwait(false); - var start = 0; - - while (start < data.Length) + await using (var fs = new FileStream(Path.Combine(folder_, + key), + FileMode.OpenOrCreate)) { - var chunkSize = Math.Min(Configuration!.DataChunkMaxSize, - data.Length - start); - - await stream.RequestStream.WriteAsync(new Result - { - CommunicationToken = Token, - Data = new DataChunk - { - Data = UnsafeByteOperations.UnsafeWrap(data.AsMemory() - .Slice(start, - chunkSize)), - }, - }) - .ConfigureAwait(false); - - start += chunkSize; + await using var w = new BinaryWriter(fs); + w.Write(data); } - await stream.RequestStream.WriteAsync(new Result - { - CommunicationToken = Token, - Data = new DataChunk - { - DataComplete = true, - }, - }) - .ConfigureAwait(false); - - await stream.RequestStream.WriteAsync(new Result + await client_.NotifyResultDataAsync(new NotifyResultDataRequest + { + CommunicationToken = Token, + Ids = { - CommunicationToken = Token, - Init = new InitKeyedDataStream - { - LastResult = true, - }, - }) - .ConfigureAwait(false); - - await stream.RequestStream.CompleteAsync() - .ConfigureAwait(false); - - var reply = await stream.ResponseAsync.ConfigureAwait(false); - if (reply.TypeCase == ResultReply.TypeOneofCase.Error) - { - logger_.LogError(reply.Error); - throw new InvalidOperationException($"Cannot send result id={key}"); - } + new NotifyResultDataRequest.Types.ResultIdentifier + { + SessionId = SessionId, + ResultId = key, + }, + }, + }) + .ConfigureAwait(false); } + /// public ValueTask DisposeAsync() => ValueTask.CompletedTask; @@ -226,7 +259,7 @@ public async Task SubmitTasksAsync(IEnumerable await client_.SubmitTasksAsync(new SubmitTasksRequest { CommunicationToken = Token, - SessionId = sessionId_, + SessionId = SessionId, TaskCreations = { taskCreations, @@ -240,217 +273,11 @@ public async Task CreateResultsAsync(IEnumerable await client_.CreateResultsAsync(new CreateResultsRequest { CommunicationToken = Token, - SessionId = sessionId_, + SessionId = SessionId, Results = { results, }, }) .ConfigureAwait(false); - - public async Task UploadResultData(string key, - byte[] data) - { - var stream = client_.UploadResultData(); - - await stream.RequestStream.WriteAsync(new UploadResultDataRequest - { - Id = new UploadResultDataRequest.Types.ResultIdentifier - { - ResultId = key, - SessionId = sessionId_, - }, - CommunicationToken = Token, - }) - .ConfigureAwait(false); - - var start = 0; - while (start < data.Length) - { - var chunkSize = Math.Min(Configuration!.DataChunkMaxSize, - data.Length - start); - - await stream.RequestStream.WriteAsync(new UploadResultDataRequest - { - CommunicationToken = Token, - DataChunk = UnsafeByteOperations.UnsafeWrap(data.AsMemory() - .Slice(start, - chunkSize)), - }) - .ConfigureAwait(false); - - start += chunkSize; - } - - await stream.RequestStream.CompleteAsync() - .ConfigureAwait(false); - - return await stream.ResponseAsync.ConfigureAwait(false); - } - - public static async Task Create(IAsyncStreamReader requestStream, - Agent.AgentClient agentClient, - ILoggerFactory loggerFactory, - CancellationToken cancellationToken) - { - var output = new TaskHandler(requestStream, - agentClient, - cancellationToken, - loggerFactory); - await output.Init() - .ConfigureAwait(false); - return output; - } - - private async Task Init() - { - if (!await requestStream_.MoveNext() - .ConfigureAwait(false)) - { - throw new InvalidOperationException("Request stream ended unexpectedly."); - } - - if (requestStream_.Current.Compute.TypeCase != ProcessRequest.Types.ComputeRequest.TypeOneofCase.InitRequest) - { - throw new InvalidOperationException("Expected a Compute request type with InitRequest to start the stream."); - } - - var initRequest = requestStream_.Current.Compute.InitRequest; - sessionId_ = initRequest.SessionId; - taskId_ = initRequest.TaskId; - taskOptions_ = initRequest.TaskOptions; - expectedResults_ = initRequest.ExpectedOutputKeys; - Configuration = initRequest.Configuration; - token_ = requestStream_.Current.CommunicationToken; - - if (initRequest.Payload is null) - { - throw new InvalidOperationException("Payload from InitRequest should not be null"); - } - - - if (initRequest.Payload.DataComplete) - { - payload_ = initRequest.Payload.Data.ToByteArray(); - } - else - { - var chunks = new List(); - var dataChunk = initRequest.Payload; - - chunks.Add(dataChunk.Data); - - while (!dataChunk.DataComplete) - { - if (!await requestStream_.MoveNext(cancellationToken_) - .ConfigureAwait(false)) - { - throw new InvalidOperationException("Request stream ended unexpectedly."); - } - - if (requestStream_.Current.Compute.TypeCase != ProcessRequest.Types.ComputeRequest.TypeOneofCase.Payload) - { - throw new InvalidOperationException("Expected a Compute request type with Payload to continue the stream."); - } - - dataChunk = requestStream_.Current.Compute.Payload; - - chunks.Add(dataChunk.Data); - } - - - var size = chunks.Sum(s => s.Length); - - var payload = new byte[size]; - - var start = 0; - - foreach (var chunk in chunks) - { - chunk.CopyTo(payload, - start); - start += chunk.Length; - } - - payload_ = payload; - } - - var dataDependencies = new Dictionary(); - - ProcessRequest.Types.ComputeRequest.Types.InitData initData; - do - { - if (!await requestStream_.MoveNext(cancellationToken_) - .ConfigureAwait(false)) - { - throw new InvalidOperationException("Request stream ended unexpectedly."); - } - - - if (requestStream_.Current.Compute.TypeCase != ProcessRequest.Types.ComputeRequest.TypeOneofCase.InitData) - { - throw new InvalidOperationException("Expected a Compute request type with InitData to continue the stream."); - } - - initData = requestStream_.Current.Compute.InitData; - if (!string.IsNullOrEmpty(initData.Key)) - { - var chunks = new List(); - - while (true) - { - if (!await requestStream_.MoveNext(cancellationToken_) - .ConfigureAwait(false)) - { - throw new InvalidOperationException("Request stream ended unexpectedly."); - } - - if (requestStream_.Current.Compute.TypeCase != ProcessRequest.Types.ComputeRequest.TypeOneofCase.Data) - { - throw new InvalidOperationException("Expected a Compute request type with Data to continue the stream."); - } - - var dataChunk = requestStream_.Current.Compute.Data; - - if (dataChunk.TypeCase == DataChunk.TypeOneofCase.Data) - { - chunks.Add(dataChunk.Data); - } - - if (dataChunk.TypeCase == DataChunk.TypeOneofCase.None) - { - throw new InvalidOperationException("Expected a Compute request type with a DataChunk Payload to continue the stream."); - } - - if (dataChunk.TypeCase == DataChunk.TypeOneofCase.DataComplete) - { - break; - } - } - - var size = chunks.Sum(s => s.Length); - - var data = new byte[size]; - - var start = 0; - - foreach (var chunk in chunks) - { - chunk.CopyTo(data, - start); - start += chunk.Length; - } - - dataDependencies[initData.Key] = data; - } - } while (!string.IsNullOrEmpty(initData.Key)); - - dataDependencies_ = dataDependencies; - isInitialized_ = true; - } - - private Exception TaskHandlerException(string argumentName) - => isInitialized_ - ? new InvalidOperationException($"Error in initalization: {argumentName} is null") - : new InvalidOperationException(""); } diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs index 0edca8218..efd4b17aa 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs @@ -57,20 +57,22 @@ public WorkerStreamWrapper(ILoggerFactory loggerFactory, client_ = new Agent.AgentClient(channel_); } + /// public async ValueTask DisposeAsync() => await channel_.ShutdownAsync() .ConfigureAwait(false); - public sealed override async Task Process(IAsyncStreamReader requestStream, - ServerCallContext context) + + /// + public sealed override async Task Process(ProcessRequest request, + ServerCallContext context) { Output output; { - await using var taskHandler = await TaskHandler.Create(requestStream, - client_, - loggerFactory_, - context.CancellationToken) - .ConfigureAwait(false); + await using var taskHandler = new TaskHandler(request, + client_, + loggerFactory_, + context.CancellationToken); using var _ = logger_.BeginNamedScope("Execute task", ("taskId", taskHandler.TaskId), @@ -89,6 +91,7 @@ public virtual Task Process(ITaskHandler taskHandler) => throw new RpcException(new Status(StatusCode.Unimplemented, "")); + /// public override Task HealthCheck(Empty request, ServerCallContext context) => Task.FromResult(new HealthCheckReply From 1a82d038252fea5f4ea278b51e9ba8e474eb4baa Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 18 Sep 2023 15:27:40 +0200 Subject: [PATCH 055/344] Fixed issue with client, more verbose test --- .../source/submitter/ResultsClient.cpp | 2 +- .../source/SubmitterClientTest.cpp | 22 ++++++++++++++----- .../header/utils/WorkerServer.h | 4 ++++ .../source/Worker/ArmoniKWorker.cpp | 2 +- packages/cpp/tools/Dockerfile.worker | 5 +++-- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp index ad354fdd2..4162c0ce1 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp @@ -69,7 +69,7 @@ void ResultsClient::upload_result_data(const std::string &session_id, const std: if (!stream->Write(request)) { throw armonik::api::common::exceptions::ArmoniKApiException("Unable to continue upload result"); } - payload = payload.substr(maxChunkSize); + payload = payload.substr(chunk.size()); } if (!stream->WritesDone()) { diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index 4391d1575..4d7b689df 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -45,7 +45,7 @@ namespace logger = armonik::api::common::logger; * @param channel The gRPC channel to communicate with the server. * @param default_task_options The default task options. */ -void init(std::shared_ptr &channel, TaskOptions &default_task_options) { +void init(std::shared_ptr &channel, TaskOptions &default_task_options, logger::ILogger& logger) { Configuration configuration; // auto server = std::make_shared(configuration_t); @@ -54,7 +54,7 @@ void init(std::shared_ptr &channel, TaskOptions &default_task_options) std::string server_address = configuration.get("Grpc__EndPoint"); - std::cout << " Server address " << server_address << std::endl; + logger.info(" Server address {address}", {{"address", server_address}}); channel = grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); @@ -77,6 +77,7 @@ void init(std::shared_ptr &channel, TaskOptions &default_task_options) TEST(testMock, createSession) { // MockStubInterface stub; std::shared_ptr channel; + logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; ClientContext context; CreateSessionReply reply; @@ -85,7 +86,7 @@ TEST(testMock, createSession) { const std::vector &partition_ids = {""}; TaskOptions task_options; - init(channel, task_options); + init(channel, task_options, log); ASSERT_EQ(task_options.partition_id(), ""); @@ -126,7 +127,7 @@ TEST(testMock, submitTask) { TaskOptions task_options; std::shared_ptr channel; - init(channel, task_options); + init(channel, task_options, log); // MockStubInterface stub; std::unique_ptr stub = Submitter::NewStub(channel); @@ -190,6 +191,7 @@ TEST(testMock, submitTask) { } TEST(testMock, testWorker) { + logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; std::shared_ptr channel; CreateSessionReply reply; @@ -199,7 +201,7 @@ TEST(testMock, testWorker) { TaskOptions task_options; - init(channel, task_options); + init(channel, task_options, log); auto stub = armonik::api::grpc::v1::results::Results::NewStub(channel); @@ -242,9 +244,11 @@ TEST(testMock, testWorker) { } TEST(testMock, getResult) { + logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; // MockStubInterface stub; std::shared_ptr channel; + CreateSessionReply reply; CreateSessionRequest request; @@ -253,15 +257,17 @@ TEST(testMock, getResult) { TaskOptions task_options; armonik::api::grpc::v1::ResultRequest result_request; - init(channel, task_options); + init(channel, task_options, log); auto stub = armonik::api::grpc::v1::results::Results::NewStub(channel); grpc::ClientContext context; + log.info("Creating Client"); std::unique_ptr stub_client = Submitter::NewStub(channel); armonik::api::client::SubmitterClient submitter(std::move(stub_client)); std::string session_id = submitter.create_session(task_options, partition_ids); + log.info("Received session id {session_id}", {{"session_id", session_id}}); auto name = "test"; @@ -269,10 +275,13 @@ TEST(testMock, getResult) { request_create.set_session_id(session_id); armonik::api::client::ResultsClient results(armonik::api::grpc::v1::results::Results::NewStub(channel)); auto mapping = results.create_results(session_id, {name}); + log.info("Created result {result_id}", {{"result_id", mapping[name]}}); ASSERT_TRUE(mapping.size() == 1); std::string payload = "TestPayload"; + results.upload_result_data(session_id, mapping[name], payload); + log.info("Uploaded result {result_id}", {{"result_id", mapping[name]}}); // EXPECT_CALL(*stub, GetServiceConfiguration(_, _, _)).Times(AtLeast(1)); // EXPECT_CALL(*stub, TryGetResultStreamRaw(_, _)).Times(AtLeast(1)); @@ -281,6 +290,7 @@ TEST(testMock, getResult) { result_request.set_session(session_id); auto result = submitter.get_result_async(result_request).get(); + log.info("Received result {result_id}", {{"result_id", mapping[name]}}); ASSERT_FALSE(result.empty()); ASSERT_EQ(payload, result); diff --git a/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h b/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h index 3ca818957..7c8f21558 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/utils/WorkerServer.h @@ -17,6 +17,7 @@ #include "Worker/ProcessStatus.h" #include "Worker/TaskHandler.h" +#include "exceptions/ArmoniKApiException.h" #include "logger/formatter.h" #include "logger/logger.h" #include "logger/writer.h" @@ -57,6 +58,9 @@ class WorkerServer { logger.info("Creating worker"); common::options::ComputePlane compute_plane(configuration); + logger.info("Worker address : " + compute_plane.get_server_address()); + logger.info("Agent address : " + compute_plane.get_agent_address()); + builder_.AddListeningPort(compute_plane.get_server_address(), ::grpc::InsecureServerCredentials()); builder_.SetMaxReceiveMessageSize(-1); diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp index 082a03873..fbbfd540a 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp @@ -89,7 +89,7 @@ armonik::api::worker::ArmoniKWorker::HealthCheck([[maybe_unused]] ::grpc::Server [[maybe_unused]] const ::armonik::api::grpc::v1::Empty *request, ::armonik::api::grpc::v1::worker::HealthCheckReply *response) { // Implementation of the HealthCheck method - logger_.debug("HealthCheck request OK"); + logger_.info("HealthCheck request OK"); response->set_status(HealthCheckReply_ServingStatus_SERVING); diff --git a/packages/cpp/tools/Dockerfile.worker b/packages/cpp/tools/Dockerfile.worker index 66b02ce54..c2735e186 100644 --- a/packages/cpp/tools/Dockerfile.worker +++ b/packages/cpp/tools/Dockerfile.worker @@ -22,8 +22,7 @@ RUN apk update && apk add --no-cache \ grpc \ grpc-dev \ protobuf \ - protobuf-dev \ - libfmt-dev + protobuf-dev # Update the PATH environment variable to include the gRPC libraries and binaries ENV LD_LIBRARY_PATH="/app/install/lib:$LD_LIBRARY_PATH" @@ -39,6 +38,8 @@ COPY ./packages/cpp/ArmoniK.Api.Worker ./ArmoniK.Api.Worker COPY ./packages/cpp/ArmoniK.Api.Worker.Tests ./ArmoniK.Api.Worker.Tests COPY ./packages/cpp/CMakeLists.txt ./ COPY ./packages/cpp/Dependencies.cmake ./ +COPY ./packages/cpp/Packaging.cmake ./ +COPY ./packages/cpp/tools/packaging/. ./tools/packaging/. # Copy the Protocol Buffer definition files into the image WORKDIR /app/proto From 900f9efb5dcbfe5dba70f1f7d5f4919213521aac Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 18 Sep 2023 16:27:14 +0200 Subject: [PATCH 056/344] More verbose error --- .../cpp/ArmoniK.Api.Common/header/options/ComputePlane.h | 8 ++++---- .../ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp | 7 +++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h b/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h index 8466f692a..44de3c50b 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h +++ b/packages/cpp/ArmoniK.Api.Common/header/options/ComputePlane.h @@ -34,8 +34,8 @@ class ComputePlane { * @param socket_address The socket address to set for the worker. */ void set_worker_address(std::string socket_address) { - if (socket_address.find("unix:") != 0) { - socket_address.insert(0, "unix:"); + if (socket_address.find("unix://") != 0) { + socket_address.insert(0, "unix://"); } worker_address_ = std::move(socket_address); } @@ -45,8 +45,8 @@ class ComputePlane { * @param agent_address The agent address to set for the agent. */ void set_agent_address(std::string agent_address) { - if (agent_address.find("unix:") != 0) { - agent_address.insert(0, "unix:"); + if (agent_address.find("unix://") != 0) { + agent_address.insert(0, "unix://"); } agent_address_ = std::move(agent_address); } diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp index fbbfd540a..411fb7892 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp @@ -69,7 +69,10 @@ armonik::api::worker::ArmoniKWorker::Process([[maybe_unused]] ::grpc::ServerCont } *response->mutable_output() = std::move(output); } catch (const std::exception &e) { - return {::grpc::StatusCode::UNAVAILABLE, "Error processing task", e.what()}; + logger_.error("Error processing task : {what}", {{"what", e.what()}}); + std::stringstream ss; + ss << "Error processing task : " << e.what(); + return {::grpc::StatusCode::UNAVAILABLE, ss.str(), e.what()}; } return ::grpc::Status::OK; @@ -89,7 +92,7 @@ armonik::api::worker::ArmoniKWorker::HealthCheck([[maybe_unused]] ::grpc::Server [[maybe_unused]] const ::armonik::api::grpc::v1::Empty *request, ::armonik::api::grpc::v1::worker::HealthCheckReply *response) { // Implementation of the HealthCheck method - logger_.info("HealthCheck request OK"); + logger_.debug("HealthCheck request OK"); response->set_status(HealthCheckReply_ServingStatus_SERVING); From e4772d7b6128390ff9926c13aa838ea86e79c438 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 18 Sep 2023 17:35:14 +0200 Subject: [PATCH 057/344] Format --- packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index 4d7b689df..cb80d00c1 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -45,7 +45,7 @@ namespace logger = armonik::api::common::logger; * @param channel The gRPC channel to communicate with the server. * @param default_task_options The default task options. */ -void init(std::shared_ptr &channel, TaskOptions &default_task_options, logger::ILogger& logger) { +void init(std::shared_ptr &channel, TaskOptions &default_task_options, logger::ILogger &logger) { Configuration configuration; // auto server = std::make_shared(configuration_t); @@ -248,7 +248,6 @@ TEST(testMock, getResult) { // MockStubInterface stub; std::shared_ptr channel; - CreateSessionReply reply; CreateSessionRequest request; From 73188b3a849103b01b7a2a550558d13075f00460 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 19 Sep 2023 11:33:28 +0200 Subject: [PATCH 058/344] Debug logging for tests --- .../ArmoniK.Api.Tests/source/SubmitterClientTest.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index cb80d00c1..b24952028 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -262,11 +262,11 @@ TEST(testMock, getResult) { grpc::ClientContext context; - log.info("Creating Client"); + log.debug("Creating Client"); std::unique_ptr stub_client = Submitter::NewStub(channel); armonik::api::client::SubmitterClient submitter(std::move(stub_client)); std::string session_id = submitter.create_session(task_options, partition_ids); - log.info("Received session id {session_id}", {{"session_id", session_id}}); + log.debug("Received session id {session_id}", {{"session_id", session_id}}); auto name = "test"; @@ -274,13 +274,13 @@ TEST(testMock, getResult) { request_create.set_session_id(session_id); armonik::api::client::ResultsClient results(armonik::api::grpc::v1::results::Results::NewStub(channel)); auto mapping = results.create_results(session_id, {name}); - log.info("Created result {result_id}", {{"result_id", mapping[name]}}); + log.debug("Created result {result_id}", {{"result_id", mapping[name]}}); ASSERT_TRUE(mapping.size() == 1); std::string payload = "TestPayload"; results.upload_result_data(session_id, mapping[name], payload); - log.info("Uploaded result {result_id}", {{"result_id", mapping[name]}}); + log.debug("Uploaded result {result_id}", {{"result_id", mapping[name]}}); // EXPECT_CALL(*stub, GetServiceConfiguration(_, _, _)).Times(AtLeast(1)); // EXPECT_CALL(*stub, TryGetResultStreamRaw(_, _)).Times(AtLeast(1)); @@ -289,7 +289,7 @@ TEST(testMock, getResult) { result_request.set_session(session_id); auto result = submitter.get_result_async(result_request).get(); - log.info("Received result {result_id}", {{"result_id", mapping[name]}}); + log.debug("Received result {result_id}", {{"result_id", mapping[name]}}); ASSERT_FALSE(result.empty()); ASSERT_EQ(payload, result); From bf1269b9f2862f165d082a4a2956ab95e789920a Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 20 Sep 2023 12:31:17 +0200 Subject: [PATCH 059/344] Added base filters --- packages/common/protofiles.sh | 16 +- packages/python/pyproject.toml | 4 +- packages/python/src/armonik/client/tasks.py | 14 +- .../python/src/armonik/common/__init__.py | 1 + packages/python/src/armonik/common/filter.py | 150 ++++++++++++++++++ 5 files changed, 168 insertions(+), 17 deletions(-) create mode 100644 packages/python/src/armonik/common/filter.py diff --git a/packages/common/protofiles.sh b/packages/common/protofiles.sh index e1afae1f9..176487364 100644 --- a/packages/common/protofiles.sh +++ b/packages/common/protofiles.sh @@ -5,17 +5,5 @@ export PROTO_PATH=$REPOSITORY_PATH/Protos/V1 export README_PATH=$REPOSITORY_PATH/README.md armonik_worker_files=("agent_service.proto" "worker_service.proto") -armonik_client_files=("submitter_service.proto" "tasks_service.proto" "sessions_service.proto" \ - "results_service.proto" "applications_service.proto" "auth_service.proto" \ - "events_service.proto" "partitions_service.proto" "versions_service.proto") -armonik_common_files=("objects.proto" "task_status.proto" "session_status.proto" \ - "result_status.proto" "agent_common.proto" "sessions_common.proto" \ - "submitter_common.proto" "tasks_common.proto" "worker_common.proto" \ - "results_common.proto" "applications_common.proto" "auth_common.proto" \ - "events_common.proto" "partitions_common.proto" "sort_direction.proto" \ - "versions_common.proto" "tasks_fields.proto" "tasks_filters.proto" \ - "sessions_fields.proto" "sessions_filters.proto" \ - "applications_fields.proto" "applications_filters.proto" \ - "partitions_fields.proto" "partitions_filters.proto" \ - "results_fields.proto" "results_filters.proto" \ - "filters_common.proto") +if IFS=$'\n' read -rd '' -a armonik_client_files <<<"$(find $PROTO_PATH -name "*.proto" -exec basename {} \; | grep -v -e "worker" -e "agent" | grep "service" )"; then :; fi +if IFS=$'\n' read -rd '' -a armonik_common_files <<<"$(find $PROTO_PATH -name "*.proto" -exec basename {} \; | grep -v "service" )"; then :; fi diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 98dfbf03a..af91ab0d2 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -15,8 +15,8 @@ classifiers = [ "Programming Language :: Python :: 3", ] dependencies = [ - "grpcio", - "grpcio-tools" + "grpcio==1.56.2", + "grpcio-tools==1.56.2" ] [project.urls] diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 1696cd06c..3e01ef3e9 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -1,10 +1,22 @@ from grpc import Channel +from typing import List +import enum -from ..common import Task +from ..common import Task, Filter, StringFilter, FilterDisjunction, FilterConjunction from ..protogen.client.tasks_service_pb2_grpc import TasksStub from ..protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse +from ..protogen.common.tasks_filters_pb2 import Filters as rawFilters +class TaskFilter(FilterDisjunction): + def to_message(self) -> rawFilters: + raw = rawFilters() + setattr(raw, "or", ) + + +class TaskFieldFilter(enum.Enum): + TASK_ID = StringFilter() + class ArmoniKTasks: def __init__(self, grpc_channel: Channel): """ Tasks service client diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 601c66825..74c4fc088 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,3 +1,4 @@ from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability from .enumwrapper import HealthCheckStatus, TaskStatus +from .filter import Filter, StringFilter, FilterConjunction, FilterDisjunction diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py new file mode 100644 index 000000000..9125914fe --- /dev/null +++ b/packages/python/src/armonik/common/filter.py @@ -0,0 +1,150 @@ +from typing import List, Any, Type, Union + +from protogen.common.filters_common_pb2 import * + + +class Filter: + + def to_message(self): + raise NotImplementedError(f"{str(self.__class__.__name__)}.to_message() is not implemented") + + +class FilterDisjunction(Filter): + def __init__(self, filters: List["FilterConjunction"]): + super().__init__() + self.filters = filters + if self.conjunction_type() is None: + raise Exception(f"Conjunction type for {self.__class__} cannot be determined") + + def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + if isinstance(other, SimpleFilter): + if other.conjunction_type != self.conjunction_type(): + raise Exception(f"Invalid type {type(other).__name__} ({str(other.field)}) for 'or' operand of {self.__class__.__name__} ({str(self)}) : Conjunction types are different") + return self.__class__(self.filters + [self.conjunction_type()([other])]) + elif isinstance(other, self.conjunction_type()): + return self.__class__(self.filters + [other]) + elif isinstance(other, self.__class__): + return self.__class__(self.filters + other.filters) + raise Exception(f"Invalid type {type(other).__name__} for 'or' operand of {self.__class__.__name__}") + + def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + return self | other + + def __repr__(self): + return "( " + ' ) or ( '.join([str(f) for f in self.filters]) + ' )' + + def conjunction_type(self) -> Type["FilterConjunction"]: + raise NotImplementedError(f"{str(self.__class__.__name__)}.conjunction_type() is not implemented") + + +class FilterConjunction(Filter): + def __init__(self, filters: List["SimpleFilter"]): + super().__init__() + self.filters = filters + if self.disjunction_type() is None: + raise Exception(f"Disjunction type for {self.__class__} cannot be determined") + + def __and__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": + if isinstance(other, SimpleFilter): + if other.conjunction_type != self.__class__: + raise Exception(f"Invalid type {type(other).__name__} ({str(other.field)}) for 'and' operand of {self.__class__.__name__} ({str(self)}) : Conjunction types are different") + return self.__class__(self.filters + [other]) + elif isinstance(other, self.__class__): + return self.__class__(self.filters + other.filters) + raise Exception(f"Invalid type {type(other).__name__} for 'and' operand of {self.__class__.__name__}") + + def __mul__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": + return self & other + + def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + return self.disjunction_type()([self]) | other + + def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + return self | other + + def __repr__(self): + return ' and '.join([str(f) for f in self.filters]) + + def disjunction_type(self) -> Type["FilterDisjunction"]: + raise NotImplementedError(f"{str(self.__class__.__name__)}.disjunction_type() is not implemented") + + +class SimpleFilter(Filter): + def __init__(self, field: Any, conjunction_type: Type["FilterConjunction"]): + super().__init__() + self.field = field + if not issubclass(conjunction_type, FilterConjunction): + raise Exception(f"{conjunction_type.__name__} is not a subclass of FilterConjunction") + self.conjunction_type = conjunction_type + + def __and__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": + if isinstance(other, SimpleFilter): + if other.conjunction_type != self.conjunction_type: + raise Exception(f"Invalid type {type(other).__name__} ({str(other.field)}) for 'and' operand of {self.__class__.__name__} ({str(self.field)}) : Conjunction types are different") + return self.conjunction_type([self, other]) + elif isinstance(other, self.conjunction_type): + return other & self + raise Exception(f"Invalid type {type(other).__name__} for 'and' operand of {self.__class__.__name__}") + + def __mul__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": + return self & other + + def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + return self.conjunction_type([self]) | other + + def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + return self | other + + def __invert__(self): + raise NotImplementedError(f"{str(self.__class__.__name__)}.__invert__ does not exist (is this type of filter invertable ?)") + + def __neg__(self) -> "SimpleFilter": + return ~self + + def __repr__(self) -> str: + return f"{str(self.field)} filter" + + +class StringFilter(SimpleFilter): + def __init__(self, field: Any, conjunction_type: Type["FilterConjunction"], value=None, operator=None): + super().__init__(field, conjunction_type) + self.raw = FilterString() + if value is not None: + self.raw.value = value + if operator is not None: + self.raw.operator = operator + + def contains(self, value: str) -> "StringFilter": + return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_CONTAINS) + + def __eq__(self, value: str) -> "StringFilter": + return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_EQUAL) + + def __ne__(self, value: str) -> "StringFilter": + return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_NOT_EQUAL) + + def __invert__(self) -> "StringFilter": + if self.raw.operator == FILTER_STRING_OPERATOR_EQUAL: + return StringFilter(self.field, self.conjunction_type, self.raw.value, FILTER_STRING_OPERATOR_NOT_EQUAL) + elif self.raw.operator == FILTER_STRING_OPERATOR_NOT_EQUAL: + return StringFilter(self.field, self.conjunction_type, self.raw.value, FILTER_STRING_OPERATOR_EQUAL) + elif self.raw.operator == FILTER_STRING_OPERATOR_CONTAINS: + return StringFilter(self.field, self.conjunction_type, self.raw.value, FILTER_STRING_OPERATOR_NOT_CONTAINS) + elif self.raw.operator == FILTER_STRING_OPERATOR_NOT_CONTAINS: + return StringFilter(self.field, self.conjunction_type, self.raw.value, FILTER_STRING_OPERATOR_CONTAINS) + else: + raise Exception(f"String filter operator {str(self.raw.operator)} for field {str(self.field)} has no inverted equivalent") + + def startswith(self, value: str) -> "StringFilter": + return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_STARTS_WITH) + + def endswith(self, value: str) -> "StringFilter": + return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_ENDS_WITH) + + def to_message(self) -> FilterString: + return self.raw + + def __repr__(self) -> str: + return f"{str(self.field)} {str(self.raw.operator)} {str(self.raw.value)}" + + From ea1c276428ff97f9eeefc27815d54caedfd6ec9f Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 20 Sep 2023 17:21:25 +0200 Subject: [PATCH 060/344] python Filter continuation --- packages/python/src/armonik/client/tasks.py | 33 +++- .../python/src/armonik/common/__init__.py | 2 +- packages/python/src/armonik/common/filter.py | 145 ++++++++++++++---- 3 files changed, 145 insertions(+), 35 deletions(-) diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 3e01ef3e9..0d1b33b7e 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -1,21 +1,40 @@ from grpc import Channel -from typing import List +from typing import Type import enum -from ..common import Task, Filter, StringFilter, FilterDisjunction, FilterConjunction +from ..common import Task +from ..common.filter import StringFilter, FilterDisjunction, FilterConjunction, StatusFilter, DateFilter from ..protogen.client.tasks_service_pb2_grpc import TasksStub from ..protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse -from ..protogen.common.tasks_filters_pb2 import Filters as rawFilters +from ..protogen.common.tasks_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus + +from ..protogen.common.tasks_fields_pb2 import * + + +class TaskFilterAnd(FilterConjunction): + def disjunction_type(self) -> Type["FilterDisjunction"]: + return TaskFilter + + def message_type(self) -> Type: + return rawFilterAnd class TaskFilter(FilterDisjunction): - def to_message(self) -> rawFilters: - raw = rawFilters() - setattr(raw, "or", ) + def message_type(self) -> Type: + return rawFilters + + def conjunction_type(self) -> Type["FilterConjunction"]: + return TaskFilterAnd class TaskFieldFilter(enum.Enum): - TASK_ID = StringFilter() + TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID)), TaskFilterAnd, rawFilterField) + SESSION_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID)), TaskFilterAnd, rawFilterField) + OWNER_POD_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID)), TaskFilterAnd, rawFilterField) + INITIAL_TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID)), TaskFilterAnd, rawFilterField) + STATUS = StatusFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STATUS)), TaskFilterAnd, rawFilterField, rawFilterStatus) + CREATED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT)), TaskFilterAnd, rawFilterField) + class ArmoniKTasks: def __init__(self, grpc_channel: Channel): diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 74c4fc088..0365e5004 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,4 +1,4 @@ from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability from .enumwrapper import HealthCheckStatus, TaskStatus -from .filter import Filter, StringFilter, FilterConjunction, FilterDisjunction +from .filter import Filter, StringFilter, FilterConjunction, FilterDisjunction, StatusFilter diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 9125914fe..9b43c60f0 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -1,20 +1,34 @@ from typing import List, Any, Type, Union - +from google.protobuf.message import Message +import google.protobuf.timestamp_pb2 as timestamp from protogen.common.filters_common_pb2 import * +from datetime import datetime +from ..common.helpers import datetime_to_timestamp class Filter: + def message_type(self) -> Type: + raise NotImplementedError(f"{str(self.__class__.__name__)}.message_type() is not implemented") def to_message(self): raise NotImplementedError(f"{str(self.__class__.__name__)}.to_message() is not implemented") + def __bool__(self): + raise Exception("Filter cannot be converted to bool. Are you trying to use 'and', 'or', 'not' or 'in' instead of '&', '|', '~' or '.contains' ?") + + def to_conjunction(self) -> "FilterConjunction": + raise NotImplementedError(f"{str(self.__class__.__name__)}.to_conjunction() is not implemented") + + def to_disjunction(self) -> "FilterDisjunction": + raise NotImplementedError(f"{str(self.__class__.__name__)}.to_disjunction() is not implemented") + class FilterDisjunction(Filter): def __init__(self, filters: List["FilterConjunction"]): super().__init__() self.filters = filters - if self.conjunction_type() is None: - raise Exception(f"Conjunction type for {self.__class__} cannot be determined") + _ = self.conjunction_type() + _ = self.message_type() def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": if isinstance(other, SimpleFilter): @@ -36,13 +50,24 @@ def __repr__(self): def conjunction_type(self) -> Type["FilterConjunction"]: raise NotImplementedError(f"{str(self.__class__.__name__)}.conjunction_type() is not implemented") + def to_message(self): + raw = self.message_type()() + setattr(raw, "or", [f.to_message() for f in self.filters]) + return raw + + def to_conjunction(self) -> "FilterConjunction": + raise Exception("Cannot transform a disjunction into a conjunction") + + def to_disjunction(self) -> "FilterDisjunction": + return self + class FilterConjunction(Filter): def __init__(self, filters: List["SimpleFilter"]): super().__init__() self.filters = filters - if self.disjunction_type() is None: - raise Exception(f"Disjunction type for {self.__class__} cannot be determined") + _ = self.disjunction_type() + _ = self.message_type() def __and__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": if isinstance(other, SimpleFilter): @@ -57,7 +82,7 @@ def __mul__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterC return self & other def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": - return self.disjunction_type()([self]) | other + return self.to_disjunction() | other def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": return self | other @@ -68,14 +93,32 @@ def __repr__(self): def disjunction_type(self) -> Type["FilterDisjunction"]: raise NotImplementedError(f"{str(self.__class__.__name__)}.disjunction_type() is not implemented") + def to_message(self): + raw = self.message_type()() + setattr(raw, "and", [f.to_message() for f in self.filters]) + return raw + + def to_conjunction(self) -> "FilterConjunction": + return self + + def to_disjunction(self) -> "FilterDisjunction": + return self.disjunction_type()([self]) + class SimpleFilter(Filter): - def __init__(self, field: Any, conjunction_type: Type["FilterConjunction"]): + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message], value=None, operator=None): super().__init__() self.field = field + self.message_type = message_type if not issubclass(conjunction_type, FilterConjunction): raise Exception(f"{conjunction_type.__name__} is not a subclass of FilterConjunction") self.conjunction_type = conjunction_type + self.inner_message_type = inner_message_type + self.raw = inner_message_type() + if value is not None: + self.raw.value = value + if operator is not None: + self.raw.operator = operator def __and__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": if isinstance(other, SimpleFilter): @@ -96,7 +139,7 @@ def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisju return self | other def __invert__(self): - raise NotImplementedError(f"{str(self.__class__.__name__)}.__invert__ does not exist (is this type of filter invertable ?)") + raise NotImplementedError(f"{str(self.__class__.__name__)}.__invert__ does not exist (is this type of filter invertible ?)") def __neg__(self) -> "SimpleFilter": return ~self @@ -104,47 +147,95 @@ def __neg__(self) -> "SimpleFilter": def __repr__(self) -> str: return f"{str(self.field)} filter" + def to_conjunction(self) -> "FilterConjunction": + return self.conjunction_type([self]) + + def to_disjunction(self) -> "FilterDisjunction": + return self.to_conjunction().to_disjunction() + + def check(self, value: Any, operator: Any) -> "SimpleFilter": + return self.__class__(self.field, self.conjunction_type, self.message_type, self.inner_message_type, value, operator) + class StringFilter(SimpleFilter): - def __init__(self, field: Any, conjunction_type: Type["FilterConjunction"], value=None, operator=None): - super().__init__(field, conjunction_type) - self.raw = FilterString() - if value is not None: - self.raw.value = value - if operator is not None: - self.raw.operator = operator + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterString, value=None, operator=None): + super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) def contains(self, value: str) -> "StringFilter": - return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_CONTAINS) + return self.check(value, FILTER_STRING_OPERATOR_CONTAINS) def __eq__(self, value: str) -> "StringFilter": - return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_EQUAL) + return self.check(value, FILTER_STRING_OPERATOR_EQUAL) def __ne__(self, value: str) -> "StringFilter": - return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_NOT_EQUAL) + return self.check(value, FILTER_STRING_OPERATOR_NOT_EQUAL) def __invert__(self) -> "StringFilter": if self.raw.operator == FILTER_STRING_OPERATOR_EQUAL: - return StringFilter(self.field, self.conjunction_type, self.raw.value, FILTER_STRING_OPERATOR_NOT_EQUAL) + return self.check(self.raw.value, FILTER_STRING_OPERATOR_NOT_EQUAL) elif self.raw.operator == FILTER_STRING_OPERATOR_NOT_EQUAL: - return StringFilter(self.field, self.conjunction_type, self.raw.value, FILTER_STRING_OPERATOR_EQUAL) + return self.check(self.raw.value, FILTER_STRING_OPERATOR_EQUAL) elif self.raw.operator == FILTER_STRING_OPERATOR_CONTAINS: - return StringFilter(self.field, self.conjunction_type, self.raw.value, FILTER_STRING_OPERATOR_NOT_CONTAINS) + return self.check(self.raw.value, FILTER_STRING_OPERATOR_NOT_CONTAINS) elif self.raw.operator == FILTER_STRING_OPERATOR_NOT_CONTAINS: - return StringFilter(self.field, self.conjunction_type, self.raw.value, FILTER_STRING_OPERATOR_CONTAINS) + return self.check(self.raw.value, FILTER_STRING_OPERATOR_CONTAINS) else: raise Exception(f"String filter operator {str(self.raw.operator)} for field {str(self.field)} has no inverted equivalent") def startswith(self, value: str) -> "StringFilter": - return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_STARTS_WITH) + return self.check(value, FILTER_STRING_OPERATOR_STARTS_WITH) def endswith(self, value: str) -> "StringFilter": - return StringFilter(self.field, self.conjunction_type, value, FILTER_STRING_OPERATOR_ENDS_WITH) + return self.check(value, FILTER_STRING_OPERATOR_ENDS_WITH) - def to_message(self) -> FilterString: - return self.raw + def to_message(self): + message = self.message_type() + message.field = self.field + message.filter_string = self.raw + return message def __repr__(self) -> str: - return f"{str(self.field)} {str(self.raw.operator)} {str(self.raw.value)}" + return f"{str(self.field)} {str(self.raw.operator)} \"{str(self.raw.value)}\"" + + +class StatusFilter(SimpleFilter): + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], filter_status_type: Type[Message], value=None, operator=None): + super().__init__(field, conjunction_type, message_type, filter_status_type, value, operator) + + def __eq__(self, value) -> "StatusFilter": + return self.check(value, FILTER_STATUS_OPERATOR_EQUAL) + + def __ne__(self, value) -> "StatusFilter": + return self.check(value, FILTER_STATUS_OPERATOR_NOT_EQUAL) + + def __invert__(self) -> "StatusFilter": + if self.raw.operator == FILTER_STATUS_OPERATOR_EQUAL: + return self != self.raw.value + elif self.raw.operator == FILTER_STATUS_OPERATOR_NOT_EQUAL: + return self == self.raw.value + else: + raise Exception(f"Status filter operator {str(self.raw.operator)} for field {str(self.field)} has no inverted equivalent") + + def to_message(self): + message = self.message_type() + message.field = self.field + message.filter_status = self.raw + return message + +class DateFilter(SimpleFilter): + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterDate, value=None, operator=None): + super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) + + def normalize_value(self, value) -> timestamp.Timestamp: + if isinstance(value, timestamp.Timestamp): + return value + if isinstance(value, datetime): + return datetime_to_timestamp(value) + + def __eq__(self, value) -> "DateFilter": + return self.check(self.normalize_value(value), FILTER_DATE_OPERATOR_EQUAL) + + def __ne__(self, value) -> "DateFilter": + return self.check(self.normalize_value(value), FILTER_DATE_OPERATOR_NOT_EQUAL) From 2bcf9979ad382f5cf3ccb3cb9d1332377952dd54 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Thu, 21 Sep 2023 12:01:36 +0200 Subject: [PATCH 061/344] python: Added all filter types --- packages/python/src/armonik/client/tasks.py | 1 + packages/python/src/armonik/common/filter.py | 184 ++++++++++++++----- 2 files changed, 135 insertions(+), 50 deletions(-) diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 0d1b33b7e..dee320762 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -36,6 +36,7 @@ class TaskFieldFilter(enum.Enum): CREATED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT)), TaskFilterAnd, rawFilterField) + class ArmoniKTasks: def __init__(self, grpc_channel: Channel): """ Tasks service client diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 9b43c60f0..2f05ff6ea 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -2,8 +2,6 @@ from google.protobuf.message import Message import google.protobuf.timestamp_pb2 as timestamp from protogen.common.filters_common_pb2 import * -from datetime import datetime -from ..common.helpers import datetime_to_timestamp class Filter: @@ -106,6 +104,16 @@ def to_disjunction(self) -> "FilterDisjunction": class SimpleFilter(Filter): + eq_ = None + ne_ = None + lt_ = None + le_ = None + gt_ = None + ge_ = None + contains_ = None + notcontains_ = None + value_type_ = None + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message], value=None, operator=None): super().__init__() self.field = field @@ -138,8 +146,52 @@ def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjun def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": return self | other + def _verify_value(self, value): + if self.__class__.value_type_ is None or isinstance(value, self.__class__.value_type_): + return + raise Exception(f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead") + + def __eq__(self, value): + return self.check(value, self.__class__.eq_, "==") + + def __ne__(self, value): + return self.check(value, self.__class__.ne_, "!=") + + def __lt__(self, value): + return self.check(value, self.__class__.lt_, "<") + + def __le__(self, value): + return self.check(value, self.__class__.le_, "<=") + + def __gt__(self, value): + return self.check(value, self.__class__.gt_, ">") + + def __ge__(self, value): + return self.check(value, self.__class__.lt_, ">=") + + def contains(self, value): + return self.check(value, self.__class__.contains_, "contains") + def __invert__(self): - raise NotImplementedError(f"{str(self.__class__.__name__)}.__invert__ does not exist (is this type of filter invertible ?)") + if self.raw.operator is None: + raise Exception(f"Cannot invert None operator in class {self.__class__.__name__} for field {str(self.field)}") + if self.raw.operator == self.__class__.eq_: + return self.__ne__(self.raw.value) + if self.raw.operator == self.__class__.ne_: + return self.__eq__(self.raw.value) + if self.raw.operator == self.__class__.lt_: + return self.__ge__(self.raw.value) + if self.raw.operator == self.__class__.le_: + return self.__gt__(self.raw.value) + if self.raw.operator == self.__class__.gt_: + return self.__le__(self.raw.value) + if self.raw.operator == self.__class__.ge_: + return self.__lt__(self.raw.value) + if self.raw.operator == self.__class__.contains_: + return self.check(self.raw.value, self.__class__.notcontains_, "not_contains") + if self.raw.operator == self.__class__.notcontains_: + return self.contains(self.raw.value) + raise Exception(f"{self.__class__.__name__} operator {str(self.raw.operator)} for field {str(self.field)} has no inverted equivalent") def __neg__(self) -> "SimpleFilter": return ~self @@ -153,40 +205,28 @@ def to_conjunction(self) -> "FilterConjunction": def to_disjunction(self) -> "FilterDisjunction": return self.to_conjunction().to_disjunction() - def check(self, value: Any, operator: Any) -> "SimpleFilter": + def check(self, value: Any, operator: Any, operator_str: str = "") -> "SimpleFilter": + self._verify_value(value) + if operator is None: + raise NotImplementedError(f"Operator {operator_str} is not available for {self.__class__.__name__}") return self.__class__(self.field, self.conjunction_type, self.message_type, self.inner_message_type, value, operator) class StringFilter(SimpleFilter): + eq_ = FILTER_STRING_OPERATOR_EQUAL + ne_ = FILTER_STRING_OPERATOR_NOT_EQUAL + contains_ = FILTER_STRING_OPERATOR_CONTAINS + notcontains_ = FILTER_STRING_OPERATOR_NOT_CONTAINS + value_type_ = str + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterString, value=None, operator=None): super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) - def contains(self, value: str) -> "StringFilter": - return self.check(value, FILTER_STRING_OPERATOR_CONTAINS) - - def __eq__(self, value: str) -> "StringFilter": - return self.check(value, FILTER_STRING_OPERATOR_EQUAL) - - def __ne__(self, value: str) -> "StringFilter": - return self.check(value, FILTER_STRING_OPERATOR_NOT_EQUAL) - - def __invert__(self) -> "StringFilter": - if self.raw.operator == FILTER_STRING_OPERATOR_EQUAL: - return self.check(self.raw.value, FILTER_STRING_OPERATOR_NOT_EQUAL) - elif self.raw.operator == FILTER_STRING_OPERATOR_NOT_EQUAL: - return self.check(self.raw.value, FILTER_STRING_OPERATOR_EQUAL) - elif self.raw.operator == FILTER_STRING_OPERATOR_CONTAINS: - return self.check(self.raw.value, FILTER_STRING_OPERATOR_NOT_CONTAINS) - elif self.raw.operator == FILTER_STRING_OPERATOR_NOT_CONTAINS: - return self.check(self.raw.value, FILTER_STRING_OPERATOR_CONTAINS) - else: - raise Exception(f"String filter operator {str(self.raw.operator)} for field {str(self.field)} has no inverted equivalent") - def startswith(self, value: str) -> "StringFilter": - return self.check(value, FILTER_STRING_OPERATOR_STARTS_WITH) + return self.check(value, FILTER_STRING_OPERATOR_STARTS_WITH, "startswith") def endswith(self, value: str) -> "StringFilter": - return self.check(value, FILTER_STRING_OPERATOR_ENDS_WITH) + return self.check(value, FILTER_STRING_OPERATOR_ENDS_WITH, "endswith") def to_message(self): message = self.message_type() @@ -199,43 +239,87 @@ def __repr__(self) -> str: class StatusFilter(SimpleFilter): + eq_ = FILTER_STATUS_OPERATOR_EQUAL + ne_ = FILTER_STATUS_OPERATOR_NOT_EQUAL + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], filter_status_type: Type[Message], value=None, operator=None): super().__init__(field, conjunction_type, message_type, filter_status_type, value, operator) - def __eq__(self, value) -> "StatusFilter": - return self.check(value, FILTER_STATUS_OPERATOR_EQUAL) - - def __ne__(self, value) -> "StatusFilter": - return self.check(value, FILTER_STATUS_OPERATOR_NOT_EQUAL) - - def __invert__(self) -> "StatusFilter": - if self.raw.operator == FILTER_STATUS_OPERATOR_EQUAL: - return self != self.raw.value - elif self.raw.operator == FILTER_STATUS_OPERATOR_NOT_EQUAL: - return self == self.raw.value - else: - raise Exception(f"Status filter operator {str(self.raw.operator)} for field {str(self.field)} has no inverted equivalent") - def to_message(self): message = self.message_type() message.field = self.field message.filter_status = self.raw return message + class DateFilter(SimpleFilter): + eq_ = FILTER_DATE_OPERATOR_EQUAL + ne_ = FILTER_DATE_OPERATOR_NOT_EQUAL + lt_ = FILTER_DATE_OPERATOR_BEFORE + le_ = FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL + gt_ = FILTER_DATE_OPERATOR_AFTER + ge_ = FILTER_DATE_OPERATOR_AFTER_OR_EQUAL + value_type = timestamp.Timestamp + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterDate, value=None, operator=None): super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) - def normalize_value(self, value) -> timestamp.Timestamp: - if isinstance(value, timestamp.Timestamp): - return value - if isinstance(value, datetime): - return datetime_to_timestamp(value) + def to_message(self): + message = self.message_type() + message.field = self.field + message.filter_date = self.raw + return message + + +class NumberFilter(SimpleFilter): + eq_ = FILTER_NUMBER_OPERATOR_EQUAL + ne_ = FILTER_NUMBER_OPERATOR_NOT_EQUAL + lt_ = FILTER_NUMBER_OPERATOR_LESS_THAN + le_ = FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL + gt_ = FILTER_NUMBER_OPERATOR_GREATER_THAN + ge_ = FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL + value_type_ = int + + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterNumber, value=None, operator=None): + super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) + + def to_message(self): + message = self.message_type() + message.field = self.field + message.filter_number = self.raw + return message + + +class BooleanFilter(SimpleFilter): + eq_ = FILTER_BOOLEAN_OPERATOR_IS + value_type_ = bool - def __eq__(self, value) -> "DateFilter": - return self.check(self.normalize_value(value), FILTER_DATE_OPERATOR_EQUAL) + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterBoolean, value=True, operator=FILTER_BOOLEAN_OPERATOR_IS): + super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) - def __ne__(self, value) -> "DateFilter": - return self.check(self.normalize_value(value), FILTER_DATE_OPERATOR_NOT_EQUAL) + def __ne__(self, value: bool) -> "BooleanFilter": + return self.__eq__(not value) + def __invert__(self): + return self.__eq__(not self.raw.value) + def to_message(self): + message = self.message_type() + message.field = self.field + message.filter_boolean = self.raw + return message + + +class ArrayFilter(SimpleFilter): + contains_ = FILTER_ARRAY_OPERATOR_CONTAINS + notcontains_ = FILTER_ARRAY_OPERATOR_NOT_CONTAINS + value_type_ = str + + def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterArray, value=None, operator=None): + super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) + + def to_message(self): + message = self.message_type() + message.field = self.field + message.filter_array = self.raw + return message From 359fbdc4f2c07095c1b14e29d97cda098ea74c71 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Thu, 21 Sep 2023 14:32:54 +0200 Subject: [PATCH 062/344] python: added list task --- packages/python/src/armonik/client/tasks.py | 39 +++++++++++++++---- .../python/src/armonik/common/__init__.py | 2 +- .../python/src/armonik/common/enumwrapper.py | 10 ++++- packages/python/src/armonik/common/filter.py | 2 +- packages/python/src/armonik/worker/worker.py | 4 +- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index dee320762..f283e885e 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -1,12 +1,12 @@ from grpc import Channel -from typing import Type -import enum +from typing import Type, Union, cast, Tuple, List -from ..common import Task -from ..common.filter import StringFilter, FilterDisjunction, FilterConjunction, StatusFilter, DateFilter +from ..common import Task, Direction +from ..common.filter import StringFilter, FilterDisjunction, FilterConjunction, StatusFilter, DateFilter, NumberFilter, SimpleFilter from ..protogen.client.tasks_service_pb2_grpc import TasksStub -from ..protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse +from ..protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse, ListTasksRequest, ListTasksDetailedResponse from ..protogen.common.tasks_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus +from ..protogen.common.sort_direction_pb2 import SortDirection from ..protogen.common.tasks_fields_pb2 import * @@ -27,14 +27,34 @@ def conjunction_type(self) -> Type["FilterConjunction"]: return TaskFilterAnd -class TaskFieldFilter(enum.Enum): +class TaskFieldFilter: TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID)), TaskFilterAnd, rawFilterField) SESSION_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID)), TaskFilterAnd, rawFilterField) OWNER_POD_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID)), TaskFilterAnd, rawFilterField) INITIAL_TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID)), TaskFilterAnd, rawFilterField) STATUS = StatusFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STATUS)), TaskFilterAnd, rawFilterField, rawFilterStatus) CREATED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT)), TaskFilterAnd, rawFilterField) - + SUBMITTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT)), TaskFilterAnd, rawFilterField) + STARTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT)), TaskFilterAnd, rawFilterField) + ENDED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT)), TaskFilterAnd, rawFilterField) + POD_TLL = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL)), TaskFilterAnd, rawFilterField) + POD_HOSTNAME = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME)), TaskFilterAnd, rawFilterField) + RECEIVED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT)), TaskFilterAnd, rawFilterField) + ACQUIRED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT)), TaskFilterAnd, rawFilterField) + ERROR = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ERROR)), TaskFilterAnd, rawFilterField) + + MAX_RETRIES = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_RETRIES)), TaskFilterAnd, rawFilterField) + PRIORITY = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PRIORITY)), TaskFilterAnd, rawFilterField) + PARTITION_ID = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PARTITION_ID)), TaskFilterAnd, rawFilterField) + APPLICATION_NAME = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAME)), TaskFilterAnd, rawFilterField) + APPLICATION_VERSION = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION)), TaskFilterAnd, rawFilterField) + APPLICATION_NAMESPACE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE)), TaskFilterAnd, rawFilterField) + APPLICATION_SERVICE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE)), TaskFilterAnd, rawFilterField) + ENGINE_TYPE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE)), TaskFilterAnd, rawFilterField) + + @classmethod + def task_options_key(_, option_key:str) -> StringFilter: + return StringFilter(TaskField(task_option_generic_field=TaskOptionGenericField(field=option_key)), TaskFilterAnd, rawFilterField) class ArmoniKTasks: @@ -57,3 +77,8 @@ def get_task(self, task_id: str) -> Task: """ task_response: GetTaskResponse = self._client.GetTask(GetTaskRequest(task_id=task_id)) return Task.from_message(task_response.task) + + def list_tasks(self, task_filter: Union[SimpleFilter, TaskFilterAnd, TaskFilter], with_errors: bool = False, page: int = 0, page_size: int = 1000, sort_field: SimpleFilter = TaskFieldFilter.TASK_ID, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Task]]: + request = ListTasksRequest(page=page, page_size=page_size, filters=task_filter.to_disjunction().to_message(), sort=ListTasksRequest.Sort(field=cast(TaskField, sort_field.field), direction=sort_direction), with_errors=with_errors) + list_response: ListTasksDetailedResponse = self._client.ListTasksDetailed(request) + return list_response.total, [Task.from_message(t) for t in list_response.tasks] diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 0365e5004..48a46de37 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,4 +1,4 @@ from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability -from .enumwrapper import HealthCheckStatus, TaskStatus +from .enumwrapper import HealthCheckStatus, TaskStatus, Direction from .filter import Filter, StringFilter, FilterConjunction, FilterDisjunction, StatusFilter diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 3c646a796..e4183ddf8 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -2,17 +2,18 @@ from ..protogen.common.task_status_pb2 import * from ..protogen.common.worker_common_pb2 import HealthCheckReply +from ..protogen.common.sort_direction_pb2 import SORT_DIRECTION_ASC, SORT_DIRECTION_DESC # This file is necessary because the grpc types aren't considered proper types -class HealthCheckStatus(enum.Enum): +class HealthCheckStatus: NOT_SERVING = HealthCheckReply.NOT_SERVING SERVING = HealthCheckReply.SERVING UNKNOWN = HealthCheckReply.UNKNOWN -class TaskStatus(enum.Enum): +class TaskStatus: CANCELLED = TASK_STATUS_CANCELLED CANCELLING = TASK_STATUS_CANCELLING COMPLETED = TASK_STATUS_COMPLETED @@ -24,3 +25,8 @@ class TaskStatus(enum.Enum): SUBMITTED = TASK_STATUS_SUBMITTED TIMEOUT = TASK_STATUS_TIMEOUT UNSPECIFIED = TASK_STATUS_UNSPECIFIED + + +class Direction: + ASC = SORT_DIRECTION_ASC + DESC = SORT_DIRECTION_DESC diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 2f05ff6ea..a172d1293 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -1,7 +1,7 @@ from typing import List, Any, Type, Union from google.protobuf.message import Message import google.protobuf.timestamp_pb2 as timestamp -from protogen.common.filters_common_pb2 import * +from ..protogen.common.filters_common_pb2 import * class Filter: diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index 9ac1a6884..eb34805c8 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -15,7 +15,7 @@ class ArmoniKWorker(WorkerServicer): - def __init__(self, agent_channel: Channel, processing_function: Callable[[TaskHandler], Output], health_check: Callable[[], HealthCheckStatus] = lambda: HealthCheckStatus.SERVING, logger=ClefLogger.getLogger("ArmoniKWorker")): + def __init__(self, agent_channel: Channel, processing_function: Callable[[TaskHandler], Output], health_check: Callable[[], HealthCheckReply.ServingStatus] = lambda: HealthCheckStatus.SERVING, logger=ClefLogger.getLogger("ArmoniKWorker")): """Creates a worker for ArmoniK Args: @@ -54,4 +54,4 @@ def Process(self, request_iterator, context) -> Union[ProcessReply, None]: self._logger.exception(f"Failed task {''.join(traceback.format_exception(type(e) ,e, e.__traceback__))}", exc_info=e) def HealthCheck(self, request: Empty, context) -> HealthCheckReply: - return HealthCheckReply(status=self.health_check().value) + return HealthCheckReply(status=self.health_check()) From 8b2d1054eb76509b28df3a03877fbdfe7668d7dd Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Thu, 21 Sep 2023 18:20:37 +0200 Subject: [PATCH 063/344] Fix tests and added filters tests --- packages/python/proto2python.sh | 2 +- packages/python/src/armonik/client/results.py | 5 +- .../python/src/armonik/client/submitter.py | 13 +- packages/python/src/armonik/client/tasks.py | 1 + .../python/src/armonik/common/enumwrapper.py | 2 +- packages/python/src/armonik/common/filter.py | 114 ++++++++---------- packages/python/src/armonik/common/helpers.py | 5 +- packages/python/src/armonik/common/objects.py | 8 +- .../python/src/armonik/worker/seqlogger.py | 1 + .../python/src/armonik/worker/taskhandler.py | 4 +- packages/python/src/armonik/worker/worker.py | 1 + packages/python/tests/filters_test.py | 7 ++ packages/python/tests/submitter_test.py | 10 +- packages/python/tests/tasks_test.py | 86 ++++++++++++- 14 files changed, 167 insertions(+), 92 deletions(-) create mode 100644 packages/python/tests/filters_test.py diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh index 786a047c1..f483b0541 100644 --- a/packages/python/proto2python.sh +++ b/packages/python/proto2python.sh @@ -32,7 +32,7 @@ mkdir -p $ARMONIK_WORKER $ARMONIK_CLIENT $ARMONIK_COMMON $PACKAGE_PATH python -m pip install --upgrade pip python -m venv $PYTHON_VENV source $PYTHON_VENV/bin/activate -python -m pip install build grpcio grpcio-tools click pytest setuptools_scm[toml] +python -m pip install build grpcio==1.56.2 grpcio-tools==1.56.2 click pytest setuptools_scm[toml] unset proto_files for proto in ${armonik_worker_files[@]}; do diff --git a/packages/python/src/armonik/client/results.py b/packages/python/src/armonik/client/results.py index b60bc4967..642fc346f 100644 --- a/packages/python/src/armonik/client/results.py +++ b/packages/python/src/armonik/client/results.py @@ -1,3 +1,4 @@ +from __future__ import annotations from grpc import Channel from typing import List, Dict, cast @@ -15,5 +16,5 @@ def __init__(self, grpc_channel: Channel): """ self._client = ResultsStub(grpc_channel) - def get_results_ids(self, session_id: str, names : List[str]) -> Dict[str, str]: - return {r.name : r.result_id for r in cast(CreateResultsMetaDataResponse, self._client.CreateResultsMetaData(CreateResultsMetaDataRequest(results=[CreateResultsMetaDataRequest.ResultCreate(name = n) for n in names], session_id=session_id))).results} \ No newline at end of file + def get_results_ids(self, session_id: str, names: List[str]) -> Dict[str, str]: + return {r.name : r.result_id for r in cast(CreateResultsMetaDataResponse, self._client.CreateResultsMetaData(CreateResultsMetaDataRequest(results=[CreateResultsMetaDataRequest.ResultCreate(name = n) for n in names], session_id=session_id))).results} diff --git a/packages/python/src/armonik/client/submitter.py b/packages/python/src/armonik/client/submitter.py index 0623555c9..3b9e402d2 100644 --- a/packages/python/src/armonik/client/submitter.py +++ b/packages/python/src/armonik/client/submitter.py @@ -1,14 +1,15 @@ -import uuid +from __future__ import annotations from typing import Optional, List, Tuple, Dict, Union, Generator from grpc import Channel -from ..common import get_task_filter, TaskOptions, TaskDefinition, Task, TaskStatus, ResultAvailability +from ..common import get_task_filter, TaskOptions, TaskDefinition, Task, ResultAvailability from ..protogen.client.submitter_service_pb2_grpc import SubmitterStub from ..protogen.common.objects_pb2 import Empty, TaskRequest, ResultRequest, DataChunk, InitTaskRequest, \ TaskRequestHeader, Configuration, Session, TaskOptions as InnerTaskOptions from ..protogen.common.submitter_common_pb2 import CreateSessionRequest, GetTaskStatusRequest, CreateLargeTaskRequest, \ - WaitRequest + WaitRequest, GetTaskStatusReply +from ..protogen.common.task_status_pb2 import TaskStatus class ArmoniKSubmitter: @@ -135,8 +136,8 @@ def get_task_status(self, task_ids: List[str]) -> Dict[str, TaskStatus]: """ request = GetTaskStatusRequest() request.task_ids.extend(task_ids) - reply = self._client.GetTaskStatus(request) - return {s.task_id: TaskStatus(s.status) for s in reply.id_statuses} + reply: GetTaskStatusReply = self._client.GetTaskStatus(request) + return {s.task_id: s.status for s in reply.id_statuses} def wait_for_completion(self, session_ids: Optional[List[str]] = None, @@ -167,7 +168,7 @@ def wait_for_completion(self, Dictionary containing the number of tasks in each status after waiting for completion """ - return {TaskStatus(sc.status): sc.count for sc in self._client.WaitForCompletion( + return {sc.status: sc.count for sc in self._client.WaitForCompletion( WaitRequest(filter=get_task_filter(session_ids, task_ids, included_statuses, excluded_statuses), stop_on_first_task_error=stop_on_first_task_error, stop_on_first_task_cancellation=stop_on_first_task_cancellation)).values} diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index f283e885e..8720f2b05 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -1,3 +1,4 @@ +from __future__ import annotations from grpc import Channel from typing import Type, Union, cast, Tuple, List diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index e4183ddf8..0b0218f0f 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -1,4 +1,4 @@ -import enum +from __future__ import annotations from ..protogen.common.task_status_pb2 import * from ..protogen.common.worker_common_pb2 import HealthCheckReply diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index a172d1293..9f99a316c 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -1,3 +1,4 @@ +from __future__ import annotations from typing import List, Any, Type, Union from google.protobuf.message import Message import google.protobuf.timestamp_pb2 as timestamp @@ -48,7 +49,7 @@ def __repr__(self): def conjunction_type(self) -> Type["FilterConjunction"]: raise NotImplementedError(f"{str(self.__class__.__name__)}.conjunction_type() is not implemented") - def to_message(self): + def to_message(self) -> Message: raw = self.message_type()() setattr(raw, "or", [f.to_message() for f in self.filters]) return raw @@ -85,13 +86,13 @@ def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjun def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": return self | other - def __repr__(self): + def __repr__(self) -> str: return ' and '.join([str(f) for f in self.filters]) def disjunction_type(self) -> Type["FilterDisjunction"]: raise NotImplementedError(f"{str(self.__class__.__name__)}.disjunction_type() is not implemented") - def to_message(self): + def to_message(self) -> Message: raw = self.message_type()() setattr(raw, "and", [f.to_message() for f in self.filters]) return raw @@ -122,11 +123,8 @@ def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], raise Exception(f"{conjunction_type.__name__} is not a subclass of FilterConjunction") self.conjunction_type = conjunction_type self.inner_message_type = inner_message_type - self.raw = inner_message_type() - if value is not None: - self.raw.value = value - if operator is not None: - self.raw.operator = operator + self.value = value + self.operator = operator def __and__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": if isinstance(other, SimpleFilter): @@ -151,47 +149,47 @@ def _verify_value(self, value): return raise Exception(f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead") - def __eq__(self, value): + def __eq__(self, value) -> SimpleFilter: return self.check(value, self.__class__.eq_, "==") - def __ne__(self, value): + def __ne__(self, value) -> SimpleFilter: return self.check(value, self.__class__.ne_, "!=") - def __lt__(self, value): + def __lt__(self, value) -> SimpleFilter: return self.check(value, self.__class__.lt_, "<") - def __le__(self, value): + def __le__(self, value) -> SimpleFilter: return self.check(value, self.__class__.le_, "<=") - def __gt__(self, value): + def __gt__(self, value) -> SimpleFilter: return self.check(value, self.__class__.gt_, ">") - def __ge__(self, value): + def __ge__(self, value) -> SimpleFilter: return self.check(value, self.__class__.lt_, ">=") - def contains(self, value): + def contains(self, value) -> SimpleFilter: return self.check(value, self.__class__.contains_, "contains") - def __invert__(self): - if self.raw.operator is None: + def __invert__(self) -> SimpleFilter: + if self.operator is None: raise Exception(f"Cannot invert None operator in class {self.__class__.__name__} for field {str(self.field)}") - if self.raw.operator == self.__class__.eq_: - return self.__ne__(self.raw.value) - if self.raw.operator == self.__class__.ne_: - return self.__eq__(self.raw.value) - if self.raw.operator == self.__class__.lt_: - return self.__ge__(self.raw.value) - if self.raw.operator == self.__class__.le_: - return self.__gt__(self.raw.value) - if self.raw.operator == self.__class__.gt_: - return self.__le__(self.raw.value) - if self.raw.operator == self.__class__.ge_: - return self.__lt__(self.raw.value) - if self.raw.operator == self.__class__.contains_: - return self.check(self.raw.value, self.__class__.notcontains_, "not_contains") - if self.raw.operator == self.__class__.notcontains_: - return self.contains(self.raw.value) - raise Exception(f"{self.__class__.__name__} operator {str(self.raw.operator)} for field {str(self.field)} has no inverted equivalent") + if self.operator == self.__class__.eq_: + return self.__ne__(self.value) + if self.operator == self.__class__.ne_: + return self.__eq__(self.value) + if self.operator == self.__class__.lt_: + return self.__ge__(self.value) + if self.operator == self.__class__.le_: + return self.__gt__(self.value) + if self.operator == self.__class__.gt_: + return self.__le__(self.value) + if self.operator == self.__class__.ge_: + return self.__lt__(self.value) + if self.operator == self.__class__.contains_: + return self.check(self.value, self.__class__.notcontains_, "not_contains") + if self.operator == self.__class__.notcontains_: + return self.contains(self.value) + raise Exception(f"{self.__class__.__name__} operator {str(self.operator)} for field {str(self.field)} has no inverted equivalent") def __neg__(self) -> "SimpleFilter": return ~self @@ -228,14 +226,11 @@ def startswith(self, value: str) -> "StringFilter": def endswith(self, value: str) -> "StringFilter": return self.check(value, FILTER_STRING_OPERATOR_ENDS_WITH, "endswith") - def to_message(self): - message = self.message_type() - message.field = self.field - message.filter_string = self.raw - return message + def to_message(self) -> Message: + return self.message_type(field=self.field, filter_string=self.inner_message_type(value=self.value, operator=self.operator)) def __repr__(self) -> str: - return f"{str(self.field)} {str(self.raw.operator)} \"{str(self.raw.value)}\"" + return f"{str(self.field)} {str(self.operator)} \"{str(self.value)}\"" class StatusFilter(SimpleFilter): @@ -245,11 +240,8 @@ class StatusFilter(SimpleFilter): def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], filter_status_type: Type[Message], value=None, operator=None): super().__init__(field, conjunction_type, message_type, filter_status_type, value, operator) - def to_message(self): - message = self.message_type() - message.field = self.field - message.filter_status = self.raw - return message + def to_message(self) -> Message: + return self.message_type(field=self.field, filter_status=self.inner_message_type(value=self.value, operator=self.operator)) class DateFilter(SimpleFilter): @@ -264,11 +256,8 @@ class DateFilter(SimpleFilter): def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterDate, value=None, operator=None): super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) - def to_message(self): - message = self.message_type() - message.field = self.field - message.filter_date = self.raw - return message + def to_message(self) -> Message: + return self.message_type(field=self.field, filter_date=self.inner_message_type(value=self.value, operator=self.operator)) class NumberFilter(SimpleFilter): @@ -283,11 +272,8 @@ class NumberFilter(SimpleFilter): def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterNumber, value=None, operator=None): super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) - def to_message(self): - message = self.message_type() - message.field = self.field - message.filter_number = self.raw - return message + def to_message(self) -> Message: + return self.message_type(field=self.field, filter_number=self.inner_message_type(value=self.value, operator=self.operator)) class BooleanFilter(SimpleFilter): @@ -300,14 +286,11 @@ def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], def __ne__(self, value: bool) -> "BooleanFilter": return self.__eq__(not value) - def __invert__(self): - return self.__eq__(not self.raw.value) + def __invert__(self) -> "BooleanFilter": + return self.__eq__(not self.value) - def to_message(self): - message = self.message_type() - message.field = self.field - message.filter_boolean = self.raw - return message + def to_message(self) -> Message: + return self.message_type(field=self.field, filter_boolean=self.inner_message_type(value=self.value, operator=self.operator)) class ArrayFilter(SimpleFilter): @@ -318,8 +301,5 @@ class ArrayFilter(SimpleFilter): def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterArray, value=None, operator=None): super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) - def to_message(self): - message = self.message_type() - message.field = self.field - message.filter_array = self.raw - return message + def to_message(self) -> Message: + return self.message_type(field=self.field, filter_array=self.inner_message_type(value=self.value, operator=self.operator)) diff --git a/packages/python/src/armonik/common/helpers.py b/packages/python/src/armonik/common/helpers.py index cbc08bba1..e174e2f42 100644 --- a/packages/python/src/armonik/common/helpers.py +++ b/packages/python/src/armonik/common/helpers.py @@ -1,3 +1,4 @@ +from __future__ import annotations from datetime import timedelta, datetime, timezone from typing import List, Optional @@ -37,9 +38,9 @@ def get_task_filter(session_ids: Optional[List[str]] = None, task_ids: Optional[ if task_ids: task_filter.task.ids.extend(task_ids) if included_statuses: - task_filter.included.statuses.extend([t.value for t in included_statuses]) + task_filter.included.statuses.extend(included_statuses) if excluded_statuses: - task_filter.excluded.statuses.extend([t.value for t in excluded_statuses]) + task_filter.excluded.statuses.extend(excluded_statuses) return task_filter diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 02d6f1f7b..453cb5c56 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -1,3 +1,4 @@ +from __future__ import annotations from dataclasses import dataclass, field from datetime import timedelta, datetime from typing import Optional, List, Dict @@ -5,6 +6,7 @@ from ..protogen.common.tasks_common_pb2 import TaskDetailed from .helpers import duration_to_timedelta, timedelta_to_duration, timestamp_to_datetime from ..protogen.common.objects_pb2 import Empty, Output as WorkerOutput, TaskOptions as RawTaskOptions +from ..protogen.common.task_status_pb2 import TaskStatus as RawTaskStatus from .enumwrapper import TaskStatus @@ -83,7 +85,7 @@ class Task: data_dependencies: List[str] = field(default_factory=list) expected_output_ids: List[str] = field(default_factory=list) retry_of_ids: List[str] = field(default_factory=list) - status: TaskStatus = TaskStatus.UNSPECIFIED + status: RawTaskStatus = TaskStatus.UNSPECIFIED status_message: Optional[str] = None options: Optional[TaskOptions] = None created_at: Optional[datetime] = None @@ -109,7 +111,7 @@ def refresh(self, task_client) -> None: self.data_dependencies = result.data_dependencies self.expected_output_ids = result.expected_output_ids self.retry_of_ids = result.retry_of_ids - self.status = TaskStatus(result.status) + self.status = result.status self.status_message = result.status_message self.options = result.options self.created_at = result.created_at @@ -133,7 +135,7 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": data_dependencies=list(task_raw.data_dependencies), expected_output_ids=list(task_raw.expected_output_ids), retry_of_ids=list(task_raw.retry_of_ids), - status=TaskStatus(task_raw.status), + status=task_raw.status, status_message=task_raw.status_message, options=TaskOptions.from_message(task_raw.options), created_at=timestamp_to_datetime(task_raw.created_at), diff --git a/packages/python/src/armonik/worker/seqlogger.py b/packages/python/src/armonik/worker/seqlogger.py index 79637bce1..4d5d48ec7 100644 --- a/packages/python/src/armonik/worker/seqlogger.py +++ b/packages/python/src/armonik/worker/seqlogger.py @@ -1,3 +1,4 @@ +from __future__ import annotations import logging import sys import json diff --git a/packages/python/src/armonik/worker/taskhandler.py b/packages/python/src/armonik/worker/taskhandler.py index ec70a27bd..9d8ade962 100644 --- a/packages/python/src/armonik/worker/taskhandler.py +++ b/packages/python/src/armonik/worker/taskhandler.py @@ -1,4 +1,4 @@ -import uuid +from __future__ import annotations from typing import Optional, Dict, List, Tuple, Union, cast from ..common import TaskOptions, TaskDefinition, Task @@ -141,7 +141,7 @@ def result_stream(): result_reply = self._client.SendResult(result_stream()) if result_reply.WhichOneof("type") == "error": raise Exception(f"Cannot send result id={key}") - + def get_results_ids(self, names : List[str]) -> Dict[str, str]: return {r.name : r.result_id for r in cast(CreateResultsMetaDataResponse, self._client.CreateResultsMetaData(CreateResultsMetaDataRequest(results=[CreateResultsMetaDataRequest.ResultCreate(name = n) for n in names], session_id=self.session_id, communication_token=self.token))).results} diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index eb34805c8..19db04f38 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -1,3 +1,4 @@ +from __future__ import annotations import traceback from concurrent import futures from typing import Callable, Union diff --git a/packages/python/tests/filters_test.py b/packages/python/tests/filters_test.py new file mode 100644 index 000000000..ceb184d43 --- /dev/null +++ b/packages/python/tests/filters_test.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 +import datetime +import logging +import pytest + +logging.basicConfig() +logging.getLogger().setLevel(logging.INFO) diff --git a/packages/python/tests/submitter_test.py b/packages/python/tests/submitter_test.py index b57de1c1a..c849efdc0 100644 --- a/packages/python/tests/submitter_test.py +++ b/packages/python/tests/submitter_test.py @@ -195,8 +195,8 @@ def test_armonik_submitter_should_list_tasks(session_ids, task_ids, included_sta assert inner.task_filter is not None assert all(map(lambda x: x[1] == session_ids[x[0]], enumerate(inner.task_filter.session.ids))) assert all(map(lambda x: x[1] == task_ids[x[0]], enumerate(inner.task_filter.task.ids))) - assert all(map(lambda x: x[1] == included_statuses[x[0]].value, enumerate(inner.task_filter.included.statuses))) - assert all(map(lambda x: x[1] == excluded_statuses[x[0]].value, enumerate(inner.task_filter.excluded.statuses))) + assert all(map(lambda x: x[1] == included_statuses[x[0]], enumerate(inner.task_filter.included.statuses))) + assert all(map(lambda x: x[1] == excluded_statuses[x[0]], enumerate(inner.task_filter.excluded.statuses))) else: with pytest.raises(ValueError): _ = submitter.list_tasks(session_ids=session_ids, task_ids=task_ids, included_statuses=included_statuses, @@ -223,7 +223,7 @@ def test_armonik_submitter_should_get_status(): [ResultReply(result=DataChunk(data="payload".encode("utf-8"))), ResultReply(result=DataChunk(data_complete=True)), ResultReply(result=DataChunk(data="payload".encode("utf-8")))], [ResultReply( - error=TaskError(task_id="TaskId", errors=[Error(task_status=TaskStatus.ERROR.value, detail="TestError")]))], + error=TaskError(task_id="TaskId", errors=[Error(task_status=TaskStatus.ERROR, detail="TestError")]))], ] get_result_should_succeed = [ @@ -300,9 +300,9 @@ def test_armonik_submitter_wait_completion(session_ids, task_ids, included_statu assert inner.wait_request is not None assert all(map(lambda x: x[1] == session_ids[x[0]], enumerate(inner.wait_request.filter.session.ids))) assert all(map(lambda x: x[1] == task_ids[x[0]], enumerate(inner.wait_request.filter.task.ids))) - assert all(map(lambda x: x[1] == included_statuses[x[0]].value, + assert all(map(lambda x: x[1] == included_statuses[x[0]], enumerate(inner.wait_request.filter.included.statuses))) - assert all(map(lambda x: x[1] == excluded_statuses[x[0]].value, + assert all(map(lambda x: x[1] == excluded_statuses[x[0]], enumerate(inner.wait_request.filter.excluded.statuses))) assert not inner.wait_request.stop_on_first_task_error assert not inner.wait_request.stop_on_first_task_cancellation diff --git a/packages/python/tests/tasks_test.py b/packages/python/tests/tasks_test.py index a47ed98b9..a7fd1e44d 100644 --- a/packages/python/tests/tasks_test.py +++ b/packages/python/tests/tasks_test.py @@ -1,12 +1,22 @@ #!/usr/bin/env python3 -from typing import Optional +import dataclasses +from typing import Optional, List, Any, Union +from google.protobuf.timestamp_pb2 import Timestamp from datetime import datetime + +import pytest + from .common import DummyChannel from armonik.client import ArmoniKTasks +from armonik.client.tasks import TaskFieldFilter from armonik.common import TaskStatus, datetime_to_timestamp, Task +from armonik.common.filter import StringFilter, FilterDisjunction, FilterConjunction, SimpleFilter from armonik.protogen.client.tasks_service_pb2_grpc import TasksStub from armonik.protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse, TaskDetailed +from armonik.protogen.common.tasks_filters_pb2 import Filters, FilterField +from armonik.protogen.common.filters_common_pb2 import * +from armonik.protogen.common.tasks_fields_pb2 import * from .submitter_test import default_task_option @@ -20,9 +30,9 @@ def GetTask(self, request: GetTaskRequest) -> GetTaskResponse: self.task_request = request raw = TaskDetailed(id="TaskId", session_id="SessionId", owner_pod_id="PodId", parent_task_ids=["ParentTaskId"], data_dependencies=["DD"], expected_output_ids=["EOK"], retry_of_ids=["RetryId"], - status=TaskStatus.COMPLETED.value, status_message="Message", + status=TaskStatus.COMPLETED, status_message="Message", options=default_task_option.to_message(), - created_at=datetime_to_timestamp(datetime.now()), + created_at=datetime_to_timestamp(datetime.now()), started_at=datetime_to_timestamp(datetime.now()), submitted_at=datetime_to_timestamp(datetime.now()), ended_at=datetime_to_timestamp(datetime.now()), pod_ttl=datetime_to_timestamp(datetime.now()), @@ -61,3 +71,73 @@ def test_task_refresh(): assert current.parent_task_ids == ["ParentTaskId"] assert current.output assert current.output.success + + +def test_task_filters(): + filt: StringFilter = TaskFieldFilter.TASK_ID == "TaskId" + message = filt.to_message() + assert isinstance(message, FilterField) + assert message.field.WhichOneof("field") == "task_summary_field" + assert message.field.task_summary_field.field == TASK_SUMMARY_ENUM_FIELD_TASK_ID + assert message.filter_string.value == "TaskId" + assert message.filter_string.operator == FILTER_STRING_OPERATOR_EQUAL + + filt: StringFilter = TaskFieldFilter.TASK_ID != "TaskId" + message = filt.to_message() + assert isinstance(message, FilterField) + assert message.field.WhichOneof("field") == "task_summary_field" + assert message.field.task_summary_field.field == TASK_SUMMARY_ENUM_FIELD_TASK_ID + assert message.filter_string.value == "TaskId" + assert message.filter_string.operator == FILTER_STRING_OPERATOR_NOT_EQUAL + + +@dataclasses.dataclass +class SimpleFieldFilter: + field: Any + value: Any + operator: Any + + +@pytest.mark.parametrize("filt,n_or,n_and,filters", [ + ( + (TaskFieldFilter.INITIAL_TASK_ID == "TestId"), + 1, [1], + [ + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID, "TestId", FILTER_STRING_OPERATOR_EQUAL) + ] + ), + ( + (TaskFieldFilter.APPLICATION_NAME.contains("TestName") & (TaskFieldFilter.CREATED_AT > Timestamp(seconds=1000, nanos=500))), + 1, [2], + [ + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_NAME, "TestName", FILTER_STRING_OPERATOR_CONTAINS), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_CREATED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_AFTER) + ] + ), + ( + (((TaskFieldFilter.MAX_RETRIES <= 3) & ~(TaskFieldFilter.SESSION_ID == "SessionId")) | (TaskFieldFilter.task_options_key("MyKey").startswith("Start"))), + 2, [1, 2], + [ + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_MAX_RETRIES, 3, FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_SESSION_ID, "SessionId", FILTER_STRING_OPERATOR_NOT_EQUAL), + SimpleFieldFilter("MyKey", "Start", FILTER_STRING_OPERATOR_STARTS_WITH) + ] + ) +]) +def test_filter_combination(filt: Union[SimpleFilter, FilterConjunction, FilterDisjunction], n_or: int, n_and: List[int], filters: List[SimpleFieldFilter]): + filt = filt.to_disjunction() + assert len(filt.filters) == n_or + sorted_n_and = sorted(n_and) + sorted_actual = sorted([len(f.filters) for f in filt.filters]) + assert len(sorted_n_and) == len(sorted_actual) + assert all((sorted_n_and[i] == sorted_actual[i] for i in range(len(sorted_actual)))) + for f in filt.filters: + for ff in f.filters: + field_value = getattr(ff.field, ff.field.WhichOneof("field")).field + for i, expected in enumerate(filters): + if expected.field == field_value and expected.value == ff.value and expected.operator == ff.operator: + filters.pop(i) + break + else: + assert False + assert len(filters) == 0 From 82c24686617c2aebf7b42927ce0fe8aeb6722006 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 22 Sep 2023 17:06:01 +0200 Subject: [PATCH 064/344] python: functionnal filters and list task --- examples/python/client.py | 18 +- packages/python/src/armonik/client/tasks.py | 38 +++- .../python/src/armonik/common/enumwrapper.py | 6 +- packages/python/src/armonik/common/filter.py | 164 ++++++++++++++++-- packages/python/tests/filters_test.py | 7 - packages/python/tests/tasks_test.py | 26 +++ 6 files changed, 235 insertions(+), 24 deletions(-) delete mode 100644 packages/python/tests/filters_test.py diff --git a/examples/python/client.py b/examples/python/client.py index a996de3b5..399fc0018 100644 --- a/examples/python/client.py +++ b/examples/python/client.py @@ -2,7 +2,8 @@ import grpc import argparse from typing import cast -from armonik.client import ArmoniKSubmitter, ArmoniKResult +from armonik.client import ArmoniKSubmitter, ArmoniKResult, ArmoniKTasks +from armonik.client.tasks import TaskFieldFilter from armonik.common import TaskDefinition, TaskOptions from datetime import timedelta, datetime from common import Payload, Result @@ -14,6 +15,7 @@ def parse_arguments(): parser.add_argument("-p", "--partition", type=str, help="Partition used for the worker") parser.add_argument("-v", "--values", type=float, help="List of values to compute instead of x in [0, n[", nargs='+') parser.add_argument("-n", "--nfirst", type=int, help="Compute from 0 inclusive to n exclusive, n=10 by default", default=10) + parser.add_argument("-l", "--list", action="store_true", help="List tasks of the session at the end") return parser.parse_args() @@ -61,6 +63,20 @@ def main(): # Result is in error errors = "\n".join(reply.errors) print(f'Errors : {errors}') + + # List tasks + if args.list: + print(f"Listing tasks of session {session_id}") + # Create the tasks client + tasks_client = ArmoniKTasks(channel) + + # Request listing of tasks from the session + total_tasks, tasks = tasks_client.list_tasks(TaskFieldFilter.SESSION_ID == session_id) + print(f"Found {total_tasks} tasks in total for the session {session_id}") + + for t in tasks: + print(t) + except KeyboardInterrupt: # If we stop the script, cancel the session client.cancel_session(session_id) diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 8720f2b05..28f4a6c3e 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -13,6 +13,9 @@ class TaskFilterAnd(FilterConjunction): + """ + Conjunction of task filters + """ def disjunction_type(self) -> Type["FilterDisjunction"]: return TaskFilter @@ -21,6 +24,9 @@ def message_type(self) -> Type: class TaskFilter(FilterDisjunction): + """ + Disjunction of task filters + """ def message_type(self) -> Type: return rawFilters @@ -29,6 +35,9 @@ def conjunction_type(self) -> Type["FilterConjunction"]: class TaskFieldFilter: + """ + Enumeration of the available filters + """ TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID)), TaskFilterAnd, rawFilterField) SESSION_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID)), TaskFilterAnd, rawFilterField) OWNER_POD_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID)), TaskFilterAnd, rawFilterField) @@ -38,7 +47,7 @@ class TaskFieldFilter: SUBMITTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT)), TaskFilterAnd, rawFilterField) STARTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT)), TaskFilterAnd, rawFilterField) ENDED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT)), TaskFilterAnd, rawFilterField) - POD_TLL = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL)), TaskFilterAnd, rawFilterField) + POD_TTL = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL)), TaskFilterAnd, rawFilterField) POD_HOSTNAME = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME)), TaskFilterAnd, rawFilterField) RECEIVED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT)), TaskFilterAnd, rawFilterField) ACQUIRED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT)), TaskFilterAnd, rawFilterField) @@ -54,7 +63,15 @@ class TaskFieldFilter: ENGINE_TYPE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE)), TaskFilterAnd, rawFilterField) @classmethod - def task_options_key(_, option_key:str) -> StringFilter: + def task_options_key(cls, option_key: str) -> StringFilter: + """ + Filter for the TaskOptions.Options dictionary + Args: + option_key: key in the dictionary + + Returns: + Corresponding filter + """ return StringFilter(TaskField(task_option_generic_field=TaskOptionGenericField(field=option_key)), TaskFilterAnd, rawFilterField) @@ -80,6 +97,23 @@ def get_task(self, task_id: str) -> Task: return Task.from_message(task_response.task) def list_tasks(self, task_filter: Union[SimpleFilter, TaskFilterAnd, TaskFilter], with_errors: bool = False, page: int = 0, page_size: int = 1000, sort_field: SimpleFilter = TaskFieldFilter.TASK_ID, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Task]]: + """List tasks + + If the total returned exceeds the requested page size, you may want to use this function again and ask for subsequent pages. + + Args: + task_filter: Filter for the tasks to be listed + with_errors: Retrieve the error if the task had errors, defaults to false + page: page number to request, this can be useful when paginating the result, defaults to 0 + page_size: size of a page, defaults to 1000 + sort_field: field on which to sort the resulting list, defaults to the task_id + sort_direction: direction of the sort, defaults to ascending + + Returns: + A tuple containing : + - The total number of tasks for the given filter + - The obtained list of tasks + """ request = ListTasksRequest(page=page, page_size=page_size, filters=task_filter.to_disjunction().to_message(), sort=ListTasksRequest.Sort(field=cast(TaskField, sort_field.field), direction=sort_direction), with_errors=with_errors) list_response: ListTasksDetailedResponse = self._client.ListTasksDetailed(request) return list_response.total, [Task.from_message(t) for t in list_response.tasks] diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 0b0218f0f..39f76119a 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -1,6 +1,6 @@ from __future__ import annotations -from ..protogen.common.task_status_pb2 import * +from ..protogen.common.task_status_pb2 import TaskStatus as RawStatus, _TASKSTATUS, TASK_STATUS_CANCELLED, TASK_STATUS_CANCELLING, TASK_STATUS_COMPLETED, TASK_STATUS_CREATING, TASK_STATUS_DISPATCHED, TASK_STATUS_ERROR, TASK_STATUS_PROCESSED, TASK_STATUS_PROCESSING, TASK_STATUS_SUBMITTED, TASK_STATUS_TIMEOUT, TASK_STATUS_UNSPECIFIED from ..protogen.common.worker_common_pb2 import HealthCheckReply from ..protogen.common.sort_direction_pb2 import SORT_DIRECTION_ASC, SORT_DIRECTION_DESC @@ -14,6 +14,10 @@ class HealthCheckStatus: class TaskStatus: + @classmethod + def name_from_value(cls, status: RawStatus) -> str: + return _TASKSTATUS.values_by_number[status].name + CANCELLED = TASK_STATUS_CANCELLED CANCELLING = TASK_STATUS_CANCELLING COMPLETED = TASK_STATUS_COMPLETED diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 9f99a316c..7ff20e56b 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -6,23 +6,50 @@ class Filter: + """ + Base class for all filters + """ def message_type(self) -> Type: + """ + Get the message type to be used by FilterDisjunction and FilterConjunction types + + Returns: + The message type + """ raise NotImplementedError(f"{str(self.__class__.__name__)}.message_type() is not implemented") def to_message(self): + """ + Get the gRPC message corresponding to this filter + Returns: + gRPC message + """ raise NotImplementedError(f"{str(self.__class__.__name__)}.to_message() is not implemented") def __bool__(self): raise Exception("Filter cannot be converted to bool. Are you trying to use 'and', 'or', 'not' or 'in' instead of '&', '|', '~' or '.contains' ?") def to_conjunction(self) -> "FilterConjunction": + """ + Transforms the filter into a conjunction + Returns: + Equivalent conjunction of this filter + """ raise NotImplementedError(f"{str(self.__class__.__name__)}.to_conjunction() is not implemented") def to_disjunction(self) -> "FilterDisjunction": + """ + Transforms the filter into a disjunction + Returns: + Equivalent disjunction of this filter + """ raise NotImplementedError(f"{str(self.__class__.__name__)}.to_disjunction() is not implemented") class FilterDisjunction(Filter): + """ + Represents a disjunction of filters (logical or) + """ def __init__(self, filters: List["FilterConjunction"]): super().__init__() self.filters = filters @@ -30,28 +57,49 @@ def __init__(self, filters: List["FilterConjunction"]): _ = self.message_type() def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + """ + Returns a new disjunction from the operands + Args: + other: + Other filter or filters + Returns: + New disjunction + """ if isinstance(other, SimpleFilter): + # Create a conjunction from the filter then add to the list if other.conjunction_type != self.conjunction_type(): raise Exception(f"Invalid type {type(other).__name__} ({str(other.field)}) for 'or' operand of {self.__class__.__name__} ({str(self)}) : Conjunction types are different") return self.__class__(self.filters + [self.conjunction_type()([other])]) elif isinstance(other, self.conjunction_type()): + # Add the conjunction to the list return self.__class__(self.filters + [other]) elif isinstance(other, self.__class__): + # Fuse the disjunctions return self.__class__(self.filters + other.filters) raise Exception(f"Invalid type {type(other).__name__} for 'or' operand of {self.__class__.__name__}") def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + """ + Equivalent to __or__ + """ return self | other def __repr__(self): return "( " + ' ) or ( '.join([str(f) for f in self.filters]) + ' )' def conjunction_type(self) -> Type["FilterConjunction"]: + """ + Conjunction type associated with this disjunction type. + Must be overriden by child class + Returns: + Type of FilterConjunction + """ raise NotImplementedError(f"{str(self.__class__.__name__)}.conjunction_type() is not implemented") def to_message(self) -> Message: raw = self.message_type()() - setattr(raw, "or", [f.to_message() for f in self.filters]) + # Can't use raw.or : https://protobuf.dev/reference/python/python-generated/#keyword-conflicts + getattr(raw, "or").extend([f.to_message() for f in self.filters]) return raw def to_conjunction(self) -> "FilterConjunction": @@ -62,6 +110,9 @@ def to_disjunction(self) -> "FilterDisjunction": class FilterConjunction(Filter): + """ + Represents a conjunction of filters (logical and) + """ def __init__(self, filters: List["SimpleFilter"]): super().__init__() self.filters = filters @@ -69,21 +120,45 @@ def __init__(self, filters: List["SimpleFilter"]): _ = self.message_type() def __and__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": + """ + Returns a new conjunction from the operands + Args: + other: + Other filter or filters + Returns: + New conjunction + """ if isinstance(other, SimpleFilter): + # Add the filter to the filter list if other.conjunction_type != self.__class__: raise Exception(f"Invalid type {type(other).__name__} ({str(other.field)}) for 'and' operand of {self.__class__.__name__} ({str(self)}) : Conjunction types are different") return self.__class__(self.filters + [other]) elif isinstance(other, self.__class__): + # Fuse the conjunctions return self.__class__(self.filters + other.filters) raise Exception(f"Invalid type {type(other).__name__} for 'and' operand of {self.__class__.__name__}") def __mul__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": + """ + Equivalent to __and__ + """ return self & other def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + """ + Creates a disjunction of the operands + Args: + other: + Other filter or filters + Returns: + Disjunction of the operands + """ return self.to_disjunction() | other def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": + """ + Equivalent to __or__ + """ return self | other def __repr__(self) -> str: @@ -94,7 +169,7 @@ def disjunction_type(self) -> Type["FilterDisjunction"]: def to_message(self) -> Message: raw = self.message_type()() - setattr(raw, "and", [f.to_message() for f in self.filters]) + getattr(raw, "and").extend([f.to_message() for f in self.filters]) return raw def to_conjunction(self) -> "FilterConjunction": @@ -105,6 +180,27 @@ def to_disjunction(self) -> "FilterDisjunction": class SimpleFilter(Filter): + """ + Basic filter for a field + + Attributes: + eq_: equality raw Api operator + ne_: inequality raw Api operator + lt_: less than raw Api operator + le_: less or equal raw Api operator + gt_: greater than raw Api operator + ge_: greater or equal raw Api operator + contains_: contains raw Api operator + notcontains_: not contains raw Api operator + value_type_: expected type for the value to test against in this filter + + field: field of the filter + message_type: Api message type of the filter + inner_message_type: Api message type of the inner filter (with value and operator) + conjunction_type: Type of the conjunction for this filter + value: value to test against in this filter + operator: operator to apply for this filter + """ eq_ = None ne_ = None lt_ = None @@ -145,32 +241,47 @@ def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisju return self | other def _verify_value(self, value): + """ + Checks if the value is of the expected type + Args: + value: Value to test + + Raises: + Exception if value is not of the expected type + + """ if self.__class__.value_type_ is None or isinstance(value, self.__class__.value_type_): return raise Exception(f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead") def __eq__(self, value) -> SimpleFilter: - return self.check(value, self.__class__.eq_, "==") + return self._check(value, self.__class__.eq_, "==") def __ne__(self, value) -> SimpleFilter: - return self.check(value, self.__class__.ne_, "!=") + return self._check(value, self.__class__.ne_, "!=") def __lt__(self, value) -> SimpleFilter: - return self.check(value, self.__class__.lt_, "<") + return self._check(value, self.__class__.lt_, "<") def __le__(self, value) -> SimpleFilter: - return self.check(value, self.__class__.le_, "<=") + return self._check(value, self.__class__.le_, "<=") def __gt__(self, value) -> SimpleFilter: - return self.check(value, self.__class__.gt_, ">") + return self._check(value, self.__class__.gt_, ">") def __ge__(self, value) -> SimpleFilter: - return self.check(value, self.__class__.lt_, ">=") + return self._check(value, self.__class__.ge_, ">=") def contains(self, value) -> SimpleFilter: - return self.check(value, self.__class__.contains_, "contains") + return self._check(value, self.__class__.contains_, "contains") def __invert__(self) -> SimpleFilter: + """ + Inverts the test + + Returns: + Filter with the test being inverted + """ if self.operator is None: raise Exception(f"Cannot invert None operator in class {self.__class__.__name__} for field {str(self.field)}") if self.operator == self.__class__.eq_: @@ -186,7 +297,7 @@ def __invert__(self) -> SimpleFilter: if self.operator == self.__class__.ge_: return self.__lt__(self.value) if self.operator == self.__class__.contains_: - return self.check(self.value, self.__class__.notcontains_, "not_contains") + return self._check(self.value, self.__class__.notcontains_, "not_contains") if self.operator == self.__class__.notcontains_: return self.contains(self.value) raise Exception(f"{self.__class__.__name__} operator {str(self.operator)} for field {str(self.field)} has no inverted equivalent") @@ -203,7 +314,20 @@ def to_conjunction(self) -> "FilterConjunction": def to_disjunction(self) -> "FilterDisjunction": return self.to_conjunction().to_disjunction() - def check(self, value: Any, operator: Any, operator_str: str = "") -> "SimpleFilter": + def _check(self, value: Any, operator: Any, operator_str: str = "") -> "SimpleFilter": + """ + Internal function to create a new filter from the current filter with a different value and/or operator + Args: + value: Value of the new filter + operator: Operator of the new filter + operator_str: Optional string for error message clarification + + Returns: + new filter with the given value/operator + + Raises: + NotImplementedError if the given operator is not available for the given class + """ self._verify_value(value) if operator is None: raise NotImplementedError(f"Operator {operator_str} is not available for {self.__class__.__name__}") @@ -211,6 +335,9 @@ def check(self, value: Any, operator: Any, operator_str: str = "") -> "SimpleFil class StringFilter(SimpleFilter): + """ + Filter for string comparisons + """ eq_ = FILTER_STRING_OPERATOR_EQUAL ne_ = FILTER_STRING_OPERATOR_NOT_EQUAL contains_ = FILTER_STRING_OPERATOR_CONTAINS @@ -221,10 +348,10 @@ def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) def startswith(self, value: str) -> "StringFilter": - return self.check(value, FILTER_STRING_OPERATOR_STARTS_WITH, "startswith") + return self._check(value, FILTER_STRING_OPERATOR_STARTS_WITH, "startswith") def endswith(self, value: str) -> "StringFilter": - return self.check(value, FILTER_STRING_OPERATOR_ENDS_WITH, "endswith") + return self._check(value, FILTER_STRING_OPERATOR_ENDS_WITH, "endswith") def to_message(self) -> Message: return self.message_type(field=self.field, filter_string=self.inner_message_type(value=self.value, operator=self.operator)) @@ -234,6 +361,9 @@ def __repr__(self) -> str: class StatusFilter(SimpleFilter): + """ + Filter for status comparison + """ eq_ = FILTER_STATUS_OPERATOR_EQUAL ne_ = FILTER_STATUS_OPERATOR_NOT_EQUAL @@ -245,6 +375,7 @@ def to_message(self) -> Message: class DateFilter(SimpleFilter): + """Filter for timestamp comparison""" eq_ = FILTER_DATE_OPERATOR_EQUAL ne_ = FILTER_DATE_OPERATOR_NOT_EQUAL lt_ = FILTER_DATE_OPERATOR_BEFORE @@ -261,6 +392,7 @@ def to_message(self) -> Message: class NumberFilter(SimpleFilter): + """Filter for int comparison""" eq_ = FILTER_NUMBER_OPERATOR_EQUAL ne_ = FILTER_NUMBER_OPERATOR_NOT_EQUAL lt_ = FILTER_NUMBER_OPERATOR_LESS_THAN @@ -277,6 +409,9 @@ def to_message(self) -> Message: class BooleanFilter(SimpleFilter): + """ + Filter for boolean comparison + """ eq_ = FILTER_BOOLEAN_OPERATOR_IS value_type_ = bool @@ -294,6 +429,9 @@ def to_message(self) -> Message: class ArrayFilter(SimpleFilter): + """ + Filter for array comparisons + """ contains_ = FILTER_ARRAY_OPERATOR_CONTAINS notcontains_ = FILTER_ARRAY_OPERATOR_NOT_CONTAINS value_type_ = str diff --git a/packages/python/tests/filters_test.py b/packages/python/tests/filters_test.py deleted file mode 100644 index ceb184d43..000000000 --- a/packages/python/tests/filters_test.py +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env python3 -import datetime -import logging -import pytest - -logging.basicConfig() -logging.getLogger().setLevel(logging.INFO) diff --git a/packages/python/tests/tasks_test.py b/packages/python/tests/tasks_test.py index a7fd1e44d..1bacbed68 100644 --- a/packages/python/tests/tasks_test.py +++ b/packages/python/tests/tasks_test.py @@ -122,6 +122,28 @@ class SimpleFieldFilter: SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_SESSION_ID, "SessionId", FILTER_STRING_OPERATOR_NOT_EQUAL), SimpleFieldFilter("MyKey", "Start", FILTER_STRING_OPERATOR_STARTS_WITH) ] + ), + ( + (((TaskFieldFilter.PRIORITY > 3) & ~(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) & TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) | (TaskFieldFilter.ENGINE_TYPE.endswith("Test") & (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))), + 2, [2, 3], + [ + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_NOT_EQUAL), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_CONTAINS), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), + ] + ), + ( + (((TaskFieldFilter.PRIORITY >= 3) * -(TaskFieldFilter.STATUS != TaskStatus.COMPLETED) * -TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) + (TaskFieldFilter.ENGINE_TYPE.endswith("Test") * (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))), + 2, [2, 3], + [ + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_EQUAL), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_NOT_CONTAINS), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), + ] ) ]) def test_filter_combination(filt: Union[SimpleFilter, FilterConjunction, FilterDisjunction], n_or: int, n_and: List[int], filters: List[SimpleFieldFilter]): @@ -139,5 +161,9 @@ def test_filter_combination(filt: Union[SimpleFilter, FilterConjunction, FilterD filters.pop(i) break else: + print(f"Could not find {str(ff)}") assert False assert len(filters) == 0 + +def test_name_from_value(): + assert TaskStatus.name_from_value(TaskStatus.COMPLETED) == "TASK_STATUS_COMPLETED" From 568fed48453da12cfb6fe7c090614ee988952d9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 25 Sep 2023 08:54:25 +0200 Subject: [PATCH 065/344] feat: Events API client extension method to wait for results completion --- .../ArmoniK.Api.Client/EventsClientExt.cs | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs diff --git a/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs new file mode 100644 index 000000000..2ce9ec003 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs @@ -0,0 +1,149 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using ArmoniK.Api.gRPC.V1; +using ArmoniK.Api.gRPC.V1.Events; +using ArmoniK.Api.gRPC.V1.Results; + +using Grpc.Core.Utils; + +using JetBrains.Annotations; + +namespace ArmoniK.Api.Client +{ + /// + /// extensions methods + /// + [PublicAPI] + public static class EventsClientExt + { + private static FiltersAnd ResultsFilter(string resultId) + => new() + { + And = + { + new FilterField + { + Field = new ResultField + { + ResultRawField = new ResultRawField + { + Field = ResultRawEnumField.ResultId, + }, + }, + FilterString = new FilterString + { + Operator = FilterStringOperator.Equal, + Value = resultId, + }, + }, + }, + }; + + /// + /// Wait until the given results are completed + /// + /// gRPC result client + /// The session ID in which the results are located + /// A collection of results to wait for + /// Token used to cancel the execution of the method + /// if a result is aborted + [PublicAPI] + public static async Task WaitForResultsAsync(this Events.EventsClient client, + string sessionId, + ICollection resultIds, + CancellationToken cancellationToken) + { + var resultsNotFound = resultIds.ToDictionary(id => id, + _ => true); + + using var streamingCall = client.GetEvents(new EventSubscriptionRequest + { + SessionId = sessionId, + ReturnedEvents = + { + EventsEnum.ResultStatusUpdate, + EventsEnum.NewResult, + }, + ResultsFilters = new Filters + { + Or = + { + resultIds.Select(ResultsFilter), + }, + }, + }); + + + await streamingCall.ResponseStream.ForEachAsync(resp => + { + cancellationToken.ThrowIfCancellationRequested(); + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.ResultStatusUpdate && + resultsNotFound.ContainsKey(resp.ResultStatusUpdate.ResultId)) + { + if (resp.ResultStatusUpdate.Status == ResultStatus.Completed) + { + resultsNotFound.Remove(resp.ResultStatusUpdate.ResultId); + if (!resultsNotFound.Any()) + { + return Task.CompletedTask; + } + } + + if (resp.ResultStatusUpdate.Status == ResultStatus.Aborted) + { + throw new Exception($"Result {resp.ResultStatusUpdate.ResultId} has been aborted"); + } + } + + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.NewResult && + resultsNotFound.ContainsKey(resp.NewResult.ResultId)) + { + if (resp.NewResult.Status == ResultStatus.Completed) + { + resultsNotFound.Remove(resp.NewResult.ResultId); + if (!resultsNotFound.Any()) + { + return Task.CompletedTask; + } + } + + if (resp.NewResult.Status == ResultStatus.Aborted) + { + throw new Exception($"Result {resp.NewResult.ResultId} has been aborted"); + } + } + + return Task.CompletedTask; + }) + .ConfigureAwait(false); + } + } +} From 7eb412c21a771c5c53e68fac7ac222626ad09fa6 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 25 Sep 2023 10:58:41 +0200 Subject: [PATCH 066/344] python: Filter is now abstract class. Added more inversion tests --- packages/python/src/armonik/client/tasks.py | 6 +- .../python/src/armonik/common/enumwrapper.py | 4 +- packages/python/src/armonik/common/filter.py | 38 +++++----- packages/python/tests/filters_test.py | 69 +++++++++++++++++++ packages/python/tests/tasks_test.py | 1 + 5 files changed, 94 insertions(+), 24 deletions(-) create mode 100644 packages/python/tests/filters_test.py diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 28f4a6c3e..7c451648b 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -62,8 +62,8 @@ class TaskFieldFilter: APPLICATION_SERVICE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE)), TaskFilterAnd, rawFilterField) ENGINE_TYPE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE)), TaskFilterAnd, rawFilterField) - @classmethod - def task_options_key(cls, option_key: str) -> StringFilter: + @staticmethod + def task_options_key(option_key: str) -> StringFilter: """ Filter for the TaskOptions.Options dictionary Args: @@ -114,6 +114,6 @@ def list_tasks(self, task_filter: Union[SimpleFilter, TaskFilterAnd, TaskFilter] - The total number of tasks for the given filter - The obtained list of tasks """ - request = ListTasksRequest(page=page, page_size=page_size, filters=task_filter.to_disjunction().to_message(), sort=ListTasksRequest.Sort(field=cast(TaskField, sort_field.field), direction=sort_direction), with_errors=with_errors) + request = ListTasksRequest(page=page, page_size=page_size, filters=cast(rawFilters, task_filter.to_disjunction().to_message()), sort=ListTasksRequest.Sort(field=cast(TaskField, sort_field.field), direction=sort_direction), with_errors=with_errors) list_response: ListTasksDetailedResponse = self._client.ListTasksDetailed(request) return list_response.total, [Task.from_message(t) for t in list_response.tasks] diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 39f76119a..433a52e8a 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -14,8 +14,8 @@ class HealthCheckStatus: class TaskStatus: - @classmethod - def name_from_value(cls, status: RawStatus) -> str: + @staticmethod + def name_from_value(status: RawStatus) -> str: return _TASKSTATUS.values_by_number[status].name CANCELLED = TASK_STATUS_CANCELLED diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 7ff20e56b..1d73e7f72 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -1,14 +1,16 @@ from __future__ import annotations +from abc import ABC, abstractmethod from typing import List, Any, Type, Union from google.protobuf.message import Message import google.protobuf.timestamp_pb2 as timestamp from ..protogen.common.filters_common_pb2 import * -class Filter: +class Filter(ABC): """ Base class for all filters """ + @abstractmethod def message_type(self) -> Type: """ Get the message type to be used by FilterDisjunction and FilterConjunction types @@ -16,34 +18,37 @@ def message_type(self) -> Type: Returns: The message type """ - raise NotImplementedError(f"{str(self.__class__.__name__)}.message_type() is not implemented") + pass + @abstractmethod def to_message(self): """ Get the gRPC message corresponding to this filter Returns: gRPC message """ - raise NotImplementedError(f"{str(self.__class__.__name__)}.to_message() is not implemented") + pass def __bool__(self): raise Exception("Filter cannot be converted to bool. Are you trying to use 'and', 'or', 'not' or 'in' instead of '&', '|', '~' or '.contains' ?") + @abstractmethod def to_conjunction(self) -> "FilterConjunction": """ Transforms the filter into a conjunction Returns: Equivalent conjunction of this filter """ - raise NotImplementedError(f"{str(self.__class__.__name__)}.to_conjunction() is not implemented") + pass + @abstractmethod def to_disjunction(self) -> "FilterDisjunction": """ Transforms the filter into a disjunction Returns: Equivalent disjunction of this filter """ - raise NotImplementedError(f"{str(self.__class__.__name__)}.to_disjunction() is not implemented") + pass class FilterDisjunction(Filter): @@ -53,8 +58,6 @@ class FilterDisjunction(Filter): def __init__(self, filters: List["FilterConjunction"]): super().__init__() self.filters = filters - _ = self.conjunction_type() - _ = self.message_type() def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": """ @@ -87,15 +90,6 @@ def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisju def __repr__(self): return "( " + ' ) or ( '.join([str(f) for f in self.filters]) + ' )' - def conjunction_type(self) -> Type["FilterConjunction"]: - """ - Conjunction type associated with this disjunction type. - Must be overriden by child class - Returns: - Type of FilterConjunction - """ - raise NotImplementedError(f"{str(self.__class__.__name__)}.conjunction_type() is not implemented") - def to_message(self) -> Message: raw = self.message_type()() # Can't use raw.or : https://protobuf.dev/reference/python/python-generated/#keyword-conflicts @@ -108,6 +102,10 @@ def to_conjunction(self) -> "FilterConjunction": def to_disjunction(self) -> "FilterDisjunction": return self + @abstractmethod + def conjunction_type(self) -> Type["FilterConjunction"]: + pass + class FilterConjunction(Filter): """ @@ -116,8 +114,6 @@ class FilterConjunction(Filter): def __init__(self, filters: List["SimpleFilter"]): super().__init__() self.filters = filters - _ = self.disjunction_type() - _ = self.message_type() def __and__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": """ @@ -164,8 +160,9 @@ def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisju def __repr__(self) -> str: return ' and '.join([str(f) for f in self.filters]) + @abstractmethod def disjunction_type(self) -> Type["FilterDisjunction"]: - raise NotImplementedError(f"{str(self.__class__.__name__)}.disjunction_type() is not implemented") + pass def to_message(self) -> Message: raw = self.message_type()() @@ -314,6 +311,9 @@ def to_conjunction(self) -> "FilterConjunction": def to_disjunction(self) -> "FilterDisjunction": return self.to_conjunction().to_disjunction() + def message_type(self) -> Type: + return self.message_type + def _check(self, value: Any, operator: Any, operator_str: str = "") -> "SimpleFilter": """ Internal function to create a new filter from the current filter with a different value and/or operator diff --git a/packages/python/tests/filters_test.py b/packages/python/tests/filters_test.py new file mode 100644 index 000000000..8b3501d23 --- /dev/null +++ b/packages/python/tests/filters_test.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +from typing import Type + +import pytest + +from dataclasses import dataclass +from armonik.common.filter import SimpleFilter, FilterConjunction, FilterDisjunction, StringFilter, BooleanFilter, NumberFilter +from armonik.protogen.common.filters_common_pb2 import FilterBoolean +from google.protobuf.message import Message + + +@dataclass +class DummyMessage(Message): + pass + + +@dataclass +class DummyMessageAnd(Message): + pass + + +@dataclass +class Field(Message): + pass + + +class DummyDisjunction(FilterDisjunction): + + def conjunction_type(self) -> Type["FilterConjunction"]: + return DummyConjunction + + def message_type(self) -> Type: + return DummyMessageAnd + + +class DummyConjunction(FilterConjunction): + + def disjunction_type(self) -> Type["FilterDisjunction"]: + return DummyDisjunction + + def message_type(self) -> Type: + return DummyMessage + + +@pytest.mark.parametrize("filt,inverted", [ + (StringFilter(Field(), DummyConjunction, DummyMessage) == "Test", StringFilter(Field(), DummyConjunction, DummyMessage) != "Test"), + (StringFilter(Field(), DummyConjunction, DummyMessage).contains("Test"), ~(StringFilter(Field(), DummyConjunction, DummyMessage).contains("Test"))), + (BooleanFilter(Field(), DummyConjunction, DummyMessage), BooleanFilter(Field(), DummyConjunction, DummyMessage, FilterBoolean, False)), + (NumberFilter(Field(), DummyConjunction, DummyMessage) > 0, NumberFilter(Field(), DummyConjunction, DummyMessage) <= 0), + (NumberFilter(Field(), DummyConjunction, DummyMessage) >= 0, NumberFilter(Field(), DummyConjunction, DummyMessage) < 0), + (NumberFilter(Field(), DummyConjunction, DummyMessage) < 0, NumberFilter(Field(), DummyConjunction, DummyMessage) >= 0), + (NumberFilter(Field(), DummyConjunction, DummyMessage) <= 0, NumberFilter(Field(), DummyConjunction, DummyMessage) > 0) + +]) +def test_inversion(filt: SimpleFilter, inverted: SimpleFilter): + assert filt.operator != inverted.operator or filt.value == (not inverted.value) # In case of BooleanFilter, the value is inverted, not the operator + assert (~filt).operator == inverted.operator and (~filt).value == inverted.value + assert filt.operator == (~(~filt)).operator and filt.value == (~(~filt)).value + + +@pytest.mark.parametrize("filt", [ + (StringFilter(Field(), DummyConjunction, DummyMessage).startswith("Test")), + (StringFilter(Field(), DummyConjunction, DummyMessage).endswith("Test")), + (StringFilter(Field(), DummyConjunction, DummyMessage)) # No op +]) +def test_inversion_raises(filt: SimpleFilter): + with pytest.raises(Exception): + test = ~filt + print(test) diff --git a/packages/python/tests/tasks_test.py b/packages/python/tests/tasks_test.py index 1bacbed68..125e44e5d 100644 --- a/packages/python/tests/tasks_test.py +++ b/packages/python/tests/tasks_test.py @@ -165,5 +165,6 @@ def test_filter_combination(filt: Union[SimpleFilter, FilterConjunction, FilterD assert False assert len(filters) == 0 + def test_name_from_value(): assert TaskStatus.name_from_value(TaskStatus.COMPLETED) == "TASK_STATUS_COMPLETED" From 406eda9f981d7994972cfc7b668da6adabc2182f Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 25 Sep 2023 11:17:35 +0200 Subject: [PATCH 067/344] common: revert protofiles.sh changes --- packages/common/protofiles.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/common/protofiles.sh b/packages/common/protofiles.sh index 176487364..e1afae1f9 100644 --- a/packages/common/protofiles.sh +++ b/packages/common/protofiles.sh @@ -5,5 +5,17 @@ export PROTO_PATH=$REPOSITORY_PATH/Protos/V1 export README_PATH=$REPOSITORY_PATH/README.md armonik_worker_files=("agent_service.proto" "worker_service.proto") -if IFS=$'\n' read -rd '' -a armonik_client_files <<<"$(find $PROTO_PATH -name "*.proto" -exec basename {} \; | grep -v -e "worker" -e "agent" | grep "service" )"; then :; fi -if IFS=$'\n' read -rd '' -a armonik_common_files <<<"$(find $PROTO_PATH -name "*.proto" -exec basename {} \; | grep -v "service" )"; then :; fi +armonik_client_files=("submitter_service.proto" "tasks_service.proto" "sessions_service.proto" \ + "results_service.proto" "applications_service.proto" "auth_service.proto" \ + "events_service.proto" "partitions_service.proto" "versions_service.proto") +armonik_common_files=("objects.proto" "task_status.proto" "session_status.proto" \ + "result_status.proto" "agent_common.proto" "sessions_common.proto" \ + "submitter_common.proto" "tasks_common.proto" "worker_common.proto" \ + "results_common.proto" "applications_common.proto" "auth_common.proto" \ + "events_common.proto" "partitions_common.proto" "sort_direction.proto" \ + "versions_common.proto" "tasks_fields.proto" "tasks_filters.proto" \ + "sessions_fields.proto" "sessions_filters.proto" \ + "applications_fields.proto" "applications_filters.proto" \ + "partitions_fields.proto" "partitions_filters.proto" \ + "results_fields.proto" "results_filters.proto" \ + "filters_common.proto") From 5abcce11a173f3ee816b203f8ac64ecd28f02f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 25 Sep 2023 11:28:54 +0200 Subject: [PATCH 068/344] fix: use while instead of gRPC foreach --- .../ArmoniK.Api.Client/EventsClientExt.cs | 76 +++++++++---------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs index 2ce9ec003..021346442 100644 --- a/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs +++ b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs @@ -32,8 +32,6 @@ using ArmoniK.Api.gRPC.V1.Events; using ArmoniK.Api.gRPC.V1.Results; -using Grpc.Core.Utils; - using JetBrains.Annotations; namespace ArmoniK.Api.Client @@ -102,48 +100,44 @@ public static async Task WaitForResultsAsync(this Events.EventsClient client, }); - await streamingCall.ResponseStream.ForEachAsync(resp => - { - cancellationToken.ThrowIfCancellationRequested(); - if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.ResultStatusUpdate && - resultsNotFound.ContainsKey(resp.ResultStatusUpdate.ResultId)) - { - if (resp.ResultStatusUpdate.Status == ResultStatus.Completed) - { - resultsNotFound.Remove(resp.ResultStatusUpdate.ResultId); - if (!resultsNotFound.Any()) - { - return Task.CompletedTask; - } - } - - if (resp.ResultStatusUpdate.Status == ResultStatus.Aborted) - { - throw new Exception($"Result {resp.ResultStatusUpdate.ResultId} has been aborted"); - } - } + while (await streamingCall.ResponseStream.MoveNext(cancellationToken)) + { + cancellationToken.ThrowIfCancellationRequested(); + var resp = streamingCall.ResponseStream.Current; + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.ResultStatusUpdate && resultsNotFound.ContainsKey(resp.ResultStatusUpdate.ResultId)) + { + if (resp.ResultStatusUpdate.Status == ResultStatus.Completed) + { + resultsNotFound.Remove(resp.ResultStatusUpdate.ResultId); + if (!resultsNotFound.Any()) + { + break; + } + } - if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.NewResult && - resultsNotFound.ContainsKey(resp.NewResult.ResultId)) - { - if (resp.NewResult.Status == ResultStatus.Completed) - { - resultsNotFound.Remove(resp.NewResult.ResultId); - if (!resultsNotFound.Any()) - { - return Task.CompletedTask; - } - } + if (resp.ResultStatusUpdate.Status == ResultStatus.Aborted) + { + throw new Exception($"Result {resp.ResultStatusUpdate.ResultId} has been aborted"); + } + } - if (resp.NewResult.Status == ResultStatus.Aborted) - { - throw new Exception($"Result {resp.NewResult.ResultId} has been aborted"); - } - } + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.NewResult && resultsNotFound.ContainsKey(resp.NewResult.ResultId)) + { + if (resp.NewResult.Status == ResultStatus.Completed) + { + resultsNotFound.Remove(resp.NewResult.ResultId); + if (!resultsNotFound.Any()) + { + break; + } + } - return Task.CompletedTask; - }) - .ConfigureAwait(false); + if (resp.NewResult.Status == ResultStatus.Aborted) + { + throw new Exception($"Result {resp.NewResult.ResultId} has been aborted"); + } + } + } } } } From 0b9e044a9f360dde37de0cec76165b53caf466d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 25 Sep 2023 12:01:32 +0200 Subject: [PATCH 069/344] refactor: use HashSet instead of Dictionary --- packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs index 021346442..e296a92da 100644 --- a/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs +++ b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs @@ -79,8 +79,7 @@ public static async Task WaitForResultsAsync(this Events.EventsClient client, ICollection resultIds, CancellationToken cancellationToken) { - var resultsNotFound = resultIds.ToDictionary(id => id, - _ => true); + var resultsNotFound = new HashSet(resultIds); using var streamingCall = client.GetEvents(new EventSubscriptionRequest { @@ -99,12 +98,11 @@ public static async Task WaitForResultsAsync(this Events.EventsClient client, }, }); - while (await streamingCall.ResponseStream.MoveNext(cancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); var resp = streamingCall.ResponseStream.Current; - if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.ResultStatusUpdate && resultsNotFound.ContainsKey(resp.ResultStatusUpdate.ResultId)) + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.ResultStatusUpdate && resultsNotFound.Contains(resp.ResultStatusUpdate.ResultId)) { if (resp.ResultStatusUpdate.Status == ResultStatus.Completed) { @@ -121,7 +119,7 @@ public static async Task WaitForResultsAsync(this Events.EventsClient client, } } - if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.NewResult && resultsNotFound.ContainsKey(resp.NewResult.ResultId)) + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.NewResult && resultsNotFound.Contains(resp.NewResult.ResultId)) { if (resp.NewResult.Status == ResultStatus.Completed) { From bae77f0f4d3be8f5f3107d48c8fc09995a76e882 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 25 Sep 2023 13:16:06 +0200 Subject: [PATCH 070/344] python: Removed Filter base class --- .../python/src/armonik/common/__init__.py | 2 +- packages/python/src/armonik/common/filter.py | 77 +++++-------------- 2 files changed, 20 insertions(+), 59 deletions(-) diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 48a46de37..0dfa49d04 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,4 +1,4 @@ from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability from .enumwrapper import HealthCheckStatus, TaskStatus, Direction -from .filter import Filter, StringFilter, FilterConjunction, FilterDisjunction, StatusFilter +from .filter import StringFilter, FilterConjunction, FilterDisjunction, StatusFilter diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 1d73e7f72..dd3cc8792 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -6,52 +6,7 @@ from ..protogen.common.filters_common_pb2 import * -class Filter(ABC): - """ - Base class for all filters - """ - @abstractmethod - def message_type(self) -> Type: - """ - Get the message type to be used by FilterDisjunction and FilterConjunction types - - Returns: - The message type - """ - pass - - @abstractmethod - def to_message(self): - """ - Get the gRPC message corresponding to this filter - Returns: - gRPC message - """ - pass - - def __bool__(self): - raise Exception("Filter cannot be converted to bool. Are you trying to use 'and', 'or', 'not' or 'in' instead of '&', '|', '~' or '.contains' ?") - - @abstractmethod - def to_conjunction(self) -> "FilterConjunction": - """ - Transforms the filter into a conjunction - Returns: - Equivalent conjunction of this filter - """ - pass - - @abstractmethod - def to_disjunction(self) -> "FilterDisjunction": - """ - Transforms the filter into a disjunction - Returns: - Equivalent disjunction of this filter - """ - pass - - -class FilterDisjunction(Filter): +class FilterDisjunction(ABC): """ Represents a disjunction of filters (logical or) """ @@ -96,9 +51,6 @@ def to_message(self) -> Message: getattr(raw, "or").extend([f.to_message() for f in self.filters]) return raw - def to_conjunction(self) -> "FilterConjunction": - raise Exception("Cannot transform a disjunction into a conjunction") - def to_disjunction(self) -> "FilterDisjunction": return self @@ -106,8 +58,12 @@ def to_disjunction(self) -> "FilterDisjunction": def conjunction_type(self) -> Type["FilterConjunction"]: pass + @abstractmethod + def message_type(self) -> Type[Message]: + pass + -class FilterConjunction(Filter): +class FilterConjunction(ABC): """ Represents a conjunction of filters (logical and) """ @@ -160,10 +116,6 @@ def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisju def __repr__(self) -> str: return ' and '.join([str(f) for f in self.filters]) - @abstractmethod - def disjunction_type(self) -> Type["FilterDisjunction"]: - pass - def to_message(self) -> Message: raw = self.message_type()() getattr(raw, "and").extend([f.to_message() for f in self.filters]) @@ -175,8 +127,16 @@ def to_conjunction(self) -> "FilterConjunction": def to_disjunction(self) -> "FilterDisjunction": return self.disjunction_type()([self]) + @abstractmethod + def disjunction_type(self) -> Type["FilterDisjunction"]: + pass + + @abstractmethod + def message_type(self) -> Type[Message]: + pass -class SimpleFilter(Filter): + +class SimpleFilter: """ Basic filter for a field @@ -311,9 +271,6 @@ def to_conjunction(self) -> "FilterConjunction": def to_disjunction(self) -> "FilterDisjunction": return self.to_conjunction().to_disjunction() - def message_type(self) -> Type: - return self.message_type - def _check(self, value: Any, operator: Any, operator_str: str = "") -> "SimpleFilter": """ Internal function to create a new filter from the current filter with a different value and/or operator @@ -333,6 +290,10 @@ def _check(self, value: Any, operator: Any, operator_str: str = "") -> "SimpleFi raise NotImplementedError(f"Operator {operator_str} is not available for {self.__class__.__name__}") return self.__class__(self.field, self.conjunction_type, self.message_type, self.inner_message_type, value, operator) + @abstractmethod + def to_message(self) -> Message: + pass + class StringFilter(SimpleFilter): """ From fd6052d23b5881875602cc091b1f9346fae6ca9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 25 Sep 2023 14:43:14 +0200 Subject: [PATCH 071/344] refactor: mark submitter RPCs as deprecated --- Protos/V1/submitter_service.proto | 56 +++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/Protos/V1/submitter_service.proto b/Protos/V1/submitter_service.proto index 44adf3ea5..8d8752263 100644 --- a/Protos/V1/submitter_service.proto +++ b/Protos/V1/submitter_service.proto @@ -8,26 +8,52 @@ import "submitter_common.proto"; option csharp_namespace = "ArmoniK.Api.gRPC.V1.Submitter"; service Submitter { - rpc GetServiceConfiguration(Empty) returns (Configuration); + rpc GetServiceConfiguration(Empty) returns (Configuration) { + option deprecated = true; + } - rpc CreateSession(CreateSessionRequest) returns (CreateSessionReply); - rpc CancelSession(Session) returns (Empty); + rpc CreateSession(CreateSessionRequest) returns (CreateSessionReply) { + option deprecated = true; + } + rpc CancelSession(Session) returns (Empty) { + option deprecated = true; + } - rpc CreateSmallTasks(CreateSmallTaskRequest) returns (CreateTaskReply); - rpc CreateLargeTasks(stream CreateLargeTaskRequest) returns (CreateTaskReply); + rpc CreateSmallTasks(CreateSmallTaskRequest) returns (CreateTaskReply) { + option deprecated = true; + } + rpc CreateLargeTasks(stream CreateLargeTaskRequest) returns (CreateTaskReply) { + option deprecated = true; + } - rpc ListTasks(TaskFilter) returns (TaskIdList); - rpc ListSessions(SessionFilter) returns (SessionIdList); + rpc ListTasks(TaskFilter) returns (TaskIdList) { + option deprecated = true; + } + rpc ListSessions(SessionFilter) returns (SessionIdList) { + option deprecated = true; + } - rpc CountTasks(TaskFilter) returns (Count); - rpc TryGetResultStream(ResultRequest) returns (stream ResultReply); - rpc TryGetTaskOutput(TaskOutputRequest) returns (Output); + rpc CountTasks(TaskFilter) returns (Count) { + option deprecated = true; + } + rpc TryGetResultStream(ResultRequest) returns (stream ResultReply) { + option deprecated = true; + } + rpc TryGetTaskOutput(TaskOutputRequest) returns (Output) { + option deprecated = true; + } rpc WaitForAvailability(ResultRequest) returns (AvailabilityReply) { option deprecated = true; } - rpc WaitForCompletion(WaitRequest) returns (Count); - rpc CancelTasks(TaskFilter) returns (Empty); - rpc GetTaskStatus(GetTaskStatusRequest) returns (GetTaskStatusReply); + rpc WaitForCompletion(WaitRequest) returns (Count) { + option deprecated = true; + } + rpc CancelTasks(TaskFilter) returns (Empty) { + option deprecated = true; + } + rpc GetTaskStatus(GetTaskStatusRequest) returns (GetTaskStatusReply) { + option deprecated = true; + } rpc GetResultStatus(GetResultStatusRequest) returns (GetResultStatusReply) { option deprecated = true; } @@ -41,5 +67,7 @@ service Submitter { * Any reply can be implicitely chunked if there are too many event to report at the same time (or for the first reply). * It is possible to filter out specific statuses from events. */ - rpc WatchResults(stream WatchResultRequest) returns (stream WatchResultStream); + rpc WatchResults(stream WatchResultRequest) returns (stream WatchResultStream) { + option deprecated = true; + } } From 7776a3ff4f7d0dfcfe0e07a28560c31e81382a1a Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 25 Sep 2023 18:01:18 +0200 Subject: [PATCH 072/344] python: refactored to use only a single subclass --- packages/python/src/armonik/client/tasks.py | 74 ++-- .../python/src/armonik/common/__init__.py | 2 +- packages/python/src/armonik/common/filter.py | 341 +++++++----------- packages/python/tests/filters_test.py | 44 +-- packages/python/tests/tasks_test.py | 125 ++++++- 5 files changed, 290 insertions(+), 296 deletions(-) diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 7c451648b..2a543a458 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -3,7 +3,7 @@ from typing import Type, Union, cast, Tuple, List from ..common import Task, Direction -from ..common.filter import StringFilter, FilterDisjunction, FilterConjunction, StatusFilter, DateFilter, NumberFilter, SimpleFilter +from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter from ..protogen.client.tasks_service_pb2_grpc import TasksStub from ..protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse, ListTasksRequest, ListTasksDetailedResponse from ..protogen.common.tasks_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus @@ -12,55 +12,33 @@ from ..protogen.common.tasks_fields_pb2 import * -class TaskFilterAnd(FilterConjunction): - """ - Conjunction of task filters - """ - def disjunction_type(self) -> Type["FilterDisjunction"]: - return TaskFilter - - def message_type(self) -> Type: - return rawFilterAnd - - -class TaskFilter(FilterDisjunction): - """ - Disjunction of task filters - """ - def message_type(self) -> Type: - return rawFilters - - def conjunction_type(self) -> Type["FilterConjunction"]: - return TaskFilterAnd - - class TaskFieldFilter: """ Enumeration of the available filters """ - TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID)), TaskFilterAnd, rawFilterField) - SESSION_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID)), TaskFilterAnd, rawFilterField) - OWNER_POD_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID)), TaskFilterAnd, rawFilterField) - INITIAL_TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID)), TaskFilterAnd, rawFilterField) - STATUS = StatusFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STATUS)), TaskFilterAnd, rawFilterField, rawFilterStatus) - CREATED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT)), TaskFilterAnd, rawFilterField) - SUBMITTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT)), TaskFilterAnd, rawFilterField) - STARTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT)), TaskFilterAnd, rawFilterField) - ENDED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT)), TaskFilterAnd, rawFilterField) - POD_TTL = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL)), TaskFilterAnd, rawFilterField) - POD_HOSTNAME = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME)), TaskFilterAnd, rawFilterField) - RECEIVED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT)), TaskFilterAnd, rawFilterField) - ACQUIRED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT)), TaskFilterAnd, rawFilterField) - ERROR = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ERROR)), TaskFilterAnd, rawFilterField) - - MAX_RETRIES = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_RETRIES)), TaskFilterAnd, rawFilterField) - PRIORITY = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PRIORITY)), TaskFilterAnd, rawFilterField) - PARTITION_ID = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PARTITION_ID)), TaskFilterAnd, rawFilterField) - APPLICATION_NAME = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAME)), TaskFilterAnd, rawFilterField) - APPLICATION_VERSION = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION)), TaskFilterAnd, rawFilterField) - APPLICATION_NAMESPACE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE)), TaskFilterAnd, rawFilterField) - APPLICATION_SERVICE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE)), TaskFilterAnd, rawFilterField) - ENGINE_TYPE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE)), TaskFilterAnd, rawFilterField) + TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID)), rawFilters, rawFilterAnd, rawFilterField) + SESSION_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID)), rawFilters, rawFilterAnd, rawFilterField) + OWNER_POD_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID)), rawFilters, rawFilterAnd, rawFilterField) + INITIAL_TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID)), rawFilters, rawFilterAnd, rawFilterField) + STATUS = StatusFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus) + CREATED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT)), rawFilters, rawFilterAnd, rawFilterField) + SUBMITTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT)), rawFilters, rawFilterAnd, rawFilterField) + STARTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT)), rawFilters, rawFilterAnd, rawFilterField) + ENDED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT)), rawFilters, rawFilterAnd, rawFilterField) + POD_TTL = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL)), rawFilters, rawFilterAnd, rawFilterField) + POD_HOSTNAME = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME)), rawFilters, rawFilterAnd, rawFilterField) + RECEIVED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT)), rawFilters, rawFilterAnd, rawFilterField) + ACQUIRED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT)), rawFilters, rawFilterAnd, rawFilterField) + ERROR = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ERROR)), rawFilters, rawFilterAnd, rawFilterField) + + MAX_RETRIES = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_RETRIES)), rawFilters, rawFilterAnd, rawFilterField) + PRIORITY = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PRIORITY)), rawFilters, rawFilterAnd, rawFilterField) + PARTITION_ID = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PARTITION_ID)), rawFilters, rawFilterAnd, rawFilterField) + APPLICATION_NAME = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAME)), rawFilters, rawFilterAnd, rawFilterField) + APPLICATION_VERSION = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION)), rawFilters, rawFilterAnd, rawFilterField) + APPLICATION_NAMESPACE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE)), rawFilters, rawFilterAnd, rawFilterField) + APPLICATION_SERVICE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE)), rawFilters, rawFilterAnd, rawFilterField) + ENGINE_TYPE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE)), rawFilters, rawFilterAnd, rawFilterField) @staticmethod def task_options_key(option_key: str) -> StringFilter: @@ -72,7 +50,7 @@ def task_options_key(option_key: str) -> StringFilter: Returns: Corresponding filter """ - return StringFilter(TaskField(task_option_generic_field=TaskOptionGenericField(field=option_key)), TaskFilterAnd, rawFilterField) + return StringFilter(TaskField(task_option_generic_field=TaskOptionGenericField(field=option_key)), rawFilters, rawFilterAnd, rawFilterField) class ArmoniKTasks: @@ -96,7 +74,7 @@ def get_task(self, task_id: str) -> Task: task_response: GetTaskResponse = self._client.GetTask(GetTaskRequest(task_id=task_id)) return Task.from_message(task_response.task) - def list_tasks(self, task_filter: Union[SimpleFilter, TaskFilterAnd, TaskFilter], with_errors: bool = False, page: int = 0, page_size: int = 1000, sort_field: SimpleFilter = TaskFieldFilter.TASK_ID, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Task]]: + def list_tasks(self, task_filter: Filter, with_errors: bool = False, page: int = 0, page_size: int = 1000, sort_field: Filter = TaskFieldFilter.TASK_ID, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Task]]: """List tasks If the total returned exceeds the requested page size, you may want to use this function again and ask for subsequent pages. diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 0dfa49d04..50859d6f3 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,4 +1,4 @@ from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability from .enumwrapper import HealthCheckStatus, TaskStatus, Direction -from .filter import StringFilter, FilterConjunction, FilterDisjunction, StatusFilter +from .filter import StringFilter, StatusFilter diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index dd3cc8792..330329e2e 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -1,144 +1,15 @@ from __future__ import annotations -from abc import ABC, abstractmethod -from typing import List, Any, Type, Union +from abc import abstractmethod +from typing import List, Any, Type, Optional, Dict from google.protobuf.message import Message import google.protobuf.timestamp_pb2 as timestamp from ..protogen.common.filters_common_pb2 import * +import json -class FilterDisjunction(ABC): +class Filter: """ - Represents a disjunction of filters (logical or) - """ - def __init__(self, filters: List["FilterConjunction"]): - super().__init__() - self.filters = filters - - def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": - """ - Returns a new disjunction from the operands - Args: - other: - Other filter or filters - Returns: - New disjunction - """ - if isinstance(other, SimpleFilter): - # Create a conjunction from the filter then add to the list - if other.conjunction_type != self.conjunction_type(): - raise Exception(f"Invalid type {type(other).__name__} ({str(other.field)}) for 'or' operand of {self.__class__.__name__} ({str(self)}) : Conjunction types are different") - return self.__class__(self.filters + [self.conjunction_type()([other])]) - elif isinstance(other, self.conjunction_type()): - # Add the conjunction to the list - return self.__class__(self.filters + [other]) - elif isinstance(other, self.__class__): - # Fuse the disjunctions - return self.__class__(self.filters + other.filters) - raise Exception(f"Invalid type {type(other).__name__} for 'or' operand of {self.__class__.__name__}") - - def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": - """ - Equivalent to __or__ - """ - return self | other - - def __repr__(self): - return "( " + ' ) or ( '.join([str(f) for f in self.filters]) + ' )' - - def to_message(self) -> Message: - raw = self.message_type()() - # Can't use raw.or : https://protobuf.dev/reference/python/python-generated/#keyword-conflicts - getattr(raw, "or").extend([f.to_message() for f in self.filters]) - return raw - - def to_disjunction(self) -> "FilterDisjunction": - return self - - @abstractmethod - def conjunction_type(self) -> Type["FilterConjunction"]: - pass - - @abstractmethod - def message_type(self) -> Type[Message]: - pass - - -class FilterConjunction(ABC): - """ - Represents a conjunction of filters (logical and) - """ - def __init__(self, filters: List["SimpleFilter"]): - super().__init__() - self.filters = filters - - def __and__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": - """ - Returns a new conjunction from the operands - Args: - other: - Other filter or filters - Returns: - New conjunction - """ - if isinstance(other, SimpleFilter): - # Add the filter to the filter list - if other.conjunction_type != self.__class__: - raise Exception(f"Invalid type {type(other).__name__} ({str(other.field)}) for 'and' operand of {self.__class__.__name__} ({str(self)}) : Conjunction types are different") - return self.__class__(self.filters + [other]) - elif isinstance(other, self.__class__): - # Fuse the conjunctions - return self.__class__(self.filters + other.filters) - raise Exception(f"Invalid type {type(other).__name__} for 'and' operand of {self.__class__.__name__}") - - def __mul__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": - """ - Equivalent to __and__ - """ - return self & other - - def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": - """ - Creates a disjunction of the operands - Args: - other: - Other filter or filters - Returns: - Disjunction of the operands - """ - return self.to_disjunction() | other - - def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": - """ - Equivalent to __or__ - """ - return self | other - - def __repr__(self) -> str: - return ' and '.join([str(f) for f in self.filters]) - - def to_message(self) -> Message: - raw = self.message_type()() - getattr(raw, "and").extend([f.to_message() for f in self.filters]) - return raw - - def to_conjunction(self) -> "FilterConjunction": - return self - - def to_disjunction(self) -> "FilterDisjunction": - return self.disjunction_type()([self]) - - @abstractmethod - def disjunction_type(self) -> Type["FilterDisjunction"]: - pass - - @abstractmethod - def message_type(self) -> Type[Message]: - pass - - -class SimpleFilter: - """ - Basic filter for a field + Filter for use with ArmoniK Attributes: eq_: equality raw Api operator @@ -151,12 +22,12 @@ class SimpleFilter: notcontains_: not contains raw Api operator value_type_: expected type for the value to test against in this filter - field: field of the filter + field: field of the filter if it's a simple filter message_type: Api message type of the filter inner_message_type: Api message type of the inner filter (with value and operator) conjunction_type: Type of the conjunction for this filter - value: value to test against in this filter - operator: operator to apply for this filter + value: value to test against in this filter if it's a simple filter + operator: operator to apply for this filter if it's a simple filter """ eq_ = None ne_ = None @@ -168,71 +39,85 @@ class SimpleFilter: notcontains_ = None value_type_ = None - def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message], value=None, operator=None): - super().__init__() + def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]], filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): + self._filters: List[List["Filter"]] = [[]] if filters is None else filters self.field = field self.message_type = message_type - if not issubclass(conjunction_type, FilterConjunction): - raise Exception(f"{conjunction_type.__name__} is not a subclass of FilterConjunction") - self.conjunction_type = conjunction_type + self.conjunction_type = conjunction_message_type + self.disjunction_type = disjunction_message_type self.inner_message_type = inner_message_type self.value = value self.operator = operator - def __and__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": - if isinstance(other, SimpleFilter): - if other.conjunction_type != self.conjunction_type: - raise Exception(f"Invalid type {type(other).__name__} ({str(other.field)}) for 'and' operand of {self.__class__.__name__} ({str(self.field)}) : Conjunction types are different") - return self.conjunction_type([self, other]) - elif isinstance(other, self.conjunction_type): - return other & self - raise Exception(f"Invalid type {type(other).__name__} for 'and' operand of {self.__class__.__name__}") - - def __mul__(self, other: Union["SimpleFilter", "FilterConjunction"]) -> "FilterConjunction": - return self & other + def is_true_conjunction(self) -> bool: + """ + Tests whether the filter is a conjunction (logical and) + Note : This will only output true if it's an actual conjunction with multiple filters and no disjunction + """ + return self.message_type == self.conjunction_type or (len(self._filters) == 1 and len(self._filters[0]) > 1) - def __or__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": - return self.conjunction_type([self]) | other + def is_true_disjunction(self) -> bool: + """ + Tests whether the filter is a disjunction (logical or) + Note : This will only output true if it's an actual disjunction with multiple filters + """ + return len(self._filters) > 1 - def __add__(self, other: Union["SimpleFilter", "FilterConjunction", "FilterDisjunction"]) -> "FilterDisjunction": - return self | other + def to_disjunction(self) -> Filter: + """ + Converts the filter into a disjunction - def _verify_value(self, value): """ - Checks if the value is of the expected type - Args: - value: Value to test + if self.is_true_disjunction(): + return self + if self.is_true_conjunction(): + return Filter(None, self.disjunction_type, self.conjunction_type, self.disjunction_type, None, self._filters) + return Filter(None, self.disjunction_type, self.conjunction_type, self.disjunction_type, None, [[self]]) + + def __and__(self, other: "Filter") -> "Filter": + if not isinstance(other, Filter): + raise Exception(f"Cannot create a conjunction between Filter and {other.__class__.__name__}") + if self.is_true_disjunction() or other.is_true_disjunction(): + raise Exception(f"Cannot make a conjunction of disjunctions") + if self.conjunction_type != other.conjunction_type: + raise Exception(f"Conjunction types are different") + return Filter(None, self.disjunction_type, self.conjunction_type, self.conjunction_type, None, [self.to_disjunction()._filters[0] + other.to_disjunction()._filters[0]]) + + def __mul__(self, other: Filter) -> "Filter": + return self & other - Raises: - Exception if value is not of the expected type + def __or__(self, other: "Filter") -> "Filter": + if not isinstance(other, Filter): + raise Exception(f"Cannot create a conjunction between Filter and {other.__class__.__name__}") + if self.disjunction_type != other.disjunction_type: + raise Exception(f"Disjunction types are different") + return Filter(None, self.disjunction_type, self.conjunction_type, self.disjunction_type, None, self.to_disjunction()._filters + other.to_disjunction()._filters) - """ - if self.__class__.value_type_ is None or isinstance(value, self.__class__.value_type_): - return - raise Exception(f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead") + def __add__(self, other: "Filter") -> "Filter": + return self | other - def __eq__(self, value) -> SimpleFilter: + def __eq__(self, value) -> Filter: return self._check(value, self.__class__.eq_, "==") - def __ne__(self, value) -> SimpleFilter: + def __ne__(self, value) -> Filter: return self._check(value, self.__class__.ne_, "!=") - def __lt__(self, value) -> SimpleFilter: + def __lt__(self, value) -> Filter: return self._check(value, self.__class__.lt_, "<") - def __le__(self, value) -> SimpleFilter: + def __le__(self, value) -> Filter: return self._check(value, self.__class__.le_, "<=") - def __gt__(self, value) -> SimpleFilter: + def __gt__(self, value) -> Filter: return self._check(value, self.__class__.gt_, ">") - def __ge__(self, value) -> SimpleFilter: + def __ge__(self, value) -> Filter: return self._check(value, self.__class__.ge_, ">=") - def contains(self, value) -> SimpleFilter: + def contains(self, value) -> Filter: return self._check(value, self.__class__.contains_, "contains") - def __invert__(self) -> SimpleFilter: + def __invert__(self) -> Filter: """ Inverts the test @@ -240,6 +125,8 @@ def __invert__(self) -> SimpleFilter: Filter with the test being inverted """ if self.operator is None: + if self.is_true_conjunction() or self.is_true_disjunction(): + raise Exception(f"Cannot invert conjunctions or disjunctions") raise Exception(f"Cannot invert None operator in class {self.__class__.__name__} for field {str(self.field)}") if self.operator == self.__class__.eq_: return self.__ne__(self.value) @@ -259,19 +146,39 @@ def __invert__(self) -> SimpleFilter: return self.contains(self.value) raise Exception(f"{self.__class__.__name__} operator {str(self.operator)} for field {str(self.field)} has no inverted equivalent") - def __neg__(self) -> "SimpleFilter": + def __neg__(self) -> "Filter": return ~self - def __repr__(self) -> str: - return f"{str(self.field)} filter" + def to_dict(self) -> Dict: + rep = {} + if self.is_true_disjunction(): + rep["or"] = [{"and": [f.to_dict() for f in conj]} for conj in self._filters] + return rep + if self.is_true_conjunction(): + rep["and"] = [f.to_dict() for f in self._filters[0]] + return rep + if len(self._filters) == 1 and len(self._filters[0]) == 1: + return self._filters[0][0].to_dict() + return {"field": str(self.field), "value": str(self.value), "operator": str(self.operator)} + + def __str__(self) -> str: + return json.dumps(self.to_dict()) + + def _verify_value(self, value): + """ + Checks if the value is of the expected type + Args: + value: Value to test - def to_conjunction(self) -> "FilterConjunction": - return self.conjunction_type([self]) + Raises: + Exception if value is not of the expected type - def to_disjunction(self) -> "FilterDisjunction": - return self.to_conjunction().to_disjunction() + """ + if self.__class__.value_type_ is None or isinstance(value, self.__class__.value_type_): + return + raise Exception(f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead") - def _check(self, value: Any, operator: Any, operator_str: str = "") -> "SimpleFilter": + def _check(self, value: Any, operator: Any, operator_str: str = "") -> "Filter": """ Internal function to create a new filter from the current filter with a different value and/or operator Args: @@ -285,17 +192,33 @@ def _check(self, value: Any, operator: Any, operator_str: str = "") -> "SimpleFi Raises: NotImplementedError if the given operator is not available for the given class """ + if self.is_true_conjunction() or self.is_true_disjunction(): + raise Exception(f"Cannot apply operator to a disjunction or a conjunction") self._verify_value(value) if operator is None: raise NotImplementedError(f"Operator {operator_str} is not available for {self.__class__.__name__}") - return self.__class__(self.field, self.conjunction_type, self.message_type, self.inner_message_type, value, operator) + return self.__class__(self.field, self.disjunction_type, self.conjunction_type, self.message_type, self.inner_message_type, self._filters, value, operator) @abstractmethod - def to_message(self) -> Message: + def to_basic_message(self) -> Message: pass + def to_message(self) -> Message: + def to_conjunction_message(conj: List[Filter]) -> Message: + conj_raw = self.conjunction_type() + getattr(conj_raw, "and").extend([f.to_basic_message() for f in conj]) + return conj_raw + + if self.message_type == self.disjunction_type: + raw = self.to_disjunction().disjunction_type() + getattr(raw, "or").extend([to_conjunction_message(conj) for conj in self._filters]) + return raw + if self.message_type == self.conjunction_type: + return to_conjunction_message(self.to_disjunction()._filters[0]) + return self.to_basic_message() + -class StringFilter(SimpleFilter): +class StringFilter(Filter): """ Filter for string comparisons """ @@ -305,8 +228,8 @@ class StringFilter(SimpleFilter): notcontains_ = FILTER_STRING_OPERATOR_NOT_CONTAINS value_type_ = str - def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterString, value=None, operator=None): - super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) + def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterString, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): + super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) def startswith(self, value: str) -> "StringFilter": return self._check(value, FILTER_STRING_OPERATOR_STARTS_WITH, "startswith") @@ -314,28 +237,28 @@ def startswith(self, value: str) -> "StringFilter": def endswith(self, value: str) -> "StringFilter": return self._check(value, FILTER_STRING_OPERATOR_ENDS_WITH, "endswith") - def to_message(self) -> Message: + def to_basic_message(self) -> Message: return self.message_type(field=self.field, filter_string=self.inner_message_type(value=self.value, operator=self.operator)) def __repr__(self) -> str: return f"{str(self.field)} {str(self.operator)} \"{str(self.value)}\"" -class StatusFilter(SimpleFilter): +class StatusFilter(Filter): """ Filter for status comparison """ eq_ = FILTER_STATUS_OPERATOR_EQUAL ne_ = FILTER_STATUS_OPERATOR_NOT_EQUAL - def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], filter_status_type: Type[Message], value=None, operator=None): - super().__init__(field, conjunction_type, message_type, filter_status_type, value, operator) + def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Type[Message], filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): + super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) - def to_message(self) -> Message: + def to_basic_message(self) -> Message: return self.message_type(field=self.field, filter_status=self.inner_message_type(value=self.value, operator=self.operator)) -class DateFilter(SimpleFilter): +class DateFilter(Filter): """Filter for timestamp comparison""" eq_ = FILTER_DATE_OPERATOR_EQUAL ne_ = FILTER_DATE_OPERATOR_NOT_EQUAL @@ -345,14 +268,14 @@ class DateFilter(SimpleFilter): ge_ = FILTER_DATE_OPERATOR_AFTER_OR_EQUAL value_type = timestamp.Timestamp - def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterDate, value=None, operator=None): - super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) + def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterDate, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): + super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) - def to_message(self) -> Message: + def to_basic_message(self) -> Message: return self.message_type(field=self.field, filter_date=self.inner_message_type(value=self.value, operator=self.operator)) -class NumberFilter(SimpleFilter): +class NumberFilter(Filter): """Filter for int comparison""" eq_ = FILTER_NUMBER_OPERATOR_EQUAL ne_ = FILTER_NUMBER_OPERATOR_NOT_EQUAL @@ -362,22 +285,22 @@ class NumberFilter(SimpleFilter): ge_ = FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL value_type_ = int - def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterNumber, value=None, operator=None): - super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) + def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterNumber, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): + super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) - def to_message(self) -> Message: + def to_basic_message(self) -> Message: return self.message_type(field=self.field, filter_number=self.inner_message_type(value=self.value, operator=self.operator)) -class BooleanFilter(SimpleFilter): +class BooleanFilter(Filter): """ Filter for boolean comparison """ eq_ = FILTER_BOOLEAN_OPERATOR_IS value_type_ = bool - def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterBoolean, value=True, operator=FILTER_BOOLEAN_OPERATOR_IS): - super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) + def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterBoolean, filters: Optional[List[List["Filter"]]] = None, value=True, operator=FILTER_BOOLEAN_OPERATOR_IS): + super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) def __ne__(self, value: bool) -> "BooleanFilter": return self.__eq__(not value) @@ -385,11 +308,11 @@ def __ne__(self, value: bool) -> "BooleanFilter": def __invert__(self) -> "BooleanFilter": return self.__eq__(not self.value) - def to_message(self) -> Message: + def to_basic_message(self) -> Message: return self.message_type(field=self.field, filter_boolean=self.inner_message_type(value=self.value, operator=self.operator)) -class ArrayFilter(SimpleFilter): +class ArrayFilter(Filter): """ Filter for array comparisons """ @@ -397,8 +320,8 @@ class ArrayFilter(SimpleFilter): notcontains_ = FILTER_ARRAY_OPERATOR_NOT_CONTAINS value_type_ = str - def __init__(self, field: Message, conjunction_type: Type["FilterConjunction"], message_type: Type[Message], inner_message_type: Type[Message] = FilterArray, value=None, operator=None): - super().__init__(field, conjunction_type, message_type, inner_message_type, value, operator) + def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterArray, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): + super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) - def to_message(self) -> Message: + def to_basic_message(self) -> Message: return self.message_type(field=self.field, filter_array=self.inner_message_type(value=self.value, operator=self.operator)) diff --git a/packages/python/tests/filters_test.py b/packages/python/tests/filters_test.py index 8b3501d23..b67f7341f 100644 --- a/packages/python/tests/filters_test.py +++ b/packages/python/tests/filters_test.py @@ -4,7 +4,7 @@ import pytest from dataclasses import dataclass -from armonik.common.filter import SimpleFilter, FilterConjunction, FilterDisjunction, StringFilter, BooleanFilter, NumberFilter +from armonik.common.filter import Filter, StringFilter, BooleanFilter, NumberFilter from armonik.protogen.common.filters_common_pb2 import FilterBoolean from google.protobuf.message import Message @@ -24,46 +24,28 @@ class Field(Message): pass -class DummyDisjunction(FilterDisjunction): - - def conjunction_type(self) -> Type["FilterConjunction"]: - return DummyConjunction - - def message_type(self) -> Type: - return DummyMessageAnd - - -class DummyConjunction(FilterConjunction): - - def disjunction_type(self) -> Type["FilterDisjunction"]: - return DummyDisjunction - - def message_type(self) -> Type: - return DummyMessage - - @pytest.mark.parametrize("filt,inverted", [ - (StringFilter(Field(), DummyConjunction, DummyMessage) == "Test", StringFilter(Field(), DummyConjunction, DummyMessage) != "Test"), - (StringFilter(Field(), DummyConjunction, DummyMessage).contains("Test"), ~(StringFilter(Field(), DummyConjunction, DummyMessage).contains("Test"))), - (BooleanFilter(Field(), DummyConjunction, DummyMessage), BooleanFilter(Field(), DummyConjunction, DummyMessage, FilterBoolean, False)), - (NumberFilter(Field(), DummyConjunction, DummyMessage) > 0, NumberFilter(Field(), DummyConjunction, DummyMessage) <= 0), - (NumberFilter(Field(), DummyConjunction, DummyMessage) >= 0, NumberFilter(Field(), DummyConjunction, DummyMessage) < 0), - (NumberFilter(Field(), DummyConjunction, DummyMessage) < 0, NumberFilter(Field(), DummyConjunction, DummyMessage) >= 0), - (NumberFilter(Field(), DummyConjunction, DummyMessage) <= 0, NumberFilter(Field(), DummyConjunction, DummyMessage) > 0) + (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) == "Test", StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) != "Test"), + (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains("Test"), ~(StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains("Test"))), + (BooleanFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage), BooleanFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage, FilterBoolean, None, False)), + (NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) > 0, NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) <= 0), + (NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) >= 0, NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) < 0), + (NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) < 0, NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) >= 0), + (NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) <= 0, NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) > 0) ]) -def test_inversion(filt: SimpleFilter, inverted: SimpleFilter): +def test_inversion(filt: Filter, inverted: Filter): assert filt.operator != inverted.operator or filt.value == (not inverted.value) # In case of BooleanFilter, the value is inverted, not the operator assert (~filt).operator == inverted.operator and (~filt).value == inverted.value assert filt.operator == (~(~filt)).operator and filt.value == (~(~filt)).value @pytest.mark.parametrize("filt", [ - (StringFilter(Field(), DummyConjunction, DummyMessage).startswith("Test")), - (StringFilter(Field(), DummyConjunction, DummyMessage).endswith("Test")), - (StringFilter(Field(), DummyConjunction, DummyMessage)) # No op + (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).startswith("Test")), + (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).endswith("Test")), + (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage)) # No op ]) -def test_inversion_raises(filt: SimpleFilter): +def test_inversion_raises(filt: Filter): with pytest.raises(Exception): test = ~filt print(test) diff --git a/packages/python/tests/tasks_test.py b/packages/python/tests/tasks_test.py index 125e44e5d..752b2ac63 100644 --- a/packages/python/tests/tasks_test.py +++ b/packages/python/tests/tasks_test.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import dataclasses -from typing import Optional, List, Any, Union +from typing import Optional, List, Any, Union, Dict, Collection from google.protobuf.timestamp_pb2 import Timestamp from datetime import datetime @@ -11,7 +11,7 @@ from armonik.client import ArmoniKTasks from armonik.client.tasks import TaskFieldFilter from armonik.common import TaskStatus, datetime_to_timestamp, Task -from armonik.common.filter import StringFilter, FilterDisjunction, FilterConjunction, SimpleFilter +from armonik.common.filter import StringFilter, Filter from armonik.protogen.client.tasks_service_pb2_grpc import TasksStub from armonik.protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse, TaskDetailed from armonik.protogen.common.tasks_filters_pb2 import Filters, FilterField @@ -146,15 +146,15 @@ class SimpleFieldFilter: ] ) ]) -def test_filter_combination(filt: Union[SimpleFilter, FilterConjunction, FilterDisjunction], n_or: int, n_and: List[int], filters: List[SimpleFieldFilter]): +def test_filter_combination(filt: Filter, n_or: int, n_and: List[int], filters: List[SimpleFieldFilter]): filt = filt.to_disjunction() - assert len(filt.filters) == n_or + assert len(filt._filters) == n_or sorted_n_and = sorted(n_and) - sorted_actual = sorted([len(f.filters) for f in filt.filters]) + sorted_actual = sorted([len(f) for f in filt._filters]) assert len(sorted_n_and) == len(sorted_actual) assert all((sorted_n_and[i] == sorted_actual[i] for i in range(len(sorted_actual)))) - for f in filt.filters: - for ff in f.filters: + for f in filt._filters: + for ff in f: field_value = getattr(ff.field, ff.field.WhichOneof("field")).field for i, expected in enumerate(filters): if expected.field == field_value and expected.value == ff.value and expected.operator == ff.operator: @@ -168,3 +168,114 @@ def test_filter_combination(filt: Union[SimpleFilter, FilterConjunction, FilterD def test_name_from_value(): assert TaskStatus.name_from_value(TaskStatus.COMPLETED) == "TASK_STATUS_COMPLETED" + + +class BasicFilterAnd: + + def __setattr__(self, key, value): + self.__dict__[key] = value + + def __getattr__(self, item): + return self.__dict__[item] + + +@pytest.mark.parametrize("filt,n_or,n_and,filters,expected_type", [ + ( + (TaskFieldFilter.INITIAL_TASK_ID == "TestId"), + 1, [1], + [ + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID, "TestId", FILTER_STRING_OPERATOR_EQUAL) + ], + 0 + ), + ( + (TaskFieldFilter.APPLICATION_NAME.contains("TestName") & (TaskFieldFilter.CREATED_AT > Timestamp(seconds=1000, nanos=500))), + 1, [2], + [ + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_NAME, "TestName", FILTER_STRING_OPERATOR_CONTAINS), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_CREATED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_AFTER) + ], + 1 + ), + ( + (((TaskFieldFilter.MAX_RETRIES <= 3) & ~(TaskFieldFilter.SESSION_ID == "SessionId")) | (TaskFieldFilter.task_options_key("MyKey").startswith("Start"))), + 2, [1, 2], + [ + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_MAX_RETRIES, 3, FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_SESSION_ID, "SessionId", FILTER_STRING_OPERATOR_NOT_EQUAL), + SimpleFieldFilter("MyKey", "Start", FILTER_STRING_OPERATOR_STARTS_WITH) + ], + 2 + ), + ( + (((TaskFieldFilter.PRIORITY > 3) & ~(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) & TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) | (TaskFieldFilter.ENGINE_TYPE.endswith("Test") & (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))), + 2, [2, 3], + [ + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_NOT_EQUAL), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_CONTAINS), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), + ], + 2 + ), + ( + (((TaskFieldFilter.PRIORITY >= 3) * -(TaskFieldFilter.STATUS != TaskStatus.COMPLETED) * -TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) + (TaskFieldFilter.ENGINE_TYPE.endswith("Test") * (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))), + 2, [2, 3], + [ + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_EQUAL), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_NOT_CONTAINS), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), + ], + 2 + ), + ( + (((TaskFieldFilter.PRIORITY >= 3) * -(TaskFieldFilter.STATUS != TaskStatus.COMPLETED) * -TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) + (TaskFieldFilter.ENGINE_TYPE.endswith("Test") * (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))) + (((TaskFieldFilter.MAX_RETRIES <= 3) & ~(TaskFieldFilter.SESSION_ID == "SessionId")) | (TaskFieldFilter.task_options_key("MyKey").startswith("Start"))), + 4, [2, 3, 2, 1], + [ + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_EQUAL), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_NOT_CONTAINS), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), + SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_MAX_RETRIES, 3, FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL), + SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_SESSION_ID, "SessionId", FILTER_STRING_OPERATOR_NOT_EQUAL), + SimpleFieldFilter("MyKey", "Start", FILTER_STRING_OPERATOR_STARTS_WITH) + ], + 2 + ) +]) +def test_taskfilter_to_message(filt: Filter, n_or: int, n_and: List[int], filters: List[SimpleFieldFilter], expected_type: int): + print(filt) + message = filt.to_message() + conjs: Collection = [] + if expected_type == 2: # Disjunction + conjs: Collection = getattr(message, "or") + assert len(conjs) == n_or + sorted_n_and = sorted(n_and) + sorted_actual = sorted([len(getattr(f, "and")) for f in conjs]) + assert len(sorted_n_and) == len(sorted_actual) + assert all((sorted_n_and[i] == sorted_actual[i] for i in range(len(sorted_actual)))) + + if expected_type == 1: # Conjunction + conjs: Collection = [message] + + if expected_type == 0: # Simple filter + m = BasicFilterAnd() + setattr(m, "and", [message]) + conjs: Collection = [m] + + for conj in conjs: + basics = getattr(conj, "and") + for f in basics: + field_value = getattr(f.field, f.field.WhichOneof("field")).field + for i, expected in enumerate(filters): + if expected.field == field_value and expected.value == getattr(f, f.WhichOneof("value_condition")).value and expected.operator == getattr(f, f.WhichOneof("value_condition")).operator: + filters.pop(i) + break + else: + print(f"Could not find {str(f)}") + assert False + assert len(filters) == 0 From a82e08f79140e493799f2b5d11c826efbbce8ac7 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 26 Sep 2023 10:09:51 +0200 Subject: [PATCH 073/344] Fixed fstrings in exceptions --- packages/python/proto2python.sh | 1 + packages/python/pyproject.toml | 2 +- packages/python/src/armonik/client/tasks.py | 8 ++++-- packages/python/src/armonik/common/filter.py | 28 ++++++++++++-------- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh index f483b0541..c2fe45244 100644 --- a/packages/python/proto2python.sh +++ b/packages/python/proto2python.sh @@ -32,6 +32,7 @@ mkdir -p $ARMONIK_WORKER $ARMONIK_CLIENT $ARMONIK_COMMON $PACKAGE_PATH python -m pip install --upgrade pip python -m venv $PYTHON_VENV source $PYTHON_VENV/bin/activate +# We need to fix grpc to 1.56 until this bug is solved : https://github.com/grpc/grpc/issues/34305 python -m pip install build grpcio==1.56.2 grpcio-tools==1.56.2 click pytest setuptools_scm[toml] unset proto_files diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index af91ab0d2..0b66674bc 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "grpcio==1.56.2", "grpcio-tools==1.56.2" ] - +# We need to set grpc to 1.56 until this bug is resolved : https://github.com/grpc/grpc/issues/34305 [project.urls] "Homepage" = "https://github.com/aneoconsulting/ArmoniK.Api" "Bug Tracker" = "https://github.com/aneoconsulting/ArmoniK/issues" diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 2a543a458..d6fb6876a 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -1,6 +1,6 @@ from __future__ import annotations from grpc import Channel -from typing import Type, Union, cast, Tuple, List +from typing import cast, Tuple, List from ..common import Task, Direction from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter @@ -92,6 +92,10 @@ def list_tasks(self, task_filter: Filter, with_errors: bool = False, page: int = - The total number of tasks for the given filter - The obtained list of tasks """ - request = ListTasksRequest(page=page, page_size=page_size, filters=cast(rawFilters, task_filter.to_disjunction().to_message()), sort=ListTasksRequest.Sort(field=cast(TaskField, sort_field.field), direction=sort_direction), with_errors=with_errors) + request = ListTasksRequest(page=page, + page_size=page_size, + filters=cast(rawFilters, task_filter.to_disjunction().to_message()), + sort=ListTasksRequest.Sort(field=cast(TaskField, sort_field.field), direction=sort_direction), + with_errors=with_errors) list_response: ListTasksDetailedResponse = self._client.ListTasksDetailed(request) return list_response.total, [Task.from_message(t) for t in list_response.tasks] diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 330329e2e..d80ccd312 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -76,11 +76,12 @@ def to_disjunction(self) -> Filter: def __and__(self, other: "Filter") -> "Filter": if not isinstance(other, Filter): - raise Exception(f"Cannot create a conjunction between Filter and {other.__class__.__name__}") + msg = f"Cannot create a conjunction between Filter and {other.__class__.__name__}" + raise Exception(msg) if self.is_true_disjunction() or other.is_true_disjunction(): - raise Exception(f"Cannot make a conjunction of disjunctions") + raise Exception("Cannot make a conjunction of disjunctions") if self.conjunction_type != other.conjunction_type: - raise Exception(f"Conjunction types are different") + raise Exception("Conjunction types are different") return Filter(None, self.disjunction_type, self.conjunction_type, self.conjunction_type, None, [self.to_disjunction()._filters[0] + other.to_disjunction()._filters[0]]) def __mul__(self, other: Filter) -> "Filter": @@ -88,9 +89,10 @@ def __mul__(self, other: Filter) -> "Filter": def __or__(self, other: "Filter") -> "Filter": if not isinstance(other, Filter): - raise Exception(f"Cannot create a conjunction between Filter and {other.__class__.__name__}") + msg = f"Cannot create a conjunction between Filter and {other.__class__.__name__}" + raise Exception(msg) if self.disjunction_type != other.disjunction_type: - raise Exception(f"Disjunction types are different") + raise Exception("Disjunction types are different") return Filter(None, self.disjunction_type, self.conjunction_type, self.disjunction_type, None, self.to_disjunction()._filters + other.to_disjunction()._filters) def __add__(self, other: "Filter") -> "Filter": @@ -126,8 +128,9 @@ def __invert__(self) -> Filter: """ if self.operator is None: if self.is_true_conjunction() or self.is_true_disjunction(): - raise Exception(f"Cannot invert conjunctions or disjunctions") - raise Exception(f"Cannot invert None operator in class {self.__class__.__name__} for field {str(self.field)}") + raise Exception("Cannot invert conjunctions or disjunctions") + msg = f"Cannot invert None operator in class {self.__class__.__name__} for field {str(self.field)}" + raise Exception(msg) if self.operator == self.__class__.eq_: return self.__ne__(self.value) if self.operator == self.__class__.ne_: @@ -144,7 +147,8 @@ def __invert__(self) -> Filter: return self._check(self.value, self.__class__.notcontains_, "not_contains") if self.operator == self.__class__.notcontains_: return self.contains(self.value) - raise Exception(f"{self.__class__.__name__} operator {str(self.operator)} for field {str(self.field)} has no inverted equivalent") + msg = f"{self.__class__.__name__} operator {str(self.operator)} for field {str(self.field)} has no inverted equivalent" + raise Exception(msg) def __neg__(self) -> "Filter": return ~self @@ -176,7 +180,8 @@ def _verify_value(self, value): """ if self.__class__.value_type_ is None or isinstance(value, self.__class__.value_type_): return - raise Exception(f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead") + msg = f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead" + raise Exception(msg) def _check(self, value: Any, operator: Any, operator_str: str = "") -> "Filter": """ @@ -193,10 +198,11 @@ def _check(self, value: Any, operator: Any, operator_str: str = "") -> "Filter": NotImplementedError if the given operator is not available for the given class """ if self.is_true_conjunction() or self.is_true_disjunction(): - raise Exception(f"Cannot apply operator to a disjunction or a conjunction") + raise Exception("Cannot apply operator to a disjunction or a conjunction") self._verify_value(value) if operator is None: - raise NotImplementedError(f"Operator {operator_str} is not available for {self.__class__.__name__}") + msg = f"Operator {operator_str} is not available for {self.__class__.__name__}" + raise NotImplementedError(msg) return self.__class__(self.field, self.disjunction_type, self.conjunction_type, self.message_type, self.inner_message_type, self._filters, value, operator) @abstractmethod From 16da828f436c5d5e5790b830d3e727c97de50f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Tue, 26 Sep 2023 11:04:37 +0200 Subject: [PATCH 074/344] chore: update 3.13.0 --- .../projects/aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 2 +- .../ArmoniK.Api.Common.Channel.csproj | 2 +- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 2 +- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 2 +- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 2 +- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 2 +- packages/web/package.json | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index af93c4b85..72e87d50b 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.12.0", + "version": "3.13.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 74f4ea033..329a0d426 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.12.0) +set(version 3.13.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 8b608d4a1..340ead518 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.12.0 + 3.13.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 38b74b44e..8f4d394ae 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.12.0 + 3.13.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index b75181220..76da1aac5 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - 3.12.0 + 3.13.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 089ffad69..b4d5d8784 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.12.0 + 3.13.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index d95259962..d95bb358b 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.12.0 + 3.13.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 0683573ba..c4b6f0cf9 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,7 +14,7 @@ true snupkg ../kp.snk - 3.12.0 + 3.13.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 6c9b2c2e5..f4f4c3be6 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.12.0 + 3.13.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 3096634fd..14ba949aa 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.12.0 + 3.13.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index 80bdaa15f..60690e21a 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.12.0", + "version": "3.13.0", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From a36e5c1f6842e13f0bb751c98a750a70667b4b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Tue, 26 Sep 2023 11:38:22 +0200 Subject: [PATCH 075/344] fix: ReadFromFolderDict is internal --- packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs index 5f287396e..c13820e6e 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs @@ -38,7 +38,7 @@ namespace ArmoniK.Api.Worker.Worker; -public class ReadFromFolderDict : IReadOnlyDictionary +internal class ReadFromFolderDict : IReadOnlyDictionary { private readonly Dictionary data_ = new(); private readonly IList dataDependencies_; From b39d84f262ed7bd117e462455da16a215a549aa4 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 26 Sep 2023 15:52:50 +0200 Subject: [PATCH 076/344] cpp :Fixed worker/agent communication (via files) --- .../header/utils/string_utils.h | 62 +++++++ .../ArmoniK.Api.Worker.Tests/source/main.cpp | 5 +- .../header/Worker/ArmoniKWorker.h | 9 +- .../header/Worker/TaskHandler.h | 16 +- .../source/Worker/ArmoniKWorker.cpp | 43 ++--- .../source/Worker/TaskHandler.cpp | 158 +++++------------- packages/cpp/tools/restart-build-env.sh | 3 +- 7 files changed, 138 insertions(+), 158 deletions(-) create mode 100644 packages/cpp/ArmoniK.Api.Common/header/utils/string_utils.h diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/string_utils.h b/packages/cpp/ArmoniK.Api.Common/header/utils/string_utils.h new file mode 100644 index 000000000..607b4131b --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/string_utils.h @@ -0,0 +1,62 @@ +#pragma once + +#include +#include +#include +#include + +namespace armonik { +namespace api { +namespace common { +namespace utils { +// trim from start (in place) +static inline void ltrim(std::string &s) { + s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { return !std::isspace(ch); })); +} + +// trim from end (in place) +static inline void rtrim(std::string &s) { + s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch); }).base(), s.end()); +} + +// trim from both ends (in place) +static inline void trim(std::string &s) { + rtrim(s); + ltrim(s); +} + +// trim from start (copying) +static inline std::string ltrim_copy(std::string s) { + ltrim(s); + return s; +} + +// trim from end (copying) +static inline std::string rtrim_copy(std::string s) { + rtrim(s); + return s; +} + +// trim from both ends (copying) +static inline std::string trim_copy(std::string s) { + trim(s); + return s; +} + +inline std::string pathJoin(const std::string &p1, const std::string &p2) { +#ifdef _WIN32 + constexpr char sep = '\\'; +#else + constexpr char sep = '/'; +#endif + std::string tmp = trim_copy(p1); + + if (tmp[tmp.length() - 1] != sep) { + tmp += sep; + } + return tmp + trim_copy(p2); +} +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Worker.Tests/source/main.cpp b/packages/cpp/ArmoniK.Api.Worker.Tests/source/main.cpp index 39558d0e7..a64e51227 100644 --- a/packages/cpp/ArmoniK.Api.Worker.Tests/source/main.cpp +++ b/packages/cpp/ArmoniK.Api.Worker.Tests/source/main.cpp @@ -36,10 +36,7 @@ class TestWorker : public armonik::api::worker::ArmoniKWorker { try { if (!taskHandler.getExpectedResults().empty()) { - auto res = taskHandler.send_result(taskHandler.getExpectedResults()[0], taskHandler.getPayload()).get(); - if (res.has_error()) { - throw armonik::api::common::exceptions::ArmoniKApiException(res.error()); - } + taskHandler.send_result(taskHandler.getExpectedResults()[0], taskHandler.getPayload()).get(); } } catch (const std::exception &e) { diff --git a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h index ff06921bd..18e9d1893 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/Worker/ArmoniKWorker.h @@ -35,15 +35,14 @@ class ArmoniKWorker : public armonik::api::grpc::v1::worker::Worker::Service { * @brief Implements the Process method of the Worker service. * * @param context The ServerContext object. - * @param reader The request iterator + * @param request The Process request * @param response The ProcessReply object. * * @return The status of the method. */ - [[maybe_unused]] ::grpc::Status - Process(::grpc::ServerContext *context, - ::grpc::ServerReader<::armonik::api::grpc::v1::worker::ProcessRequest> *reader, - ::armonik::api::grpc::v1::worker::ProcessReply *response) override; + ::grpc::Status Process(::grpc::ServerContext *context, + const ::armonik::api::grpc::v1::worker::ProcessRequest *request, + ::armonik::api::grpc::v1::worker::ProcessReply *response) override; /** * @brief Function which does the actual work diff --git a/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h b/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h index e50d753ae..620fad918 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h @@ -22,7 +22,7 @@ class TaskHandler { private: armonik::api::grpc::v1::agent::Agent::Stub &stub_; - ::grpc::ServerReader &request_iterator_; + const armonik::api::grpc::v1::worker::ProcessRequest &request_; std::string session_id_; std::string task_id_; armonik::api::grpc::v1::TaskOptions task_options_; @@ -31,22 +31,17 @@ class TaskHandler { std::map data_dependencies_; std::string token_; armonik::api::grpc::v1::Configuration config_; + std::string data_folder_; public: /** * @brief Construct a new Task Handler object * * @param client the agent client - * @param request_iterator The request iterator + * @param request The process request */ TaskHandler(armonik::api::grpc::v1::agent::Agent::Stub &client, - ::grpc::ServerReader &request_iterator); - - /** - * @brief Initialise the task handler - * - */ - void init(); + const armonik::api::grpc::v1::worker::ProcessRequest &request); /** * @brief Create a task_chunk_stream. @@ -89,7 +84,8 @@ class TaskHandler { * @param data The result data * @return A future containing a vector of ResultReply */ - std::future send_result(std::string key, absl::string_view data); + std::future send_result(std::string key, + absl::string_view data); /** * @brief Get the result ids object diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp index 411fb7892..5a4e5c90a 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/ArmoniKWorker.cpp @@ -47,32 +47,37 @@ armonik::api::worker::ArmoniKWorker::ArmoniKWorker(std::unique_ptr *reader, +armonik::api::worker::ArmoniKWorker::Process(::grpc::ServerContext *context, + const ::armonik::api::grpc::v1::worker::ProcessRequest *request, ::armonik::api::grpc::v1::worker::ProcessReply *response) { - + (void)context; logger_.debug("Receive new request From C++ Worker"); - TaskHandler task_handler(*agent_, *reader); - - task_handler.init(); try { - ProcessStatus status = Execute(task_handler); - - logger_.debug("Finish call C++"); - - armonik::api::grpc::v1::Output output; - if (status.ok()) { - *output.mutable_ok() = armonik::api::grpc::v1::Empty(); - } else { - output.mutable_error()->set_details(std::move(status).details()); + TaskHandler task_handler(*agent_, *request); + try { + ProcessStatus status = Execute(task_handler); + + logger_.debug("Finish call C++"); + + armonik::api::grpc::v1::Output output; + if (status.ok()) { + *output.mutable_ok() = armonik::api::grpc::v1::Empty(); + } else { + output.mutable_error()->set_details(std::move(status).details()); + } + *response->mutable_output() = std::move(output); + } catch (const std::exception &e) { + logger_.error("Error processing task : {what}", {{"what", e.what()}}); + std::stringstream ss; + ss << "Error processing task : " << e.what(); + return {::grpc::StatusCode::UNAVAILABLE, ss.str(), e.what()}; } - *response->mutable_output() = std::move(output); } catch (const std::exception &e) { - logger_.error("Error processing task : {what}", {{"what", e.what()}}); + logger_.error("Error in the request handling : {what}", {{"what", e.what()}}); std::stringstream ss; - ss << "Error processing task : " << e.what(); - return {::grpc::StatusCode::UNAVAILABLE, ss.str(), e.what()}; + ss << "Error in the request handling : " << e.what(); + return {::grpc::StatusCode::INVALID_ARGUMENT, ss.str(), e.what()}; } return ::grpc::Status::OK; diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp index 8b2820d92..aff224cf2 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp @@ -1,5 +1,7 @@ #include "Worker/TaskHandler.h" #include "exceptions/ArmoniKApiException.h" +#include "utils/string_utils.h" +#include #include #include #include @@ -28,89 +30,28 @@ using ::grpc::Status; * @param client the agent client * @param request_iterator The request iterator */ -armonik::api::worker::TaskHandler::TaskHandler(Agent::Stub &client, - ::grpc::ServerReader &request_iterator) - : stub_(client), request_iterator_(request_iterator) {} - -/** - * @brief Initialise the task handler - * - */ -void armonik::api::worker::TaskHandler::init() { - ProcessRequest Request; - if (!request_iterator_.Read(&Request)) { - throw std::runtime_error("Request stream ended unexpectedly."); +armonik::api::worker::TaskHandler::TaskHandler(Agent::Stub &client, const ProcessRequest &request) + : stub_(client), request_(request) { + token_ = request_.communication_token(); + session_id_ = request_.session_id(); + task_id_ = request_.task_id(); + task_options_ = request_.task_options(); + const std::string payload_id = request_.payload_id(); + data_folder_ = request_.data_folder(); + payload_ = + (std::ostringstream(std::ios::binary) + << std::ifstream(armonik::api::common::utils::pathJoin(data_folder_, payload_id), std::fstream::binary).rdbuf()) + .str(); + config_ = request_.configuration(); + expected_result_.assign(request_.expected_output_keys().begin(), request_.expected_output_keys().end()); + + for (auto &&dd : request_.data_dependencies()) { + // TODO Replace with lazy loading via a custom std::map (to not break compatibility) + data_dependencies_[dd] = + (std::ostringstream(std::ios::binary) + << std::ifstream(armonik::api::common::utils::pathJoin(data_folder_, dd), std::fstream::binary).rdbuf()) + .str(); } - - if (Request.compute().type_case() != armonik::api::grpc::v1::worker::ProcessRequest_ComputeRequest::kInitRequest) { - throw std::runtime_error("Expected a Compute request type with InitRequest to start the stream."); - } - auto *init_request = Request.mutable_compute()->mutable_init_request(); - session_id_ = init_request->session_id(); - task_id_ = init_request->task_id(); - task_options_ = init_request->task_options(); - expected_result_.assign(std::make_move_iterator(init_request->mutable_expected_output_keys()->begin()), - std::make_move_iterator(init_request->mutable_expected_output_keys()->end())); - token_ = Request.communication_token(); - config_ = std::move(*init_request->mutable_configuration()); - - auto *datachunk = &init_request->payload(); - assert(payload_.empty()); - payload_.append(datachunk->data()); - - while (!datachunk->data_complete()) { - if (!request_iterator_.Read(&Request)) { - throw std::runtime_error("Request stream ended unexpectedly."); - } - if (Request.compute().type_case() != armonik::api::grpc::v1::worker::ProcessRequest_ComputeRequest::kPayload) { - throw std::runtime_error("Expected a Compute request type with Payload to continue the stream."); - } - - datachunk = &Request.compute().payload(); - if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::kData) { - payload_.append(datachunk->data()); - } else if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::TYPE_NOT_SET) { - throw std::runtime_error("Expected a Compute request type with a DataChunk Payload to continue the stream."); - } else if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::kDataComplete) { - break; - } - } - - armonik::api::grpc::v1::worker::ProcessRequest_ComputeRequest::InitData *init_data; - - do { - if (!request_iterator_.Read(&Request)) { - throw std::runtime_error("Request stream ended unexpectedly."); - } - if (Request.compute().type_case() != armonik::api::grpc::v1::worker::ProcessRequest_ComputeRequest::kInitData) { - throw std::runtime_error("Expected a Compute request type with InitData to continue the stream."); - } - - init_data = Request.mutable_compute()->mutable_init_data(); - if (init_data->type_case() == armonik::api::grpc::v1::worker::ProcessRequest_ComputeRequest_InitData::kKey) { - const std::string &key = init_data->key(); - std::string data_dep; - while (true) { - ProcessRequest dep_request; - if (!request_iterator_.Read(&dep_request)) { - throw std::runtime_error("Request stream ended unexpectedly."); - } - if (dep_request.compute().type_case() != armonik::api::grpc::v1::worker::ProcessRequest_ComputeRequest::kData) { - throw std::runtime_error("Expected a Compute request type with Data to continue the stream."); - } - - auto chunk = dep_request.compute().data(); - if (chunk.type_case() == armonik::api::grpc::v1::DataChunk::kData) { - data_dep.append(chunk.data()); - } else if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::TYPE_NOT_SET) { - throw std::runtime_error("Expected a Compute request type with a DataChunk Payload to continue the stream."); - } else if (datachunk->type_case() == armonik::api::grpc::v1::DataChunk::kDataComplete) { - break; - } - } - data_dependencies_[key] = data_dep; - } - } while (init_data->type_case() == armonik::api::grpc::v1::worker::ProcessRequest_ComputeRequest_InitData::kKey); } /** @@ -273,44 +214,25 @@ armonik::api::worker::TaskHandler::create_tasks_async(TaskOptions task_options, * @param data The result data * @return A future containing a vector of ResultReply */ -std::future +std::future armonik::api::worker::TaskHandler::send_result(std::string key, absl::string_view data) { return std::async(std::launch::async, [this, key = std::move(key), data]() mutable { - ::grpc::ClientContext context_client_writer; - - armonik::api::grpc::v1::agent::ResultReply reply; - - size_t max_chunk = config_.data_chunk_max_size(); - const size_t data_size = data.size(); - size_t start = 0; - - auto stream = stub_.SendResult(&context_client_writer, &reply); - - armonik::api::grpc::v1::agent::Result init_msg; - init_msg.mutable_init()->set_key(std::move(key)); - init_msg.set_communication_token(token_); - - stream->Write(init_msg); - - while (start < data_size) { - size_t chunkSize = std::min(max_chunk, data_size - start); - - armonik::api::grpc::v1::agent::Result msg; - msg.set_communication_token(token_); - msg.mutable_data()->mutable_data()->assign(data.data() + start, chunkSize); - - stream->Write(msg); - - start += chunkSize; - } - - armonik::api::grpc::v1::agent::Result end_msg; - end_msg.set_communication_token(token_); - end_msg.mutable_data()->set_data_complete(true); - stream->Write(end_msg); - - stream->WritesDone(); - ::grpc::Status status = stream->Finish(); + ::grpc::ClientContext context; + + std::ofstream output(armonik::api::common::utils::pathJoin(data_folder_, key), + std::fstream::binary | std::fstream::trunc); + output << data; + output.close(); + + armonik::api::grpc::v1::agent::NotifyResultDataResponse reply; + armonik::api::grpc::v1::agent::NotifyResultDataRequest request; + request.set_communication_token(token_); + armonik::api::grpc::v1::agent::NotifyResultDataRequest::ResultIdentifier result_id; + result_id.set_session_id(session_id_); + result_id.set_result_id(key); + *(request.mutable_ids()->Add()) = result_id; + + auto status = stub_.NotifyResultData(&context, request, &reply); if (!status.ok()) { std::stringstream message; diff --git a/packages/cpp/tools/restart-build-env.sh b/packages/cpp/tools/restart-build-env.sh index 54f1af08a..a6de45dd7 100755 --- a/packages/cpp/tools/restart-build-env.sh +++ b/packages/cpp/tools/restart-build-env.sh @@ -35,8 +35,7 @@ docker build -t "${IMAGE_NAME}:${IMAGE_TAG}" -f BuildEnv.Dockerfile . cd "${working_dir}" mkdir -p ${working_dir}/build -mkdir -p ${working_dir}/buildtest mkdir -p ${install_dir} REMOTE_BUILD_ADDRESS="${REMOTE_BUILD_ADDRESS:-"127.0.0.1:2223"}" -docker run --rm -d --cap-add sys_ptrace -p"${REMOTE_BUILD_ADDRESS}":22 --name "${CONTAINER_NAME}" -v "${proto_dir}:/app/proto" -v "${working_dir}:/app/source" -v "${install_dir}:/app/install" -v "${working_dir}/build:/app/build" -v "${working_dir}/buildtest:/app/buildtest" "${IMAGE_NAME}:${IMAGE_TAG}" \ No newline at end of file +docker run --rm -d --cap-add sys_ptrace -p"${REMOTE_BUILD_ADDRESS}":22 --name "${CONTAINER_NAME}" -v "${proto_dir}:/app/proto" -v "${working_dir}:/app/source" -v "${install_dir}:/app/install" -v "${working_dir}/build:/app/build" "${IMAGE_NAME}:${IMAGE_TAG}" \ No newline at end of file From 77bf4d32797b6bff9278fa58f927a348cc70d7e6 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 26 Sep 2023 16:22:26 +0200 Subject: [PATCH 077/344] Fixed Rhel compilation --- .../source/Worker/TaskHandler.cpp | 17 +++++++++-------- packages/cpp/tools/restart-build-env.sh | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp index aff224cf2..d29bffbec 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp @@ -38,19 +38,20 @@ armonik::api::worker::TaskHandler::TaskHandler(Agent::Stub &client, const Proces task_options_ = request_.task_options(); const std::string payload_id = request_.payload_id(); data_folder_ = request_.data_folder(); - payload_ = - (std::ostringstream(std::ios::binary) - << std::ifstream(armonik::api::common::utils::pathJoin(data_folder_, payload_id), std::fstream::binary).rdbuf()) - .str(); + std::ostringstream string_stream(std::ios::binary); + string_stream + << std::ifstream(armonik::api::common::utils::pathJoin(data_folder_, payload_id), std::fstream::binary).rdbuf(); + payload_ = string_stream.str(); + string_stream.clear(); config_ = request_.configuration(); expected_result_.assign(request_.expected_output_keys().begin(), request_.expected_output_keys().end()); for (auto &&dd : request_.data_dependencies()) { // TODO Replace with lazy loading via a custom std::map (to not break compatibility) - data_dependencies_[dd] = - (std::ostringstream(std::ios::binary) - << std::ifstream(armonik::api::common::utils::pathJoin(data_folder_, dd), std::fstream::binary).rdbuf()) - .str(); + string_stream + << std::ifstream(armonik::api::common::utils::pathJoin(data_folder_, dd), std::fstream::binary).rdbuf(); + data_dependencies_[dd] = string_stream.str(); + string_stream.clear(); } } diff --git a/packages/cpp/tools/restart-build-env.sh b/packages/cpp/tools/restart-build-env.sh index a6de45dd7..5717f6125 100755 --- a/packages/cpp/tools/restart-build-env.sh +++ b/packages/cpp/tools/restart-build-env.sh @@ -38,4 +38,4 @@ mkdir -p ${working_dir}/build mkdir -p ${install_dir} REMOTE_BUILD_ADDRESS="${REMOTE_BUILD_ADDRESS:-"127.0.0.1:2223"}" -docker run --rm -d --cap-add sys_ptrace -p"${REMOTE_BUILD_ADDRESS}":22 --name "${CONTAINER_NAME}" -v "${proto_dir}:/app/proto" -v "${working_dir}:/app/source" -v "${install_dir}:/app/install" -v "${working_dir}/build:/app/build" "${IMAGE_NAME}:${IMAGE_TAG}" \ No newline at end of file +docker run --rm -d --cap-add sys_ptrace -p"${REMOTE_BUILD_ADDRESS}":22 --name "${CONTAINER_NAME}" -v "${proto_dir}:/app/proto" -v "${working_dir}:/app/source" -v "${install_dir}:/app/install" -v "${working_dir}/build:/app/build" "${IMAGE_NAME}:${IMAGE_TAG}" From 4c404f4bfb34019c5ee1b5db62066d463f769260 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 27 Sep 2023 10:25:56 +0200 Subject: [PATCH 078/344] python: Fixed taskhandler and tests --- .../python/src/armonik/worker/taskhandler.py | 122 ++++----------- packages/python/src/armonik/worker/worker.py | 8 +- packages/python/tests/taskhandler_test.py | 143 ++++-------------- packages/python/tests/worker_test.py | 38 ++++- 4 files changed, 98 insertions(+), 213 deletions(-) diff --git a/packages/python/src/armonik/worker/taskhandler.py b/packages/python/src/armonik/worker/taskhandler.py index 9d8ade962..49eeb8ff3 100644 --- a/packages/python/src/armonik/worker/taskhandler.py +++ b/packages/python/src/armonik/worker/taskhandler.py @@ -1,83 +1,35 @@ from __future__ import annotations +import os from typing import Optional, Dict, List, Tuple, Union, cast from ..common import TaskOptions, TaskDefinition, Task -from ..protogen.common.agent_common_pb2 import Result, CreateTaskRequest, CreateResultsMetaDataRequest, CreateResultsMetaDataResponse -from ..protogen.common.objects_pb2 import TaskRequest, InitKeyedDataStream, DataChunk, InitTaskRequest, TaskRequestHeader, Configuration +from ..protogen.common.agent_common_pb2 import CreateTaskRequest, CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, NotifyResultDataRequest +from ..protogen.common.objects_pb2 import TaskRequest, DataChunk, InitTaskRequest, TaskRequestHeader, Configuration from ..protogen.worker.agent_service_pb2_grpc import AgentStub +from ..protogen.common.worker_common_pb2 import ProcessRequest class TaskHandler: - def __init__(self, request_iterator, agent_client): - self.request_iterator = request_iterator + def __init__(self, request: ProcessRequest, agent_client: AgentStub): self._client: AgentStub = agent_client - self.payload = bytearray() - self.session_id: Optional[str] = None - self.task_id: Optional[str] = None - self.task_options: Optional[TaskOptions] = None - self.token: Optional[str] = None - self.expected_results: List[str] = [] - self.data_dependencies: Dict[str, bytearray] = {} - self.configuration: Optional[Configuration] = None - - @classmethod - def create(cls, request_iterator, agent_client) -> "TaskHandler": - output = cls(request_iterator, agent_client) - output.init() - return output - - def init(self): - current = next(self.request_iterator, None) - if current is None: - raise ValueError("Request stream ended unexpectedly") - - if current.compute.WhichOneof("type") != "init_request": - raise ValueError("Expected a Compute request type with InitRequest to start the stream.") - - init_request = current.compute.init_request - self.session_id = init_request.session_id - self.task_id = init_request.task_id - self.task_options = TaskOptions.from_message(init_request.task_options) - self.expected_results = list(init_request.expected_output_keys) - self.configuration = init_request.configuration - self.token = current.communication_token - - datachunk = init_request.payload - self.payload.extend(datachunk.data) - while not datachunk.data_complete: - current = next(self.request_iterator, None) - if current is None: - raise ValueError("Request stream ended unexpectedly") - if current.compute.WhichOneof("type") != "payload": - raise ValueError("Expected a Compute request type with Payload to continue the stream.") - datachunk = current.compute.payload - self.payload.extend(datachunk.data) - - while True: - current = next(self.request_iterator, None) - if current is None: - raise ValueError("Request stream ended unexpectedly") - if current.compute.WhichOneof("type") != "init_data": - raise ValueError("Expected a Compute request type with InitData to continue the stream.") - init_data = current.compute.init_data - if not (init_data.key is None or init_data.key == ""): - chunk = bytearray() - while True: - current = next(self.request_iterator, None) - if current is None: - raise ValueError("Request stream ended unexpectedly") - if current.compute.WhichOneof("type") != "data": - raise ValueError("Expected a Compute request type with Data to continue the stream.") - datachunk = current.compute.data - if datachunk.WhichOneof("type") == "data": - chunk.extend(datachunk.data) - elif datachunk.WhichOneof("type") is None or datachunk.WhichOneof("type") == "": - raise ValueError("Expected a Compute request type with Datachunk Payload to continue the stream.") - elif datachunk.WhichOneof("type") == "data_complete": - break - self.data_dependencies[init_data.key] = chunk - else: - break + self.session_id: str = request.session_id + self.task_id: str = request.task_id + self.task_options: TaskOptions = TaskOptions.from_message(request.task_options) + self.token: str = request.communication_token + self.expected_results: List[str] = list(request.expected_output_keys) + self.configuration: Configuration = request.configuration + self.payload_id: str = request.payload_id + self.data_folder: str = request.data_folder + + # TODO: Lazy load + with open(os.path.join(self.data_folder, self.payload_id), "rb") as f: + self.payload = f.read() + + # TODO: Lazy load + self.data_dependencies: Dict[str, bytes] = {} + for dd in request.data_dependencies: + with open(os.path.join(self.data_folder, dd), "rb") as f: + self.data_dependencies[dd] = f.read() def create_tasks(self, tasks: List[TaskDefinition], task_options: Optional[TaskOptions] = None) -> Tuple[List[Task], List[str]]: """Create new tasks for ArmoniK @@ -122,29 +74,13 @@ def send_result(self, key: str, data: Union[bytes, bytearray]) -> None: key: Result key data: Result data """ - def result_stream(): - res = Result(communication_token=self.token, init=InitKeyedDataStream(key=key)) - assert self.configuration is not None - yield res - start = 0 - data_len = len(data) - while start < data_len: - chunksize = min(self.configuration.data_chunk_max_size, data_len - start) - res = Result(communication_token=self.token, data=DataChunk(data=data[start:start + chunksize])) - yield res - start += chunksize - res = Result(communication_token=self.token, data=DataChunk(data_complete=True)) - yield res - res = Result(communication_token=self.token, init=InitKeyedDataStream(last_result=True)) - yield res - - result_reply = self._client.SendResult(result_stream()) - if result_reply.WhichOneof("type") == "error": - raise Exception(f"Cannot send result id={key}") - - def get_results_ids(self, names : List[str]) -> Dict[str, str]: - return {r.name : r.result_id for r in cast(CreateResultsMetaDataResponse, self._client.CreateResultsMetaData(CreateResultsMetaDataRequest(results=[CreateResultsMetaDataRequest.ResultCreate(name = n) for n in names], session_id=self.session_id, communication_token=self.token))).results} + with open(os.path.join(self.data_folder, key), "wb") as f: + f.write(data) + self._client.NotifyResultData(NotifyResultDataRequest(ids=[NotifyResultDataRequest.ResultIdentifier(session_id=self.session_id, result_id=key)], communication_token=self.token)) + + def get_results_ids(self, names: List[str]) -> Dict[str, str]: + return {r.name: r.result_id for r in cast(CreateResultsMetaDataResponse, self._client.CreateResultsMetaData(CreateResultsMetaDataRequest(results=[CreateResultsMetaDataRequest.ResultCreate(name=n) for n in names], session_id=self.session_id, communication_token=self.token))).results} def _to_request_stream_internal(request, communication_token, is_last, chunk_max_size): diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index 19db04f38..2de34aad1 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -9,7 +9,7 @@ from .seqlogger import ClefLogger from ..common import Output, HealthCheckStatus from ..protogen.common.objects_pb2 import Empty -from ..protogen.common.worker_common_pb2 import ProcessReply, HealthCheckReply +from ..protogen.common.worker_common_pb2 import ProcessReply, ProcessRequest, HealthCheckReply from ..protogen.worker.agent_service_pb2_grpc import AgentStub from ..protogen.worker.worker_service_pb2_grpc import WorkerServicer, add_WorkerServicer_to_server from .taskhandler import TaskHandler @@ -46,11 +46,11 @@ def start(self, endpoint: str): server.start() server.wait_for_termination() - def Process(self, request_iterator, context) -> Union[ProcessReply, None]: + def Process(self, request: ProcessRequest, context) -> Union[ProcessReply, None]: try: self._logger.debug("Received task") - task_handler = TaskHandler.create(request_iterator, self._client) - return ProcessReply(communication_token=task_handler.token, output=self.processing_function(task_handler).to_message()) + task_handler = TaskHandler(request, self._client) + return ProcessReply(output=self.processing_function(task_handler).to_message()) except Exception as e: self._logger.exception(f"Failed task {''.join(traceback.format_exception(type(e) ,e, e.__traceback__))}", exc_info=e) diff --git a/packages/python/tests/taskhandler_test.py b/packages/python/tests/taskhandler_test.py index 88cbc3809..e4f3c181c 100644 --- a/packages/python/tests/taskhandler_test.py +++ b/packages/python/tests/taskhandler_test.py @@ -1,18 +1,35 @@ #!/usr/bin/env python3 +import os + import pytest from typing import Iterator -from .common import DummyChannel + from armonik.common import TaskDefinition + +from .common import DummyChannel from armonik.worker import TaskHandler from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub -from armonik.protogen.common.agent_common_pb2 import CreateTaskRequest, CreateTaskReply, Result, ResultReply +from armonik.protogen.common.agent_common_pb2 import CreateTaskRequest, CreateTaskReply, NotifyResultDataRequest, NotifyResultDataResponse from armonik.protogen.common.worker_common_pb2 import ProcessRequest -from armonik.protogen.common.objects_pb2 import Configuration, DataChunk +from armonik.protogen.common.objects_pb2 import Configuration import logging logging.basicConfig() logging.getLogger().setLevel(logging.INFO) +data_folder = os.getcwd() + + +@pytest.fixture(autouse=True, scope="session") +def setup_teardown(): + with open(os.path.join(data_folder, "payloadid"), "wb") as f: + f.write("payload".encode()) + with open(os.path.join(data_folder, "ddid"), "wb") as f: + f.write("dd".encode()) + yield + os.remove(os.path.join(data_folder, "payloadid")) + os.remove(os.path.join(data_folder, "ddid")) + class DummyAgent(AgentStub): @@ -29,94 +46,18 @@ def CreateTask(self, request_iterator: Iterator[CreateTaskRequest]) -> CreateTas task_info=CreateTaskReply.TaskInfo(task_id="TaskId", expected_output_keys=["EOK"], data_dependencies=["DD"]))])) - def SendResult(self, request_iterator: Iterator[Result]) -> ResultReply: - self.send_result_task_message = [r for r in request_iterator] - return ResultReply() - - -class Reqs: - InitData1 = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - init_data=ProcessRequest.ComputeRequest.InitData(key="DataKey1"))) - InitData2 = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - init_data=ProcessRequest.ComputeRequest.InitData(key="DataKey2"))) - LastDataTrue = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - init_data=ProcessRequest.ComputeRequest.InitData(last_data=True))) - LastDataFalse = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - init_data=ProcessRequest.ComputeRequest.InitData(last_data=False))) - InitRequestPayload = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - init_request=ProcessRequest.ComputeRequest.InitRequest( - payload=DataChunk(data="test".encode("utf-8")), - configuration=Configuration(data_chunk_max_size=100), - expected_output_keys=["EOK"], session_id="SessionId", - task_id="TaskId"))) - InitRequestEmptyPayload = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - init_request=ProcessRequest.ComputeRequest.InitRequest( - configuration=Configuration(data_chunk_max_size=100), - expected_output_keys=["EOK"], session_id="SessionId", - task_id="TaskId"))) - Payload1 = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - payload=DataChunk(data="Payload1".encode("utf-8")))) - Payload2 = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - payload=DataChunk(data="Payload2".encode("utf-8")))) - PayloadComplete = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest(payload=DataChunk(data_complete=True))) - DataComplete = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest(data=DataChunk(data_complete=True))) - Data1 = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - data=DataChunk(data="Data1".encode("utf-8")))) - Data2 = ProcessRequest(communication_token="Token", - compute=ProcessRequest.ComputeRequest( - data=DataChunk(data="Data2".encode("utf-8")))) - - -should_throw_cases = [ - [], - [Reqs.InitData1], - [Reqs.InitData2], - [Reqs.LastDataTrue], - [Reqs.LastDataFalse], - [Reqs.InitRequestPayload], - [Reqs.DataComplete], - [Reqs.InitRequestEmptyPayload], - [Reqs.InitRequestPayload, Reqs.PayloadComplete, Reqs.InitData1, Reqs.Data1, Reqs.LastDataTrue], - [Reqs.InitRequestPayload, Reqs.InitData1, Reqs.Data1, Reqs.DataComplete, Reqs.LastDataTrue], - [Reqs.InitRequestPayload, Reqs.PayloadComplete, Reqs.Data1, Reqs.DataComplete, Reqs.LastDataTrue], -] - -should_succeed_cases = [ - [Reqs.InitRequestPayload, Reqs.Payload1, Reqs.Payload2, Reqs.PayloadComplete, Reqs.InitData1, Reqs.Data1, - Reqs.Data2, Reqs.DataComplete, Reqs.InitData2, Reqs.Data1, Reqs.Data2, Reqs.Data2, Reqs.Data2, - Reqs.DataComplete, Reqs.LastDataTrue], - [Reqs.InitRequestPayload, Reqs.Payload1, Reqs.PayloadComplete, Reqs.InitData1, Reqs.Data1, Reqs.DataComplete, - Reqs.LastDataTrue], - [Reqs.InitRequestPayload, Reqs.PayloadComplete, Reqs.InitData1, Reqs.Data1, Reqs.DataComplete, Reqs.LastDataTrue], -] - - -def get_cases(list_requests): - for r in list_requests: - yield iter(r) - - -@pytest.mark.parametrize("requests", get_cases(should_throw_cases)) -def test_taskhandler_create_should_throw(requests: Iterator[ProcessRequest]): - with pytest.raises(ValueError): - TaskHandler.create(requests, DummyAgent(DummyChannel())) - - -@pytest.mark.parametrize("requests", get_cases(should_succeed_cases)) -def test_taskhandler_create_should_succeed(requests: Iterator[ProcessRequest]): + def NotifyResultData(self, request: NotifyResultDataRequest) -> NotifyResultDataResponse: + self.send_result_task_message.append(request) + return NotifyResultDataResponse(result_ids=[i.result_id for i in request.ids]) + + +should_succeed_case = ProcessRequest(communication_token="token", session_id="sessionid", task_id="taskid", expected_output_keys=["resultid"], payload_id="payloadid", data_dependencies=["ddid"], data_folder=data_folder, configuration=Configuration(data_chunk_max_size=8000)) + + +@pytest.mark.parametrize("requests", [should_succeed_case]) +def test_taskhandler_create_should_succeed(requests: ProcessRequest): agent = DummyAgent(DummyChannel()) - task_handler = TaskHandler.create(requests, agent) + task_handler = TaskHandler(requests, agent) assert task_handler.token is not None and len(task_handler.token) > 0 assert len(task_handler.payload) > 0 assert task_handler.session_id is not None and len(task_handler.session_id) > 0 @@ -125,28 +66,8 @@ def test_taskhandler_create_should_succeed(requests: Iterator[ProcessRequest]): def test_taskhandler_data_are_correct(): agent = DummyAgent(DummyChannel()) - task_handler = TaskHandler.create(iter(should_succeed_cases[0]), agent) + task_handler = TaskHandler(should_succeed_case, agent) assert len(task_handler.payload) > 0 - assert task_handler.payload.decode('utf-8') == "testPayload1Payload2" - assert len(task_handler.data_dependencies) == 2 - assert task_handler.data_dependencies["DataKey1"].decode('utf-8') == "Data1Data2" - assert task_handler.data_dependencies["DataKey2"].decode('utf-8') == "Data1Data2Data2Data2" - assert task_handler.task_id == "TaskId" - assert task_handler.session_id == "SessionId" - assert task_handler.token == "Token" - - task_handler.send_result("test", "TestData".encode("utf-8")) - - results = agent.send_result_task_message - assert len(results) == 4 - assert results[0].WhichOneof("type") == "init" - assert results[0].init.key == "test" - assert results[1].WhichOneof("type") == "data" - assert results[1].data.data == "TestData".encode("utf-8") - assert results[2].WhichOneof("type") == "data" - assert results[2].data.data_complete - assert results[3].WhichOneof("type") == "init" - assert results[3].init.last_result task_handler.create_tasks([TaskDefinition("Payload".encode("utf-8"), ["EOK"], ["DD"])]) diff --git a/packages/python/tests/worker_test.py b/packages/python/tests/worker_test.py index 1e4604a31..032c406ee 100644 --- a/packages/python/tests/worker_test.py +++ b/packages/python/tests/worker_test.py @@ -1,9 +1,11 @@ #!/usr/bin/env python3 import logging - +import os +import pytest from armonik.worker import ArmoniKWorker, TaskHandler, ClefLogger from armonik.common import Output -from .taskhandler_test import should_succeed_cases +from .taskhandler_test import should_succeed_case, data_folder, DummyAgent +from .common import DummyChannel from armonik.protogen.common.objects_pb2 import Empty import grpc @@ -20,10 +22,22 @@ def return_error(_: TaskHandler) -> Output: return Output("TestError") +def return_and_send(th: TaskHandler) -> Output: + th.send_result(th.expected_results[0], b"result") + return Output() + + +@pytest.fixture(autouse=True, scope="function") +def remove_result(): + yield + if os.path.exists(os.path.join(data_folder, "resultid")): + os.remove(os.path.join(data_folder, "resultid")) + + def test_do_nothing_worker(): with grpc.insecure_channel("unix:///tmp/agent.sock") as agent_channel: worker = ArmoniKWorker(agent_channel, do_nothing, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) - reply = worker.Process(iter(should_succeed_cases[0]), None) + reply = worker.Process(should_succeed_case, None) assert Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None).success worker.HealthCheck(Empty(), None) @@ -31,15 +45,29 @@ def test_do_nothing_worker(): def test_worker_should_return_none(): with grpc.insecure_channel("unix:///tmp/agent.sock") as agent_channel: worker = ArmoniKWorker(agent_channel, throw_error, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) - reply = worker.Process(iter(should_succeed_cases[0]), None) + reply = worker.Process(should_succeed_case, None) assert reply is None def test_worker_should_error(): with grpc.insecure_channel("unix:///tmp/agent.sock") as agent_channel: worker = ArmoniKWorker(agent_channel, return_error, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) - reply = worker.Process(iter(should_succeed_cases[0]), None) + reply = worker.Process(should_succeed_case, None) output = Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None) assert not output.success assert output.error == "TestError" + +def test_worker_should_write_result(): + with grpc.insecure_channel("unix:///tmp/agent.sock") as agent_channel: + worker = ArmoniKWorker(agent_channel, return_and_send, logger=ClefLogger("TestLogger", level=logging.DEBUG)) + worker._client = DummyAgent(DummyChannel()) + reply = worker.Process(should_succeed_case, None) + assert reply is not None + output = Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None) + assert output.success + assert os.path.exists(os.path.join(data_folder, should_succeed_case.expected_output_keys[0])) + with open(os.path.join(data_folder, should_succeed_case.expected_output_keys[0]), "rb") as f: + value = f.read() + assert len(value) > 0 + From 6c662c2ffb7787c7d49374d1baaae6fb14e1d7c9 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Thu, 28 Sep 2023 10:05:39 +0200 Subject: [PATCH 079/344] cpp: PR suggestions --- .../cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h | 3 +-- .../cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp | 8 +++++--- packages/cpp/tools/restart-build-env.sh | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h b/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h index 620fad918..886df1aa3 100644 --- a/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h +++ b/packages/cpp/ArmoniK.Api.Worker/header/Worker/TaskHandler.h @@ -84,8 +84,7 @@ class TaskHandler { * @param data The result data * @return A future containing a vector of ResultReply */ - std::future send_result(std::string key, - absl::string_view data); + std::future send_result(std::string key, absl::string_view data); /** * @brief Get the result ids object diff --git a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp index d29bffbec..a1837f2ab 100644 --- a/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp +++ b/packages/cpp/ArmoniK.Api.Worker/source/Worker/TaskHandler.cpp @@ -215,8 +215,7 @@ armonik::api::worker::TaskHandler::create_tasks_async(TaskOptions task_options, * @param data The result data * @return A future containing a vector of ResultReply */ -std::future -armonik::api::worker::TaskHandler::send_result(std::string key, absl::string_view data) { +std::future armonik::api::worker::TaskHandler::send_result(std::string key, absl::string_view data) { return std::async(std::launch::async, [this, key = std::move(key), data]() mutable { ::grpc::ClientContext context; @@ -241,7 +240,10 @@ armonik::api::worker::TaskHandler::send_result(std::string key, absl::string_vie << ". details: " << status.error_details() << std::endl; throw armonik::api::common::exceptions::ArmoniKApiException(message.str()); } - return reply; + + if (reply.result_ids_size() != 1) { + throw armonik::api::common::exceptions::ArmoniKApiException("Received erroneous reply for send data"); + } }); } diff --git a/packages/cpp/tools/restart-build-env.sh b/packages/cpp/tools/restart-build-env.sh index 5717f6125..54f1af08a 100755 --- a/packages/cpp/tools/restart-build-env.sh +++ b/packages/cpp/tools/restart-build-env.sh @@ -35,7 +35,8 @@ docker build -t "${IMAGE_NAME}:${IMAGE_TAG}" -f BuildEnv.Dockerfile . cd "${working_dir}" mkdir -p ${working_dir}/build +mkdir -p ${working_dir}/buildtest mkdir -p ${install_dir} REMOTE_BUILD_ADDRESS="${REMOTE_BUILD_ADDRESS:-"127.0.0.1:2223"}" -docker run --rm -d --cap-add sys_ptrace -p"${REMOTE_BUILD_ADDRESS}":22 --name "${CONTAINER_NAME}" -v "${proto_dir}:/app/proto" -v "${working_dir}:/app/source" -v "${install_dir}:/app/install" -v "${working_dir}/build:/app/build" "${IMAGE_NAME}:${IMAGE_TAG}" +docker run --rm -d --cap-add sys_ptrace -p"${REMOTE_BUILD_ADDRESS}":22 --name "${CONTAINER_NAME}" -v "${proto_dir}:/app/proto" -v "${working_dir}:/app/source" -v "${install_dir}:/app/install" -v "${working_dir}/build:/app/build" -v "${working_dir}/buildtest:/app/buildtest" "${IMAGE_NAME}:${IMAGE_TAG}" \ No newline at end of file From b7f471f4b79f2e4d9a2c30f797669f96620e7250 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 2 Oct 2023 15:22:20 +0200 Subject: [PATCH 080/344] Added delete and list results --- .../header/submitter/ResultsClient.h | 27 +++++++ .../source/submitter/ResultsClient.cpp | 70 +++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h index 93b07631d..330dbd6af 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h @@ -15,8 +15,35 @@ class ResultsClient { const std::vector &names); void upload_result_data(const std::string &session_id, const std::string &result_id, absl::string_view payload); + /** + * Deletes the results data + * @param session_id Session id + * @param result_ids Result ids + */ + void delete_results(const std::string &session_id, const std::vector &result_ids); + + /** + * List the results + * @param filters Filter to be used + * @param total Output for the total of results available from this request (used for pagination) + * @param page Page to request, use -1 to get all pages. + * @param page_size Size of the requested page, ignored if page is -1 + * @param sort How the results are sorted, ascending creation date by default + * @return List of results + * + * @note If the results corresponding to the filters change while this call is going for page==-1, + * or between calls, then the returned values may not be consistent depending on the sorting used. + * For example, a sort by ascending creation date (the default) will be stable if results are being created in between + * requests. + */ + std::vector + list_results(const armonik::api::grpc::v1::results::Filters &filters, int32_t &total, int32_t page = -1, + int32_t page_size = 500, + const armonik::api::grpc::v1::results::ListResultsRequest::Sort &sort = get_default_sort()); + private: std::unique_ptr stub; + static armonik::api::grpc::v1::results::ListResultsRequest::Sort get_default_sort(); }; } // namespace client } // namespace api diff --git a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp index 4162c0ce1..9b6986220 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp @@ -81,6 +81,76 @@ void ResultsClient::upload_result_data(const std::string &session_id, const std: status.error_message()); } } + +void ResultsClient::delete_results(const std::string &session_id, const std::vector &result_ids) { + if (result_ids.empty()) { + return; + } + + ::grpc::ClientContext context; + armonik::api::grpc::v1::results::DeleteResultsDataRequest request; + armonik::api::grpc::v1::results::DeleteResultsDataResponse response; + *request.mutable_session_id() = session_id; + request.mutable_result_id()->Add(result_ids.begin(), result_ids.end()); + + auto status = stub->DeleteResultsData(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to delete results " + status.error_message()); + } +} + +std::vector +ResultsClient::list_results(const grpc::v1::results::Filters &filters, int32_t &total, int32_t page, int32_t page_size, + const grpc::v1::results::ListResultsRequest::Sort &sort) { + armonik::api::grpc::v1::results::ListResultsRequest request; + armonik::api::grpc::v1::results::ListResultsResponse response; + + *request.mutable_filters() = filters; + *request.mutable_sort() = sort; + request.set_page_size(page_size); + + if (page >= 0) { + request.set_page(page); + ::grpc::ClientContext context; + auto status = stub->ListResults(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list results " + status.error_message()); + } + total = response.total(); + return {response.results().begin(), response.results().end()}; + } else { + std::vector rawResults; + int current_page = 0; + do { + request.set_page(current_page); + ::grpc::ClientContext context; + auto status = stub->ListResults(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list results " + status.error_message()); + } + // Append only the additional results + // If the current_page is a re-request, this will add only the new information + rawResults.insert(rawResults.end(), + response.results().begin() + ((int32_t)rawResults.size() - current_page * page_size), + response.results().end()); + if (response.results_size() >= page_size) { + ++current_page; + } + + response.clear_results(); + } while ((int32_t)rawResults.size() < response.total()); + return rawResults; + } +} +armonik::api::grpc::v1::results::ListResultsRequest::Sort ResultsClient::get_default_sort() { + static armonik::api::grpc::v1::results::ListResultsRequest::Sort sort; + if (sort.direction() == grpc::v1::sort_direction::SORT_DIRECTION_UNSPECIFIED) { + sort.set_direction(grpc::v1::sort_direction::SORT_DIRECTION_ASC); + sort.mutable_field()->mutable_result_raw_field()->set_field(grpc::v1::results::RESULT_RAW_ENUM_FIELD_CREATED_AT); + } + return sort; +} + } // namespace client } // namespace api } // namespace armonik From b9e1fcfd3859531574b4faa5ee6ea9c20d3445a0 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 2 Oct 2023 17:31:51 +0200 Subject: [PATCH 081/344] Added result listing and tests --- .../source/submitter/ResultsClient.cpp | 1 + .../header/SubmitterClientTest.h | 8 -- .../cpp/ArmoniK.Api.Tests/header/common.h | 15 ++++ .../source/ResultsClientTest.cpp | 89 +++++++++++++++++++ .../source/SubmitterClientTest.cpp | 36 +------- .../cpp/ArmoniK.Api.Tests/source/common.cpp | 39 ++++++++ 6 files changed, 145 insertions(+), 43 deletions(-) create mode 100644 packages/cpp/ArmoniK.Api.Tests/header/common.h create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/common.cpp diff --git a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp index 9b6986220..a75a9cd5f 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp @@ -139,6 +139,7 @@ ResultsClient::list_results(const grpc::v1::results::Filters &filters, int32_t & response.clear_results(); } while ((int32_t)rawResults.size() < response.total()); + total = response.total(); return rawResults; } } diff --git a/packages/cpp/ArmoniK.Api.Tests/header/SubmitterClientTest.h b/packages/cpp/ArmoniK.Api.Tests/header/SubmitterClientTest.h index 06a23803b..50e1cff94 100644 --- a/packages/cpp/ArmoniK.Api.Tests/header/SubmitterClientTest.h +++ b/packages/cpp/ArmoniK.Api.Tests/header/SubmitterClientTest.h @@ -285,11 +285,3 @@ class MockStubInterface : public armonik::api::grpc::v1::submitter::Submitter::S ::armonik::api::grpc::v1::submitter::WatchResultStream> *), PrepareAsyncWatchResultsRaw, (::grpc::ClientContext * context, ::grpc::CompletionQueue *cq)); }; - -/** - * @brief Initializes task options creates channel with server address - * - * @param channel The gRPC channel to communicate with the server. - * @param default_task_options The default task options. - */ -void init(std::shared_ptr &channel, armonik::api::grpc::v1::TaskOptions &task_options); diff --git a/packages/cpp/ArmoniK.Api.Tests/header/common.h b/packages/cpp/ArmoniK.Api.Tests/header/common.h new file mode 100644 index 000000000..ad7b3656c --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/header/common.h @@ -0,0 +1,15 @@ +#pragma once + +#include "logger/base.h" +#include "objects.pb.h" +#include +#include + +/** + * @brief Initializes task options creates channel with server address + * + * @param channel The gRPC channel to communicate with the server. + * @param default_task_options The default task options. + */ +void init(std::shared_ptr &channel, armonik::api::grpc::v1::TaskOptions &task_options, + armonik::api::common::logger::ILogger &logger); diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp new file mode 100644 index 000000000..ec278028b --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp @@ -0,0 +1,89 @@ +#include +#include + +#include "common.h" +#include "logger/formatter.h" +#include "logger/logger.h" +#include "logger/writer.h" + +#include "results_service.grpc.pb.h" +#include "submitter/ResultsClient.h" +#include "submitter/SubmitterClient.h" + +using Logger = armonik::api::common::logger::Logger; + +TEST(Results, test_results_created) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto sub_client = + armonik::api::client::SubmitterClient(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); + auto session_id = sub_client.create_session(task_options, {}); + auto map = client.create_results(session_id, std::vector{"0", "1", "2", "3"}); + ASSERT_TRUE(!map.empty()); + ASSERT_EQ(map.size(), 4); +} + +TEST(Results, test_results_list) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto sub_client = + armonik::api::client::SubmitterClient(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); + auto session_id = sub_client.create_session(task_options, {}); + auto map = client.create_results(session_id, std::vector{"0", "1", "2", "3"}); + ASSERT_TRUE(!map.empty()); + ASSERT_EQ(map.size(), 4); + + armonik::api::grpc::v1::results::Filters filters; + armonik::api::grpc::v1::results::FilterField filter_field; + filter_field.mutable_field()->mutable_result_raw_field()->set_field( + armonik::api::grpc::v1::results::RESULT_RAW_ENUM_FIELD_SESSION_ID); + filter_field.mutable_filter_string()->set_value(session_id); + filter_field.mutable_filter_string()->set_operator_(armonik::api::grpc::v1::FILTER_STRING_OPERATOR_EQUAL); + *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; + int total; + auto list = client.list_results(filters, total); + ASSERT_EQ(list.size(), 4); + ASSERT_EQ(list.size(), total); +} + +TEST(Results, test_results_list_small_page) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto sub_client = + armonik::api::client::SubmitterClient(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); + auto session_id = sub_client.create_session(task_options, {}); + auto map = client.create_results(session_id, std::vector{"0", "1", "2", "3", "4"}); + ASSERT_TRUE(!map.empty()); + ASSERT_EQ(map.size(), 5); + + armonik::api::grpc::v1::results::Filters filters; + armonik::api::grpc::v1::results::FilterField filter_field; + filter_field.mutable_field()->mutable_result_raw_field()->set_field( + armonik::api::grpc::v1::results::RESULT_RAW_ENUM_FIELD_SESSION_ID); + filter_field.mutable_filter_string()->set_value(session_id); + filter_field.mutable_filter_string()->set_operator_(armonik::api::grpc::v1::FILTER_STRING_OPERATOR_EQUAL); + *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; + int total; + auto list = client.list_results(filters, total, 0, 2); + ASSERT_EQ(list.size(), 2); + ASSERT_EQ(total, 5); + + list = client.list_results(filters, total, -1, 2); + ASSERT_EQ(list.size(), 5); + ASSERT_EQ(total, 5); +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index b24952028..959ca08c0 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -20,6 +20,7 @@ #include "utils/EnvConfiguration.h" #include "utils/GuuId.h" +#include "common.h" #include "results_common.pb.h" #include "results_service.grpc.pb.h" #include "submitter/ResultsClient.h" @@ -39,41 +40,6 @@ using ::testing::AtLeast; namespace logger = armonik::api::common::logger; -/** - * @brief Initializes task options creates channel with server address - * - * @param channel The gRPC channel to communicate with the server. - * @param default_task_options The default task options. - */ -void init(std::shared_ptr &channel, TaskOptions &default_task_options, logger::ILogger &logger) { - - Configuration configuration; - // auto server = std::make_shared(configuration_t); - - configuration.add_json_configuration("appsettings.json").add_env_configuration(); - - std::string server_address = configuration.get("Grpc__EndPoint"); - - logger.info(" Server address {address}", {{"address", server_address}}); - - channel = grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); - - // stub_ = Submitter::NewStub(channel); - - default_task_options.mutable_options()->insert({"key1", "value1"}); - default_task_options.mutable_options()->insert({"key2", "value2"}); - default_task_options.mutable_max_duration()->set_seconds(3600); - default_task_options.mutable_max_duration()->set_nanos(0); - default_task_options.set_max_retries(1); - default_task_options.set_priority(1); - default_task_options.set_partition_id(""); - default_task_options.set_application_name("my-app"); - default_task_options.set_application_version("1.0"); - default_task_options.set_application_namespace("my-namespace"); - default_task_options.set_application_service("my-service"); - default_task_options.set_engine_type("Unified"); -} - TEST(testMock, createSession) { // MockStubInterface stub; std::shared_ptr channel; diff --git a/packages/cpp/ArmoniK.Api.Tests/source/common.cpp b/packages/cpp/ArmoniK.Api.Tests/source/common.cpp new file mode 100644 index 000000000..0a404bc5c --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/common.cpp @@ -0,0 +1,39 @@ +#include "common.h" +#include "utils/Configuration.h" +#include + +/** + * @brief Initializes task options creates channel with server address + * + * @param channel The gRPC channel to communicate with the server. + * @param default_task_options The default task options. + */ +void init(std::shared_ptr<::grpc::Channel> &channel, armonik::api::grpc::v1::TaskOptions &default_task_options, + armonik::api::common::logger::ILogger &logger) { + + armonik::api::common::utils::Configuration configuration; + // auto server = std::make_shared(configuration_t); + + configuration.add_json_configuration("appsettings.json").add_env_configuration(); + + std::string server_address = configuration.get("Grpc__EndPoint"); + + logger.info(" Server address {address}", {{"address", server_address}}); + + channel = ::grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); + + // stub_ = Submitter::NewStub(channel); + + default_task_options.mutable_options()->insert({"key1", "value1"}); + default_task_options.mutable_options()->insert({"key2", "value2"}); + default_task_options.mutable_max_duration()->set_seconds(3600); + default_task_options.mutable_max_duration()->set_nanos(0); + default_task_options.set_max_retries(1); + default_task_options.set_priority(1); + default_task_options.set_partition_id(""); + default_task_options.set_application_name("my-app"); + default_task_options.set_application_version("1.0"); + default_task_options.set_application_namespace("my-namespace"); + default_task_options.set_application_service("my-service"); + default_task_options.set_engine_type("Unified"); +} From de16faa103d89e2cfd7b18bdcbe8e02b388e2d52 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 3 Oct 2023 11:33:10 +0200 Subject: [PATCH 082/344] updated version to 3.13.1 --- .../projects/aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 2 +- .../ArmoniK.Api.Common.Channel.csproj | 2 +- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 2 +- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 2 +- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 2 +- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 2 +- packages/web/package.json | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 72e87d50b..988b1e269 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.13.0", + "version": "3.13.1", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 329a0d426..25a9161a5 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.13.0) +set(version 3.13.1) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 340ead518..3256df8b4 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.13.0 + 3.13.1 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 8f4d394ae..c38cbd2b9 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.13.0 + 3.13.1 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index 76da1aac5..a8b106f49 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - 3.13.0 + 3.13.1 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index b4d5d8784..8c0ad7b64 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.13.0 + 3.13.1 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index d95bb358b..b5f40cb48 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.13.0 + 3.13.1 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index c4b6f0cf9..658b93b3b 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,7 +14,7 @@ true snupkg ../kp.snk - 3.13.0 + 3.13.1 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index f4f4c3be6..dc4a553c9 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.13.0 + 3.13.1 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 14ba949aa..3724724dd 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.13.0 + 3.13.1 True True diff --git a/packages/web/package.json b/packages/web/package.json index 60690e21a..c7ca47ffd 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.13.0", + "version": "3.13.1", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From 6ec986e185f2bc522222646d4134251f364d7b01 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 6 Oct 2023 12:34:01 +0200 Subject: [PATCH 083/344] Added duration filter --- Protos/V1/filters_common.proto | 15 +++++++++++ Protos/V1/sessions_filters.proto | 1 + Protos/V1/tasks_filters.proto | 1 + packages/python/src/armonik/client/tasks.py | 5 +++- packages/python/src/armonik/common/filter.py | 28 ++++++++++++++++++-- 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/Protos/V1/filters_common.proto b/Protos/V1/filters_common.proto index 73a602c30..d711d7519 100644 --- a/Protos/V1/filters_common.proto +++ b/Protos/V1/filters_common.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package armonik.api.grpc.v1; +import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; option csharp_namespace = "ArmoniK.Api.gRPC.V1"; @@ -71,3 +72,17 @@ message FilterBoolean { bool value = 1; FilterBooleanOperator operator = 2; } + +enum FilterDurationOperator { + FILTER_DURATION_OPERATOR_EQUAL = 0; /** Equal */ + FILTER_DURATION_OPERATOR_NOT_EQUAL = 1; /** Not equal */ + FILTER_DURATION_OPERATOR_SHORTER_THAN = 2; /** Shorter than */ + FILTER_DURATION_OPERATOR_SHORTER_THAN_OR_EQUAL = 3; /** Shorter than or equal */ + FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL = 4; /** Longer than or equal */ + FILTER_DURATION_OPERATOR_LONGER_THAN = 5; /** Longer than */ +} + +message FilterDuration { + google.protobuf.Duration value = 1; + FilterDurationOperator operator = 2; +} diff --git a/Protos/V1/sessions_filters.proto b/Protos/V1/sessions_filters.proto index b03b3d0a2..fc7157767 100644 --- a/Protos/V1/sessions_filters.proto +++ b/Protos/V1/sessions_filters.proto @@ -22,6 +22,7 @@ message FilterField { FilterStatus filter_status = 5; FilterDate filter_date = 6; FilterArray filter_array = 7; + FilterDuration filter_duration = 8; } } diff --git a/Protos/V1/tasks_filters.proto b/Protos/V1/tasks_filters.proto index c4d01e2ae..887f959f8 100644 --- a/Protos/V1/tasks_filters.proto +++ b/Protos/V1/tasks_filters.proto @@ -22,6 +22,7 @@ message FilterField { FilterStatus filter_status = 5; FilterDate filter_date = 6; FilterArray filter_array = 7; + FilterDuration filter_duration = 8; } } diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index d6fb6876a..18f7c3478 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -3,7 +3,7 @@ from typing import cast, Tuple, List from ..common import Task, Direction -from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter +from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter, DurationFilter from ..protogen.client.tasks_service_pb2_grpc import TasksStub from ..protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse, ListTasksRequest, ListTasksDetailedResponse from ..protogen.common.tasks_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus @@ -25,12 +25,15 @@ class TaskFieldFilter: SUBMITTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT)), rawFilters, rawFilterAnd, rawFilterField) STARTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT)), rawFilters, rawFilterAnd, rawFilterField) ENDED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT)), rawFilters, rawFilterAnd, rawFilterField) + CREATION_TO_END_DURATION = DurationFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATION_TO_END_DURATION)), rawFilters, rawFilterAnd, rawFilterField) + PROCESSING_TO_END_DURATION = DurationFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_PROCESSING_TO_END_DURATION)), rawFilters, rawFilterAnd, rawFilterField) POD_TTL = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL)), rawFilters, rawFilterAnd, rawFilterField) POD_HOSTNAME = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME)), rawFilters, rawFilterAnd, rawFilterField) RECEIVED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT)), rawFilters, rawFilterAnd, rawFilterField) ACQUIRED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT)), rawFilters, rawFilterAnd, rawFilterField) ERROR = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ERROR)), rawFilters, rawFilterAnd, rawFilterField) + MAX_DURATION = DurationFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_DURATION)), rawFilters, rawFilterAnd, rawFilterField) MAX_RETRIES = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_RETRIES)), rawFilters, rawFilterAnd, rawFilterField) PRIORITY = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PRIORITY)), rawFilters, rawFilterAnd, rawFilterField) PARTITION_ID = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PARTITION_ID)), rawFilters, rawFilterAnd, rawFilterField) diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index d80ccd312..728f9a0bc 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -3,6 +3,7 @@ from typing import List, Any, Type, Optional, Dict from google.protobuf.message import Message import google.protobuf.timestamp_pb2 as timestamp +import google.protobuf.duration_pb2 as duration from ..protogen.common.filters_common_pb2 import * import json @@ -265,7 +266,9 @@ def to_basic_message(self) -> Message: class DateFilter(Filter): - """Filter for timestamp comparison""" + """ + Filter for timestamp comparison + """ eq_ = FILTER_DATE_OPERATOR_EQUAL ne_ = FILTER_DATE_OPERATOR_NOT_EQUAL lt_ = FILTER_DATE_OPERATOR_BEFORE @@ -282,7 +285,9 @@ def to_basic_message(self) -> Message: class NumberFilter(Filter): - """Filter for int comparison""" + """ + Filter for int comparison + """ eq_ = FILTER_NUMBER_OPERATOR_EQUAL ne_ = FILTER_NUMBER_OPERATOR_NOT_EQUAL lt_ = FILTER_NUMBER_OPERATOR_LESS_THAN @@ -331,3 +336,22 @@ def __init__(self, field: Optional[Message], disjunction_message_type: Type[Mess def to_basic_message(self) -> Message: return self.message_type(field=self.field, filter_array=self.inner_message_type(value=self.value, operator=self.operator)) + + +class DurationFilter(Filter): + """ + Filter for duration comparison + """ + eq_ = FILTER_DURATION_OPERATOR_EQUAL + ne_ = FILTER_DURATION_OPERATOR_NOT_EQUAL + lt_ = FILTER_DURATION_OPERATOR_SHORTER_THAN + le_ = FILTER_DURATION_OPERATOR_SHORTER_THAN_OR_EQUAL + gt_ = FILTER_DURATION_OPERATOR_LONGER_THAN + ge_ = FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL + value_type_ = duration.Duration + + def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterDuration, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): + super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) + + def to_basic_message(self) -> Message: + return self.message_type(field=self.field, filter_duration=self.inner_message_type(value=self.value, operator=self.operator)) From 661cb3cb04179c5c89c62c4469320e507239ef5d Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 10 Oct 2023 09:34:49 +0200 Subject: [PATCH 084/344] Added missing retried task status --- packages/python/src/armonik/common/enumwrapper.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 433a52e8a..563c8ca57 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -1,6 +1,6 @@ from __future__ import annotations -from ..protogen.common.task_status_pb2 import TaskStatus as RawStatus, _TASKSTATUS, TASK_STATUS_CANCELLED, TASK_STATUS_CANCELLING, TASK_STATUS_COMPLETED, TASK_STATUS_CREATING, TASK_STATUS_DISPATCHED, TASK_STATUS_ERROR, TASK_STATUS_PROCESSED, TASK_STATUS_PROCESSING, TASK_STATUS_SUBMITTED, TASK_STATUS_TIMEOUT, TASK_STATUS_UNSPECIFIED +from ..protogen.common.task_status_pb2 import TaskStatus as RawStatus, _TASKSTATUS, TASK_STATUS_CANCELLED, TASK_STATUS_CANCELLING, TASK_STATUS_COMPLETED, TASK_STATUS_CREATING, TASK_STATUS_DISPATCHED, TASK_STATUS_ERROR, TASK_STATUS_PROCESSED, TASK_STATUS_PROCESSING, TASK_STATUS_SUBMITTED, TASK_STATUS_TIMEOUT, TASK_STATUS_UNSPECIFIED, TASK_STATUS_RETRIED from ..protogen.common.worker_common_pb2 import HealthCheckReply from ..protogen.common.sort_direction_pb2 import SORT_DIRECTION_ASC, SORT_DIRECTION_DESC @@ -27,6 +27,7 @@ def name_from_value(status: RawStatus) -> str: PROCESSED = TASK_STATUS_PROCESSED PROCESSING = TASK_STATUS_PROCESSING SUBMITTED = TASK_STATUS_SUBMITTED + RETRIED = TASK_STATUS_RETRIED TIMEOUT = TASK_STATUS_TIMEOUT UNSPECIFIED = TASK_STATUS_UNSPECIFIED From 463f4e5a14d2ce56befec298782c36ad9b352fe5 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 10 Oct 2023 15:25:32 +0200 Subject: [PATCH 085/344] Added channel retry arguments --- .../header/options/ControlPlane.h | 47 +++++++++---- .../header/utils/ChannelArguments.h | 33 +++++++++ .../ArmoniK.Api.Common/header/utils/Utils.h | 33 +++++++++ .../source/options/ControlPlane.cpp | 32 +++++++++ .../source/utils/ChannelArguments.cpp | 53 ++++++++++++++ .../source/utils/Configuration.cpp | 8 +++ .../ArmoniK.Api.Common/source/utils/Utils.cpp | 69 +++++++++++++++++++ .../source/ChannelOptionsTest.cpp | 64 +++++++++++++++++ .../ArmoniK.Api.Tests/source/UtilsTest.cpp | 38 ++++++++++ 9 files changed, 363 insertions(+), 14 deletions(-) create mode 100644 packages/cpp/ArmoniK.Api.Common/header/utils/ChannelArguments.h create mode 100644 packages/cpp/ArmoniK.Api.Common/header/utils/Utils.h create mode 100644 packages/cpp/ArmoniK.Api.Common/source/options/ControlPlane.cpp create mode 100644 packages/cpp/ArmoniK.Api.Common/source/utils/ChannelArguments.cpp create mode 100644 packages/cpp/ArmoniK.Api.Common/source/utils/Utils.cpp create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/UtilsTest.cpp diff --git a/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h b/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h index 7a977aadc..661e4b238 100644 --- a/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h +++ b/packages/cpp/ArmoniK.Api.Common/header/options/ControlPlane.h @@ -2,6 +2,8 @@ #define ARMONIK_API_CONTROLPLANE_H #include "utils/Configuration.h" +#include +#include namespace armonik { namespace api { @@ -9,21 +11,22 @@ namespace common { namespace options { class ControlPlane { public: - ControlPlane(const utils::Configuration &config) { - endpoint_ = config.get(EndpointKey); - user_cert_pem_path_ = config.get(UserCertKey); - user_key_pem_path_ = config.get(UserKeyKey); - user_p12_path_ = config.get(UserP12Key); - ca_cert_pem_path_ = config.get(CaCertKey); - sslValidation_ = config.get(SSLValidationKey) != "disable"; - } + ControlPlane(const utils::Configuration &config); - [[nodiscard]] absl::string_view getEndpoint() const { return endpoint_; } - [[nodiscard]] absl::string_view getUserCertPemPath() const { return user_cert_pem_path_; } - [[nodiscard]] absl::string_view getUserKeyPemPath() const { return user_key_pem_path_; } - [[nodiscard]] absl::string_view getUserP12Path() const { return user_p12_path_; } - [[nodiscard]] absl::string_view getCaCertPemPath() const { return ca_cert_pem_path_; } - [[nodiscard]] bool isSslValidation() const { return sslValidation_; } + absl::string_view getEndpoint() const { return endpoint_; } + absl::string_view getUserCertPemPath() const { return user_cert_pem_path_; } + absl::string_view getUserKeyPemPath() const { return user_key_pem_path_; } + absl::string_view getUserP12Path() const { return user_p12_path_; } + absl::string_view getCaCertPemPath() const { return ca_cert_pem_path_; } + bool isSslValidation() const { return sslValidation_; } + const google::protobuf::Duration &getKeepAliveTime() const { return keep_alive_time_; } + const google::protobuf::Duration &getKeepAliveTimeInterval() const { return keep_alive_time_interval_; } + const google::protobuf::Duration &getMaxIdleTime() const { return max_idle_time_; } + int getMaxAttempts() const { return max_attempts_; } + double getBackoffMultiplier() const { return backoff_multiplier_; } + const google::protobuf::Duration &getInitialBackoff() const { return initial_backoff_; } + const google::protobuf::Duration &getMaxBackoff() const { return max_backoff_; } + const google::protobuf::Duration &getRequestTimeout() const { return request_timeout_; } static constexpr char EndpointKey[] = "Grpc__EndPoint"; static constexpr char UserCertKey[] = "Grpc__ClientCert"; @@ -31,6 +34,14 @@ class ControlPlane { static constexpr char UserP12Key[] = "Grpc__ClientP12"; static constexpr char CaCertKey[] = "Grpc__CaCert"; static constexpr char SSLValidationKey[] = "Grpc__SSLValidation"; + static constexpr char KeepAliveTimeKey[] = "Grpc__KeepAliveTime"; + static constexpr char KeepAliveTimeIntervalKey[] = "Grpc__KeepAliveTimeInterval"; + static constexpr char MaxIdleTimeKey[] = "Grpc__MaxIdleTime"; + static constexpr char MaxAttemptsKey[] = "Grpc__MaxAttempts"; + static constexpr char BackoffMultiplierKey[] = "Grpc__BackoffMultiplier"; + static constexpr char InitialBackOffKey[] = "Grpc__InitialBackOff"; + static constexpr char MaxBackOffKey[] = "Grpc__MaxBackOff"; + static constexpr char RequestTimeoutKey[] = "Grpc__RequestTimeout"; private: std::string endpoint_; @@ -38,6 +49,14 @@ class ControlPlane { std::string user_key_pem_path_; std::string user_p12_path_; std::string ca_cert_pem_path_; + ::google::protobuf::Duration keep_alive_time_; + ::google::protobuf::Duration keep_alive_time_interval_; + ::google::protobuf::Duration max_idle_time_; + int max_attempts_{}; + double backoff_multiplier_{}; + ::google::protobuf::Duration initial_backoff_; + ::google::protobuf::Duration max_backoff_; + ::google::protobuf::Duration request_timeout_; bool sslValidation_; }; } // namespace options diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/ChannelArguments.h b/packages/cpp/ArmoniK.Api.Common/header/utils/ChannelArguments.h new file mode 100644 index 000000000..d68eb98b1 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/ChannelArguments.h @@ -0,0 +1,33 @@ +#pragma once + +#include "utils/Configuration.h" +#include + +namespace armonik { +namespace api { +namespace common { +namespace utils { +/** + * Get custom channel arguments for channel creation + * @param config Configuration + * @return Channel arguments + */ +::grpc::ChannelArguments getChannelArguments(const Configuration &config); + +/** + * Get custom channel arguments for channel creation + * @param config Control Plane configuration + * @return Channel arguments + */ +::grpc::ChannelArguments getChannelArguments(const options::ControlPlane &config); + +/** + * Generate the service config for the channel arguments + * @param config Control Plane configuration + * @return Json of the service + */ +std::string getServiceConfigJson(const armonik::api::common::options::ControlPlane &config); +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/header/utils/Utils.h b/packages/cpp/ArmoniK.Api.Common/header/utils/Utils.h new file mode 100644 index 000000000..00f787e00 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/header/utils/Utils.h @@ -0,0 +1,33 @@ +#pragma once + +#include "google/protobuf/duration.pb.h" + +namespace armonik { +namespace api { +namespace common { +namespace utils { +/** + * Creates a duration from the given values + * @param days Days + * @param hours Hours + * @param minutes Minutes + * @param seconds Seconds + * @param nanoseconds Nanoseconds + * @return Duration with the right value + * @note Make sure that the resulting number of seconds and the nanoseconds are of the same sign for the duration to be + * valid + */ +::google::protobuf::Duration duration_from_values(long long int days = 0, long long int hours = 0, + long long int minutes = 0, long long int seconds = 0, + int nanoseconds = 0); + +/** + * Creates a duration from timespan string + * @param timespan string with format [-][d.]hh:mm:ss[.fffffffff] + * @return Duration in accordance with timespan + */ +::google::protobuf::Duration duration_from_timespan(const std::string ×pan); +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Common/source/options/ControlPlane.cpp b/packages/cpp/ArmoniK.Api.Common/source/options/ControlPlane.cpp new file mode 100644 index 000000000..e600c4f34 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/source/options/ControlPlane.cpp @@ -0,0 +1,32 @@ +#include "options/ControlPlane.h" +#include "utils/Configuration.h" +#include "utils/Utils.h" + +armonik::api::common::options::ControlPlane::ControlPlane(const utils::Configuration &config) { + endpoint_ = config.get(EndpointKey); + user_cert_pem_path_ = config.get(UserCertKey); + user_key_pem_path_ = config.get(UserKeyKey); + user_p12_path_ = config.get(UserP12Key); + ca_cert_pem_path_ = config.get(CaCertKey); + sslValidation_ = config.get(SSLValidationKey) != "disable"; + + keep_alive_time_ = config.get(KeepAliveTimeKey).empty() ? utils::duration_from_values(0, 0, 0, 30) + : utils::duration_from_timespan(config.get(KeepAliveTimeKey)); + keep_alive_time_interval_ = config.get(KeepAliveTimeIntervalKey).empty() + ? utils::duration_from_values(0, 0, 0, 30) + : utils::duration_from_timespan(config.get(KeepAliveTimeIntervalKey)); + max_idle_time_ = config.get(MaxIdleTimeKey).empty() ? utils::duration_from_values(0, 0, 5) + : utils::duration_from_timespan(config.get(MaxIdleTimeKey)); + long attempts = std::strtol(config.get(MaxAttemptsKey).c_str(), nullptr, 10); + max_attempts_ = (attempts <= 0 || attempts >= INT_MAX) ? 5 : (int)attempts; + backoff_multiplier_ = strtod(config.get(BackoffMultiplierKey).c_str(), nullptr); + backoff_multiplier_ = backoff_multiplier_ == 0 || backoff_multiplier_ == HUGE_VAL ? 1.5 : backoff_multiplier_; + initial_backoff_ = config.get(InitialBackOffKey).empty() + ? utils::duration_from_values(0, 0, 0, 1) + : utils::duration_from_timespan(config.get(InitialBackOffKey)); + max_backoff_ = config.get(MaxBackOffKey).empty() ? utils::duration_from_values(0, 0, 0, 5) + : utils::duration_from_timespan(config.get(MaxBackOffKey)); + request_timeout_ = config.get(RequestTimeoutKey).empty() + ? utils::duration_from_values(366) + : utils::duration_from_timespan(config.get(RequestTimeoutKey)); +} diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/ChannelArguments.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/ChannelArguments.cpp new file mode 100644 index 000000000..85e3fcb8c --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/ChannelArguments.cpp @@ -0,0 +1,53 @@ +#include "utils/ChannelArguments.h" +#include "options/ControlPlane.h" +#include +#include + +template T saturate_cast(Tin in, T max_value = std::numeric_limits::max()) { + if (in > max_value) { + return max_value; + } + return static_cast(in); +} + +int getMilliseconds(const google::protobuf::Duration &duration) { + return saturate_cast(duration.seconds() * 1000) + (duration.nanos() / 1000000); +} + +std::string +armonik::api::common::utils::getServiceConfigJson(const armonik::api::common::options::ControlPlane &config) { + std::stringstream ss; + std::string initialBackoff, maxBackoff, timeout; + auto status = google::protobuf::util::MessageToJsonString(config.getInitialBackoff(), &initialBackoff); + if (!status.ok()) { + throw std::invalid_argument("Initial backoff is invalid" + status.ToString()); + } + status = google::protobuf::util::MessageToJsonString(config.getMaxBackoff(), &maxBackoff); + if (!status.ok()) { + throw std::invalid_argument("Max backoff is invalid" + status.ToString()); + } + status = google::protobuf::util::MessageToJsonString(config.getRequestTimeout(), &timeout); + if (!status.ok()) { + throw std::invalid_argument("Timeout is invalid" + status.ToString()); + } + ss << R"({ "methodConfig": [{ "name": [{}], )" + << R"("timeout" : )" << timeout << ',' << R"("retryPolicy" : {)" + << R"("backoffMultiplier": )" << config.getBackoffMultiplier() << ',' << R"("initialBackoff":)" << initialBackoff + << "," + << R"("maxBackoff":)" << maxBackoff << "," + << R"("maxAttempts":)" << config.getMaxAttempts() << ',' + << R"("retryableStatusCodes": [ "UNAVAILABLE", "ABORTED", "UNKNOWN" ])" + << "}}]}"; + return ss.str(); +} + +::grpc::ChannelArguments armonik::api::common::utils::getChannelArguments(const Configuration &config) { + return getChannelArguments(config.get_control_plane()); +} +::grpc::ChannelArguments armonik::api::common::utils::getChannelArguments(const options::ControlPlane &config) { + ::grpc::ChannelArguments args; + args.SetInt(GRPC_ARG_KEEPALIVE_TIME_MS, getMilliseconds(config.getKeepAliveTime())); + args.SetInt(GRPC_ARG_MAX_CONNECTION_IDLE_MS, getMilliseconds(config.getMaxIdleTime())); + args.SetServiceConfigJSON(getServiceConfigJson(config)); + return args; +} diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp index 97451187f..31ffa4bbd 100644 --- a/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/Configuration.cpp @@ -10,6 +10,14 @@ constexpr char armonik::api::common::options::ControlPlane::SSLValidationKey[]; constexpr char armonik::api::common::options::ControlPlane::UserCertKey[]; constexpr char armonik::api::common::options::ControlPlane::UserKeyKey[]; constexpr char armonik::api::common::options::ControlPlane::UserP12Key[]; +constexpr char armonik::api::common::options::ControlPlane::KeepAliveTimeKey[]; +constexpr char armonik::api::common::options::ControlPlane::KeepAliveTimeIntervalKey[]; +constexpr char armonik::api::common::options::ControlPlane::MaxIdleTimeKey[]; +constexpr char armonik::api::common::options::ControlPlane::MaxAttemptsKey[]; +constexpr char armonik::api::common::options::ControlPlane::BackoffMultiplierKey[]; +constexpr char armonik::api::common::options::ControlPlane::InitialBackOffKey[]; +constexpr char armonik::api::common::options::ControlPlane::MaxBackOffKey[]; +constexpr char armonik::api::common::options::ControlPlane::RequestTimeoutKey[]; namespace armonik { namespace api { diff --git a/packages/cpp/ArmoniK.Api.Common/source/utils/Utils.cpp b/packages/cpp/ArmoniK.Api.Common/source/utils/Utils.cpp new file mode 100644 index 000000000..8bc13007b --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Common/source/utils/Utils.cpp @@ -0,0 +1,69 @@ +#include "utils/Utils.h" +#include +#include +#include + +namespace armonik { +namespace api { +namespace common { +namespace utils { + +::google::protobuf::Duration duration_from_values(long long int days, long long int hours, long long int minutes, + long long int seconds, int nanoseconds) { + ::google::protobuf::Duration duration; + duration.set_seconds(days * 86400 + 3600 * hours + 60 * minutes + seconds); + duration.set_nanos(nanoseconds); + return duration; +} + +/** + * Creates a duration from timespan string + * @param timespan string with format [-][d.]hh:mm:ss[.fffffffff] + * @return Duration in accordance with timespan + */ +::google::protobuf::Duration duration_from_timespan(const std::string ×pan) { + auto splitted = absl::StrSplit(timespan, ':'); + std::vector sections(splitted.begin(), splitted.end()); + long days = 0, hours, minutes, seconds; + if (sections.size() != 3) { + throw std::invalid_argument("timespan is not of the format [-][d.]hh:mm:ss[.fffffffff]"); + } + // Split the days.hours + auto subsplitted = absl::StrSplit(sections[0], '.'); + std::vector subsplit(subsplitted.begin(), subsplitted.end()); + if (subsplit.size() > 2) { + throw std::invalid_argument("timespan is not of the format [-][d.]hh:mm:ss[.fffffffff]"); + } + // Sign is only present in the first section + int sign = absl::StrContains(subsplit[0], '-') ? -1 : 1; + if (subsplit.size() == 2) { + days = std::strtol(subsplit[0].c_str(), nullptr, 10); + hours = sign * std::strtol(subsplit[1].c_str(), nullptr, 10); + } else { + hours = std::strtol(subsplit[0].c_str(), nullptr, 10); + } + + minutes = sign * std::strtol(sections[1].c_str(), nullptr, 10); + subsplitted = absl::StrSplit(sections[2], '.'); + std::vector subsplit_sec(subsplitted.begin(), subsplitted.end()); + if (subsplit_sec.size() > 2) { + throw std::invalid_argument("timespan is not of the format [-][d.]hh:mm:ss[.fffffffff]"); + } + int nanos = 0; + seconds = sign * std::strtol(subsplit_sec[0].c_str(), nullptr, 10); + if (subsplit_sec.size() == 2) { + if (subsplit_sec[1].length() >= 9) { + nanos = sign * (int)std::strtol(subsplit_sec[1].substr(0, 9).c_str(), nullptr, 10); + } else { + nanos = sign * + (int)std::strtol((subsplit_sec[1] + std::string(9 - subsplit_sec[1].length(), '0')).c_str(), nullptr, 10); + } + } + + return duration_from_values(days, hours, minutes, seconds, nanos); +} + +} // namespace utils +} // namespace common +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp new file mode 100644 index 000000000..bb322d23f --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp @@ -0,0 +1,64 @@ +#include "common.h" +#include "options/ControlPlane.h" +#include "utils/Configuration.h" +#include +#include + +#include "submitter/SubmitterClient.h" +#include "utils/ChannelArguments.h" + +armonik::api::grpc::v1::TaskOptions default_task_options() { + armonik::api::grpc::v1::TaskOptions default_task_options; + default_task_options.mutable_options()->insert({"key1", "value1"}); + default_task_options.mutable_options()->insert({"key2", "value2"}); + default_task_options.mutable_max_duration()->set_seconds(3600); + default_task_options.mutable_max_duration()->set_nanos(0); + default_task_options.set_max_retries(1); + default_task_options.set_priority(1); + default_task_options.set_partition_id(""); + default_task_options.set_application_name("my-app"); + default_task_options.set_application_version("1.0"); + default_task_options.set_application_namespace("my-namespace"); + default_task_options.set_application_service("my-service"); + default_task_options.set_engine_type("Unified"); + return default_task_options; +} + +TEST(Options, no_options) { + armonik::api::common::utils::Configuration configuration; + configuration.add_json_configuration("appsettings.json").add_env_configuration(); + + std::string server_address = configuration.get("Grpc__EndPoint"); + auto channel = ::grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); + armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); + ASSERT_NO_THROW(client.create_session(default_task_options(), {})); +} + +TEST(Options, default_options) { + armonik::api::common::utils::Configuration configuration; + configuration.add_json_configuration("appsettings.json").add_env_configuration(); + + std::string server_address = configuration.get("Grpc__EndPoint"); + auto args = armonik::api::common::utils::getChannelArguments(configuration); + auto channel = ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), args); + armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); + ASSERT_NO_THROW(client.create_session(default_task_options(), {})); +} + +TEST(Options, test_timeout) { + armonik::api::common::utils::Configuration configuration; + configuration.add_json_configuration("appsettings.json").add_env_configuration(); + + std::string server_address = configuration.get("Grpc__EndPoint"); + configuration.set(armonik::api::common::options::ControlPlane::RequestTimeoutKey, "0:0:0.001"); // 1ms, way too short + armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub( + ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), + armonik::api::common::utils::getChannelArguments(configuration)))); + ASSERT_ANY_THROW(client.create_session(default_task_options(), {})); + configuration.set(armonik::api::common::options::ControlPlane::RequestTimeoutKey, + "0:0:10"); // 10s, should have finished by now + client = armonik::api::client::SubmitterClient(armonik::api::grpc::v1::submitter::Submitter::NewStub( + ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), + armonik::api::common::utils::getChannelArguments(configuration)))); + ASSERT_NO_THROW(client.create_session(default_task_options(), {})); +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/UtilsTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/UtilsTest.cpp new file mode 100644 index 000000000..ec7c7a17e --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/UtilsTest.cpp @@ -0,0 +1,38 @@ +#include +#include +#include + +#include "utils/Utils.h" + +struct timespan_test_case_from_string { + ::google::protobuf::Duration expected; + std::string value_to_test; +}; + +timespan_test_case_from_string genCaseForString(long seconds, int nanos, const std::string &str) { + timespan_test_case_from_string value; + value.expected.set_seconds(seconds); + value.expected.set_nanos(nanos); + value.value_to_test = str; + return value; +} + +class TestTimespanFromString : public testing::TestWithParam {}; + +TEST_P(TestTimespanFromString, IsWellConverted) { + auto value = GetParam(); + ::google::protobuf::Duration out; + EXPECT_NO_THROW(out = armonik::api::common::utils::duration_from_timespan(value.value_to_test)); + EXPECT_EQ(out.seconds(), value.expected.seconds()); + EXPECT_EQ(out.nanos(), value.expected.nanos()); +} + +INSTANTIATE_TEST_SUITE_P(Timespan_Conversion, TestTimespanFromString, + ::testing::Values(genCaseForString(5, 0, "0:0:5"), genCaseForString(5, 5000, "0:0:5.000005"), + genCaseForString(3605, 0, "1:0:5"), genCaseForString(-3605, 0, "-1:0:5"), + genCaseForString(3605, 0, "1:0:5.0"), genCaseForString(3665, 0, "1:1:5.0"), + genCaseForString(3605, 0, "0.1:0:5.0"), + genCaseForString(90005, 0, "1.1:0:5"), + genCaseForString(90005, 500000000, "1.1:0:5.5"), + genCaseForString(90005, 500000000, "1.1:0:5.50000000000"), + genCaseForString(-90005, -500000000, "-1.1:0:5.5"))); From 9b6a87688fceb0d56f660f74d2be71de5ce73423 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 11 Oct 2023 13:45:41 +0200 Subject: [PATCH 086/344] chore: Bump version to 3.13.2 --- .../projects/aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 2 +- .../ArmoniK.Api.Common.Channel.csproj | 2 +- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 2 +- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 2 +- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 2 +- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 2 +- packages/web/package.json | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 988b1e269..90375cdc6 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.13.1", + "version": "3.13.2", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 25a9161a5..e9148e02a 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.13.1) +set(version 3.13.2) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 3256df8b4..8d7b5a90e 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.13.1 + 3.13.2 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index c38cbd2b9..9f4e3f525 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.13.1 + 3.13.2 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index a8b106f49..d6f0a3cf9 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - 3.13.1 + 3.13.2 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 8c0ad7b64..9ee3c3820 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.13.1 + 3.13.2 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index b5f40cb48..94d680db2 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.13.1 + 3.13.2 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 658b93b3b..3a2ae6f57 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,7 +14,7 @@ true snupkg ../kp.snk - 3.13.1 + 3.13.2 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index dc4a553c9..ef072ee37 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.13.1 + 3.13.2 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 3724724dd..3bde89dea 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.13.1 + 3.13.2 True True diff --git a/packages/web/package.json b/packages/web/package.json index c7ca47ffd..65dba968a 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.13.1", + "version": "3.13.2", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From 65963f1ad79271e183a7ec09e758156f55ef5a51 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 11 Oct 2023 14:54:25 +0200 Subject: [PATCH 087/344] Marked submitter as deprecated in Api Cpp and Python --- .../header/submitter/SubmitterClient.h | 22 +++++++++---------- .../python/src/armonik/client/submitter.py | 4 ++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h index 9eefa6857..4cbf38329 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/submitter/SubmitterClient.h @@ -30,7 +30,7 @@ struct payload_data { /** * @brief The SubmitterClientExt class provides methods to create and manage task submissions. */ -class SubmitterClient { +class [[deprecated("Use the Session, Task and Result clients instead")]] SubmitterClient { private: std::unique_ptr stub_; @@ -68,8 +68,8 @@ class SubmitterClient { * @param chunk_max_size The maximum chunk size. * @return A future large task request object. */ - static std::future> - task_chunk_stream(const armonik::api::grpc::v1::TaskRequest &task_request, bool is_last, size_t chunk_max_size); + static std::future> task_chunk_stream( + const armonik::api::grpc::v1::TaskRequest &task_request, bool is_last, size_t chunk_max_size); /** * @brief Creates tasks asynchronously with the specified options and requests. @@ -78,9 +78,9 @@ class SubmitterClient { * @param task_requests The vector of task requests. * @return A future create task reply object. */ - std::future - create_tasks_async(std::string session_id, armonik::api::grpc::v1::TaskOptions task_options, - const std::vector &task_requests); + std::future create_tasks_async( + std::string session_id, armonik::api::grpc::v1::TaskOptions task_options, + const std::vector &task_requests); /** * @brief Submits tasks with dependencies to the session context. @@ -90,9 +90,9 @@ class SubmitterClient { * @param max_retries The maximum number of retries for submitting tasks. * @return A vector of submitted task IDs. */ - std::pair, std::vector> - submit_tasks_with_dependencies(std::string session_id, armonik::api::grpc::v1::TaskOptions task_options, - const std::vector &payloads_with_dependencies, int max_retries); + std::pair, std::vector> submit_tasks_with_dependencies( + std::string session_id, armonik::api::grpc::v1::TaskOptions task_options, + const std::vector &payloads_with_dependencies, int max_retries); /** * @brief Get result without streaming. @@ -101,8 +101,8 @@ class SubmitterClient { */ std::future get_result_async(const armonik::api::grpc::v1::ResultRequest &result_request); - std::map - get_result_status(const std::string &session_id, const std::vector &result_ids); + std::map get_result_status( + const std::string &session_id, const std::vector &result_ids); }; } // namespace client diff --git a/packages/python/src/armonik/client/submitter.py b/packages/python/src/armonik/client/submitter.py index 3b9e402d2..8d1eb1dde 100644 --- a/packages/python/src/armonik/client/submitter.py +++ b/packages/python/src/armonik/client/submitter.py @@ -13,6 +13,10 @@ class ArmoniKSubmitter: + """ + Deprecated: + Use Session client, Task client and Result client instead + """ def __init__(self, grpc_channel: Channel): """Create a Submitter with the given channel From 1a9363a933bc0bca3cf1acc4d205ae84a4d232aa Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 11 Oct 2023 15:25:52 +0200 Subject: [PATCH 088/344] Added deprecation annotation --- packages/python/pyproject.toml | 3 ++- packages/python/src/armonik/client/submitter.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 0b66674bc..42a8a65d8 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -16,7 +16,8 @@ classifiers = [ ] dependencies = [ "grpcio==1.56.2", - "grpcio-tools==1.56.2" + "grpcio-tools==1.56.2", + "deprecation" ] # We need to set grpc to 1.56 until this bug is resolved : https://github.com/grpc/grpc/issues/34305 [project.urls] diff --git a/packages/python/src/armonik/client/submitter.py b/packages/python/src/armonik/client/submitter.py index 8d1eb1dde..b50be07b4 100644 --- a/packages/python/src/armonik/client/submitter.py +++ b/packages/python/src/armonik/client/submitter.py @@ -1,5 +1,6 @@ from __future__ import annotations from typing import Optional, List, Tuple, Dict, Union, Generator +from deprecation import deprecated from grpc import Channel @@ -12,6 +13,7 @@ from ..protogen.common.task_status_pb2 import TaskStatus +@deprecated(deprecated_in="3.14.0", details="Use sessions, task and results client instead") class ArmoniKSubmitter: """ Deprecated: From 09fb6d223ed1b2bfd12073677ea2b9739ea62b2f Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Wed, 11 Oct 2023 17:38:30 +0200 Subject: [PATCH 089/344] feat: Add Session List and status filter to Python --- packages/python/proto2python.sh | 0 .../python/src/armonik/client/sessions.py | 66 +++++++++++++++++++ .../python/src/armonik/common/__init__.py | 2 +- packages/python/src/armonik/common/objects.py | 25 +++++++ 4 files changed, 92 insertions(+), 1 deletion(-) mode change 100644 => 100755 packages/python/proto2python.sh create mode 100644 packages/python/src/armonik/client/sessions.py diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh old mode 100644 new mode 100755 diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py new file mode 100644 index 000000000..3d8194a92 --- /dev/null +++ b/packages/python/src/armonik/client/sessions.py @@ -0,0 +1,66 @@ +from __future__ import annotations +from grpc import Channel +from typing import cast, Tuple, List + +from ..protogen.client.sessions_service_pb2_grpc import SessionsStub +from ..protogen.common.submitter_common_pb2 import SessionFilter +from ..protogen.common.sessions_common_pb2 import GetSessionRequest, GetSessionResponse, ListSessionsRequest, ListSessionsResponse, SessionRaw +from ..protogen.common.sessions_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus +from ..protogen.common.sessions_fields_pb2 import * +from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter +from ..protogen.common.sort_direction_pb2 import SortDirection +from ..common import Direction, Session +from ..protogen.common.sessions_fields_pb2 import SessionField, SessionRawField, SESSION_RAW_ENUM_FIELD_STATUS, TaskOptionGenericField + +class SessionFieldFilter: + """ + Enumeration of the available filters + """ + STATUS = StatusFilter(SessionField(session_raw_field=SessionRawField(field=SESSION_RAW_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus) + + # @staticmethod + # def task_options_key(option_key: str) -> StringFilter: + # """ + # Filter for the TaskOptions.Options dictionary + # Args: + # option_key: key in the dictionary + + # Returns: + # Corresponding filter + # """ + # return StringFilter(SessionField(task_option_generic_field=TaskOptionGenericField(field=option_key)), rawFilters, rawFilterAnd, rawFilterField) + +class ArmoniKSessions: + + def __init__(self, grpc_channel: Channel): + """ Session service client + + Args: + grpc_channel: gRPC channel to use + """ + self._client = SessionsStub(grpc_channel) + + def list_sessions(self, task_filter: Filter, page: int = 0, page_size: int = 1000, sort_field: Filter = SessionFieldFilter.STATUS, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Session]]: + """ + List sessions + + Args: + session_filter (Filter): Filter to apply when listing sessions. + page: page number to request, this can be useful when paginating the result, defaults to 0 + page_size: size of a page, defaults to 1000 + sort_field: field on which to sort the resulting list, defaults to the status + sort_direction: direction of the sort, defaults to ascending + + Returns: + A tuple containing : + - The total number of sessions for the given filter + - The obtained list of sessions + """ + request : ListSessionsRequest = ListSessionsRequest( + page=page, + page_size=page_size, + filters=cast(rawFilters, task_filter.to_disjunction().to_message()), + sort=ListSessionsRequest.Sort(field=cast(SessionField, sort_field.field), direction=sort_direction), + ) + list_response : ListSessionsResponse = self._client.ListSessions(request) + return list_response.total, [Session.from_message(t) for t in list_response.sessions] diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 50859d6f3..7b6ba7ad6 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,4 +1,4 @@ from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter -from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability +from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability, Session from .enumwrapper import HealthCheckStatus, TaskStatus, Direction from .filter import StringFilter, StatusFilter diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 453cb5c56..bd818057c 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -8,6 +8,8 @@ from ..protogen.common.objects_pb2 import Empty, Output as WorkerOutput, TaskOptions as RawTaskOptions from ..protogen.common.task_status_pb2 import TaskStatus as RawTaskStatus from .enumwrapper import TaskStatus +from ..protogen.common.session_status_pb2 import * +from ..protogen.common.sessions_common_pb2 import SessionRaw @dataclass() @@ -157,3 +159,26 @@ class ResultAvailability: def is_available(self) -> bool: return len(self.errors) == 0 + + +@dataclass +class Session: + session_id: Optional[str] = None + status: SessionStatus = SESSION_STATUS_UNSPECIFIED + partition_ids: List[str] = field(default_factory=list) + options: Optional[TaskOptions] = None + created_at: Optional[datetime] = None + cancelled_at: Optional[datetime] = None + duration: Optional[timedelta] = None + + @classmethod + def from_message(cls, session_raw: SessionRaw) -> "Session": + return cls( + session_id=session_raw.session_id, + status=session_raw.status, + partition_ids=list(session_raw.partition_ids), + options=TaskOptions.from_message(session_raw.options), + created_at=timestamp_to_datetime(session_raw.created_at), + cancelled_at=timestamp_to_datetime(session_raw.cancelled_at), + duration=duration_to_timedelta(session_raw.duration) + ) \ No newline at end of file From 3b791585cdd67e64790c2189ac015567377274ce Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 12 Oct 2023 04:07:17 +0200 Subject: [PATCH 090/344] refactor: Edit enumwrapper to add CONST for session status names --- packages/python/src/armonik/common/enumwrapper.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 563c8ca57..e983394df 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -1,6 +1,7 @@ from __future__ import annotations from ..protogen.common.task_status_pb2 import TaskStatus as RawStatus, _TASKSTATUS, TASK_STATUS_CANCELLED, TASK_STATUS_CANCELLING, TASK_STATUS_COMPLETED, TASK_STATUS_CREATING, TASK_STATUS_DISPATCHED, TASK_STATUS_ERROR, TASK_STATUS_PROCESSED, TASK_STATUS_PROCESSING, TASK_STATUS_SUBMITTED, TASK_STATUS_TIMEOUT, TASK_STATUS_UNSPECIFIED, TASK_STATUS_RETRIED +from ..protogen.common.session_status_pb2 import SessionStatus as RawSessionStatus, _SESSIONSTATUS, SESSION_STATUS_UNSPECIFIED, SESSION_STATUS_CANCELLED, SESSION_STATUS_RUNNING from ..protogen.common.worker_common_pb2 import HealthCheckReply from ..protogen.common.sort_direction_pb2 import SORT_DIRECTION_ASC, SORT_DIRECTION_DESC @@ -35,3 +36,13 @@ def name_from_value(status: RawStatus) -> str: class Direction: ASC = SORT_DIRECTION_ASC DESC = SORT_DIRECTION_DESC + + +class SessionStatus: + @staticmethod + def name_from_value(status: RawSessionStatus) -> str: + return _SESSIONSTATUS.values_by_number[status].name + + UNSPECIFIED = SESSION_STATUS_UNSPECIFIED + RUNNING = SESSION_STATUS_RUNNING + CANCELLED = SESSION_STATUS_CANCELLED \ No newline at end of file From bf693be8197a0bb86760c6f5166c7daf3e754e7d Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo <136341946+jeremyzyngeraneo@users.noreply.github.com> Date: Thu, 12 Oct 2023 14:39:58 +0200 Subject: [PATCH 091/344] Update packages/python/src/armonik/common/objects.py Co-authored-by: Dylan Brasseur <103190315+dbrasseur-aneo@users.noreply.github.com> --- packages/python/src/armonik/common/objects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index bd818057c..84a26c6b6 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -181,4 +181,4 @@ def from_message(cls, session_raw: SessionRaw) -> "Session": created_at=timestamp_to_datetime(session_raw.created_at), cancelled_at=timestamp_to_datetime(session_raw.cancelled_at), duration=duration_to_timedelta(session_raw.duration) - ) \ No newline at end of file + ) From 7b15503323afc9e0bac2973eaa513d341d852a79 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo <136341946+jeremyzyngeraneo@users.noreply.github.com> Date: Thu, 12 Oct 2023 14:40:13 +0200 Subject: [PATCH 092/344] Update packages/python/src/armonik/common/enumwrapper.py Co-authored-by: Dylan Brasseur <103190315+dbrasseur-aneo@users.noreply.github.com> --- packages/python/src/armonik/common/enumwrapper.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index e983394df..78e5fed8a 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -45,4 +45,5 @@ def name_from_value(status: RawSessionStatus) -> str: UNSPECIFIED = SESSION_STATUS_UNSPECIFIED RUNNING = SESSION_STATUS_RUNNING - CANCELLED = SESSION_STATUS_CANCELLED \ No newline at end of file + CANCELLED = SESSION_STATUS_CANCELLED + \ No newline at end of file From 2d0457f2dfdbd2da648d08c8e72266a53e7e3ab1 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 12 Oct 2023 15:12:18 +0200 Subject: [PATCH 093/344] reinstated commented static method --- .../python/src/armonik/client/sessions.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 3d8194a92..1df69d6b5 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -18,17 +18,17 @@ class SessionFieldFilter: """ STATUS = StatusFilter(SessionField(session_raw_field=SessionRawField(field=SESSION_RAW_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus) - # @staticmethod - # def task_options_key(option_key: str) -> StringFilter: - # """ - # Filter for the TaskOptions.Options dictionary - # Args: - # option_key: key in the dictionary + @staticmethod + def task_options_key(option_key: str) -> StringFilter: + """ + Filter for the TaskOptions.Options dictionary + Args: + option_key: key in the dictionary - # Returns: - # Corresponding filter - # """ - # return StringFilter(SessionField(task_option_generic_field=TaskOptionGenericField(field=option_key)), rawFilters, rawFilterAnd, rawFilterField) + Returns: + Corresponding filter + """ + return StringFilter(SessionField(task_option_generic_field=TaskOptionGenericField(field=option_key)), rawFilters, rawFilterAnd, rawFilterField) class ArmoniKSessions: From 080161a78c410f18643cf56aea50faa5d19acb61 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Mon, 16 Oct 2023 10:27:20 +0200 Subject: [PATCH 094/344] feat: Add cancel_session method to class SessionFieldFilter --- packages/python/src/armonik/client/sessions.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 1df69d6b5..8c7912b9e 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -4,7 +4,7 @@ from ..protogen.client.sessions_service_pb2_grpc import SessionsStub from ..protogen.common.submitter_common_pb2 import SessionFilter -from ..protogen.common.sessions_common_pb2 import GetSessionRequest, GetSessionResponse, ListSessionsRequest, ListSessionsResponse, SessionRaw +from ..protogen.common.sessions_common_pb2 import GetSessionRequest, GetSessionResponse, ListSessionsRequest, ListSessionsResponse, SessionRaw, CancelSessionRequest, CancelSessionResponse from ..protogen.common.sessions_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus from ..protogen.common.sessions_fields_pb2 import * from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter @@ -64,3 +64,12 @@ def list_sessions(self, task_filter: Filter, page: int = 0, page_size: int = 100 ) list_response : ListSessionsResponse = self._client.ListSessions(request) return list_response.total, [Session.from_message(t) for t in list_response.sessions] + + def cancel_session(self, session_id: str) -> None: + """Cancel a session + + Args: + session_id: Id of the session to b cancelled + """ + self._client.CancelSession(CancelSessionRequest(session_id=session_id)) + \ No newline at end of file From fcdb450d756a51bebec719484147de1b91317af2 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 18 Oct 2023 10:32:16 +0200 Subject: [PATCH 095/344] chore: release 3.14.0 --- .../projects/aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 2 +- .../ArmoniK.Api.Common.Channel.csproj | 2 +- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 2 +- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 2 +- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 2 +- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 2 +- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 2 +- packages/web/package.json | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 90375cdc6..78a6d7ab8 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.13.2", + "version": "3.14.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index e9148e02a..055ef1eea 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.13.2) +set(version 3.14.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 8d7b5a90e..1313fec98 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.13.2 + 3.14.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 9f4e3f525..94b11f800 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.13.2 + 3.14.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index d6f0a3cf9..f9e439526 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - 3.13.2 + 3.14.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 9ee3c3820..79a87706a 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,7 +14,7 @@ enable ../kp.snk true - 3.13.2 + 3.14.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index 94d680db2..65d8c8751 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.13.2 + 3.14.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 3a2ae6f57..26fc8e3ca 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,7 +14,7 @@ true snupkg ../kp.snk - 3.13.2 + 3.14.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index ef072ee37..6689ea880 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,7 +9,7 @@ true Embedded true - 3.13.2 + 3.14.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 3bde89dea..156bf6faa 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,7 +16,7 @@ true snupkg ../kp.snk - 3.13.2 + 3.14.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index 65dba968a..0f937b72e 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.13.2", + "version": "3.14.0", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From f3292fc3288205eedc5cf262d984e36c17b507c9 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Wed, 18 Oct 2023 11:36:52 +0200 Subject: [PATCH 096/344] feat: Add Result List with a Status Filter to Python --- packages/python/src/armonik/client/results.py | 35 +++++++++++++++++-- .../python/src/armonik/common/__init__.py | 2 +- .../python/src/armonik/common/enumwrapper.py | 13 ++++++- packages/python/src/armonik/common/objects.py | 35 ++++++++++++++++--- 4 files changed, 77 insertions(+), 8 deletions(-) diff --git a/packages/python/src/armonik/client/results.py b/packages/python/src/armonik/client/results.py index 642fc346f..942add9c1 100644 --- a/packages/python/src/armonik/client/results.py +++ b/packages/python/src/armonik/client/results.py @@ -1,11 +1,19 @@ from __future__ import annotations from grpc import Channel -from typing import List, Dict, cast +from typing import List, Dict, cast, Tuple from ..protogen.client.results_service_pb2_grpc import ResultsStub -from ..protogen.common.results_common_pb2 import CreateResultsMetaDataRequest, CreateResultsMetaDataResponse +from ..protogen.common.results_common_pb2 import CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, ListResultsRequest, ListResultsResponse +from ..protogen.common.results_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus +from ..protogen.common.results_fields_pb2 import ResultField +from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter +from ..protogen.common.sort_direction_pb2 import SortDirection +from ..common import Direction , Result +from ..protogen.common.results_fields_pb2 import ResultField, ResultRawField, ResultRawEnumField, RESULT_RAW_ENUM_FIELD_STATUS +class ResultFieldFilter: + STATUS = StatusFilter(ResultField(result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus) class ArmoniKResult: def __init__(self, grpc_channel: Channel): @@ -18,3 +26,26 @@ def __init__(self, grpc_channel: Channel): def get_results_ids(self, session_id: str, names: List[str]) -> Dict[str, str]: return {r.name : r.result_id for r in cast(CreateResultsMetaDataResponse, self._client.CreateResultsMetaData(CreateResultsMetaDataRequest(results=[CreateResultsMetaDataRequest.ResultCreate(name = n) for n in names], session_id=session_id))).results} + + def list_results(self, result_filter: Filter, page: int = 0, page_size: int = 1000, sort_field: Filter = ResultFieldFilter.STATUS,sort_direction: SortDirection = Direction.ASC ) -> Tuple[int, List[Result]]: + """List results based on a filter. + + Args: + result_filter (Filter): Filter to apply when listing results + page: page number to request, useful for pagination, defaults to 0 + page_size: size of a page, defaults to 1000 + sort_field: field to sort the resulting list by, defaults to the status + sort_direction: direction of the sort, defaults to ascending + Returns: + A tuple containing : + - The total number of results for the given filter + - The obtained list of results + """ + request: ListResultsRequest = ListResultsRequest( + page=page, + page_size=page_size, + filters=cast(rawFilters, result_filter.to_disjunction().to_message()), + sort=ListResultsRequest.Sort(field=cast(ResultField, sort_field.field), direction=sort_direction), + ) + list_response: ListResultsResponse = self._client.ListResults(request) + return list_response.total, [Result.from_message(r) for r in list_response.results] diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 7b6ba7ad6..001721868 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,4 +1,4 @@ from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter -from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability, Session +from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability, Session, Result from .enumwrapper import HealthCheckStatus, TaskStatus, Direction from .filter import StringFilter, StatusFilter diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 78e5fed8a..9c19a9a82 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -2,6 +2,7 @@ from ..protogen.common.task_status_pb2 import TaskStatus as RawStatus, _TASKSTATUS, TASK_STATUS_CANCELLED, TASK_STATUS_CANCELLING, TASK_STATUS_COMPLETED, TASK_STATUS_CREATING, TASK_STATUS_DISPATCHED, TASK_STATUS_ERROR, TASK_STATUS_PROCESSED, TASK_STATUS_PROCESSING, TASK_STATUS_SUBMITTED, TASK_STATUS_TIMEOUT, TASK_STATUS_UNSPECIFIED, TASK_STATUS_RETRIED from ..protogen.common.session_status_pb2 import SessionStatus as RawSessionStatus, _SESSIONSTATUS, SESSION_STATUS_UNSPECIFIED, SESSION_STATUS_CANCELLED, SESSION_STATUS_RUNNING +from ..protogen.common.result_status_pb2 import ResultStatus as RawResultStatus, _RESULTSTATUS, RESULT_STATUS_UNSPECIFIED, RESULT_STATUS_CREATED, RESULT_STATUS_COMPLETED, RESULT_STATUS_ABORTED, RESULT_STATUS_NOTFOUND from ..protogen.common.worker_common_pb2 import HealthCheckReply from ..protogen.common.sort_direction_pb2 import SORT_DIRECTION_ASC, SORT_DIRECTION_DESC @@ -46,4 +47,14 @@ def name_from_value(status: RawSessionStatus) -> str: UNSPECIFIED = SESSION_STATUS_UNSPECIFIED RUNNING = SESSION_STATUS_RUNNING CANCELLED = SESSION_STATUS_CANCELLED - \ No newline at end of file + +class ResultStatus: + @staticmethod + def name_from_value(status: RawResultStatus) -> str: + return _RESULTSTATUS.values_by_number[status].name + + UNSPECIFIED = RESULT_STATUS_UNSPECIFIED + CREATED = RESULT_STATUS_CREATED + COMPLETED = RESULT_STATUS_COMPLETED + ABORTED = RESULT_STATUS_ABORTED + NOTFOUND = RESULT_STATUS_NOTFOUND diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 84a26c6b6..8debb5cbd 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -7,10 +7,11 @@ from .helpers import duration_to_timedelta, timedelta_to_duration, timestamp_to_datetime from ..protogen.common.objects_pb2 import Empty, Output as WorkerOutput, TaskOptions as RawTaskOptions from ..protogen.common.task_status_pb2 import TaskStatus as RawTaskStatus -from .enumwrapper import TaskStatus -from ..protogen.common.session_status_pb2 import * +from .enumwrapper import TaskStatus, SessionStatus, ResultStatus +from ..protogen.common.session_status_pb2 import SessionStatus as RawSessionStatus from ..protogen.common.sessions_common_pb2 import SessionRaw - +from ..protogen.common.result_status_pb2 import ResultStatus as RawResultStatus +from ..protogen.common.results_common_pb2 import ResultRaw @dataclass() class TaskOptions: @@ -164,7 +165,7 @@ def is_available(self) -> bool: @dataclass class Session: session_id: Optional[str] = None - status: SessionStatus = SESSION_STATUS_UNSPECIFIED + status: RawSessionStatus = SessionStatus.UNSPECIFIED partition_ids: List[str] = field(default_factory=list) options: Optional[TaskOptions] = None created_at: Optional[datetime] = None @@ -182,3 +183,29 @@ def from_message(cls, session_raw: SessionRaw) -> "Session": cancelled_at=timestamp_to_datetime(session_raw.cancelled_at), duration=duration_to_timedelta(session_raw.duration) ) + +from dataclasses import dataclass, field +from typing import List, Optional +from datetime import datetime + +@dataclass +class Result: + session_id: Optional[str] = None + name: Optional[str] = None + owner_task_id: Optional[str] = None + status: RawResultStatus = ResultStatus.UNSPECIFIED + created_at: Optional[datetime] = None + completed_at: Optional[datetime] = None + result_id: Optional[str] = None + + @classmethod + def from_message(cls, result_raw: ResultRaw) -> "Result": + return cls( + session_id=result_raw.session_id, + name=result_raw.name, + owner_task_id=result_raw.owner_task_id, + status=result_raw.status, + created_at=timestamp_to_datetime(result_raw.created_at), + completed_at=timestamp_to_datetime(result_raw.completed_at), + result_id=result_raw.result_id + ) From 50dfeaf66f69a51184052ad50a32a02ff04df181 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 18 Oct 2023 12:20:37 +0200 Subject: [PATCH 097/344] Added session client --- .../header/sessions/SessionsClient.h | 66 +++++++++++ .../source/sessions/SessionsClient.cpp | 109 ++++++++++++++++++ .../source/SessionClientTest.cpp | 103 +++++++++++++++++ 3 files changed, 278 insertions(+) create mode 100644 packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h create mode 100644 packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp diff --git a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h new file mode 100644 index 000000000..0224ce7cd --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h @@ -0,0 +1,66 @@ +#pragma once + +#include "sessions_common.pb.h" +#include "sessions_service.grpc.pb.h" + +namespace armonik { +namespace api { +namespace client { + +/** + * Session client wrapper + */ +class SessionsClient final { +public: + explicit SessionsClient(std::unique_ptr stub); + + /** + * Create a new session + * @param default_task_options Default task options for the session + * @param partitions Partitions the session will be able to send tasks to + * @return Session id + */ + std::string create_session(const armonik::api::grpc::v1::TaskOptions &default_task_options, + const std::vector &partitions = {}); + + /** + * Get informations about the given session + * @param session_id Session id + * @return SessionRaw object containing information about the session + */ + armonik::api::grpc::v1::sessions::SessionRaw get_session(const std::string &session_id); + + /** + * Cancel a session + * @param session_id Session id + * @return SessionRaw object containing information about the session + */ + armonik::api::grpc::v1::sessions::SessionRaw cancel_session(const std::string &session_id); + + /** + * List the Sessions + * @param filters Filter to be used + * @param total Output for the total of session available for this request (used for pagination) + * @param page Page to request, use -1 to get all pages. + * @param page_size Size of the requested page, ignored if page is -1 + * @param sort How the sessions are sorted, ascending creation date by default + * @return List of sessions + * + * @note If the sessions corresponding to the filters change while this call is going for page==-1, + * or between calls, then the returned values may not be consistent depending on the sorting used. + * For example, a sort by ascending creation date (the default) will be stable if sessions are being created in + * between requests. + */ + std::vector + list_sessions(const armonik::api::grpc::v1::sessions::Filters &filters, int32_t &total, int32_t page = -1, + int32_t page_size = 500, + const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort &sort = default_sort); + +private: + std::unique_ptr stub; + static const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort default_sort; +}; + +} // namespace client +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp new file mode 100644 index 000000000..249efc2dc --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp @@ -0,0 +1,109 @@ +#include "sessions/SessionsClient.h" +#include "exceptions/ArmoniKApiException.h" + +armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort get_default_sort() { + armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort sort; + sort.mutable_field()->mutable_session_raw_field()->set_field( + armonik::api::grpc::v1::sessions::SESSION_RAW_ENUM_FIELD_CREATED_AT); + sort.set_direction(armonik::api::grpc::v1::sort_direction::SORT_DIRECTION_ASC); + return sort; +} +const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort armonik::api::client::SessionsClient::default_sort = + get_default_sort(); + +armonik::api::client::SessionsClient::SessionsClient( + std::unique_ptr stub) + : stub(std::move(stub)) {} + +std::string +armonik::api::client::SessionsClient::create_session(const armonik::api::grpc::v1::TaskOptions &default_task_options, + const std::vector &partitions) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::sessions::CreateSessionRequest request; + armonik::api::grpc::v1::sessions::CreateSessionReply response; + + *request.mutable_default_task_option() = default_task_options; + request.mutable_partition_ids()->Add(partitions.begin(), partitions.end()); + + auto status = stub->CreateSession(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Could not create session : " + status.error_message()); + } + return response.session_id(); +} + +armonik::api::grpc::v1::sessions::SessionRaw +armonik::api::client::SessionsClient::get_session(const std::string &session_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::sessions::GetSessionRequest request; + armonik::api::grpc::v1::sessions::GetSessionResponse response; + + request.set_session_id(session_id); + + auto status = stub->GetSession(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Could not get session : " + status.error_message()); + } + return response.session(); +} + +armonik::api::grpc::v1::sessions::SessionRaw +armonik::api::client::SessionsClient::cancel_session(const std::string &session_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::sessions::CancelSessionRequest request; + armonik::api::grpc::v1::sessions::CancelSessionResponse response; + + request.set_session_id(session_id); + auto status = stub->CancelSession(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Could not cancel session : " + status.error_message()); + } + return response.session(); +} + +std::vector armonik::api::client::SessionsClient::list_sessions( + const armonik::api::grpc::v1::sessions::Filters &filters, int32_t &total, int32_t page, int32_t page_size, + const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort &sort) { + armonik::api::grpc::v1::sessions::ListSessionsRequest request; + armonik::api::grpc::v1::sessions::ListSessionsResponse response; + + *request.mutable_filters() = filters; + *request.mutable_sort() = sort; + request.set_page_size(page_size); + + if (page >= 0) { + request.set_page(page); + ::grpc::ClientContext context; + auto status = stub->ListSessions(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list sessions : " + + status.error_message()); + } + total = response.total(); + return {response.sessions().begin(), response.sessions().end()}; + } else { + std::vector rawSessions; + int current_page = 0; + do { + request.set_page(current_page); + ::grpc::ClientContext context; + auto status = stub->ListSessions(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list sessions : " + + status.error_message()); + } + // Append only the additional sessions + // If the current_page is a re-request, this will add only the new information + rawSessions.insert(rawSessions.end(), + response.sessions().begin() + ((int32_t)rawSessions.size() - current_page * page_size), + response.sessions().end()); + if (response.sessions_size() >= page_size) { + ++current_page; + } + + response.clear_sessions(); + } while ((int32_t)rawSessions.size() < response.total()); + total = response.total(); + return rawSessions; + } +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp new file mode 100644 index 000000000..39616eb33 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp @@ -0,0 +1,103 @@ +#include + +#include "common.h" +#include "logger/formatter.h" +#include "logger/logger.h" +#include "logger/writer.h" + +#include "sessions/SessionsClient.h" + +using Logger = armonik::api::common::logger::Logger; + +TEST(Sessions, can_create_session) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string response; + ASSERT_NO_THROW(response = client.create_session(task_options)); + ASSERT_FALSE(response.empty()); + + ASSERT_TRUE(client.get_session(response).status() == armonik::api::grpc::v1::session_status::SESSION_STATUS_RUNNING); +} + +TEST(Sessions, can_cancel_session) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string session_id = client.create_session(task_options); + ASSERT_TRUE(client.get_session(session_id).status() == + armonik::api::grpc::v1::session_status::SESSION_STATUS_RUNNING); + + armonik::api::grpc::v1::sessions::SessionRaw response; + ASSERT_NO_THROW(response = client.cancel_session(session_id)); + ASSERT_EQ(response.session_id(), session_id); + ASSERT_TRUE(client.get_session(session_id).status() == + armonik::api::grpc::v1::session_status::SESSION_STATUS_CANCELLED); +} + +TEST(Sessions, can_get_session) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string session_id = client.create_session(task_options); + + armonik::api::grpc::v1::sessions::SessionRaw response; + ASSERT_NO_THROW(response = client.get_session(session_id)); + ASSERT_EQ(response.session_id(), session_id); +} + +TEST(Sessions, can_list_sessions) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + auto client = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + std::string session_ids; + size_t expected_n_sessions = 5; + for (size_t i = 0; i < expected_n_sessions; i++) { + ASSERT_NO_THROW(client.create_session(task_options)); + } + + armonik::api::grpc::v1::sessions::Filters filters; + int total; + auto list = client.list_sessions(filters, total); + ASSERT_GE(list.size(), expected_n_sessions); + ASSERT_GE(total, expected_n_sessions); +} + +TEST(Sessions, can_list_sessions_small_page) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + auto client = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + std::string session_ids; + size_t expected_n_sessions = 5; + for (size_t i = 0; i < expected_n_sessions; i++) { + ASSERT_NO_THROW(client.create_session(task_options)); + } + + armonik::api::grpc::v1::sessions::Filters filters; + int total; + auto list = client.list_sessions(filters, total, 0, 2); + ASSERT_EQ(list.size(), 2); + ASSERT_GE(total, expected_n_sessions); + + list = client.list_sessions(filters, total, -1, 2); + ASSERT_GE(list.size(), expected_n_sessions); + ASSERT_GE(total, expected_n_sessions); +} From 114c2af30667ce2910a596b0ed9b014f0b82da90 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Thu, 19 Oct 2023 11:23:09 +0200 Subject: [PATCH 098/344] PR suggestions --- .../header/sessions/SessionsClient.h | 9 ++++---- .../source/sessions/SessionsClient.cpp | 21 +++++++------------ 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h index 0224ce7cd..b54d02d8b 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h @@ -10,9 +10,10 @@ namespace client { /** * Session client wrapper */ -class SessionsClient final { +class SessionsClient { public: - explicit SessionsClient(std::unique_ptr stub); + explicit SessionsClient(std::unique_ptr stub) + : stub(std::move(stub)){}; /** * Create a new session @@ -28,14 +29,14 @@ class SessionsClient final { * @param session_id Session id * @return SessionRaw object containing information about the session */ - armonik::api::grpc::v1::sessions::SessionRaw get_session(const std::string &session_id); + armonik::api::grpc::v1::sessions::SessionRaw get_session(std::string session_id); /** * Cancel a session * @param session_id Session id * @return SessionRaw object containing information about the session */ - armonik::api::grpc::v1::sessions::SessionRaw cancel_session(const std::string &session_id); + armonik::api::grpc::v1::sessions::SessionRaw cancel_session(std::string session_id); /** * List the Sessions diff --git a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp index 249efc2dc..6cc59f046 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp @@ -1,7 +1,7 @@ #include "sessions/SessionsClient.h" #include "exceptions/ArmoniKApiException.h" -armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort get_default_sort() { +static armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort get_default_sort() { armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort sort; sort.mutable_field()->mutable_session_raw_field()->set_field( armonik::api::grpc::v1::sessions::SESSION_RAW_ENUM_FIELD_CREATED_AT); @@ -11,10 +11,6 @@ armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort get_default_sort() { const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort armonik::api::client::SessionsClient::default_sort = get_default_sort(); -armonik::api::client::SessionsClient::SessionsClient( - std::unique_ptr stub) - : stub(std::move(stub)) {} - std::string armonik::api::client::SessionsClient::create_session(const armonik::api::grpc::v1::TaskOptions &default_task_options, const std::vector &partitions) { @@ -29,36 +25,35 @@ armonik::api::client::SessionsClient::create_session(const armonik::api::grpc::v if (!status.ok()) { throw armonik::api::common::exceptions::ArmoniKApiException("Could not create session : " + status.error_message()); } - return response.session_id(); + return std::move(*response.mutable_session_id()); } -armonik::api::grpc::v1::sessions::SessionRaw -armonik::api::client::SessionsClient::get_session(const std::string &session_id) { +armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::get_session(std::string session_id) { ::grpc::ClientContext context; armonik::api::grpc::v1::sessions::GetSessionRequest request; armonik::api::grpc::v1::sessions::GetSessionResponse response; - request.set_session_id(session_id); + request.set_session_id(std::move(session_id)); auto status = stub->GetSession(&context, request, &response); if (!status.ok()) { throw armonik::api::common::exceptions::ArmoniKApiException("Could not get session : " + status.error_message()); } - return response.session(); + return std::move(*response.mutable_session()); } armonik::api::grpc::v1::sessions::SessionRaw -armonik::api::client::SessionsClient::cancel_session(const std::string &session_id) { +armonik::api::client::SessionsClient::cancel_session(std::string session_id) { ::grpc::ClientContext context; armonik::api::grpc::v1::sessions::CancelSessionRequest request; armonik::api::grpc::v1::sessions::CancelSessionResponse response; - request.set_session_id(session_id); + request.set_session_id(std::move(session_id)); auto status = stub->CancelSession(&context, request, &response); if (!status.ok()) { throw armonik::api::common::exceptions::ArmoniKApiException("Could not cancel session : " + status.error_message()); } - return response.session(); + return std::move(*response.mutable_session()); } std::vector armonik::api::client::SessionsClient::list_sessions( From 89acb0443ac70551aeb1fe2c252f6eff44bbcaad Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Thu, 19 Oct 2023 11:42:23 +0200 Subject: [PATCH 099/344] PR suggestions --- .../header/sessions/SessionsClient.h | 6 +++--- .../source/sessions/SessionsClient.cpp | 20 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h index b54d02d8b..349748160 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h @@ -21,7 +21,7 @@ class SessionsClient { * @param partitions Partitions the session will be able to send tasks to * @return Session id */ - std::string create_session(const armonik::api::grpc::v1::TaskOptions &default_task_options, + std::string create_session(armonik::api::grpc::v1::TaskOptions default_task_options, const std::vector &partitions = {}); /** @@ -53,9 +53,9 @@ class SessionsClient { * between requests. */ std::vector - list_sessions(const armonik::api::grpc::v1::sessions::Filters &filters, int32_t &total, int32_t page = -1, + list_sessions(armonik::api::grpc::v1::sessions::Filters filters, int32_t &total, int32_t page = -1, int32_t page_size = 500, - const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort &sort = default_sort); + armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort sort = default_sort); private: std::unique_ptr stub; diff --git a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp index 6cc59f046..7780b2f18 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp @@ -1,5 +1,7 @@ -#include "sessions/SessionsClient.h" +#include + #include "exceptions/ArmoniKApiException.h" +#include "sessions/SessionsClient.h" static armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort get_default_sort() { armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort sort; @@ -12,13 +14,13 @@ const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort armonik::api:: get_default_sort(); std::string -armonik::api::client::SessionsClient::create_session(const armonik::api::grpc::v1::TaskOptions &default_task_options, +armonik::api::client::SessionsClient::create_session(armonik::api::grpc::v1::TaskOptions default_task_options, const std::vector &partitions) { ::grpc::ClientContext context; armonik::api::grpc::v1::sessions::CreateSessionRequest request; armonik::api::grpc::v1::sessions::CreateSessionReply response; - *request.mutable_default_task_option() = default_task_options; + *request.mutable_default_task_option() = std::move(default_task_options); request.mutable_partition_ids()->Add(partitions.begin(), partitions.end()); auto status = stub->CreateSession(&context, request, &response); @@ -56,14 +58,15 @@ armonik::api::client::SessionsClient::cancel_session(std::string session_id) { return std::move(*response.mutable_session()); } -std::vector armonik::api::client::SessionsClient::list_sessions( - const armonik::api::grpc::v1::sessions::Filters &filters, int32_t &total, int32_t page, int32_t page_size, - const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort &sort) { +std::vector +armonik::api::client::SessionsClient::list_sessions(armonik::api::grpc::v1::sessions::Filters filters, int32_t &total, + int32_t page, int32_t page_size, + armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort sort) { armonik::api::grpc::v1::sessions::ListSessionsRequest request; armonik::api::grpc::v1::sessions::ListSessionsResponse response; - *request.mutable_filters() = filters; - *request.mutable_sort() = sort; + *request.mutable_filters() = std::move(filters); + *request.mutable_sort() = std::move(sort); request.set_page_size(page_size); if (page >= 0) { @@ -99,6 +102,7 @@ std::vector armonik::api::client:: response.clear_sessions(); } while ((int32_t)rawSessions.size() < response.total()); total = response.total(); + // NRVO return rawSessions; } } From a3b438f8b1ace0ebb25f254b7b03c64ea48fe711 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 20 Oct 2023 17:15:32 +0200 Subject: [PATCH 100/344] Refactored Result service --- .../header/results/ResultsClient.h | 169 +++++++++++ .../header/submitter/ResultsClient.h | 52 ---- .../source/results/ResultsClient.cpp | 275 ++++++++++++++++++ .../source/submitter/ResultsClient.cpp | 157 ---------- .../source/ResultsClientTest.cpp | 117 +++++++- .../source/SubmitterClientTest.cpp | 2 +- 6 files changed, 547 insertions(+), 225 deletions(-) create mode 100644 packages/cpp/ArmoniK.Api.Client/header/results/ResultsClient.h delete mode 100644 packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h create mode 100644 packages/cpp/ArmoniK.Api.Client/source/results/ResultsClient.cpp delete mode 100644 packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp diff --git a/packages/cpp/ArmoniK.Api.Client/header/results/ResultsClient.h b/packages/cpp/ArmoniK.Api.Client/header/results/ResultsClient.h new file mode 100644 index 000000000..482054c9c --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/header/results/ResultsClient.h @@ -0,0 +1,169 @@ +#pragma once + +#include "results_service.grpc.pb.h" + +namespace armonik { +namespace api { +namespace client { + +namespace { + +template +struct is_result_create : std::conditional>::value || + std::is_same>::value || + std::is_same>::value, + std::true_type, std::false_type>::type {}; + +} // namespace + +class ResultsClient { +public: + struct Configuration { + int32_t data_chunk_max_size; + }; + +public: + explicit ResultsClient(std::unique_ptr stub) + : stub(std::move(stub)) {} + + /** + * List the results + * @param filters Filter to be used + * @param total Output for the total of results available from this request (used for pagination) + * @param page Page to request, use -1 to get all pages. + * @param page_size Size of the requested page, ignored if page is -1 + * @param sort How the results are sorted, ascending creation date by default + * @return List of results + * + * @note If the results corresponding to the filters change while this call is going for page==-1, + * or between calls, then the returned values may not be consistent depending on the sorting used. + * For example, a sort by ascending creation date (the default) will be stable if results are being created in between + * requests. + */ + std::vector + list_results(armonik::api::grpc::v1::results::Filters filters, int32_t &total, int32_t page = -1, + int32_t page_size = 500, armonik::api::grpc::v1::results::ListResultsRequest::Sort sort = default_sort); + + /** + * Get a result by id + * @param result_id Result id + * @return Result information + */ + armonik::api::grpc::v1::results::ResultRaw get_result(std::string result_id); + + /** + * Get the ids of the tasks that should produce the results + * @param session_id Session Id + * @param result_ids List of result ids + * @return Mapping between a result_id the and corresponding owner task + */ + std::map get_owner_task_id(std::string session_id, std::vector result_ids); + + /** + * Create the metadata of multiple results at once + * Data have to be uploaded separately + * @param session_id Session id + * @param names Names of the results to be created + * @return Map matching the names to their result_id + */ + std::map create_results_metadata(std::string session_id, + const std::vector &names); + [[deprecated("Use the create_results_metadata method instead")]] std::map + create_results(absl::string_view session_id, const std::vector &names); + + /** + * Create results with data included in the request + * + * @param session_id Session id + * @param results_to_create Vector of pairs made with : result name, result data + * @return Map matching the names to their result_id + */ + std::map + create_results(std::string session_id, const std::vector> &results_to_create); + + /** + * Create results with data included in the request + * @param session_id Session id + * @param results_to_create Map associating the result's name to their data + * @return Map matching the names to their result_id + */ + std::map create_results(std::string session_id, + const std::map &results_to_create); + + /** + * Create results with data included in the request + * @param session_id Session id + * @param results_to_create Map associating the result's name to their data + * @return Map matching the names to their result_id + */ + std::map + create_results(std::string session_id, const std::unordered_map &results_to_create); + + /** + * Create results with data included in the request + * @tparam pair_iterator Iterator of string pairs each made with : result name, result data + * @tparam pair_value_type String pair type made of : result name, result data + * @param session_id Session id + * @param begin Beginning of the iterator + * @param end End of the iterator + * @return Map matching the names to their result_id + */ + template ::value_type>::value, + typename std::iterator_traits::value_type>::type> + std::map create_results(std::string session_id, const pair_iterator &begin, + const pair_iterator &end) { + armonik::api::grpc::v1::results::CreateResultsRequest request; + + request.set_session_id(std::move(session_id)); + for (auto t = begin; t != end; t++) { + auto result_create = request.mutable_results()->Add(); + *result_create->mutable_name() = static_cast(*t).first; + result_create->mutable_data()->assign(static_cast(*t).second.data(), + static_cast(*t).second.length()); + } + + return send_create_results(request); + } + + /** + * Upload data for result + * @param session_id Session id + * @param result_id Result Id + * @param payload + */ + void upload_result_data(std::string session_id, std::string result_id, absl::string_view payload); + + /** + * Retrieve data from a result + * @param session_id Session id + * @param result_id Result Id + * @return Result data + */ + std::string download_result_data(std::string session_id, std::string result_id); + + /** + * Deletes the results data + * @param session_id Session id + * @param result_ids Result ids + */ + void delete_results_data(std::string session_id, const std::vector &result_ids); + [[deprecated("Use the delete_results_data method instead")]] void + delete_results(const std::string &session_id, const std::vector &result_ids); + + /** + * Get the service configuration + * @return Result service configuration + */ + Configuration get_service_configuration(); + +private: + std::unique_ptr stub; + static const armonik::api::grpc::v1::results::ListResultsRequest::Sort default_sort; + + std::map + send_create_results(const armonik::api::grpc::v1::results::CreateResultsRequest &request); +}; +} // namespace client +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h b/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h deleted file mode 100644 index 330dbd6af..000000000 --- a/packages/cpp/ArmoniK.Api.Client/header/submitter/ResultsClient.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef ARMONIK_API_RESULTSCLIENT_H -#define ARMONIK_API_RESULTSCLIENT_H - -#include - -namespace armonik { -namespace api { -namespace client { -class ResultsClient { -public: - explicit ResultsClient(std::unique_ptr stub) - : stub(std::move(stub)) {} - - std::map create_results(absl::string_view session_id, - const std::vector &names); - void upload_result_data(const std::string &session_id, const std::string &result_id, absl::string_view payload); - - /** - * Deletes the results data - * @param session_id Session id - * @param result_ids Result ids - */ - void delete_results(const std::string &session_id, const std::vector &result_ids); - - /** - * List the results - * @param filters Filter to be used - * @param total Output for the total of results available from this request (used for pagination) - * @param page Page to request, use -1 to get all pages. - * @param page_size Size of the requested page, ignored if page is -1 - * @param sort How the results are sorted, ascending creation date by default - * @return List of results - * - * @note If the results corresponding to the filters change while this call is going for page==-1, - * or between calls, then the returned values may not be consistent depending on the sorting used. - * For example, a sort by ascending creation date (the default) will be stable if results are being created in between - * requests. - */ - std::vector - list_results(const armonik::api::grpc::v1::results::Filters &filters, int32_t &total, int32_t page = -1, - int32_t page_size = 500, - const armonik::api::grpc::v1::results::ListResultsRequest::Sort &sort = get_default_sort()); - -private: - std::unique_ptr stub; - static armonik::api::grpc::v1::results::ListResultsRequest::Sort get_default_sort(); -}; -} // namespace client -} // namespace api -} // namespace armonik - -#endif // ARMONIK_API_RESULTSCLIENT_H diff --git a/packages/cpp/ArmoniK.Api.Client/source/results/ResultsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/results/ResultsClient.cpp new file mode 100644 index 000000000..9c436e517 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/source/results/ResultsClient.cpp @@ -0,0 +1,275 @@ +#include "results/ResultsClient.h" +#include "exceptions/ArmoniKApiException.h" +#include + +namespace armonik { +namespace api { +namespace client { + +static armonik::api::grpc::v1::results::ListResultsRequest::Sort get_default_sort() { + armonik::api::grpc::v1::results::ListResultsRequest::Sort sort; + sort.set_direction(grpc::v1::sort_direction::SORT_DIRECTION_ASC); + sort.mutable_field()->mutable_result_raw_field()->set_field(grpc::v1::results::RESULT_RAW_ENUM_FIELD_CREATED_AT); + return sort; +} + +const armonik::api::grpc::v1::results::ListResultsRequest::Sort ResultsClient::default_sort = get_default_sort(); + +std::map ResultsClient::create_results(absl::string_view session_id, + const std::vector &names) { + return create_results_metadata(std::string(session_id), names); +} + +std::map ResultsClient::create_results_metadata(std::string session_id, + const std::vector &names) { + std::map mapping; + ::grpc::ClientContext context; + armonik::api::grpc::v1::results::CreateResultsMetaDataRequest request; + armonik::api::grpc::v1::results::CreateResultsMetaDataResponse response; + + request.set_session_id(std::move(session_id)); + request.mutable_results()->Reserve((int)names.size()); + for (auto &&name : names) { + *request.mutable_results()->Add()->mutable_name() = name; + } + + // Creates the results + auto status = stub->CreateResultsMetaData(&context, request, &response); + + if (!status.ok()) { + std::stringstream message; + message << "Error creating results metadata: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + for (auto &&res : response.results()) { + mapping.insert({res.name(), res.result_id()}); + } + return mapping; +} + +void ResultsClient::upload_result_data(std::string session_id, std::string result_id, absl::string_view payload) { + + size_t maxChunkSize = get_service_configuration().data_chunk_max_size; + + armonik::api::grpc::v1::results::UploadResultDataResponse response; + ::grpc::ClientContext context; + auto stream = stub->UploadResultData(&context, &response); + armonik::api::grpc::v1::results::UploadResultDataRequest request; + request.mutable_id()->set_session_id(std::move(session_id)); + request.mutable_id()->set_result_id(std::move(result_id)); + stream->Write(request); + + while (!payload.empty()) { + auto chunk = payload.substr(0, maxChunkSize); + request.mutable_data_chunk()->assign(chunk.data(), chunk.size()); + if (!stream->Write(request)) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to continue upload result"); + } + payload = payload.substr(chunk.size()); + } + + if (!stream->WritesDone()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to upload result"); + } + auto status = stream->Finish(); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to finish upload result " + + status.error_message()); + } +} + +void ResultsClient::delete_results(const std::string &session_id, const std::vector &result_ids) { + delete_results_data(session_id, result_ids); +} + +void ResultsClient::delete_results_data(std::string session_id, const std::vector &result_ids) { + if (result_ids.empty()) { + return; + } + + ::grpc::ClientContext context; + armonik::api::grpc::v1::results::DeleteResultsDataRequest request; + armonik::api::grpc::v1::results::DeleteResultsDataResponse response; + *request.mutable_session_id() = std::move(session_id); + request.mutable_result_id()->Add(result_ids.begin(), result_ids.end()); + + auto status = stub->DeleteResultsData(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to delete results " + status.error_message()); + } +} + +std::vector +ResultsClient::list_results(grpc::v1::results::Filters filters, int32_t &total, int32_t page, int32_t page_size, + grpc::v1::results::ListResultsRequest::Sort sort) { + armonik::api::grpc::v1::results::ListResultsRequest request; + armonik::api::grpc::v1::results::ListResultsResponse response; + + *request.mutable_filters() = std::move(filters); + *request.mutable_sort() = std::move(sort); + request.set_page_size(page_size); + + if (page >= 0) { + request.set_page(page); + ::grpc::ClientContext context; + auto status = stub->ListResults(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list results " + status.error_message()); + } + total = response.total(); + return {response.results().begin(), response.results().end()}; + } else { + std::vector rawResults; + int current_page = 0; + do { + request.set_page(current_page); + ::grpc::ClientContext context; + auto status = stub->ListResults(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list results " + status.error_message()); + } + // Append only the additional results + // If the current_page is a re-request, this will add only the new information + rawResults.insert(rawResults.end(), + response.results().begin() + ((int32_t)rawResults.size() - current_page * page_size), + response.results().end()); + if (response.results_size() >= page_size) { + ++current_page; + } + + response.clear_results(); + } while ((int32_t)rawResults.size() < response.total()); + total = response.total(); + return rawResults; + } +} + +std::map +ResultsClient::create_results(std::string session_id, + const std::vector> &results_to_create) { + return ResultsClient::create_results(std::move(session_id), results_to_create.begin(), results_to_create.end()); +} +std::map +ResultsClient::create_results(std::string session_id, const std::map &results_to_create) { + return ResultsClient::create_results(std::move(session_id), results_to_create.begin(), results_to_create.end()); +} +std::map +ResultsClient::create_results(std::string session_id, + const std::unordered_map &results_to_create) { + return ResultsClient::create_results(std::move(session_id), results_to_create.begin(), results_to_create.end()); +} +std::map +ResultsClient::send_create_results(const grpc::v1::results::CreateResultsRequest &request) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::results::CreateResultsResponse response; + + auto status = stub->CreateResults(&context, request, &response); + + if (!status.ok()) { + std::stringstream message; + message << "Error creating results with data: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + std::map mapping; + for (auto &&res : response.results()) { + mapping.insert({res.name(), res.result_id()}); + } + return mapping; +} +armonik::api::grpc::v1::results::ResultRaw ResultsClient::get_result(std::string result_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::results::GetResultRequest request; + armonik::api::grpc::v1::results::GetResultResponse response; + *request.mutable_result_id() = std::move(result_id); + + auto status = stub->GetResult(&context, request, &response); + + if (!status.ok()) { + std::stringstream message; + message << "Error getting result: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + return response.result(); +} + +std::map ResultsClient::get_owner_task_id(std::string session_id, + std::vector result_ids) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::results::GetOwnerTaskIdRequest request; + armonik::api::grpc::v1::results::GetOwnerTaskIdResponse response; + + *request.mutable_session_id() = std::move(session_id); + request.mutable_result_id()->Add(result_ids.begin(), result_ids.end()); + + auto status = stub->GetOwnerTaskId(&context, request, &response); + + if (!status.ok()) { + std::stringstream message; + message << "Error getting owner task id: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + std::map mapping; + for (auto &&rid_tid : *response.mutable_result_task()) { + mapping[std::move(*rid_tid.mutable_task_id())] = std::move(*rid_tid.mutable_result_id()); + } + return mapping; +} + +std::string ResultsClient::download_result_data(std::string session_id, std::string result_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::results::DownloadResultDataRequest request; + armonik::api::grpc::v1::results::DownloadResultDataResponse response; + + *request.mutable_session_id() = std::move(session_id); + *request.mutable_result_id() = std::move(result_id); + + std::string received_data; + + auto stream = stub->DownloadResultData(&context, request); + while (stream->Read(&response)) { + received_data.append(response.data_chunk()); + } + auto status = stream->Finish(); + if (!status.ok()) { + std::stringstream message; + message << "Error downloading result data: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + return received_data; +} + +ResultsClient::Configuration ResultsClient::get_service_configuration() { + ::grpc::ClientContext context; + armonik::api::grpc::v1::Empty request; + armonik::api::grpc::v1::results::ResultsServiceConfigurationResponse response; + + auto status = stub->GetServiceConfiguration(&context, request, &response); + if (!status.ok()) { + std::stringstream message; + message << "Error getting result service configuration: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + return {response.data_chunk_max_size()}; +} + +} // namespace client +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp deleted file mode 100644 index a75a9cd5f..000000000 --- a/packages/cpp/ArmoniK.Api.Client/source/submitter/ResultsClient.cpp +++ /dev/null @@ -1,157 +0,0 @@ -#include "submitter/ResultsClient.h" -#include "exceptions/ArmoniKApiException.h" -#include - -namespace armonik { -namespace api { -namespace client { - -std::map ResultsClient::create_results(absl::string_view session_id, - const std::vector &names) { - std::map mapping; - ::grpc::ClientContext context; - armonik::api::grpc::v1::results::CreateResultsMetaDataRequest results_request; - armonik::api::grpc::v1::results::CreateResultsMetaDataResponse results_response; - - // Creates the result creation requests - std::vector results_create; - results_create.reserve(names.size()); - for (auto &&name : names) { - armonik::api::grpc::v1::results::CreateResultsMetaDataRequest_ResultCreate result_create; - result_create.set_name(name); - results_create.push_back(result_create); - } - - results_request.mutable_results()->Add(results_create.begin(), results_create.end()); - results_request.mutable_session_id()->assign(session_id.data(), session_id.size()); - - // Creates the results - auto status = stub->CreateResultsMetaData(&context, results_request, &results_response); - - if (!status.ok()) { - std::stringstream message; - message << "Error: " << status.error_code() << ": " << status.error_message() - << ". details : " << status.error_details() << std::endl; - auto str = message.str(); - std::cerr << "Could not create results for submit: " << str << std::endl; - throw armonik::api::common::exceptions::ArmoniKApiException(str); - } - - for (auto &&res : results_response.results()) { - mapping.insert({res.name(), res.result_id()}); - } - return mapping; -} -void ResultsClient::upload_result_data(const std::string &session_id, const std::string &result_id, - absl::string_view payload) { - ::grpc::ClientContext context; - armonik::api::grpc::v1::results::ResultsServiceConfigurationResponse configuration; - auto status = stub->GetServiceConfiguration(&context, armonik::api::grpc::v1::Empty(), &configuration); - if (!status.ok()) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to get result configuration : " + - status.error_message()); - } - - size_t maxChunkSize = configuration.data_chunk_max_size(); - - armonik::api::grpc::v1::results::UploadResultDataResponse response; - // response.set_allocated_result(new armonik::api::grpc::v1::results::ResultRaw()); - ::grpc::ClientContext streamContext; - auto stream = stub->UploadResultData(&streamContext, &response); - armonik::api::grpc::v1::results::UploadResultDataRequest request; - request.mutable_id()->set_session_id(session_id); - request.mutable_id()->set_result_id(result_id); - stream->Write(request); - - while (!payload.empty()) { - auto chunk = payload.substr(0, maxChunkSize); - request.mutable_data_chunk()->assign(chunk.data(), chunk.size()); - if (!stream->Write(request)) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to continue upload result"); - } - payload = payload.substr(chunk.size()); - } - - if (!stream->WritesDone()) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to upload result"); - } - status = stream->Finish(); - if (!status.ok()) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to finish upload result " + - status.error_message()); - } -} - -void ResultsClient::delete_results(const std::string &session_id, const std::vector &result_ids) { - if (result_ids.empty()) { - return; - } - - ::grpc::ClientContext context; - armonik::api::grpc::v1::results::DeleteResultsDataRequest request; - armonik::api::grpc::v1::results::DeleteResultsDataResponse response; - *request.mutable_session_id() = session_id; - request.mutable_result_id()->Add(result_ids.begin(), result_ids.end()); - - auto status = stub->DeleteResultsData(&context, request, &response); - if (!status.ok()) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to delete results " + status.error_message()); - } -} - -std::vector -ResultsClient::list_results(const grpc::v1::results::Filters &filters, int32_t &total, int32_t page, int32_t page_size, - const grpc::v1::results::ListResultsRequest::Sort &sort) { - armonik::api::grpc::v1::results::ListResultsRequest request; - armonik::api::grpc::v1::results::ListResultsResponse response; - - *request.mutable_filters() = filters; - *request.mutable_sort() = sort; - request.set_page_size(page_size); - - if (page >= 0) { - request.set_page(page); - ::grpc::ClientContext context; - auto status = stub->ListResults(&context, request, &response); - if (!status.ok()) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list results " + status.error_message()); - } - total = response.total(); - return {response.results().begin(), response.results().end()}; - } else { - std::vector rawResults; - int current_page = 0; - do { - request.set_page(current_page); - ::grpc::ClientContext context; - auto status = stub->ListResults(&context, request, &response); - if (!status.ok()) { - throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list results " + status.error_message()); - } - // Append only the additional results - // If the current_page is a re-request, this will add only the new information - rawResults.insert(rawResults.end(), - response.results().begin() + ((int32_t)rawResults.size() - current_page * page_size), - response.results().end()); - if (response.results_size() >= page_size) { - ++current_page; - } - - response.clear_results(); - } while ((int32_t)rawResults.size() < response.total()); - total = response.total(); - return rawResults; - } -} -armonik::api::grpc::v1::results::ListResultsRequest::Sort ResultsClient::get_default_sort() { - static armonik::api::grpc::v1::results::ListResultsRequest::Sort sort; - if (sort.direction() == grpc::v1::sort_direction::SORT_DIRECTION_UNSPECIFIED) { - sort.set_direction(grpc::v1::sort_direction::SORT_DIRECTION_ASC); - sort.mutable_field()->mutable_result_raw_field()->set_field(grpc::v1::results::RESULT_RAW_ENUM_FIELD_CREATED_AT); - } - return sort; -} - -} // namespace client -} // namespace api -} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp index ec278028b..e1ca82c10 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp @@ -1,4 +1,3 @@ -#include #include #include "common.h" @@ -6,9 +5,9 @@ #include "logger/logger.h" #include "logger/writer.h" +#include "results/ResultsClient.h" #include "results_service.grpc.pb.h" -#include "submitter/ResultsClient.h" -#include "submitter/SubmitterClient.h" +#include "sessions/SessionsClient.h" using Logger = armonik::api::common::logger::Logger; @@ -20,10 +19,9 @@ TEST(Results, test_results_created) { init(channel, task_options, log); auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); - auto sub_client = - armonik::api::client::SubmitterClient(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); - auto session_id = sub_client.create_session(task_options, {}); - auto map = client.create_results(session_id, std::vector{"0", "1", "2", "3"}); + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto map = client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3"}); ASSERT_TRUE(!map.empty()); ASSERT_EQ(map.size(), 4); } @@ -36,10 +34,9 @@ TEST(Results, test_results_list) { init(channel, task_options, log); auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); - auto sub_client = - armonik::api::client::SubmitterClient(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); - auto session_id = sub_client.create_session(task_options, {}); - auto map = client.create_results(session_id, std::vector{"0", "1", "2", "3"}); + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto map = client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3"}); ASSERT_TRUE(!map.empty()); ASSERT_EQ(map.size(), 4); @@ -64,10 +61,9 @@ TEST(Results, test_results_list_small_page) { init(channel, task_options, log); auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); - auto sub_client = - armonik::api::client::SubmitterClient(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); - auto session_id = sub_client.create_session(task_options, {}); - auto map = client.create_results(session_id, std::vector{"0", "1", "2", "3", "4"}); + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto map = client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3", "4"}); ASSERT_TRUE(!map.empty()); ASSERT_EQ(map.size(), 5); @@ -87,3 +83,94 @@ TEST(Results, test_results_list_small_page) { ASSERT_EQ(list.size(), 5); ASSERT_EQ(total, 5); } + +TEST(Results, test_results_create_with_data_vector) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto map = client.create_results(session_id, std::vector>{{"0", "TestPayload"}}); + ASSERT_EQ(map.size(), 1); + ASSERT_NO_THROW(map.at("0")); + ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); +} + +TEST(Results, test_results_create_with_data_map) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + std::map name_payload; + name_payload["0"] = "TestPayload"; + auto map = client.create_results(session_id, name_payload); + ASSERT_EQ(map.size(), 1); + ASSERT_NO_THROW(map.at("0")); + ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); +} + +TEST(Results, test_results_create_with_data_unordered_map) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + std::unordered_map name_payload; + name_payload["0"] = "TestPayload"; + auto map = client.create_results(session_id, name_payload); + ASSERT_EQ(map.size(), 1); + ASSERT_NO_THROW(map.at("0")); + ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); +} + +TEST(Results, test_results_create_with_data_string_view) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + std::vector> name_payload; + std::string fill_str = "TestPayloadTestPayload2"; + name_payload.emplace_back("0", absl::string_view(fill_str.c_str(), 11)); + name_payload.emplace_back("1", absl::string_view(fill_str.c_str() + 11, 12)); + auto map = client.create_results(session_id, name_payload.begin(), name_payload.end()); + ASSERT_EQ(map.size(), 2); + ASSERT_NO_THROW(map.at("0")); + ASSERT_NO_THROW(map.at("1")); + ASSERT_EQ(client.download_result_data(session_id, map.at("0")), std::string("TestPayload", 0, 11)); + ASSERT_EQ(client.download_result_data(session_id, map.at("1")), std::string("TestPayload2", 0, 12)); +} + +TEST(Results, test_results_upload_download) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto map = client.create_results_metadata(session_id, std::vector{"0"}); + ASSERT_EQ(map.size(), 1); + ASSERT_NO_THROW(map.at("0")); + ASSERT_NO_THROW(client.upload_result_data(session_id, map.at("0"), "TestPayload")); + ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index 959ca08c0..4c5f04fe8 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -21,9 +21,9 @@ #include "utils/GuuId.h" #include "common.h" +#include "results/ResultsClient.h" #include "results_common.pb.h" #include "results_service.grpc.pb.h" -#include "submitter/ResultsClient.h" using armonik::api::common::utils::Configuration; using armonik::api::grpc::v1::TaskOptions; From 26aeb417034767a56da1ee74c335ddbf507df44e Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 23 Oct 2023 11:52:54 +0200 Subject: [PATCH 101/344] Better generic create_results --- .../header/results/ResultsClient.h | 93 +++++++++---------- .../source/results/ResultsClient.cpp | 30 ++---- .../source/ResultsClientTest.cpp | 7 +- .../source/SubmitterClientTest.cpp | 2 +- 4 files changed, 55 insertions(+), 77 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/results/ResultsClient.h b/packages/cpp/ArmoniK.Api.Client/header/results/ResultsClient.h index 482054c9c..067968ff1 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/results/ResultsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/results/ResultsClient.h @@ -1,20 +1,18 @@ #pragma once #include "results_service.grpc.pb.h" +#include namespace armonik { namespace api { namespace client { -namespace { +template ()))> std::string materialize_string(T &&x) { + absl::string_view view(x); + return {view.data(), view.size()}; +} -template -struct is_result_create : std::conditional>::value || - std::is_same>::value || - std::is_same>::value, - std::true_type, std::false_type>::type {}; - -} // namespace +inline std::string materialize_string(std::string &&x) { return std::move(x); } class ResultsClient { public: @@ -42,7 +40,8 @@ class ResultsClient { */ std::vector list_results(armonik::api::grpc::v1::results::Filters filters, int32_t &total, int32_t page = -1, - int32_t page_size = 500, armonik::api::grpc::v1::results::ListResultsRequest::Sort sort = default_sort); + int32_t page_size = 500, + armonik::api::grpc::v1::results::ListResultsRequest::Sort sort = default_sort()); /** * Get a result by id @@ -73,59 +72,53 @@ class ResultsClient { /** * Create results with data included in the request - * - * @param session_id Session id - * @param results_to_create Vector of pairs made with : result name, result data - * @return Map matching the names to their result_id - */ - std::map - create_results(std::string session_id, const std::vector> &results_to_create); - - /** - * Create results with data included in the request - * @param session_id Session id - * @param results_to_create Map associating the result's name to their data - * @return Map matching the names to their result_id - */ - std::map create_results(std::string session_id, - const std::map &results_to_create); - - /** - * Create results with data included in the request - * @param session_id Session id - * @param results_to_create Map associating the result's name to their data - * @return Map matching the names to their result_id - */ - std::map - create_results(std::string session_id, const std::unordered_map &results_to_create); - - /** - * Create results with data included in the request - * @tparam pair_iterator Iterator of string pairs each made with : result name, result data - * @tparam pair_value_type String pair type made of : result name, result data - * @param session_id Session id + * @tparam It Iterator of string pairs each made with : result name, result data + * @tparam T String pair type made of : result name, result data + * @tparam U Result name type + * @tparam V Result data type + * @param session_id Session Id * @param begin Beginning of the iterator * @param end End of the iterator * @return Map matching the names to their result_id */ - template ::value_type>::value, - typename std::iterator_traits::value_type>::type> - std::map create_results(std::string session_id, const pair_iterator &begin, - const pair_iterator &end) { + template ::value_type, + class U = typename std::tuple_element<0, T>::type, class V = typename std::tuple_element<1, T>::type, + class = decltype(materialize_string(std::declval())), + class = decltype(materialize_string(std::declval())), + class = typename std::enable_if::value == 2>::type> + std::map create_results(std::string session_id, It begin, It end) { armonik::api::grpc::v1::results::CreateResultsRequest request; request.set_session_id(std::move(session_id)); - for (auto t = begin; t != end; t++) { + while (begin != end) { + auto &&pair = *begin++; + // Enables forwarding for std::get + using pair_t = decltype(pair); auto result_create = request.mutable_results()->Add(); - *result_create->mutable_name() = static_cast(*t).first; - result_create->mutable_data()->assign(static_cast(*t).second.data(), - static_cast(*t).second.length()); + *result_create->mutable_name() = materialize_string(std::get<0>(static_cast(pair))); + *result_create->mutable_data() = materialize_string(std::get<1>(static_cast(pair))); } return send_create_results(request); } + /** + * Create results with data included in the request + * @tparam T Type of iterable of pairs of strings + * @param session_id Session id + * @param iterable Iterable of pairs of strings + * @return Map matching the names to their result_id + */ + template + auto create_results(std::string session_id, T &&iterable) + -> decltype(create_results(std::move(session_id), iterable.begin(), iterable.end())) { + if (std::is_lvalue_reference::value) { + return create_results(std::move(session_id), iterable.begin(), iterable.end()); + } + return create_results(std::move(session_id), std::make_move_iterator(iterable.begin()), + std::make_move_iterator(iterable.end())); + } + /** * Upload data for result * @param session_id Session id @@ -159,7 +152,7 @@ class ResultsClient { private: std::unique_ptr stub; - static const armonik::api::grpc::v1::results::ListResultsRequest::Sort default_sort; + static armonik::api::grpc::v1::results::ListResultsRequest::Sort default_sort(); std::map send_create_results(const armonik::api::grpc::v1::results::CreateResultsRequest &request); diff --git a/packages/cpp/ArmoniK.Api.Client/source/results/ResultsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/results/ResultsClient.cpp index 9c436e517..bec3e96fb 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/results/ResultsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/results/ResultsClient.cpp @@ -6,15 +6,6 @@ namespace armonik { namespace api { namespace client { -static armonik::api::grpc::v1::results::ListResultsRequest::Sort get_default_sort() { - armonik::api::grpc::v1::results::ListResultsRequest::Sort sort; - sort.set_direction(grpc::v1::sort_direction::SORT_DIRECTION_ASC); - sort.mutable_field()->mutable_result_raw_field()->set_field(grpc::v1::results::RESULT_RAW_ENUM_FIELD_CREATED_AT); - return sort; -} - -const armonik::api::grpc::v1::results::ListResultsRequest::Sort ResultsClient::default_sort = get_default_sort(); - std::map ResultsClient::create_results(absl::string_view session_id, const std::vector &names) { return create_results_metadata(std::string(session_id), names); @@ -147,20 +138,6 @@ ResultsClient::list_results(grpc::v1::results::Filters filters, int32_t &total, } } -std::map -ResultsClient::create_results(std::string session_id, - const std::vector> &results_to_create) { - return ResultsClient::create_results(std::move(session_id), results_to_create.begin(), results_to_create.end()); -} -std::map -ResultsClient::create_results(std::string session_id, const std::map &results_to_create) { - return ResultsClient::create_results(std::move(session_id), results_to_create.begin(), results_to_create.end()); -} -std::map -ResultsClient::create_results(std::string session_id, - const std::unordered_map &results_to_create) { - return ResultsClient::create_results(std::move(session_id), results_to_create.begin(), results_to_create.end()); -} std::map ResultsClient::send_create_results(const grpc::v1::results::CreateResultsRequest &request) { ::grpc::ClientContext context; @@ -270,6 +247,13 @@ ResultsClient::Configuration ResultsClient::get_service_configuration() { return {response.data_chunk_max_size()}; } +armonik::api::grpc::v1::results::ListResultsRequest::Sort ResultsClient::default_sort() { + armonik::api::grpc::v1::results::ListResultsRequest::Sort sort; + sort.set_direction(grpc::v1::sort_direction::SORT_DIRECTION_ASC); + sort.mutable_field()->mutable_result_raw_field()->set_field(grpc::v1::results::RESULT_RAW_ENUM_FIELD_CREATED_AT); + return sort; +} + } // namespace client } // namespace api } // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp index e1ca82c10..e5231ec83 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp @@ -94,7 +94,8 @@ TEST(Results, test_results_create_with_data_vector) { auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) .create_session(task_options); - auto map = client.create_results(session_id, std::vector>{{"0", "TestPayload"}}); + std::vector> vec{{"0", "TestPayload"}}; + auto map = client.create_results(session_id, vec); ASSERT_EQ(map.size(), 1); ASSERT_NO_THROW(map.at("0")); ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); @@ -112,7 +113,7 @@ TEST(Results, test_results_create_with_data_map) { .create_session(task_options); std::map name_payload; name_payload["0"] = "TestPayload"; - auto map = client.create_results(session_id, name_payload); + auto map = client.create_results(session_id, std::move(name_payload)); ASSERT_EQ(map.size(), 1); ASSERT_NO_THROW(map.at("0")); ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); @@ -130,7 +131,7 @@ TEST(Results, test_results_create_with_data_unordered_map) { .create_session(task_options); std::unordered_map name_payload; name_payload["0"] = "TestPayload"; - auto map = client.create_results(session_id, name_payload); + auto map = client.create_results(session_id, std::move(name_payload)); ASSERT_EQ(map.size(), 1); ASSERT_NO_THROW(map.at("0")); ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index 4c5f04fe8..f603a578f 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -239,7 +239,7 @@ TEST(testMock, getResult) { armonik::api::grpc::v1::results::CreateResultsMetaDataRequest request_create; request_create.set_session_id(session_id); armonik::api::client::ResultsClient results(armonik::api::grpc::v1::results::Results::NewStub(channel)); - auto mapping = results.create_results(session_id, {name}); + auto mapping = results.create_results_metadata(session_id, {name}); log.debug("Created result {result_id}", {{"result_id", mapping[name]}}); ASSERT_TRUE(mapping.size() == 1); From 9116240bdac7e3ac03a4f6b66770fc23d2e0db26 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 23 Oct 2023 10:01:36 +0200 Subject: [PATCH 102/344] start task service --- .../header/tasks/TasksClient.h | 45 +++++++++++++++++++ .../source/tasks/TasksClient.cpp | 1 + 2 files changed, 46 insertions(+) create mode 100644 packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h create mode 100644 packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp diff --git a/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h b/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h new file mode 100644 index 000000000..84da5042b --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h @@ -0,0 +1,45 @@ +#pragma once + +#include "tasks_common.pb.h" +#include "tasks_service.grpc.pb.h" + +class TasksClient final{ + explicit TasksClient(std::unique_ptr stub); + + /** + * Get informations about the given task + * @param session_id Task id + * @return TaskDetailed object containing information about the task + */ + armonik::api::grpc::v1::tasks::TaskDetailed get_task(const std::string &task_id); + + /** + * Cancel a list of tasks + * @param task_ids List of task ids + * @return Vector of TaskSummary objects containing information about the canceled tasks + */ + std::vector cancel_tasks(const std::vector &task_ids); + + /** + * List the Sessions + * @param filters Filter to be used + * @param total Output for the total of session available for this request (used for pagination) + * @param page Page to request, use -1 to get all pages. + * @param page_size Size of the requested page, ignored if page is -1 + * @param sort How the sessions are sorted, ascending creation date by default + * @return List of sessions + * + * @note If the sessions corresponding to the filters change while this call is going for page==-1, + * or between calls, then the returned values may not be consistent depending on the sorting used. + * For example, a sort by ascending creation date (the default) will be stable if sessions are being created in + * between requests. + */ + std::vector + list_sessions(const armonik::api::grpc::v1::sessions::Filters &filters, int32_t &total, int32_t page = -1, + int32_t page_size = 500, + const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort &sort = default_sort); + +private: + std::unique_ptr stub; + static const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort default_sort; +}; diff --git a/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp new file mode 100644 index 000000000..1e69fa556 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp @@ -0,0 +1 @@ +#include "tasks/TasksClient.h" From 0e7678609f8f121bb6d36f6aa628d7c7083fddb8 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 24 Oct 2023 18:34:51 +0200 Subject: [PATCH 103/344] Task client wrapper --- .../ArmoniK.Api.Client/header/tasks/Task.h | 46 ++++ .../header/tasks/TasksClient.h | 100 ++++++-- .../source/tasks/TasksClient.cpp | 214 ++++++++++++++++++ 3 files changed, 339 insertions(+), 21 deletions(-) create mode 100644 packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h diff --git a/packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h b/packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h new file mode 100644 index 000000000..462b46ee7 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h @@ -0,0 +1,46 @@ +#pragma once + +#include "tasks_common.pb.h" +#include +#include + +namespace armonik { +namespace api { +namespace client { +struct TaskCreation { + std::string payload_id; + std::vector expected_output_keys; + std::vector data_dependencies = {}; + armonik::api::grpc::v1::TaskOptions taskOptions = get_no_task_options(); + + static armonik::api::grpc::v1::TaskOptions get_no_task_options() { + armonik::api::grpc::v1::TaskOptions options; + options.set_max_retries(INT32_MIN); + return options; + } +}; + +struct TaskInfo { + /** + * Id of the task + */ + std::string task_id; + + /** + * Expected output result ids + */ + std::vector expected_output_ids; + + /** + * Data dependencies of the task + */ + std::vector data_dependencies; + + /** + * Id of the payload + */ + std::string payload_id; +}; +} // namespace client +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h b/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h index 84da5042b..f872401f6 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h @@ -3,15 +3,62 @@ #include "tasks_common.pb.h" #include "tasks_service.grpc.pb.h" -class TasksClient final{ - explicit TasksClient(std::unique_ptr stub); +#include "Task.h" + +namespace armonik { +namespace api { +namespace client { + +class TasksClient { + + explicit TasksClient(std::unique_ptr stub) + : stub(std::move(stub)){}; + + /** + * List the Tasks + * @note This function returns a summary view of each task + * @param filters Filter to be used + * @param total Output for the total of session available for this request (used for pagination) + * @param page Page to request, use -1 to get all pages. + * @param page_size Size of the requested page, ignored if page is -1 + * @param sort How the sessions are sorted, ascending creation date by default + * @return List of tasks summary + * + * @note If the tasks corresponding to the filters change while this call is going for page==-1, + * or between calls, then the returned values may not be consistent depending on the sorting used. + * For example, a sort by ascending creation date (the default) will be stable if tasks are being created in + * between requests. + */ + std::vector + list_tasks(armonik::api::grpc::v1::tasks::Filters filters, int32_t &total, int32_t page = -1, int32_t page_size = 500, + armonik::api::grpc::v1::tasks::ListTasksRequest::Sort sort = default_sort()); + + /** + * List the Tasks + * @note This function returns a detailed view of each task + * @param filters Filter to be used + * @param total Output for the total of session available for this request (used for pagination) + * @param page Page to request, use -1 to get all pages. + * @param page_size Size of the requested page, ignored if page is -1 + * @param sort How the sessions are sorted, ascending creation date by default + * @return List of tasks summary + * + * @note If the tasks corresponding to the filters change while this call is going for page==-1, + * or between calls, then the returned values may not be consistent depending on the sorting used. + * For example, a sort by ascending creation date (the default) will be stable if tasks are being created in + * between requests. + */ + std::vector + list_tasks_detailed(armonik::api::grpc::v1::tasks::Filters filters, int32_t &total, int32_t page = -1, + int32_t page_size = 500, + armonik::api::grpc::v1::tasks::ListTasksRequest::Sort sort = default_sort()); /** * Get informations about the given task * @param session_id Task id * @return TaskDetailed object containing information about the task */ - armonik::api::grpc::v1::tasks::TaskDetailed get_task(const std::string &task_id); + armonik::api::grpc::v1::tasks::TaskDetailed get_task(std::string task_id); /** * Cancel a list of tasks @@ -21,25 +68,36 @@ class TasksClient final{ std::vector cancel_tasks(const std::vector &task_ids); /** - * List the Sessions - * @param filters Filter to be used - * @param total Output for the total of session available for this request (used for pagination) - * @param page Page to request, use -1 to get all pages. - * @param page_size Size of the requested page, ignored if page is -1 - * @param sort How the sessions are sorted, ascending creation date by default - * @return List of sessions - * - * @note If the sessions corresponding to the filters change while this call is going for page==-1, - * or between calls, then the returned values may not be consistent depending on the sorting used. - * For example, a sort by ascending creation date (the default) will be stable if sessions are being created in - * between requests. + * Get the result ids of each task + * @param task_ids List of tasks + * @return Map associating the task id to its result ids + */ + std::map> get_result_ids(const std::vector &task_ids); + + /** + * Count tasks by status + * @param filters Task filter, optional + * @return Map of each task status and its count */ - std::vector - list_sessions(const armonik::api::grpc::v1::sessions::Filters &filters, int32_t &total, int32_t page = -1, - int32_t page_size = 500, - const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort &sort = default_sort); + std::map + count_tasks_by_status(armonik::api::grpc::v1::tasks::Filters filters); + + /** + * Create tasks metadata and submit task for processing + * @param session_id Session id + * @param task_creations List of task creations + * @param task_options Task options common for this submission. Will be merged with the session task options + * @return List of submitted task info + */ + std::vector submit_tasks(std::string session_id, const std::vector &task_creations, + const armonik::api::grpc::v1::TaskOptions &task_options = no_task_options); private: - std::unique_ptr stub; - static const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort default_sort; + std::unique_ptr stub; + static armonik::api::grpc::v1::tasks::ListTasksRequest::Sort default_sort(); + static const armonik::api::grpc::v1::TaskOptions no_task_options; }; + +} // namespace client +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp index 1e69fa556..270477270 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp @@ -1 +1,215 @@ #include "tasks/TasksClient.h" +#include "exceptions/ArmoniKApiException.h" +#include + +using namespace armonik::api::client; + +static inline ::grpc::Status call_stub_list(armonik::api::grpc::v1::tasks::Tasks::StubInterface *stub, + const armonik::api::grpc::v1::tasks::ListTasksRequest &request, + armonik::api::grpc::v1::tasks::ListTasksDetailedResponse *response) { + ::grpc::ClientContext context; + return stub->ListTasksDetailed(&context, request, response); +} + +static inline ::grpc::Status call_stub_list(armonik::api::grpc::v1::tasks::Tasks::StubInterface *stub, + const armonik::api::grpc::v1::tasks::ListTasksRequest &request, + armonik::api::grpc::v1::tasks::ListTasksResponse *response) { + ::grpc::ClientContext context; + return stub->ListTasks(&context, request, response); +} + +template ().tasks()), + class = decltype(std::declval().total())> +static std::vector list_tasks_common(armonik::api::grpc::v1::tasks::Tasks::StubInterface *stub, + armonik::api::grpc::v1::tasks::Filters filters, int32_t &total, int32_t page, + int32_t page_size, armonik::api::grpc::v1::tasks::ListTasksRequest::Sort sort) { + armonik::api::grpc::v1::tasks::ListTasksRequest request; + U response; + *request.mutable_filters() = std::move(filters); + *request.mutable_sort() = std::move(sort); + request.set_page_size(page_size); + + if (page >= 0) { + request.set_page(page); + auto status = call_stub_list(stub, request, &response); + + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list results " + status.error_message()); + } + total = response.total(); + return {response.tasks().begin(), response.tasks().end()}; + } else { + std::vector rawResults; + int current_page = 0; + do { + request.set_page(current_page); + ::grpc::ClientContext context; + auto status = call_stub_list(stub, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list results " + status.error_message()); + } + // Append only the additional tasks + // If the current_page is a re-request, this will add only the new information + rawResults.insert(rawResults.end(), + response.tasks().begin() + ((int32_t)rawResults.size() - current_page * page_size), + response.tasks().end()); + if (response.total() >= page_size) { + ++current_page; + } + + response.clear_tasks(); + } while ((int32_t)rawResults.size() < response.total()); + total = response.total(); + return rawResults; + } +} + +std::vector +TasksClient::list_tasks(armonik::api::grpc::v1::tasks::Filters filters, int32_t &total, int32_t page, int32_t page_size, + armonik::api::grpc::v1::tasks::ListTasksRequest::Sort sort) { + return list_tasks_common(stub.get(), std::move(filters), total, + page, page_size, std::move(sort)); +} +std::vector +TasksClient::list_tasks_detailed(armonik::api::grpc::v1::tasks::Filters filters, int32_t &total, int32_t page, + int32_t page_size, armonik::api::grpc::v1::tasks::ListTasksRequest::Sort sort) { + return list_tasks_common( + stub.get(), std::move(filters), total, page, page_size, std::move(sort)); +} +armonik::api::grpc::v1::tasks::TaskDetailed TasksClient::get_task(std::string task_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::tasks::GetTaskRequest request; + armonik::api::grpc::v1::tasks::GetTaskResponse response; + *request.mutable_task_id() = std::move(task_id); + auto status = stub->GetTask(&context, request, &response); + if (!status.ok()) { + std::stringstream message; + message << "Error getting task: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + return response.task(); +} + +std::vector +TasksClient::cancel_tasks(const std::vector &task_ids) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::tasks::CancelTasksRequest request; + armonik::api::grpc::v1::tasks::CancelTasksResponse response; + request.mutable_task_ids()->Add(task_ids.begin(), task_ids.end()); + auto status = stub->CancelTasks(&context, request, &response); + if (!status.ok()) { + std::stringstream message; + message << "Error canceling tasks: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + return {std::make_move_iterator(response.mutable_tasks()->begin()), + std::make_move_iterator(response.mutable_tasks()->end())}; +} + +std::map> TasksClient::get_result_ids(const std::vector &task_ids) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::tasks::GetResultIdsRequest request; + armonik::api::grpc::v1::tasks::GetResultIdsResponse response; + request.mutable_task_id()->Add(task_ids.begin(), task_ids.end()); + auto status = stub->GetResultIds(&context, request, &response); + if (!status.ok()) { + std::stringstream message; + message << "Error getting result ids from tasks: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + std::map> map_results; + + for (auto &&tid_rid : *response.mutable_task_results()) { + map_results[std::move(*tid_rid.mutable_task_id())] = { + std::make_move_iterator(tid_rid.mutable_result_ids()->begin()), + std::make_move_iterator(tid_rid.mutable_result_ids()->end())}; + } + return map_results; +} + +std::map +TasksClient::count_tasks_by_status(armonik::api::grpc::v1::tasks::Filters filters) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::tasks::CountTasksByStatusRequest request; + armonik::api::grpc::v1::tasks::CountTasksByStatusResponse response; + *request.mutable_filters() = std::move(filters); + + auto status = stub->CountTasksByStatus(&context, request, &response); + if (!status.ok()) { + std::stringstream message; + message << "Error getting result ids from tasks: " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + + std::map map_status; + for (auto &&status_count : *response.mutable_status()) { + map_status[status_count.status()] = status_count.count(); + } + return map_status; +} +std::vector TasksClient::submit_tasks(std::string session_id, const std::vector &task_creations, + const armonik::api::grpc::v1::TaskOptions &task_options) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::tasks::SubmitTasksRequest request; + armonik::api::grpc::v1::tasks::SubmitTasksResponse response; + + *request.mutable_session_id() = std::move(session_id); + if (task_options.max_retries() != INT32_MIN) { + // not default task_options + *request.mutable_task_options() = task_options; + } + + for (auto &&t : task_creations) { + auto new_t = request.mutable_task_creations()->Add(); + *new_t->mutable_payload_id() = t.payload_id; + new_t->mutable_data_dependencies()->Add(t.data_dependencies.begin(), t.data_dependencies.end()); + new_t->mutable_expected_output_keys()->Add(t.expected_output_keys.begin(), t.expected_output_keys.end()); + if (t.taskOptions.max_retries() != INT32_MIN) { + // not default task_options + *new_t->mutable_task_options() = t.taskOptions; + } + } + + auto status = stub->SubmitTasks(&context, request, &response); + if (!status.ok()) { + std::stringstream message; + message << "Error submitting tasks " << status.error_code() << ": " << status.error_message() + << ". details : " << status.error_details() << std::endl; + auto str = message.str(); + throw armonik::api::common::exceptions::ArmoniKApiException(str); + } + std::vector infos; + infos.reserve(response.task_infos_size()); + for (auto &&info : *response.mutable_task_infos()) { + infos.push_back({std::move(*info.mutable_task_id()), + std::vector{std::make_move_iterator(info.mutable_expected_output_ids()->begin()), + std::make_move_iterator(info.mutable_expected_output_ids()->end())}, + std::vector{std::make_move_iterator(info.mutable_data_dependencies()->begin()), + std::make_move_iterator(info.mutable_data_dependencies()->end())}, + std::move(*info.mutable_payload_id())}); + } + return infos; +} + +armonik::api::grpc::v1::tasks::ListTasksRequest::Sort TasksClient::default_sort() { + armonik::api::grpc::v1::tasks::ListTasksRequest::Sort sort; + sort.set_direction(grpc::v1::sort_direction::SORT_DIRECTION_ASC); + sort.mutable_field()->mutable_task_summary_field()->set_field(grpc::v1::tasks::TASK_SUMMARY_ENUM_FIELD_CREATED_AT); + return sort; +} + +const armonik::api::grpc::v1::TaskOptions TasksClient::no_task_options = + armonik::api::client::TaskCreation::get_no_task_options(); From 1f2bcd4d9f66f3a7f43ee7c287160d7d33857913 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 25 Oct 2023 11:23:24 +0200 Subject: [PATCH 104/344] Added documentation --- .../ArmoniK.Api.Client/header/tasks/Task.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h b/packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h index 462b46ee7..849f0a6e6 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h +++ b/packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h @@ -8,11 +8,30 @@ namespace armonik { namespace api { namespace client { struct TaskCreation { + /** + * Payload Id + */ std::string payload_id; + /** + * Expected output keys + */ std::vector expected_output_keys; + + /** + * Data dependencies, none by default + */ std::vector data_dependencies = {}; + + /** + * Per task task options, none by default + */ armonik::api::grpc::v1::TaskOptions taskOptions = get_no_task_options(); + + /** + * Default "no task option" value + * @return A task option to use to ignore the task options parameter + */ static armonik::api::grpc::v1::TaskOptions get_no_task_options() { armonik::api::grpc::v1::TaskOptions options; options.set_max_retries(INT32_MIN); From 2d55382c3f274e9a0ef369f47271cfe9d8765d83 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Wed, 25 Oct 2023 18:19:30 +0200 Subject: [PATCH 105/344] Added TaskClient Tests --- .../header/tasks/TasksClient.h | 9 +- .../source/tasks/TasksClient.cpp | 9 +- .../header/objects}/Task.h | 5 +- .../source/TasksClientTest.cpp | 226 ++++++++++++++++++ 4 files changed, 238 insertions(+), 11 deletions(-) rename packages/cpp/{ArmoniK.Api.Client/header/tasks => ArmoniK.Api.Common/header/objects}/Task.h (96%) create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp diff --git a/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h b/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h index f872401f6..8a1775176 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h @@ -3,14 +3,14 @@ #include "tasks_common.pb.h" #include "tasks_service.grpc.pb.h" -#include "Task.h" +#include "objects/Task.h" namespace armonik { namespace api { namespace client { class TasksClient { - +public: explicit TasksClient(std::unique_ptr stub) : stub(std::move(stub)){}; @@ -89,8 +89,9 @@ class TasksClient { * @param task_options Task options common for this submission. Will be merged with the session task options * @return List of submitted task info */ - std::vector submit_tasks(std::string session_id, const std::vector &task_creations, - const armonik::api::grpc::v1::TaskOptions &task_options = no_task_options); + std::vector + submit_tasks(std::string session_id, const std::vector &task_creations, + const armonik::api::grpc::v1::TaskOptions &task_options = no_task_options); private: std::unique_ptr stub; diff --git a/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp index 270477270..2bfaa3b07 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp @@ -160,8 +160,9 @@ TasksClient::count_tasks_by_status(armonik::api::grpc::v1::tasks::Filters filter } return map_status; } -std::vector TasksClient::submit_tasks(std::string session_id, const std::vector &task_creations, - const armonik::api::grpc::v1::TaskOptions &task_options) { +std::vector +TasksClient::submit_tasks(std::string session_id, const std::vector &task_creations, + const armonik::api::grpc::v1::TaskOptions &task_options) { ::grpc::ClientContext context; armonik::api::grpc::v1::tasks::SubmitTasksRequest request; armonik::api::grpc::v1::tasks::SubmitTasksResponse response; @@ -191,7 +192,7 @@ std::vector TasksClient::submit_tasks(std::string session_id, const st auto str = message.str(); throw armonik::api::common::exceptions::ArmoniKApiException(str); } - std::vector infos; + std::vector infos; infos.reserve(response.task_infos_size()); for (auto &&info : *response.mutable_task_infos()) { infos.push_back({std::move(*info.mutable_task_id()), @@ -212,4 +213,4 @@ armonik::api::grpc::v1::tasks::ListTasksRequest::Sort TasksClient::default_sort( } const armonik::api::grpc::v1::TaskOptions TasksClient::no_task_options = - armonik::api::client::TaskCreation::get_no_task_options(); + armonik::api::common::TaskCreation::get_no_task_options(); diff --git a/packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h b/packages/cpp/ArmoniK.Api.Common/header/objects/Task.h similarity index 96% rename from packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h rename to packages/cpp/ArmoniK.Api.Common/header/objects/Task.h index 849f0a6e6..08ff3f252 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/tasks/Task.h +++ b/packages/cpp/ArmoniK.Api.Common/header/objects/Task.h @@ -6,7 +6,7 @@ namespace armonik { namespace api { -namespace client { +namespace common { struct TaskCreation { /** * Payload Id @@ -27,7 +27,6 @@ struct TaskCreation { */ armonik::api::grpc::v1::TaskOptions taskOptions = get_no_task_options(); - /** * Default "no task option" value * @return A task option to use to ignore the task options parameter @@ -60,6 +59,6 @@ struct TaskInfo { */ std::string payload_id; }; -} // namespace client +} // namespace common } // namespace api } // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp new file mode 100644 index 000000000..bd8553e4b --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp @@ -0,0 +1,226 @@ +#include +#include + +#include "common.h" +#include "logger/formatter.h" +#include "logger/logger.h" +#include "logger/writer.h" + +#include "objects/Task.h" +#include "results/ResultsClient.h" +#include "sessions/SessionsClient.h" +#include "tasks/TasksClient.h" +#include "tasks_service.grpc.pb.h" + +using Logger = armonik::api::common::logger::Logger; + +armonik::api::grpc::v1::tasks::Filters get_session_id_filter(std::string session_id) { + armonik::api::grpc::v1::tasks::Filters filters; + armonik::api::grpc::v1::tasks::FilterField filter_field; + filter_field.mutable_field()->mutable_task_summary_field()->set_field( + armonik::api::grpc::v1::tasks::TASK_SUMMARY_ENUM_FIELD_SESSION_ID); + *filter_field.mutable_filter_string()->mutable_value() = std::move(session_id); + filter_field.mutable_filter_string()->set_operator_(armonik::api::grpc::v1::FILTER_STRING_OPERATOR_EQUAL); + *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; + return filters; +} + +TEST(Tasks, submit_tasks_test) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + auto task_options_submit = task_options; + task_options_submit.set_priority(task_options.priority() + 1); + auto task_options_unique = task_options; + task_options_unique.set_priority(task_options.priority() + 2); + + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto result_client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto payload_id = result_client.create_results( + session_id, std::vector>{{"name", "payload"}})["name"]; + auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; + + auto client = armonik::api::client::TasksClient(armonik::api::grpc::v1::tasks::Tasks::NewStub(channel)); + + std::vector tasks_simple; + ASSERT_NO_THROW(tasks_simple = + client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}}})); + ASSERT_EQ(tasks_simple.size(), 1); + + std::vector tasks_submit_override; + ASSERT_NO_THROW(tasks_submit_override = + client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}}}, + task_options_submit)); + ASSERT_EQ(tasks_submit_override.size(), 1); + + std::vector tasks_submit_unique_override; + ASSERT_NO_THROW(tasks_submit_unique_override = client.submit_tasks( + session_id, + {armonik::api::common::TaskCreation{payload_id, {{result_id}}, {}, task_options_unique}}, + task_options_submit)); + ASSERT_NO_THROW(tasks_submit_unique_override.push_back(client.submit_tasks( + session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}, {}, task_options_unique}})[0])); + ASSERT_EQ(tasks_submit_unique_override.size(), 2); + + ASSERT_EQ(client.get_task(tasks_simple[0].task_id).options().priority(), task_options.priority()); + ASSERT_EQ(client.get_task(tasks_submit_override[0].task_id).options().priority(), task_options_submit.priority()); + ASSERT_EQ(client.get_task(tasks_submit_unique_override[0].task_id).options().priority(), + task_options_unique.priority()); + ASSERT_EQ(client.get_task(tasks_submit_unique_override[1].task_id).options().priority(), + task_options_unique.priority()); +} + +TEST(Tasks, count_tasks_test) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto result_client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto payload_id = result_client.create_results( + session_id, std::vector>{{"name", "payload"}})["name"]; + auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; + auto client = armonik::api::client::TasksClient(armonik::api::grpc::v1::tasks::Tasks::NewStub(channel)); + + auto filters = get_session_id_filter(session_id); + + std::map status_count; + ASSERT_NO_THROW(status_count = client.count_tasks_by_status(filters)); + ASSERT_EQ(std::accumulate(status_count.begin(), status_count.end(), 0, + [](int a, std::pair p) { + return a + p.second; + }), + 0); + + client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}}}); + + ASSERT_NO_THROW(status_count = client.count_tasks_by_status(filters)); + ASSERT_EQ(std::accumulate(status_count.begin(), status_count.end(), 0, + [](int a, std::pair p) { + return a + p.second; + }), + 1); +} + +TEST(Tasks, get_result_ids_test) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto result_client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto payload_id = result_client.create_results( + session_id, std::vector>{{"name", "payload"}})["name"]; + auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; + auto client = armonik::api::client::TasksClient(armonik::api::grpc::v1::tasks::Tasks::NewStub(channel)); + + auto task_id = + client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {result_id}}})[0].task_id; + + std::map> tid_rids; + ASSERT_NO_THROW(tid_rids = client.get_result_ids({task_id})); + ASSERT_EQ(tid_rids.at(task_id).size(), 1); + ASSERT_EQ(tid_rids.at(task_id).at(0), result_id); +} + +TEST(Tasks, get_task_test) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto result_client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto payload_id = result_client.create_results( + session_id, std::vector>{{"name", "payload"}})["name"]; + auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; + auto client = armonik::api::client::TasksClient(armonik::api::grpc::v1::tasks::Tasks::NewStub(channel)); + + auto task_id = + client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {result_id}}})[0].task_id; + + armonik::api::grpc::v1::tasks::TaskDetailed details; + ASSERT_NO_THROW(details = client.get_task(task_id)); + ASSERT_EQ(details.id(), task_id); +} + +TEST(Tasks, cancel_tasks_test) { + GTEST_SKIP() << "Core bug #523"; + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto result_client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto payload_id = result_client.create_results( + session_id, std::vector>{{"name", "payload"}})["name"]; + auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; + auto dd_id = result_client.create_results_metadata(session_id, {"DD"})["DD"]; + auto client = armonik::api::client::TasksClient(armonik::api::grpc::v1::tasks::Tasks::NewStub(channel)); + + auto task_id = + client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {result_id}, {dd_id}}})[0] + .task_id; + + ASSERT_NE(client.get_task(task_id).status(), armonik::api::grpc::v1::task_status::TASK_STATUS_CANCELLED); + + ASSERT_EQ(client.cancel_tasks({task_id}).at(0).status(), armonik::api::grpc::v1::task_status::TASK_STATUS_CANCELLED); +} + +TEST(Tasks, list_tasks_test) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto result_client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto payload_id = result_client.create_results( + session_id, std::vector>{{"name", "payload"}})["name"]; + auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; + auto client = armonik::api::client::TasksClient(armonik::api::grpc::v1::tasks::Tasks::NewStub(channel)); + + client.submit_tasks(session_id, {{payload_id, {result_id}}}); + + int total; + ASSERT_EQ(client.list_tasks(get_session_id_filter(session_id), total).size(), 1); + ASSERT_EQ(total, 1); +} + +TEST(Tasks, list_tasks_detailed_test) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + + init(channel, task_options, log); + + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + auto result_client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto payload_id = result_client.create_results( + session_id, std::vector>{{"name", "payload"}})["name"]; + auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; + auto client = armonik::api::client::TasksClient(armonik::api::grpc::v1::tasks::Tasks::NewStub(channel)); + + client.submit_tasks(session_id, {{payload_id, {result_id}}}); + + int total; + ASSERT_EQ(client.list_tasks_detailed(get_session_id_filter(session_id), total).size(), 1); + ASSERT_EQ(total, 1); +} From 51465fc74465a0867f1e3996f63934cf4fc4a264 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 27 Oct 2023 14:22:46 +0200 Subject: [PATCH 106/344] PR Suggestions --- .../ArmoniK.Api.Client/header/tasks/TasksClient.h | 4 ++-- .../source/tasks/TasksClient.cpp | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h b/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h index 8a1775176..f9325996c 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/tasks/TasksClient.h @@ -21,7 +21,7 @@ class TasksClient { * @param total Output for the total of session available for this request (used for pagination) * @param page Page to request, use -1 to get all pages. * @param page_size Size of the requested page, ignored if page is -1 - * @param sort How the sessions are sorted, ascending creation date by default + * @param sort How the tasks are sorted, ascending creation date by default * @return List of tasks summary * * @note If the tasks corresponding to the filters change while this call is going for page==-1, @@ -40,7 +40,7 @@ class TasksClient { * @param total Output for the total of session available for this request (used for pagination) * @param page Page to request, use -1 to get all pages. * @param page_size Size of the requested page, ignored if page is -1 - * @param sort How the sessions are sorted, ascending creation date by default + * @param sort How the tasks are sorted, ascending creation date by default * @return List of tasks summary * * @note If the tasks corresponding to the filters change while this call is going for page==-1, diff --git a/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp index 2bfaa3b07..9c18bb1a0 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/tasks/TasksClient.cpp @@ -18,6 +18,18 @@ static inline ::grpc::Status call_stub_list(armonik::api::grpc::v1::tasks::Tasks return stub->ListTasks(&context, request, response); } +/** + * Common function called to list tasks + * @tparam T Result value type (TaskSummary or TaskDetailed + * @tparam U Response type + * @param stub Task stub + * @param filters Filter to be used + * @param total Output for the total of session available for this request (used for pagination) + * @param page Page to request, use -1 to get all pages. + * @param page_size Size of the requested page, ignored if page is -1 + * @param sort How the tasks are sorted, ascending creation date by default + * @return Vector of information about the tasks + */ template ().tasks()), class = decltype(std::declval().total())> static std::vector list_tasks_common(armonik::api::grpc::v1::tasks::Tasks::StubInterface *stub, @@ -71,6 +83,7 @@ TasksClient::list_tasks(armonik::api::grpc::v1::tasks::Filters filters, int32_t armonik::api::grpc::v1::tasks::ListTasksResponse>(stub.get(), std::move(filters), total, page, page_size, std::move(sort)); } + std::vector TasksClient::list_tasks_detailed(armonik::api::grpc::v1::tasks::Filters filters, int32_t &total, int32_t page, int32_t page_size, armonik::api::grpc::v1::tasks::ListTasksRequest::Sort sort) { @@ -78,6 +91,7 @@ TasksClient::list_tasks_detailed(armonik::api::grpc::v1::tasks::Filters filters, armonik::api::grpc::v1::tasks::ListTasksDetailedResponse>( stub.get(), std::move(filters), total, page, page_size, std::move(sort)); } + armonik::api::grpc::v1::tasks::TaskDetailed TasksClient::get_task(std::string task_id) { ::grpc::ClientContext context; armonik::api::grpc::v1::tasks::GetTaskRequest request; @@ -160,6 +174,7 @@ TasksClient::count_tasks_by_status(armonik::api::grpc::v1::tasks::Filters filter } return map_status; } + std::vector TasksClient::submit_tasks(std::string session_id, const std::vector &task_creations, const armonik::api::grpc::v1::TaskOptions &task_options) { From 5c4618a0ba05abe2d54ce2ab54628b49a54f04cb Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Mon, 6 Nov 2023 16:08:36 +0100 Subject: [PATCH 107/344] feat: Add create_session method to ArmoniKSessions Class --- .../python/src/armonik/client/sessions.py | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 8c7912b9e..8f676144d 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -1,15 +1,15 @@ from __future__ import annotations from grpc import Channel -from typing import cast, Tuple, List +from typing import cast, Tuple, List, Optional from ..protogen.client.sessions_service_pb2_grpc import SessionsStub from ..protogen.common.submitter_common_pb2 import SessionFilter -from ..protogen.common.sessions_common_pb2 import GetSessionRequest, GetSessionResponse, ListSessionsRequest, ListSessionsResponse, SessionRaw, CancelSessionRequest, CancelSessionResponse +from ..protogen.common.sessions_common_pb2 import GetSessionRequest, GetSessionResponse, ListSessionsRequest, ListSessionsResponse, SessionRaw, CancelSessionRequest, CancelSessionResponse, CreateSessionRequest from ..protogen.common.sessions_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus from ..protogen.common.sessions_fields_pb2 import * from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter from ..protogen.common.sort_direction_pb2 import SortDirection -from ..common import Direction, Session +from ..common import Direction, Session, TaskOptions from ..protogen.common.sessions_fields_pb2 import SessionField, SessionRawField, SESSION_RAW_ENUM_FIELD_STATUS, TaskOptionGenericField class SessionFieldFilter: @@ -40,6 +40,26 @@ def __init__(self, grpc_channel: Channel): """ self._client = SessionsStub(grpc_channel) + def create_session(self, default_task_options: TaskOptions, partition_ids: Optional[List[str]] = None) -> str: + """Create a session + + Args: + default_task_options: Default TaskOptions used when + submitting tasks without specifying the options + partition_ids: List of partitions this session can send + tasks to. If unspecified, can only send to the default + partition + + Returns: + Session Id + """ + if partition_ids is None: + partition_ids = [] + request = CreateSessionRequest(default_task_option=default_task_options.to_message()) + for partition in partition_ids: + request.partition_ids.append(partition) + return self._client.CreateSession(request).session_id + def list_sessions(self, task_filter: Filter, page: int = 0, page_size: int = 1000, sort_field: Filter = SessionFieldFilter.STATUS, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Session]]: """ List sessions From 20d2051f5d122c20f7a41069821d10b91f23200a Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Tue, 12 Dec 2023 17:28:55 +0100 Subject: [PATCH 108/344] Add size to Result object --- Protos/V1/results_common.proto | 1 + Protos/V1/results_fields.proto | 1 + Protos/V1/results_filters.proto | 1 + packages/csharp/ArmoniK.Api.Mock/Services/Results.cs | 1 + packages/python/src/armonik/common/objects.py | 4 +++- 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Protos/V1/results_common.proto b/Protos/V1/results_common.proto index 650be0a73..a19f1dd19 100644 --- a/Protos/V1/results_common.proto +++ b/Protos/V1/results_common.proto @@ -23,6 +23,7 @@ message ResultRaw { google.protobuf.Timestamp created_at = 5; /** The result creation date. */ google.protobuf.Timestamp completed_at = 6; /** The result completion date. */ string result_id = 8; /** The result ID. Uniquely generated by the server. */ + int64 size = 9; /** The size of the Result Data. */ } /** diff --git a/Protos/V1/results_fields.proto b/Protos/V1/results_fields.proto index 33e218936..25ee9f0c1 100644 --- a/Protos/V1/results_fields.proto +++ b/Protos/V1/results_fields.proto @@ -16,6 +16,7 @@ enum ResultRawEnumField { RESULT_RAW_ENUM_FIELD_CREATED_AT = 5; /** The result creation date. */ RESULT_RAW_ENUM_FIELD_COMPLETED_AT = 6; /** The result completion date. */ RESULT_RAW_ENUM_FIELD_RESULT_ID = 7; /** The result ID. */ + RESULT_RAW_ENUM_FIELD_SIZE = 8; /** The size of the result. */ } /** diff --git a/Protos/V1/results_filters.proto b/Protos/V1/results_filters.proto index 37e2ae9d7..11cccba66 100644 --- a/Protos/V1/results_filters.proto +++ b/Protos/V1/results_filters.proto @@ -20,6 +20,7 @@ message FilterField { FilterDate filter_date = 3; FilterArray filter_array = 4; FilterStatus filter_status = 5; + FilterNumber filter_number = 6; } } diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs index b317d9251..291d905dd 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Results.cs @@ -33,6 +33,7 @@ public class Results : gRPC.V1.Results.Results.ResultsBase Name = "result-name", Status = ResultStatus.Completed, OwnerTaskId = "owner-task-id", + Size = 0, }; /// diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 8debb5cbd..4f9527377 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -197,6 +197,7 @@ class Result: created_at: Optional[datetime] = None completed_at: Optional[datetime] = None result_id: Optional[str] = None + size: Optional[int] = None @classmethod def from_message(cls, result_raw: ResultRaw) -> "Result": @@ -207,5 +208,6 @@ def from_message(cls, result_raw: ResultRaw) -> "Result": status=result_raw.status, created_at=timestamp_to_datetime(result_raw.created_at), completed_at=timestamp_to_datetime(result_raw.completed_at), - result_id=result_raw.result_id + result_id=result_raw.result_id, + size=result_raw.size ) From ceb853f7e540354e2cddd5a976b0c1663e31d764 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Tue, 12 Dec 2023 17:45:43 +0100 Subject: [PATCH 109/344] Update ArmoniK.Utils to 0.4.0 --- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 79a87706a..8cba6a514 100644 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -19,7 +19,7 @@ - + From 52651c130e7239ad63c024b85f64abcd8883fff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 18 Dec 2023 18:18:18 +0100 Subject: [PATCH 110/344] feat: add health checks --- Protos/V1/health_checks_common.proto | 34 +++++++++++++++++++++++++++ Protos/V1/health_checks_service.proto | 18 ++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 Protos/V1/health_checks_common.proto create mode 100644 Protos/V1/health_checks_service.proto diff --git a/Protos/V1/health_checks_common.proto b/Protos/V1/health_checks_common.proto new file mode 100644 index 000000000..50cc7d039 --- /dev/null +++ b/Protos/V1/health_checks_common.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; + +package armonik.api.grpc.v1.health_checks; + +option csharp_namespace = "Armonik.Api.Grpc.V1.HealthChecks"; + +/** + * Represents the available health status + */ + enum HealthStatusEnum { + HEALTH_STATUS_ENUM_UNSPECIFIED = 0; /** Unspecified */ + HEALTH_STATUS_ENUM_HEALTHY = 1; /** Service is working without issues */ + HEALTH_STATUS_ENUM_DEGRADED = 2; /** Service has issues but still works */ + HEALTH_STATUS_ENUM_UNHEALTHY = 3; /** Service does not work */ +} + +/** +* Request to check if all services are healthy +*/ +message CheckHealthRequest {} + +/** +* Response to check if all services are healthy +*/ +message CheckHealthResponse { + message ServiceHealth { + string name = 1; // Name of the service (e.g. "control_plane", "database", "redis") + string message = 2; + HealthStatusEnum healthy = 3; + } + + repeated ServiceHealth services = 1; +} + diff --git a/Protos/V1/health_checks_service.proto b/Protos/V1/health_checks_service.proto new file mode 100644 index 000000000..6d88a5e77 --- /dev/null +++ b/Protos/V1/health_checks_service.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +package armonik.api.grpc.v1.health_checks; + +import "health_checks_common.proto"; + +option csharp_namespace = "Armonik.Api.Grpc.V1.HealthChecks"; + +/** + * The HealthChecksService provides methods to verify the health of the cluster. + */ +service HealthChecksService { + /** + * Checks the health of the cluster. This can be used to verify that the cluster is up and running. + */ + rpc CheckHealth(CheckHealthRequest) returns (CheckHealthResponse) {} + +} From 7ec122f4023370aeda002f9d79bfba8164989d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 18 Dec 2023 12:03:59 +0100 Subject: [PATCH 111/344] feat: add health checks services in packages --- packages/common/protofiles.sh | 3 ++- packages/cpp/ArmoniK.Api.Client/CMakeLists.txt | 2 ++ packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 3 +++ packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++++ packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 3 +++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/common/protofiles.sh b/packages/common/protofiles.sh index e1afae1f9..b4a80e8b1 100644 --- a/packages/common/protofiles.sh +++ b/packages/common/protofiles.sh @@ -7,6 +7,7 @@ export README_PATH=$REPOSITORY_PATH/README.md armonik_worker_files=("agent_service.proto" "worker_service.proto") armonik_client_files=("submitter_service.proto" "tasks_service.proto" "sessions_service.proto" \ "results_service.proto" "applications_service.proto" "auth_service.proto" \ + "health_checks_service.proto" \ "events_service.proto" "partitions_service.proto" "versions_service.proto") armonik_common_files=("objects.proto" "task_status.proto" "session_status.proto" \ "result_status.proto" "agent_common.proto" "sessions_common.proto" \ @@ -17,5 +18,5 @@ armonik_common_files=("objects.proto" "task_status.proto" "session_status.proto" "sessions_fields.proto" "sessions_filters.proto" \ "applications_fields.proto" "applications_filters.proto" \ "partitions_fields.proto" "partitions_filters.proto" \ - "results_fields.proto" "results_filters.proto" \ + "results_fields.proto" "results_filters.proto" "health_checks_common.proto" \ "filters_common.proto") diff --git a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt index cc602013b..27d3ccc5b 100644 --- a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt @@ -4,6 +4,7 @@ set(PROJECT_BUILD_DIR ${BUILD_DIR}/${PROJECT_NAME}) set(PROTO_FILES "submitter_service.proto" + "health_checks_service.proto" "applications_service.proto" "sessions_service.proto" "tasks_service.proto" @@ -17,6 +18,7 @@ set(PROTO_MESSAGES "auth_common.proto" "sessions_common.proto" "submitter_common.proto" + "health_checks_common.proto" "tasks_common.proto" "results_common.proto" "partitions_common.proto" diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index fa6e1a9c0..1237ce0d3 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -70,5 +70,8 @@ gRPC\Protos\versions_service.proto + + gRPC\Protos\health_checks_service.proto + diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 044fc64c7..3cc6b4698 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -58,6 +58,10 @@ Message True + + Message + True + Message True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index 53916d190..f89005982 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -67,6 +67,9 @@ gRPC\Protos\versions_service.proto + + gRPC\Protos\health_checks_service.proto + From 8709779a42a0bfb10be58ab3ef9fe1bb66b2a575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 18 Dec 2023 12:06:40 +0100 Subject: [PATCH 112/344] style: format proto files --- Protos/V1/health_checks_common.proto | 3 +-- Protos/V1/health_checks_service.proto | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Protos/V1/health_checks_common.proto b/Protos/V1/health_checks_common.proto index 50cc7d039..748121c00 100644 --- a/Protos/V1/health_checks_common.proto +++ b/Protos/V1/health_checks_common.proto @@ -7,7 +7,7 @@ option csharp_namespace = "Armonik.Api.Grpc.V1.HealthChecks"; /** * Represents the available health status */ - enum HealthStatusEnum { +enum HealthStatusEnum { HEALTH_STATUS_ENUM_UNSPECIFIED = 0; /** Unspecified */ HEALTH_STATUS_ENUM_HEALTHY = 1; /** Service is working without issues */ HEALTH_STATUS_ENUM_DEGRADED = 2; /** Service has issues but still works */ @@ -31,4 +31,3 @@ message CheckHealthResponse { repeated ServiceHealth services = 1; } - diff --git a/Protos/V1/health_checks_service.proto b/Protos/V1/health_checks_service.proto index 6d88a5e77..613f71f73 100644 --- a/Protos/V1/health_checks_service.proto +++ b/Protos/V1/health_checks_service.proto @@ -14,5 +14,4 @@ service HealthChecksService { * Checks the health of the cluster. This can be used to verify that the cluster is up and running. */ rpc CheckHealth(CheckHealthRequest) returns (CheckHealthResponse) {} - } From 66fff56787f25134fb01a6d583601a86e8e5d45a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 18 Dec 2023 15:24:10 +0100 Subject: [PATCH 113/344] fix: use proper csharp namespace --- Protos/V1/health_checks_common.proto | 2 +- Protos/V1/health_checks_service.proto | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Protos/V1/health_checks_common.proto b/Protos/V1/health_checks_common.proto index 748121c00..3c6b43a0b 100644 --- a/Protos/V1/health_checks_common.proto +++ b/Protos/V1/health_checks_common.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package armonik.api.grpc.v1.health_checks; -option csharp_namespace = "Armonik.Api.Grpc.V1.HealthChecks"; +option csharp_namespace = "ArmoniK.Api.gRPC.V1.HealthChecks"; /** * Represents the available health status diff --git a/Protos/V1/health_checks_service.proto b/Protos/V1/health_checks_service.proto index 613f71f73..7a6ce69cf 100644 --- a/Protos/V1/health_checks_service.proto +++ b/Protos/V1/health_checks_service.proto @@ -4,7 +4,7 @@ package armonik.api.grpc.v1.health_checks; import "health_checks_common.proto"; -option csharp_namespace = "Armonik.Api.Grpc.V1.HealthChecks"; +option csharp_namespace = "ArmoniK.Api.gRPC.V1.HealthChecks"; /** * The HealthChecksService provides methods to verify the health of the cluster. From f936d95e51db65c885c23961f6f9cb3c7033aa3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 18 Dec 2023 17:57:37 +0100 Subject: [PATCH 114/344] feat: implement healt check service in mock --- packages/csharp/ArmoniK.Api.Mock/Program.cs | 1 + .../ArmoniK.Api.Mock/Services/HealthChecks.cs | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 packages/csharp/ArmoniK.Api.Mock/Services/HealthChecks.cs diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index 2aa6effd2..afc5dc583 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -79,6 +79,7 @@ app.MapGrpcService(); app.MapGrpcService(); app.MapGrpcService(); +app.MapGrpcService(); app.MapGrpcService(); app.MapGrpcService(); app.MapGrpcService(); diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/HealthChecks.cs b/packages/csharp/ArmoniK.Api.Mock/Services/HealthChecks.cs new file mode 100644 index 000000000..109711160 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Mock/Services/HealthChecks.cs @@ -0,0 +1,43 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2023.All rights reserved. +// +// 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. + +using System.Threading.Tasks; + +using ArmoniK.Api.gRPC.V1.HealthChecks; + +using Grpc.Core; + +namespace ArmoniK.Api.Mock.Services; + +[Counting] +public class HealthChecks : HealthChecksService.HealthChecksServiceBase +{ + [Count] + public override Task CheckHealth(CheckHealthRequest request, + ServerCallContext context) + => Task.FromResult(new CheckHealthResponse + { + Services = + { + new CheckHealthResponse.Types.ServiceHealth + { + Healthy = HealthStatusEnum.Healthy, + Message = "Mock is healthy", + Name = "mock", + }, + }, + }); +} From ffd9dfa9bd11045c86822bd142b37b6411863224 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Wed, 20 Dec 2023 10:35:52 +0100 Subject: [PATCH 115/344] fix: missing filterDuration and filterDurationOperation exports in angular package --- .../aneoconsultingfr/armonik.api.angular/src/lib/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts index a9f279fac..c0ed87a46 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts @@ -34,6 +34,8 @@ export { FilterNumber, FilterString, FilterBooleanOperator, + FilterDuration, + FilterDurationOperator } from './generated/filters-common.pb' export { StatusCount, TaskOptions } from './generated/objects.pb' export { From e62528a04faa07eaf942606e7bb7af55751bf073 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Wed, 20 Dec 2023 10:38:13 +0100 Subject: [PATCH 116/344] added missing semicolon for lint --- .../aneoconsultingfr/armonik.api.angular/src/lib/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts index c0ed87a46..79ac02f76 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts @@ -35,7 +35,7 @@ export { FilterString, FilterBooleanOperator, FilterDuration, - FilterDurationOperator + FilterDurationOperator, } from './generated/filters-common.pb' export { StatusCount, TaskOptions } from './generated/objects.pb' export { From 1488d6a9387cc363beb6ca835a3695c65638bffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Thu, 21 Dec 2023 13:26:09 +0100 Subject: [PATCH 117/344] feat: Add version in csharp packages --- .../ArmoniK.Api.Client.Tests.csproj | 1 + .../ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 1 + .../ArmoniK.Api.Common.Channel.csproj | 1 + .../ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 1 + .../csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 1 + .../csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 1 + .../ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 1 + .../ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 1 + scripts/update-versions.ts | 11 ++++++++--- scripts/verify-versions.ts | 9 ++++++--- scripts/versions/_contants.ts | 3 ++- 11 files changed, 24 insertions(+), 7 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 1313fec98..05e64ab18 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -10,6 +10,7 @@ Embedded true 3.14.0 + 3.14.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 1237ce0d3..3bfc33e3c 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -15,6 +15,7 @@ ../kp.snk true 3.14.0 + 3.14.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index f9e439526..7df08661f 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -5,6 +5,7 @@ enable enable 3.14.0 + 3.14.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 3cc6b4698..f32e46f6a 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -15,6 +15,7 @@ ../kp.snk true 3.14.0 + 3.14.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index f89005982..f038dfed1 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -17,6 +17,7 @@ snupkg ../kp.snk 3.14.0 + 3.14.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index a59566cac..7a418fc4e 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -15,6 +15,7 @@ snupkg ../kp.snk 3.14.0 + 3.14.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 6689ea880..0de0cb6fc 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -10,6 +10,7 @@ Embedded true 3.14.0 + 3.14.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index b3938a25e..e61dcfd44 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -17,6 +17,7 @@ snupkg ../kp.snk 3.14.0 + 3.14.0 True True diff --git a/scripts/update-versions.ts b/scripts/update-versions.ts index ffb1d1a42..05a55f902 100644 --- a/scripts/update-versions.ts +++ b/scripts/update-versions.ts @@ -5,7 +5,8 @@ import { cppFiles, cppPattern, csharpFiles, - csharpPattern, + csharpPatternPackageVersion, + csharpPatternVersion, jsFiles, jsPattern, } from './versions/_contants' @@ -21,9 +22,13 @@ if (args.length === 0) { const version = args[0] -consola.info('Updating C# projects to ', version) +consola.info('Updating C# projects to ', version) csharpFiles.forEach( - _readAndReplace(csharpPattern, `${version}`), + _readAndReplace(csharpPatternPackageVersion, `${version}`), +) +consola.info('Updating C# projects to ', version) +csharpFiles.forEach( + _readAndReplace(csharpPatternVersion, `${version}`), ) consola.info('Updating JS projects to ', version) diff --git a/scripts/verify-versions.ts b/scripts/verify-versions.ts index 9d0a11de9..ae7b4ef02 100644 --- a/scripts/verify-versions.ts +++ b/scripts/verify-versions.ts @@ -4,7 +4,8 @@ import { cppFiles, cppPattern, csharpFiles, - csharpPattern, + csharpPatternPackageVersion, + csharpPatternVersion, jsFiles, jsPattern, } from './versions/_contants' @@ -15,8 +16,10 @@ const [, , ...args] = process.argv consola.info('Finding JS projects versions') jsFiles.forEach(_readAndFind(jsPattern, versions)) -consola.info('Finding C# projects versions') -csharpFiles.forEach(_readAndFind(csharpPattern, versions)) +consola.info('Finding C# projects versions') +csharpFiles.forEach(_readAndFind(csharpPatternPackageVersion, versions)) +consola.info('Finding C# projects versions') +csharpFiles.forEach(_readAndFind(csharpPatternVersion, versions)) consola.info('Finding Cpp projects versions') cppFiles.forEach(_readAndFind(cppPattern, versions)) diff --git a/scripts/versions/_contants.ts b/scripts/versions/_contants.ts index d7e5ec4c5..268e4bb8d 100644 --- a/scripts/versions/_contants.ts +++ b/scripts/versions/_contants.ts @@ -1,6 +1,7 @@ import { glob } from 'glob' -export const csharpPattern = /(?.*)<\/PackageVersion>/ +export const csharpPatternPackageVersion = /(?.*)<\/PackageVersion>/ +export const csharpPatternVersion = /(?.*)<\/Version>/ export const csharpFiles = glob.globSync('**/*.csproj') export const pythonPattern = /version = "(?.*)"/g From 45cdaa07360a3480bc43f02813ceab6bd53c8150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Thu, 21 Dec 2023 19:01:13 +0100 Subject: [PATCH 118/344] chore: update to 3.15.0 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 78a6d7ab8..7462a1458 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.14.0", + "version": "3.15.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 055ef1eea..54fcbf5e9 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.14.0) +set(version 3.15.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 05e64ab18..101a57a67 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.14.0 - 3.14.0 + 3.15.0 + 3.15.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 3bfc33e3c..e23f0a7e7 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.14.0 - 3.14.0 + 3.15.0 + 3.15.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index 7df08661f..424481a7b 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.14.0 - 3.14.0 + 3.15.0 + 3.15.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index f32e46f6a..6b4a5b48d 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.14.0 - 3.14.0 + 3.15.0 + 3.15.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index f038dfed1..3388454f3 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.14.0 - 3.14.0 + 3.15.0 + 3.15.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 7a418fc4e..563a04bcb 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.14.0 - 3.14.0 + 3.15.0 + 3.15.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 0de0cb6fc..35e21742b 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.14.0 - 3.14.0 + 3.15.0 + 3.15.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index e61dcfd44..23aeca564 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.14.0 - 3.14.0 + 3.15.0 + 3.15.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index 0f937b72e..ff60c806f 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.14.0", + "version": "3.15.0", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From a861b1d1f279158e50574fee090c29f2e1dab4e1 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Wed, 27 Dec 2023 11:38:12 +0100 Subject: [PATCH 119/344] docs: Add tests documentation --- packages/python/README.md | 50 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/python/README.md b/packages/python/README.md index 90164ebd9..67681064a 100644 --- a/packages/python/README.md +++ b/packages/python/README.md @@ -37,4 +37,52 @@ pip install pkg/armonik*.whl The generated package will be installed to your current python environment ## Windows -Coming soon \ No newline at end of file +Coming soon: + +## Tests + +### **Test Environment Setup** + +Before running tests, ensure the following setup steps are completed: + +1. Install Dotnet: +```bash +sudo apt install dotnet-sdk-6.0 +``` + +2. Launch the Mock Server: + +Verify that port 5000 is available (Armonik and the mock server communicate on the same port, uninstall armonik if necessary): + +```bash +lsof -i :5000 +``` +3. Launch the server from the project's root directory in a separate terminal: + +```bash +cd packages/csharp/ArmoniK.Api.Mock +dotnet run +``` +4. Install jq for a Better Json Readability: + +```bash +sudo apt install jq + +``` + +### **Test Environment Summary** + +The test environment utilizes a mock endpoint to assert if the ArmoniK service has been triggered. It leverages the requests library to query the /calls.json endpoint, examining the JSON response to validate the count of remote procedure calls made to specific services and methods + +Requirements : +```bash +pip install grpcio +pip install pytest +pip install requests +``` + +Install the armonik package in "editable" mode, allowing you to make changes to the source code, and the changes will be reflected immediately without reinstalling the package. + + ```bash + pip install -e ./packages/python + ``` \ No newline at end of file From 78fb96ae8bd76c5bbff3aa96ef200ec71995177a Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Tue, 2 Jan 2024 10:22:18 +0100 Subject: [PATCH 120/344] docs: remove useless requirements --- packages/python/README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/python/README.md b/packages/python/README.md index 67681064a..8ea6afb05 100644 --- a/packages/python/README.md +++ b/packages/python/README.md @@ -37,7 +37,7 @@ pip install pkg/armonik*.whl The generated package will be installed to your current python environment ## Windows -Coming soon: +Coming soon ## Tests @@ -74,12 +74,6 @@ sudo apt install jq The test environment utilizes a mock endpoint to assert if the ArmoniK service has been triggered. It leverages the requests library to query the /calls.json endpoint, examining the JSON response to validate the count of remote procedure calls made to specific services and methods -Requirements : -```bash -pip install grpcio -pip install pytest -pip install requests -``` Install the armonik package in "editable" mode, allowing you to make changes to the source code, and the changes will be reflected immediately without reinstalling the package. From 559589d0ff79d5bbbf7b0e191377f5d1a866933c Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Tue, 2 Jan 2024 11:12:03 +0100 Subject: [PATCH 121/344] docs: edit doc adding exemple for calling the endpoint and move -e mode in gen section --- packages/python/README.md | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/python/README.md b/packages/python/README.md index 8ea6afb05..6c0ba0d19 100644 --- a/packages/python/README.md +++ b/packages/python/README.md @@ -20,6 +20,7 @@ Requirements : If the python command doesn't link to python3 on your system, you may be able to install the package python-is-python3, which links python to python3. To generate the package from sources, run the [proto2python.sh](proto2python.sh) script from its folder. You need to specify a directory where the virtual environment used for the build will be located. For example the following command will generate the packages and will create the build environment "pyvenv" in the current user's home directory: + ```bash ./proto2python.sh ~/pyvenv ``` @@ -29,6 +30,12 @@ To generate the package from sources, run the [proto2python.sh](proto2python.sh) - build : contains the source files used to create the wheel package - pkg : contains the sdist and wheel packages +Instead of running the script you can install the armonik package in "editable" mode, allowing you to make changes to the source code, and the changes will be reflected immediately without reinstalling the package. + + ```bash + pip install -e ./packages/python + ``` + ### **How to install the generated package** From this directory, use the following command: ```code @@ -45,11 +52,13 @@ Coming soon Before running tests, ensure the following setup steps are completed: -1. Install Dotnet: +1. Install Dependencies: + ```bash -sudo apt install dotnet-sdk-6.0 +sudo apt install dotnet-sdk-6.0 jq ``` + 2. Launch the Mock Server: Verify that port 5000 is available (Armonik and the mock server communicate on the same port, uninstall armonik if necessary): @@ -57,26 +66,18 @@ Verify that port 5000 is available (Armonik and the mock server communicate on t ```bash lsof -i :5000 ``` + 3. Launch the server from the project's root directory in a separate terminal: ```bash cd packages/csharp/ArmoniK.Api.Mock dotnet run -``` -4. Install jq for a Better Json Readability: - -```bash -sudo apt install jq - ``` ### **Test Environment Summary** The test environment utilizes a mock endpoint to assert if the ArmoniK service has been triggered. It leverages the requests library to query the /calls.json endpoint, examining the JSON response to validate the count of remote procedure calls made to specific services and methods - -Install the armonik package in "editable" mode, allowing you to make changes to the source code, and the changes will be reflected immediately without reinstalling the package. - - ```bash - pip install -e ./packages/python - ``` \ No newline at end of file +```bash +curl localhost:5000/calls.json | jq +``` From f525cc534ef86adbc245d0e9858c28fbe6d0573d Mon Sep 17 00:00:00 2001 From: Faust1 Date: Wed, 3 Jan 2024 10:50:49 +0100 Subject: [PATCH 122/344] chore: add missing healtcheck import in angular package --- .../aneoconsultingfr/armonik.api.angular/src/lib/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts index 79ac02f76..dc9ccc47f 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts @@ -123,3 +123,9 @@ export { export { TasksClient } from './generated/tasks-service.pbsc' export { ListVersionsRequest, ListVersionsResponse } from './generated/versions-common.pb' export { VersionsClient } from './generated/versions-service.pbsc' +export { + CheckHealthRequest, + CheckHealthResponse, + HealthStatusEnum +} from './generated/health-checks-common.pb' +export { HealthChecksServiceClient } from './generated/health-checks-service.pbsc' \ No newline at end of file From a9e3d3f8af1413aee9591968b759848f9d919125 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Wed, 3 Jan 2024 10:52:31 +0100 Subject: [PATCH 123/344] fixed lint --- .../aneoconsultingfr/armonik.api.angular/src/lib/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts index dc9ccc47f..c52b074ef 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts @@ -126,6 +126,6 @@ export { VersionsClient } from './generated/versions-service.pbsc' export { CheckHealthRequest, CheckHealthResponse, - HealthStatusEnum + HealthStatusEnum, } from './generated/health-checks-common.pb' -export { HealthChecksServiceClient } from './generated/health-checks-service.pbsc' \ No newline at end of file +export { HealthChecksServiceClient } from './generated/health-checks-service.pbsc' From 5f15a7187fd690d9ea15af5aae08d932fab83202 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Wed, 3 Jan 2024 14:14:59 +0100 Subject: [PATCH 124/344] tests: Refactor python tests with mock server --- .github/workflows/ci.yml | 11 + packages/python/tests/common.py | 40 --- packages/python/tests/conftest.py | 168 ++++++++++ packages/python/tests/submitter_test.py | 313 ------------------ packages/python/tests/taskhandler_test.py | 89 ----- packages/python/tests/tasks_test.py | 281 ---------------- .../{filters_test.py => test_filters.py} | 0 .../{helpers_test.py => test_helpers.py} | 15 +- packages/python/tests/worker_test.py | 73 ---- 9 files changed, 193 insertions(+), 797 deletions(-) delete mode 100644 packages/python/tests/common.py create mode 100644 packages/python/tests/conftest.py delete mode 100644 packages/python/tests/submitter_test.py delete mode 100644 packages/python/tests/taskhandler_test.py delete mode 100644 packages/python/tests/tasks_test.py rename packages/python/tests/{filters_test.py => test_filters.py} (100%) rename packages/python/tests/{helpers_test.py => test_helpers.py} (76%) delete mode 100644 packages/python/tests/worker_test.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b91f05761..19579998f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -231,6 +231,17 @@ jobs: - name: Install dependencies run: pip install "$(echo pkg/armonik*.whl)[tests]" + - name: Install .NET Core + uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v3 + with: + dotnet-version: 6.x + + - name: Start Mock server + run: | + cd ../csharp/ArmoniK.Api.Mock + nohup dotnet run > /dev/null 2>&1 & + sleep 60 + - name: Run tests run: python -m pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-report xml:coverage.xml --cov-report html:coverage_report diff --git a/packages/python/tests/common.py b/packages/python/tests/common.py deleted file mode 100644 index db2feed4a..000000000 --- a/packages/python/tests/common.py +++ /dev/null @@ -1,40 +0,0 @@ -from grpc import Channel - - -class DummyChannel(Channel): - def __init__(self): - self.method_dict = {} - - def stream_unary(self, *args, **kwargs): - return self.get_method(args[0]) - - def unary_stream(self, *args, **kwargs): - return self.get_method(args[0]) - - def unary_unary(self, *args, **kwargs): - return self.get_method(args[0]) - - def stream_stream(self, *args, **kwargs): - return self.get_method(args[0]) - - def set_instance(self, instance): - self.method_dict = {func: getattr(instance, func) for func in dir(type(instance)) if callable(getattr(type(instance), func)) and not func.startswith("__")} - - def get_method(self, name: str): - return self.method_dict.get(name.split("/")[-1], None) - - def subscribe(self, callback, try_to_connect=False): - pass - - def unsubscribe(self, callback): - pass - - def close(self): - pass - - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py new file mode 100644 index 000000000..1b5949a7e --- /dev/null +++ b/packages/python/tests/conftest.py @@ -0,0 +1,168 @@ +import grpc +import os +import pytest +import requests + +from armonik.client import ArmoniKResults, ArmoniKSubmitter, ArmoniKTasks, ArmoniKSessions, ArmoniKPartitions, ArmoniKVersions, ArmoniKEvents, ArmoniKHealthChecks +from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub +from typing import List + + +# Mock server endpoints used for the tests. +grpc_endpoint = "localhost:5001" +calls_endpoint = "http://localhost:5000/calls.json" +reset_endpoint = "http://localhost:5000/reset" +data_folder = os.getcwd() + + +@pytest.fixture(scope="session", autouse=True) +def clean_up(request): + """ + This fixture runs at the session scope and is automatically used before and after + running all the tests. It set up and teardown the testing environments by: + - creating dummy files before testing begins; + - clear files after testing; + - resets the mocking gRPC server counters to maintain a clean testing environment. + + Yields: + None: This fixture is used as a context manager, and the test code runs between + the 'yield' statement and the cleanup code. + + Raises: + requests.exceptions.HTTPError: If an error occurs when attempting to reset + the mocking gRPC server counters. + """ + # Write dumm payload and data dependency to files for testing purposes + with open(os.path.join(data_folder, "payload-id"), "wb") as f: + f.write("payload".encode()) + with open(os.path.join(data_folder, "dd-id"), "wb") as f: + f.write("dd".encode()) + + # Run all the tests + yield + + # Remove the temporary files created for testing + os.remove(os.path.join(data_folder, "payload-id")) + os.remove(os.path.join(data_folder, "dd-id")) + os.remove(os.path.join(data_folder, "result-id")) + + # Reset the mock server counters + try: + response = requests.post(reset_endpoint) + response.raise_for_status() + print("\nMock server resetted.") + except requests.exceptions.HTTPError as e: + print("An error occurred when resetting the server: " + str(e)) + + +def get_client(client_name: str, endpoint: str = grpc_endpoint) -> [ArmoniKResults, ArmoniKSubmitter, ArmoniKTasks, ArmoniKSessions, ArmoniKPartitions, ArmoniKVersions, AgentStub, ArmoniKEvents, ArmoniKHealthChecks]: + """ + Get the ArmoniK client instance based on the specified service name. + + Args: + client_name (str): The name of the ArmoniK client to retrieve. + endpoint (str, optional): The gRPC server endpoint. Defaults to grpc_endpoint. + + Returns: + Union[ArmoniKResults, ArmoniKSubmitter, ArmoniKTasks, ArmoniKSessions, ARmoniKPartitions, AgentStub]: + An instance of the specified ArmoniK client. + + Raises: + ValueError: If the specified service name is not recognized. + + Example: + >>> result_service = get_service("Results") + >>> submitter_service = get_service("Submitter", "custom_endpoint") + """ + channel = grpc.insecure_channel(endpoint).__enter__() + match client_name: + case "Results": + return ArmoniKResults(channel) + case "Submitter": + return ArmoniKSubmitter(channel) + case "Tasks": + return ArmoniKTasks(channel) + case "Sessions": + return ArmoniKSessions(channel) + case "Partitions": + return ArmoniKPartitions(channel) + case "Versions": + return ArmoniKVersions(channel) + case "Agent": + return AgentStub(channel) + case "Events": + return ArmoniKEvents(channel) + case "HealthChecks": + return ArmoniKHealthChecks(channel) + case _: + raise ValueError("Unknown service name: " + str(service_name)) + + +def rpc_called(service_name: str, rpc_name: str, n_calls: int = 1, endpoint: str = calls_endpoint) -> bool: + """Check if a remote procedure call (RPC) has been made a specified number of times. + This function uses ArmoniK.Api.Mock. It just gets the '/calls.json' endpoint. + + Args: + service_name (str): The name of the service providing the RPC. + rpc_name (str): The name of the specific RPC to check for the number of calls. + n_calls (int, optional): The expected number of times the RPC should have been called. Default is 1. + endpoint (str, optional): The URL of the remote service providing RPC information. Default to + calls_endpoint. + + Returns: + bool: True if the specified RPC has been called the expected number of times, False otherwise. + + Raises: + requests.exceptions.RequestException: If an error occurs when requesting ArmoniK.Api.Mock. + + Example: + >>> rpc_called('http://localhost:5000/calls.json', 'Versions', 'ListVersionss', 0) + True + """ + response = requests.get(endpoint) + response.raise_for_status() + data = response.json() + + # Check if the RPC has been called n_calls times + if data[service_name][rpc_name] == n_calls: + return True + return False + + +def all_rpc_called(service_name: str, missings: List[str] = [], endpoint: str = calls_endpoint) -> bool: + """ + Check if all remote procedure calls (RPCs) in a service have been made at least once. + This function uses ArmoniK.Api.Mock. It just gets the '/calls.json' endpoint. + + Args: + service_name (str): The name of the service containing the RPC information in the response. + endpoint (str, optional): The URL of the remote service providing RPC information. Default is + the value of calls_endpoint. + missings (List[str], optional): A list of RPCs known to be not implemented. Default is an empty list. + + Returns: + bool: True if all RPCs in the specified service have been called at least once, False otherwise. + + Raises: + requests.exceptions.RequestException: If an error occurs when requesting ArmoniK.Api.Mock. + + Example: + >>> all_rpc_called('http://localhost:5000/calls.json', 'Versions') + False + """ + response = requests.get(endpoint) + response.raise_for_status() + data = response.json() + + missing_rpcs = [] + + # Check if all RPCs in the service have been called at least once + for rpc_name, rpc_num_calls in data[service_name].items(): + if rpc_num_calls == 0: + missing_rpcs.append(rpc_name) + if missing_rpcs: + if missings == missing_rpcs: + return True + print(f"RPCs not implemented in {service_name} service: {missing_rpcs}.") + return False + return True diff --git a/packages/python/tests/submitter_test.py b/packages/python/tests/submitter_test.py deleted file mode 100644 index c849efdc0..000000000 --- a/packages/python/tests/submitter_test.py +++ /dev/null @@ -1,313 +0,0 @@ -#!/usr/bin/env python3 -import datetime -import logging -import pytest -from armonik.client import ArmoniKSubmitter -from typing import Iterator, Optional, List -from .common import DummyChannel -from armonik.common import TaskOptions, TaskDefinition, TaskStatus, timedelta_to_duration -from armonik.protogen.client.submitter_service_pb2_grpc import SubmitterStub -from armonik.protogen.common.objects_pb2 import Empty, Configuration, Session, TaskIdList, ResultRequest, TaskError, Error, \ - Count, StatusCount, DataChunk -from armonik.protogen.common.submitter_common_pb2 import CreateSessionRequest, CreateSessionReply, CreateLargeTaskRequest, \ - CreateTaskReply, TaskFilter, ResultReply, AvailabilityReply, WaitRequest, GetTaskStatusRequest, GetTaskStatusReply - -logging.basicConfig() -logging.getLogger().setLevel(logging.INFO) - - -class DummySubmitter(SubmitterStub): - def __init__(self, channel: DummyChannel, max_chunk_size=300): - channel.set_instance(self) - super().__init__(channel) - self.max_chunk_size = max_chunk_size - self.large_tasks_requests: List[CreateLargeTaskRequest] = [] - self.task_filter: Optional[TaskFilter] = None - self.create_session: Optional[CreateSessionRequest] = None - self.session: Optional[Session] = None - self.result_stream: List[ResultReply] = [] - self.result_request: Optional[ResultRequest] = None - self.is_available = True - self.wait_request: Optional[WaitRequest] = None - self.get_status_request: Optional[GetTaskStatusRequest] = None - - def GetServiceConfiguration(self, _: Empty) -> Configuration: - return Configuration(data_chunk_max_size=self.max_chunk_size) - - def CreateSession(self, request: CreateSessionRequest) -> CreateSessionReply: - self.create_session = request - return CreateSessionReply(session_id="SessionId") - - def CancelSession(self, request: Session) -> Empty: - self.session = request - return Empty() - - def CreateLargeTasks(self, request: Iterator[CreateLargeTaskRequest]) -> CreateTaskReply: - self.large_tasks_requests = [r for r in request] - return CreateTaskReply(creation_status_list=CreateTaskReply.CreationStatusList(creation_statuses=[ - CreateTaskReply.CreationStatus( - task_info=CreateTaskReply.TaskInfo(task_id="TaskId", expected_output_keys=["EOK"], - data_dependencies=["DD"])), - CreateTaskReply.CreationStatus(error="TestError")])) - - def ListTasks(self, request: TaskFilter) -> TaskIdList: - self.task_filter = request - return TaskIdList(task_ids=["TaskId"]) - - def TryGetResultStream(self, request: ResultRequest) -> Iterator[ResultReply]: - self.result_request = request - for r in self.result_stream: - yield r - - def WaitForAvailability(self, request: ResultRequest) -> AvailabilityReply: - from armonik.protogen.common.task_status_pb2 import TASK_STATUS_ERROR - self.result_request = request - return AvailabilityReply(ok=Empty()) if self.is_available else AvailabilityReply( - error=TaskError(task_id="TaskId", errors=[Error(task_status=TASK_STATUS_ERROR, detail="TestError")])) - - def WaitForCompletion(self, request: WaitRequest) -> Count: - from armonik.protogen.common.task_status_pb2 import TASK_STATUS_COMPLETED - self.wait_request = request - return Count(values=[StatusCount(status=TASK_STATUS_COMPLETED, count=1)]) - - def GetTaskStatus(self, request: GetTaskStatusRequest) -> GetTaskStatusReply: - from armonik.protogen.common.task_status_pb2 import TASK_STATUS_COMPLETED - self.get_status_request = request - return GetTaskStatusReply( - id_statuses=[GetTaskStatusReply.IdStatus(task_id="TaskId", status=TASK_STATUS_COMPLETED)]) - - -default_task_option = TaskOptions(datetime.timedelta(seconds=300), priority=1, max_retries=5) - - -@pytest.mark.parametrize("task_options,partitions", [(default_task_option, None), (default_task_option, ["default"])]) -def test_armonik_submitter_should_create_session(task_options, partitions): - channel = DummyChannel() - inner = DummySubmitter(channel) - submitter = ArmoniKSubmitter(channel) - session_id = submitter.create_session(default_task_options=task_options, partition_ids=partitions) - assert session_id == "SessionId" - assert inner.create_session - assert inner.create_session.default_task_option.priority == task_options.priority - assert len(inner.create_session.partition_ids) == 0 if partitions is None else list(inner.create_session.partition_ids) == partitions - assert len(inner.create_session.default_task_option.options) == len(task_options.options) - assert inner.create_session.default_task_option.max_duration == timedelta_to_duration(task_options.max_duration) - assert inner.create_session.default_task_option.max_retries == task_options.max_retries - - -def test_armonik_submitter_should_cancel_session(): - channel = DummyChannel() - inner = DummySubmitter(channel) - submitter = ArmoniKSubmitter(channel) - submitter.cancel_session("SessionId") - assert inner.session is not None - assert inner.session.id == "SessionId" - - -def test_armonik_submitter_should_get_config(): - channel = DummyChannel() - inner = DummySubmitter(channel) - submitter = ArmoniKSubmitter(channel) - config = submitter.get_service_configuration() - assert config is not None - assert config.data_chunk_max_size == 300 - - -should_submit = [ - [TaskDefinition("Payload1".encode('utf-8'), expected_output_ids=["EOK"], data_dependencies=["DD"]), - TaskDefinition("Payload2".encode('utf-8'), expected_output_ids=["EOK"], data_dependencies=["DD"])], - [TaskDefinition("Payload1".encode('utf-8'), expected_output_ids=["EOK"]), - TaskDefinition("Payload2".encode('utf-8'), expected_output_ids=["EOK"])], - [TaskDefinition("".encode('utf-8'), expected_output_ids=["EOK"]), - TaskDefinition("".encode('utf-8'), expected_output_ids=["EOK"])] -] - - -@pytest.mark.parametrize("task_list,task_options", - [(t, default_task_option if i else None) for t in should_submit for i in [True, False]]) -def test_armonik_submitter_should_submit(task_list, task_options): - channel = DummyChannel() - inner = DummySubmitter(channel, max_chunk_size=5) - submitter = ArmoniKSubmitter(channel) - successes, errors = submitter.submit("SessionId", tasks=task_list, task_options=task_options) - # The dummy submitter has been set to submit one successful task and one submission error - assert len(successes) == 1 - assert len(errors) == 1 - assert successes[0].id == "TaskId" - assert successes[0].session_id == "SessionId" - assert errors[0] == "TestError" - - reqs = inner.large_tasks_requests - assert len(reqs) > 0 - offset = 0 - assert reqs[0 + offset].WhichOneof("type") == "init_request" - assert reqs[0 + offset].init_request.session_id == "SessionId" - assert reqs[1 + offset].WhichOneof("type") == "init_task" - assert reqs[1 + offset].init_task.header.expected_output_keys[0] == "EOK" - assert reqs[1 + offset].init_task.header.data_dependencies[0] == "DD" if len( - task_list[0].data_dependencies) > 0 else len(reqs[1 + offset].init_task.header.data_dependencies) == 0 - assert reqs[2 + offset].WhichOneof("type") == "task_payload" - assert reqs[2 + offset].task_payload.data == "".encode("utf-8") if len(task_list[0].payload) == 0 \ - else reqs[2 + offset].task_payload.data == task_list[0].payload[:5] - if len(task_list[0].payload) > 0: - offset += 1 - assert reqs[2 + offset].WhichOneof("type") == "task_payload" - assert reqs[2 + offset].task_payload.data == task_list[0].payload[5:] - assert reqs[3 + offset].WhichOneof("type") == "task_payload" - assert reqs[3 + offset].task_payload.data_complete - assert reqs[4 + offset].WhichOneof("type") == "init_task" - assert reqs[4 + offset].init_task.header.expected_output_keys[0] == "EOK" - assert reqs[4 + offset].init_task.header.data_dependencies[0] == "DD" if len( - task_list[1].data_dependencies) > 0 else len(reqs[4 + offset].init_task.header.data_dependencies) == 0 - assert reqs[5 + offset].WhichOneof("type") == "task_payload" - assert reqs[5 + offset].task_payload.data == "".encode("utf-8") if len(task_list[1].payload) == 0 \ - else reqs[5 + offset].task_payload.data == task_list[1].payload[:5] - if len(task_list[1].payload) > 0: - offset += 1 - assert reqs[5 + offset].WhichOneof("type") == "task_payload" - assert reqs[5 + offset].task_payload.data == task_list[1].payload[5:] - assert reqs[6 + offset].WhichOneof("type") == "task_payload" - assert reqs[6 + offset].task_payload.data_complete - assert reqs[7 + offset].WhichOneof("type") == "init_task" - assert reqs[7 + offset].init_task.last_task - - -filters_params = [(session_ids, task_ids, included_statuses, excluded_statuses, - (session_ids is None or task_ids is None) and ( - included_statuses is None or excluded_statuses is None)) - for session_ids in [["SessionId"], None] - for task_ids in [["TaskId"], None] - for included_statuses in [[TaskStatus.COMPLETED], None] - for excluded_statuses in [[TaskStatus.COMPLETED], None]] - - -@pytest.mark.parametrize("session_ids,task_ids,included_statuses,excluded_statuses,should_succeed", filters_params) -def test_armonik_submitter_should_list_tasks(session_ids, task_ids, included_statuses, excluded_statuses, - should_succeed): - channel = DummyChannel() - inner = DummySubmitter(channel) - submitter = ArmoniKSubmitter(channel) - if should_succeed: - tasks = submitter.list_tasks(session_ids=session_ids, task_ids=task_ids, included_statuses=included_statuses, - excluded_statuses=excluded_statuses) - assert len(tasks) > 0 - assert tasks[0] == "TaskId" - assert inner.task_filter is not None - assert all(map(lambda x: x[1] == session_ids[x[0]], enumerate(inner.task_filter.session.ids))) - assert all(map(lambda x: x[1] == task_ids[x[0]], enumerate(inner.task_filter.task.ids))) - assert all(map(lambda x: x[1] == included_statuses[x[0]], enumerate(inner.task_filter.included.statuses))) - assert all(map(lambda x: x[1] == excluded_statuses[x[0]], enumerate(inner.task_filter.excluded.statuses))) - else: - with pytest.raises(ValueError): - _ = submitter.list_tasks(session_ids=session_ids, task_ids=task_ids, included_statuses=included_statuses, - excluded_statuses=excluded_statuses) - - -def test_armonik_submitter_should_get_status(): - channel = DummyChannel() - inner = DummySubmitter(channel) - submitter = ArmoniKSubmitter(channel) - - statuses = submitter.get_task_status(["TaskId"]) - assert len(statuses) > 0 - assert "TaskId" in statuses - assert statuses["TaskId"] == TaskStatus.COMPLETED - assert inner.get_status_request is not None - assert len(inner.get_status_request.task_ids) == 1 - assert inner.get_status_request.task_ids[0] == "TaskId" - - -get_result_should_throw = [ - [], - [ResultReply(result=DataChunk(data="payload".encode("utf-8")))], - [ResultReply(result=DataChunk(data="payload".encode("utf-8"))), ResultReply(result=DataChunk(data_complete=True)), - ResultReply(result=DataChunk(data="payload".encode("utf-8")))], - [ResultReply( - error=TaskError(task_id="TaskId", errors=[Error(task_status=TaskStatus.ERROR, detail="TestError")]))], -] - -get_result_should_succeed = [ - [ResultReply(result=DataChunk(data="payload".encode("utf-8"))), ResultReply(result=DataChunk(data_complete=True))] -] - -get_result_should_none = [ - [ResultReply(not_completed_task="NotCompleted")] -] - - -@pytest.mark.parametrize("stream", [iter(x) for x in get_result_should_succeed]) -def test_armonik_submitter_should_get_result(stream): - channel = DummyChannel() - inner = DummySubmitter(channel) - inner.result_stream = stream - submitter = ArmoniKSubmitter(channel) - result = submitter.get_result("SessionId", "ResultId") - assert result is not None - assert len(result) > 0 - assert inner.result_request - assert inner.result_request.result_id == "ResultId" - assert inner.result_request.session == "SessionId" - - -@pytest.mark.parametrize("stream", [iter(x) for x in get_result_should_throw]) -def test_armonik_submitter_get_result_should_throw(stream): - channel = DummyChannel() - inner = DummySubmitter(channel) - inner.result_stream = stream - submitter = ArmoniKSubmitter(channel) - with pytest.raises(Exception): - _ = submitter.get_result("SessionId", "ResultId") - - -@pytest.mark.parametrize("stream", [iter(x) for x in get_result_should_none]) -def test_armonik_submitter_get_result_should_none(stream): - channel = DummyChannel() - inner = DummySubmitter(channel) - inner.result_stream = stream - submitter = ArmoniKSubmitter(channel) - result = submitter.get_result("SessionId", "ResultId") - assert result is None - assert inner.result_request - assert inner.result_request.result_id == "ResultId" - assert inner.result_request.session == "SessionId" - - -@pytest.mark.parametrize("available", [True, False]) -def test_armonik_submitter_wait_availability(available): - channel = DummyChannel() - inner = DummySubmitter(channel) - inner.is_available = available - submitter = ArmoniKSubmitter(channel) - reply = submitter.wait_for_availability("SessionId", "ResultId") - assert reply is not None - assert reply.is_available() == available - assert len(reply.errors) == 0 if available else reply.errors[0] == "TestError" - - -@pytest.mark.parametrize("session_ids,task_ids,included_statuses,excluded_statuses,should_succeed", filters_params) -def test_armonik_submitter_wait_completion(session_ids, task_ids, included_statuses, excluded_statuses, should_succeed): - channel = DummyChannel() - inner = DummySubmitter(channel) - submitter = ArmoniKSubmitter(channel) - - if should_succeed: - counts = submitter.wait_for_completion(session_ids=session_ids, task_ids=task_ids, - included_statuses=included_statuses, - excluded_statuses=excluded_statuses) - assert len(counts) > 0 - assert TaskStatus.COMPLETED in counts - assert counts[TaskStatus.COMPLETED] == 1 - assert inner.wait_request is not None - assert all(map(lambda x: x[1] == session_ids[x[0]], enumerate(inner.wait_request.filter.session.ids))) - assert all(map(lambda x: x[1] == task_ids[x[0]], enumerate(inner.wait_request.filter.task.ids))) - assert all(map(lambda x: x[1] == included_statuses[x[0]], - enumerate(inner.wait_request.filter.included.statuses))) - assert all(map(lambda x: x[1] == excluded_statuses[x[0]], - enumerate(inner.wait_request.filter.excluded.statuses))) - assert not inner.wait_request.stop_on_first_task_error - assert not inner.wait_request.stop_on_first_task_cancellation - else: - with pytest.raises(ValueError): - _ = submitter.wait_for_completion(session_ids=session_ids, task_ids=task_ids, - included_statuses=included_statuses, - excluded_statuses=excluded_statuses) diff --git a/packages/python/tests/taskhandler_test.py b/packages/python/tests/taskhandler_test.py deleted file mode 100644 index e4f3c181c..000000000 --- a/packages/python/tests/taskhandler_test.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python3 -import os - -import pytest -from typing import Iterator - -from armonik.common import TaskDefinition - -from .common import DummyChannel -from armonik.worker import TaskHandler -from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub -from armonik.protogen.common.agent_common_pb2 import CreateTaskRequest, CreateTaskReply, NotifyResultDataRequest, NotifyResultDataResponse -from armonik.protogen.common.worker_common_pb2 import ProcessRequest -from armonik.protogen.common.objects_pb2 import Configuration -import logging - -logging.basicConfig() -logging.getLogger().setLevel(logging.INFO) - -data_folder = os.getcwd() - - -@pytest.fixture(autouse=True, scope="session") -def setup_teardown(): - with open(os.path.join(data_folder, "payloadid"), "wb") as f: - f.write("payload".encode()) - with open(os.path.join(data_folder, "ddid"), "wb") as f: - f.write("dd".encode()) - yield - os.remove(os.path.join(data_folder, "payloadid")) - os.remove(os.path.join(data_folder, "ddid")) - - -class DummyAgent(AgentStub): - - def __init__(self, channel: DummyChannel) -> None: - channel.set_instance(self) - super(DummyAgent, self).__init__(channel) - self.create_task_messages = [] - self.send_result_task_message = [] - - def CreateTask(self, request_iterator: Iterator[CreateTaskRequest]) -> CreateTaskReply: - self.create_task_messages = [r for r in request_iterator] - return CreateTaskReply(creation_status_list=CreateTaskReply.CreationStatusList(creation_statuses=[ - CreateTaskReply.CreationStatus( - task_info=CreateTaskReply.TaskInfo(task_id="TaskId", expected_output_keys=["EOK"], - data_dependencies=["DD"]))])) - - def NotifyResultData(self, request: NotifyResultDataRequest) -> NotifyResultDataResponse: - self.send_result_task_message.append(request) - return NotifyResultDataResponse(result_ids=[i.result_id for i in request.ids]) - - -should_succeed_case = ProcessRequest(communication_token="token", session_id="sessionid", task_id="taskid", expected_output_keys=["resultid"], payload_id="payloadid", data_dependencies=["ddid"], data_folder=data_folder, configuration=Configuration(data_chunk_max_size=8000)) - - -@pytest.mark.parametrize("requests", [should_succeed_case]) -def test_taskhandler_create_should_succeed(requests: ProcessRequest): - agent = DummyAgent(DummyChannel()) - task_handler = TaskHandler(requests, agent) - assert task_handler.token is not None and len(task_handler.token) > 0 - assert len(task_handler.payload) > 0 - assert task_handler.session_id is not None and len(task_handler.session_id) > 0 - assert task_handler.task_id is not None and len(task_handler.task_id) > 0 - - -def test_taskhandler_data_are_correct(): - agent = DummyAgent(DummyChannel()) - task_handler = TaskHandler(should_succeed_case, agent) - assert len(task_handler.payload) > 0 - - task_handler.create_tasks([TaskDefinition("Payload".encode("utf-8"), ["EOK"], ["DD"])]) - - tasks = agent.create_task_messages - assert len(tasks) == 5 - assert tasks[0].WhichOneof("type") == "init_request" - assert tasks[1].WhichOneof("type") == "init_task" - assert len(tasks[1].init_task.header.data_dependencies) == 1 \ - and tasks[1].init_task.header.data_dependencies[0] == "DD" - assert len(tasks[1].init_task.header.expected_output_keys) == 1 \ - and tasks[1].init_task.header.expected_output_keys[0] == "EOK" - assert tasks[2].WhichOneof("type") == "task_payload" - assert tasks[2].task_payload.data == "Payload".encode("utf-8") - assert tasks[3].WhichOneof("type") == "task_payload" - assert tasks[3].task_payload.data_complete - assert tasks[4].WhichOneof("type") == "init_task" - assert tasks[4].init_task.last_task - - diff --git a/packages/python/tests/tasks_test.py b/packages/python/tests/tasks_test.py deleted file mode 100644 index 752b2ac63..000000000 --- a/packages/python/tests/tasks_test.py +++ /dev/null @@ -1,281 +0,0 @@ -#!/usr/bin/env python3 -import dataclasses -from typing import Optional, List, Any, Union, Dict, Collection -from google.protobuf.timestamp_pb2 import Timestamp - -from datetime import datetime - -import pytest - -from .common import DummyChannel -from armonik.client import ArmoniKTasks -from armonik.client.tasks import TaskFieldFilter -from armonik.common import TaskStatus, datetime_to_timestamp, Task -from armonik.common.filter import StringFilter, Filter -from armonik.protogen.client.tasks_service_pb2_grpc import TasksStub -from armonik.protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse, TaskDetailed -from armonik.protogen.common.tasks_filters_pb2 import Filters, FilterField -from armonik.protogen.common.filters_common_pb2 import * -from armonik.protogen.common.tasks_fields_pb2 import * -from .submitter_test import default_task_option - - -class DummyTasksService(TasksStub): - def __init__(self, channel: DummyChannel): - channel.set_instance(self) - super().__init__(channel) - self.task_request: Optional[GetTaskRequest] = None - - def GetTask(self, request: GetTaskRequest) -> GetTaskResponse: - self.task_request = request - raw = TaskDetailed(id="TaskId", session_id="SessionId", owner_pod_id="PodId", parent_task_ids=["ParentTaskId"], - data_dependencies=["DD"], expected_output_ids=["EOK"], retry_of_ids=["RetryId"], - status=TaskStatus.COMPLETED, status_message="Message", - options=default_task_option.to_message(), - created_at=datetime_to_timestamp(datetime.now()), - started_at=datetime_to_timestamp(datetime.now()), - submitted_at=datetime_to_timestamp(datetime.now()), - ended_at=datetime_to_timestamp(datetime.now()), pod_ttl=datetime_to_timestamp(datetime.now()), - output=TaskDetailed.Output(success=True), pod_hostname="Hostname", received_at=datetime_to_timestamp(datetime.now()), - acquired_at=datetime_to_timestamp(datetime.now()) - ) - return GetTaskResponse(task=raw) - - -def test_tasks_get_task_should_succeed(): - channel = DummyChannel() - inner = DummyTasksService(channel) - tasks = ArmoniKTasks(channel) - task = tasks.get_task("TaskId") - assert task is not None - assert inner.task_request is not None - assert inner.task_request.task_id == "TaskId" - assert task.id == "TaskId" - assert task.session_id == "SessionId" - assert task.parent_task_ids == ["ParentTaskId"] - assert task.output - assert task.output.success - - -def test_task_refresh(): - channel = DummyChannel() - inner = DummyTasksService(channel) - tasks = ArmoniKTasks(channel) - current = Task(id="TaskId") - current.refresh(tasks) - assert current is not None - assert inner.task_request is not None - assert inner.task_request.task_id == "TaskId" - assert current.id == "TaskId" - assert current.session_id == "SessionId" - assert current.parent_task_ids == ["ParentTaskId"] - assert current.output - assert current.output.success - - -def test_task_filters(): - filt: StringFilter = TaskFieldFilter.TASK_ID == "TaskId" - message = filt.to_message() - assert isinstance(message, FilterField) - assert message.field.WhichOneof("field") == "task_summary_field" - assert message.field.task_summary_field.field == TASK_SUMMARY_ENUM_FIELD_TASK_ID - assert message.filter_string.value == "TaskId" - assert message.filter_string.operator == FILTER_STRING_OPERATOR_EQUAL - - filt: StringFilter = TaskFieldFilter.TASK_ID != "TaskId" - message = filt.to_message() - assert isinstance(message, FilterField) - assert message.field.WhichOneof("field") == "task_summary_field" - assert message.field.task_summary_field.field == TASK_SUMMARY_ENUM_FIELD_TASK_ID - assert message.filter_string.value == "TaskId" - assert message.filter_string.operator == FILTER_STRING_OPERATOR_NOT_EQUAL - - -@dataclasses.dataclass -class SimpleFieldFilter: - field: Any - value: Any - operator: Any - - -@pytest.mark.parametrize("filt,n_or,n_and,filters", [ - ( - (TaskFieldFilter.INITIAL_TASK_ID == "TestId"), - 1, [1], - [ - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID, "TestId", FILTER_STRING_OPERATOR_EQUAL) - ] - ), - ( - (TaskFieldFilter.APPLICATION_NAME.contains("TestName") & (TaskFieldFilter.CREATED_AT > Timestamp(seconds=1000, nanos=500))), - 1, [2], - [ - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_NAME, "TestName", FILTER_STRING_OPERATOR_CONTAINS), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_CREATED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_AFTER) - ] - ), - ( - (((TaskFieldFilter.MAX_RETRIES <= 3) & ~(TaskFieldFilter.SESSION_ID == "SessionId")) | (TaskFieldFilter.task_options_key("MyKey").startswith("Start"))), - 2, [1, 2], - [ - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_MAX_RETRIES, 3, FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_SESSION_ID, "SessionId", FILTER_STRING_OPERATOR_NOT_EQUAL), - SimpleFieldFilter("MyKey", "Start", FILTER_STRING_OPERATOR_STARTS_WITH) - ] - ), - ( - (((TaskFieldFilter.PRIORITY > 3) & ~(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) & TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) | (TaskFieldFilter.ENGINE_TYPE.endswith("Test") & (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))), - 2, [2, 3], - [ - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_NOT_EQUAL), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_CONTAINS), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), - ] - ), - ( - (((TaskFieldFilter.PRIORITY >= 3) * -(TaskFieldFilter.STATUS != TaskStatus.COMPLETED) * -TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) + (TaskFieldFilter.ENGINE_TYPE.endswith("Test") * (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))), - 2, [2, 3], - [ - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_EQUAL), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_NOT_CONTAINS), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), - ] - ) -]) -def test_filter_combination(filt: Filter, n_or: int, n_and: List[int], filters: List[SimpleFieldFilter]): - filt = filt.to_disjunction() - assert len(filt._filters) == n_or - sorted_n_and = sorted(n_and) - sorted_actual = sorted([len(f) for f in filt._filters]) - assert len(sorted_n_and) == len(sorted_actual) - assert all((sorted_n_and[i] == sorted_actual[i] for i in range(len(sorted_actual)))) - for f in filt._filters: - for ff in f: - field_value = getattr(ff.field, ff.field.WhichOneof("field")).field - for i, expected in enumerate(filters): - if expected.field == field_value and expected.value == ff.value and expected.operator == ff.operator: - filters.pop(i) - break - else: - print(f"Could not find {str(ff)}") - assert False - assert len(filters) == 0 - - -def test_name_from_value(): - assert TaskStatus.name_from_value(TaskStatus.COMPLETED) == "TASK_STATUS_COMPLETED" - - -class BasicFilterAnd: - - def __setattr__(self, key, value): - self.__dict__[key] = value - - def __getattr__(self, item): - return self.__dict__[item] - - -@pytest.mark.parametrize("filt,n_or,n_and,filters,expected_type", [ - ( - (TaskFieldFilter.INITIAL_TASK_ID == "TestId"), - 1, [1], - [ - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID, "TestId", FILTER_STRING_OPERATOR_EQUAL) - ], - 0 - ), - ( - (TaskFieldFilter.APPLICATION_NAME.contains("TestName") & (TaskFieldFilter.CREATED_AT > Timestamp(seconds=1000, nanos=500))), - 1, [2], - [ - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_NAME, "TestName", FILTER_STRING_OPERATOR_CONTAINS), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_CREATED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_AFTER) - ], - 1 - ), - ( - (((TaskFieldFilter.MAX_RETRIES <= 3) & ~(TaskFieldFilter.SESSION_ID == "SessionId")) | (TaskFieldFilter.task_options_key("MyKey").startswith("Start"))), - 2, [1, 2], - [ - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_MAX_RETRIES, 3, FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_SESSION_ID, "SessionId", FILTER_STRING_OPERATOR_NOT_EQUAL), - SimpleFieldFilter("MyKey", "Start", FILTER_STRING_OPERATOR_STARTS_WITH) - ], - 2 - ), - ( - (((TaskFieldFilter.PRIORITY > 3) & ~(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) & TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) | (TaskFieldFilter.ENGINE_TYPE.endswith("Test") & (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))), - 2, [2, 3], - [ - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_NOT_EQUAL), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_CONTAINS), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), - ], - 2 - ), - ( - (((TaskFieldFilter.PRIORITY >= 3) * -(TaskFieldFilter.STATUS != TaskStatus.COMPLETED) * -TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) + (TaskFieldFilter.ENGINE_TYPE.endswith("Test") * (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))), - 2, [2, 3], - [ - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_EQUAL), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_NOT_CONTAINS), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), - ], - 2 - ), - ( - (((TaskFieldFilter.PRIORITY >= 3) * -(TaskFieldFilter.STATUS != TaskStatus.COMPLETED) * -TaskFieldFilter.APPLICATION_VERSION.contains("1.0")) + (TaskFieldFilter.ENGINE_TYPE.endswith("Test") * (TaskFieldFilter.ENDED_AT <= Timestamp(seconds=1000, nanos=500)))) + (((TaskFieldFilter.MAX_RETRIES <= 3) & ~(TaskFieldFilter.SESSION_ID == "SessionId")) | (TaskFieldFilter.task_options_key("MyKey").startswith("Start"))), - 4, [2, 3, 2, 1], - [ - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_PRIORITY, 3, FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_STATUS, TaskStatus.COMPLETED, FILTER_STATUS_OPERATOR_EQUAL), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, "1.0", FILTER_STRING_OPERATOR_NOT_CONTAINS), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, "Test", FILTER_STRING_OPERATOR_ENDS_WITH), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_ENDED_AT, Timestamp(seconds=1000, nanos=500), FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL), - SimpleFieldFilter(TASK_OPTION_ENUM_FIELD_MAX_RETRIES, 3, FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL), - SimpleFieldFilter(TASK_SUMMARY_ENUM_FIELD_SESSION_ID, "SessionId", FILTER_STRING_OPERATOR_NOT_EQUAL), - SimpleFieldFilter("MyKey", "Start", FILTER_STRING_OPERATOR_STARTS_WITH) - ], - 2 - ) -]) -def test_taskfilter_to_message(filt: Filter, n_or: int, n_and: List[int], filters: List[SimpleFieldFilter], expected_type: int): - print(filt) - message = filt.to_message() - conjs: Collection = [] - if expected_type == 2: # Disjunction - conjs: Collection = getattr(message, "or") - assert len(conjs) == n_or - sorted_n_and = sorted(n_and) - sorted_actual = sorted([len(getattr(f, "and")) for f in conjs]) - assert len(sorted_n_and) == len(sorted_actual) - assert all((sorted_n_and[i] == sorted_actual[i] for i in range(len(sorted_actual)))) - - if expected_type == 1: # Conjunction - conjs: Collection = [message] - - if expected_type == 0: # Simple filter - m = BasicFilterAnd() - setattr(m, "and", [message]) - conjs: Collection = [m] - - for conj in conjs: - basics = getattr(conj, "and") - for f in basics: - field_value = getattr(f.field, f.field.WhichOneof("field")).field - for i, expected in enumerate(filters): - if expected.field == field_value and expected.value == getattr(f, f.WhichOneof("value_condition")).value and expected.operator == getattr(f, f.WhichOneof("value_condition")).operator: - filters.pop(i) - break - else: - print(f"Could not find {str(f)}") - assert False - assert len(filters) == 0 diff --git a/packages/python/tests/filters_test.py b/packages/python/tests/test_filters.py similarity index 100% rename from packages/python/tests/filters_test.py rename to packages/python/tests/test_filters.py diff --git a/packages/python/tests/helpers_test.py b/packages/python/tests/test_helpers.py similarity index 76% rename from packages/python/tests/helpers_test.py rename to packages/python/tests/test_helpers.py index 20e07d922..1c0cf517b 100644 --- a/packages/python/tests/helpers_test.py +++ b/packages/python/tests/test_helpers.py @@ -5,7 +5,9 @@ from google.protobuf.duration_pb2 import Duration from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from armonik.common.helpers import datetime_to_timestamp, timestamp_to_datetime, timedelta_to_duration, duration_to_timedelta +from armonik.common.helpers import datetime_to_timestamp, timestamp_to_datetime, timedelta_to_duration, duration_to_timedelta, batched + +from typing import Iterable, List @dataclass @@ -60,3 +62,14 @@ def test_duration_to_timedelta(case: Case): def test_timedelta_to_duration(case: Case): ts = timedelta_to_duration(case.delta) assert ts.seconds == case.duration.seconds and abs(ts.nanos - case.duration.nanos) < 1000 + + +@pytest.mark.parametrize(["iterable", "batch_size", "iterations"], [ + ([1, 2, 3], 3, [[1, 2, 3]]), + ([1, 2, 3], 5, [[1, 2, 3]]), + ([1, 2, 3], 2, [[1, 2], [3]]), + ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]]) +]) +def test_batched(iterable: Iterable, batch_size: int, iterations: List[Iterable]): + for index, batch in enumerate(batched(iterable, batch_size)): + assert batch == iterations[index] diff --git a/packages/python/tests/worker_test.py b/packages/python/tests/worker_test.py deleted file mode 100644 index 032c406ee..000000000 --- a/packages/python/tests/worker_test.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 -import logging -import os -import pytest -from armonik.worker import ArmoniKWorker, TaskHandler, ClefLogger -from armonik.common import Output -from .taskhandler_test import should_succeed_case, data_folder, DummyAgent -from .common import DummyChannel -from armonik.protogen.common.objects_pb2 import Empty -import grpc - - -def do_nothing(_: TaskHandler) -> Output: - return Output() - - -def throw_error(_: TaskHandler) -> Output: - raise ValueError("TestError") - - -def return_error(_: TaskHandler) -> Output: - return Output("TestError") - - -def return_and_send(th: TaskHandler) -> Output: - th.send_result(th.expected_results[0], b"result") - return Output() - - -@pytest.fixture(autouse=True, scope="function") -def remove_result(): - yield - if os.path.exists(os.path.join(data_folder, "resultid")): - os.remove(os.path.join(data_folder, "resultid")) - - -def test_do_nothing_worker(): - with grpc.insecure_channel("unix:///tmp/agent.sock") as agent_channel: - worker = ArmoniKWorker(agent_channel, do_nothing, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) - reply = worker.Process(should_succeed_case, None) - assert Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None).success - worker.HealthCheck(Empty(), None) - - -def test_worker_should_return_none(): - with grpc.insecure_channel("unix:///tmp/agent.sock") as agent_channel: - worker = ArmoniKWorker(agent_channel, throw_error, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) - reply = worker.Process(should_succeed_case, None) - assert reply is None - - -def test_worker_should_error(): - with grpc.insecure_channel("unix:///tmp/agent.sock") as agent_channel: - worker = ArmoniKWorker(agent_channel, return_error, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) - reply = worker.Process(should_succeed_case, None) - output = Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None) - assert not output.success - assert output.error == "TestError" - - -def test_worker_should_write_result(): - with grpc.insecure_channel("unix:///tmp/agent.sock") as agent_channel: - worker = ArmoniKWorker(agent_channel, return_and_send, logger=ClefLogger("TestLogger", level=logging.DEBUG)) - worker._client = DummyAgent(DummyChannel()) - reply = worker.Process(should_succeed_case, None) - assert reply is not None - output = Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None) - assert output.success - assert os.path.exists(os.path.join(data_folder, should_succeed_case.expected_output_keys[0])) - with open(os.path.join(data_folder, should_succeed_case.expected_output_keys[0]), "rb") as f: - value = f.read() - assert len(value) > 0 - From d56bf0f26e5e0a39012080e92b54b7fb71a524d9 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Wed, 3 Jan 2024 14:28:47 +0100 Subject: [PATCH 125/344] Fix python tests --- packages/python/src/armonik/common/helpers.py | 31 ++++++++++++- packages/python/tests/conftest.py | 45 ------------------- 2 files changed, 30 insertions(+), 46 deletions(-) diff --git a/packages/python/src/armonik/common/helpers.py b/packages/python/src/armonik/common/helpers.py index e174e2f42..3a9cb8324 100644 --- a/packages/python/src/armonik/common/helpers.py +++ b/packages/python/src/armonik/common/helpers.py @@ -1,6 +1,6 @@ from __future__ import annotations from datetime import timedelta, datetime, timezone -from typing import List, Optional +from typing import List, Optional, Iterable, TypeVar import google.protobuf.duration_pb2 as duration import google.protobuf.timestamp_pb2 as timestamp @@ -9,6 +9,9 @@ from .enumwrapper import TaskStatus +T = TypeVar('T') + + def get_task_filter(session_ids: Optional[List[str]] = None, task_ids: Optional[List[str]] = None, included_statuses: Optional[List[TaskStatus]] = None, excluded_statuses: Optional[List[TaskStatus]] = None) -> TaskFilter: @@ -96,3 +99,29 @@ def timedelta_to_duration(delta: timedelta) -> duration.Duration: d = duration.Duration() d.FromTimedelta(delta) return d + + +def batched(iterable: Iterable[T], n: int) -> Iterable[List[T]]: + """ + Batches elements from an iterable into lists of size at most 'n'. + + Args: + iterable : The input iterable. + n : The batch size. + + Yields: + A generator yielding batches of elements from the input iterable. + """ + it = iter(iterable) + + sentinel = object() + batch = [] + c = next(it, sentinel) + while c is not sentinel: + batch.append(c) + if len(batch) == n: + yield batch + batch.clear() + c = next(it, sentinel) + if len(batch) > 0: + yield batch diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index 1b5949a7e..c7eb15a79 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -3,7 +3,6 @@ import pytest import requests -from armonik.client import ArmoniKResults, ArmoniKSubmitter, ArmoniKTasks, ArmoniKSessions, ArmoniKPartitions, ArmoniKVersions, ArmoniKEvents, ArmoniKHealthChecks from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub from typing import List @@ -44,7 +43,6 @@ def clean_up(request): # Remove the temporary files created for testing os.remove(os.path.join(data_folder, "payload-id")) os.remove(os.path.join(data_folder, "dd-id")) - os.remove(os.path.join(data_folder, "result-id")) # Reset the mock server counters try: @@ -55,49 +53,6 @@ def clean_up(request): print("An error occurred when resetting the server: " + str(e)) -def get_client(client_name: str, endpoint: str = grpc_endpoint) -> [ArmoniKResults, ArmoniKSubmitter, ArmoniKTasks, ArmoniKSessions, ArmoniKPartitions, ArmoniKVersions, AgentStub, ArmoniKEvents, ArmoniKHealthChecks]: - """ - Get the ArmoniK client instance based on the specified service name. - - Args: - client_name (str): The name of the ArmoniK client to retrieve. - endpoint (str, optional): The gRPC server endpoint. Defaults to grpc_endpoint. - - Returns: - Union[ArmoniKResults, ArmoniKSubmitter, ArmoniKTasks, ArmoniKSessions, ARmoniKPartitions, AgentStub]: - An instance of the specified ArmoniK client. - - Raises: - ValueError: If the specified service name is not recognized. - - Example: - >>> result_service = get_service("Results") - >>> submitter_service = get_service("Submitter", "custom_endpoint") - """ - channel = grpc.insecure_channel(endpoint).__enter__() - match client_name: - case "Results": - return ArmoniKResults(channel) - case "Submitter": - return ArmoniKSubmitter(channel) - case "Tasks": - return ArmoniKTasks(channel) - case "Sessions": - return ArmoniKSessions(channel) - case "Partitions": - return ArmoniKPartitions(channel) - case "Versions": - return ArmoniKVersions(channel) - case "Agent": - return AgentStub(channel) - case "Events": - return ArmoniKEvents(channel) - case "HealthChecks": - return ArmoniKHealthChecks(channel) - case _: - raise ValueError("Unknown service name: " + str(service_name)) - - def rpc_called(service_name: str, rpc_name: str, n_calls: int = 1, endpoint: str = calls_endpoint) -> bool: """Check if a remote procedure call (RPC) has been made a specified number of times. This function uses ArmoniK.Api.Mock. It just gets the '/calls.json' endpoint. From 6473b97e2996a2635c5a34651f951cce1984fc62 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Wed, 3 Jan 2024 14:50:02 +0100 Subject: [PATCH 126/344] feat: Python API add versions service --- .../python/src/armonik/client/__init__.py | 1 + .../python/src/armonik/client/versions.py | 26 +++++++++++++ packages/python/tests/conftest.py | 28 +++++++++++++ packages/python/tests/test_versions.py | 39 +++++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 packages/python/src/armonik/client/versions.py create mode 100644 packages/python/tests/test_versions.py diff --git a/packages/python/src/armonik/client/__init__.py b/packages/python/src/armonik/client/__init__.py index e94d7dde9..a3277994d 100644 --- a/packages/python/src/armonik/client/__init__.py +++ b/packages/python/src/armonik/client/__init__.py @@ -1,3 +1,4 @@ from .submitter import ArmoniKSubmitter from .tasks import ArmoniKTasks from .results import ArmoniKResult +from .versions import ArmoniKVersions diff --git a/packages/python/src/armonik/client/versions.py b/packages/python/src/armonik/client/versions.py new file mode 100644 index 000000000..db6f23a69 --- /dev/null +++ b/packages/python/src/armonik/client/versions.py @@ -0,0 +1,26 @@ +from typing import Dict + +from grpc import Channel + +from ..protogen.client.versions_service_pb2_grpc import VersionsStub +from ..protogen.common.versions_common_pb2 import ListVersionsRequest, ListVersionsResponse + + +class ArmoniKVersions: + def __init__(self, grpc_channel: Channel): + """ Result service client + + Args: + grpc_channel: gRPC channel to use + """ + self._client = VersionsStub(grpc_channel) + + def list_versions(self) -> Dict[str, str]: + """Get versions of ArmoniK components. + + Return: + A dictionnary mapping each component to its version. + """ + request = ListVersionsRequest() + response: ListVersionsResponse = self._client.ListVersions(request) + return {"core": response.core, "api": response.api} diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index c7eb15a79..b5f363808 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -3,6 +3,7 @@ import pytest import requests +from armonik.client import ArmoniKVersions from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub from typing import List @@ -53,6 +54,33 @@ def clean_up(request): print("An error occurred when resetting the server: " + str(e)) +def get_client(client_name: str, endpoint: str = grpc_endpoint) -> ArmoniKVersions: + """ + Get the ArmoniK client instance based on the specified service name. + + Args: + client_name (str): The name of the ArmoniK client to retrieve. + endpoint (str, optional): The gRPC server endpoint. Defaults to grpc_endpoint. + + Returns: + ArmoniKVersions + An instance of the specified ArmoniK client. + + Raises: + ValueError: If the specified service name is not recognized. + + Example: + >>> result_service = get_service("Results") + >>> submitter_service = get_service("Submitter", "custom_endpoint") + """ + channel = grpc.insecure_channel(endpoint).__enter__() + match client_name: + case "Versions": + return ArmoniKVersions(channel) + case _: + raise ValueError("Unknown service name: " + str(service_name)) + + def rpc_called(service_name: str, rpc_name: str, n_calls: int = 1, endpoint: str = calls_endpoint) -> bool: """Check if a remote procedure call (RPC) has been made a specified number of times. This function uses ArmoniK.Api.Mock. It just gets the '/calls.json' endpoint. diff --git a/packages/python/tests/test_versions.py b/packages/python/tests/test_versions.py new file mode 100644 index 000000000..4c04195f6 --- /dev/null +++ b/packages/python/tests/test_versions.py @@ -0,0 +1,39 @@ +import pytest + +from .conftest import all_rpc_called, rpc_called, get_client +from armonik.client import ArmoniKVersions + + +class TestArmoniKVersions: + + def test_list_versions(self): + """ + Test the list_versions method of ArmoniKVersions client. + + Args: + grpc_endpoint (str): The gRPC endpoint for the service mock. + calls_recap_endpoint (str): The endpoint for tracking RPC calls. + + Assertions: + Ensures that the RPC 'ListVersions' is called on the service 'Versions'. + Asserts that the 'core' version is returned with correct value. + Asserts that the 'api' version is returned with correct value. + """ + versions_client: ArmoniKVersions = get_client("Versions") + versions = versions_client.list_versions() + + assert rpc_called("Versions", "ListVersions") + assert versions["core"] == "Unknown" + assert versions["api"] == "3.15.1.0" + + def test_service_fully_implemented(self): + """ + Test if all RPCs in the 'Versions' service have been called at least once. + + Args: + calls_recap_endpoint (str): The endpoint for tracking RPC calls. + + Assertions: + Ensures that all RPCs in the 'Versions' service have been called at least once. + """ + assert all_rpc_called("Versions") From a768f048c5e89ad5d3681ac70bf1144749c14bd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Wed, 3 Jan 2024 15:21:05 +0100 Subject: [PATCH 127/344] chore: update to 3.15.1 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 7462a1458..e2af60671 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.15.0", + "version": "3.15.1", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 54fcbf5e9..425c401d4 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.15.0) +set(version 3.15.1) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 101a57a67..427ed78d0 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.15.0 - 3.15.0 + 3.15.1 + 3.15.1 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index e23f0a7e7..948eafc08 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.15.0 - 3.15.0 + 3.15.1 + 3.15.1 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index 424481a7b..0d8806433 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.15.0 - 3.15.0 + 3.15.1 + 3.15.1 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 6b4a5b48d..1390c95a1 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.15.0 - 3.15.0 + 3.15.1 + 3.15.1 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index 3388454f3..b05c16790 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.15.0 - 3.15.0 + 3.15.1 + 3.15.1 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 563a04bcb..409638b37 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.15.0 - 3.15.0 + 3.15.1 + 3.15.1 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 35e21742b..5ea6436d0 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.15.0 - 3.15.0 + 3.15.1 + 3.15.1 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 23aeca564..4853387dc 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.15.0 - 3.15.0 + 3.15.1 + 3.15.1 True True diff --git a/packages/web/package.json b/packages/web/package.json index ff60c806f..4ef210eee 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.15.0", + "version": "3.15.1", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From f7498c275a0c358a2f734309fc4fe083cf7d1737 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Wed, 3 Jan 2024 15:23:48 +0100 Subject: [PATCH 128/344] Update API version test --- packages/python/tests/test_versions.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/python/tests/test_versions.py b/packages/python/tests/test_versions.py index 4c04195f6..f29ab2e72 100644 --- a/packages/python/tests/test_versions.py +++ b/packages/python/tests/test_versions.py @@ -1,3 +1,5 @@ +import json +import os import pytest from .conftest import all_rpc_called, rpc_called, get_client @@ -24,7 +26,8 @@ def test_list_versions(self): assert rpc_called("Versions", "ListVersions") assert versions["core"] == "Unknown" - assert versions["api"] == "3.15.1.0" + with open("../web/package.json", "r") as file: + assert versions["api"] == json.loads(file.read())["version"] + ".0" def test_service_fully_implemented(self): """ From 4064ad2d0290bca57956b8b6397128d3355e11e3 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Wed, 3 Jan 2024 16:15:07 +0100 Subject: [PATCH 129/344] feat: Python API update tasks service --- .../python/src/armonik/client/__init__.py | 2 +- packages/python/src/armonik/client/tasks.py | 108 +++++++++++++-- packages/python/src/armonik/common/objects.py | 6 +- packages/python/tests/conftest.py | 10 +- packages/python/tests/test_tasks.py | 123 ++++++++++++++++++ 5 files changed, 232 insertions(+), 17 deletions(-) create mode 100644 packages/python/tests/test_tasks.py diff --git a/packages/python/src/armonik/client/__init__.py b/packages/python/src/armonik/client/__init__.py index a3277994d..8b74161dc 100644 --- a/packages/python/src/armonik/client/__init__.py +++ b/packages/python/src/armonik/client/__init__.py @@ -1,4 +1,4 @@ from .submitter import ArmoniKSubmitter -from .tasks import ArmoniKTasks +from .tasks import ArmoniKTasks, TaskFieldFilter from .results import ArmoniKResult from .versions import ArmoniKVersions diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 18f7c3478..67c508b74 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -1,15 +1,15 @@ from __future__ import annotations from grpc import Channel -from typing import cast, Tuple, List +from typing import cast, Dict, Optional, Tuple, List -from ..common import Task, Direction +from ..common import Task, Direction, TaskDefinition, TaskOptions, TaskStatus from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter, DurationFilter from ..protogen.client.tasks_service_pb2_grpc import TasksStub -from ..protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse, ListTasksRequest, ListTasksDetailedResponse +from ..protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse, ListTasksRequest, ListTasksDetailedResponse, CancelTasksRequest, CancelTasksResponse, GetResultIdsRequest, GetResultIdsResponse, SubmitTasksRequest, SubmitTasksResponse, CountTasksByStatusRequest, CountTasksByStatusResponse, ListTasksResponse from ..protogen.common.tasks_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus from ..protogen.common.sort_direction_pb2 import SortDirection - from ..protogen.common.tasks_fields_pb2 import * +from ..common.helpers import batched class TaskFieldFilter: @@ -77,7 +77,7 @@ def get_task(self, task_id: str) -> Task: task_response: GetTaskResponse = self._client.GetTask(GetTaskRequest(task_id=task_id)) return Task.from_message(task_response.task) - def list_tasks(self, task_filter: Filter, with_errors: bool = False, page: int = 0, page_size: int = 1000, sort_field: Filter = TaskFieldFilter.TASK_ID, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Task]]: + def list_tasks(self, task_filter: Filter | None = None, with_errors: bool = False, page: int = 0, page_size: int = 1000, sort_field: Filter = TaskFieldFilter.TASK_ID, sort_direction: SortDirection = Direction.ASC, detailed: bool = True) -> Tuple[int, List[Task]]: """List tasks If the total returned exceeds the requested page size, you may want to use this function again and ask for subsequent pages. @@ -89,6 +89,7 @@ def list_tasks(self, task_filter: Filter, with_errors: bool = False, page: int = page_size: size of a page, defaults to 1000 sort_field: field on which to sort the resulting list, defaults to the task_id sort_direction: direction of the sort, defaults to ascending + detailed: Wether to retrieve the detailed description of the task. Returns: A tuple containing : @@ -96,9 +97,94 @@ def list_tasks(self, task_filter: Filter, with_errors: bool = False, page: int = - The obtained list of tasks """ request = ListTasksRequest(page=page, - page_size=page_size, - filters=cast(rawFilters, task_filter.to_disjunction().to_message()), - sort=ListTasksRequest.Sort(field=cast(TaskField, sort_field.field), direction=sort_direction), - with_errors=with_errors) - list_response: ListTasksDetailedResponse = self._client.ListTasksDetailed(request) - return list_response.total, [Task.from_message(t) for t in list_response.tasks] + page_size=page_size, + filters=cast(rawFilters, task_filter.to_disjunction().to_message()) if task_filter else None, + sort=ListTasksRequest.Sort(field=cast(TaskField, sort_field.field), direction=sort_direction), + with_errors=with_errors + ) + if detailed: + response: ListTasksDetailedResponse = self._client.ListTasksDetailed(request) + return response.total, [Task.from_message(t) for t in response.tasks] + response: ListTasksResponse = self._client.ListTasks(request) + return response.total, [Task.from_message(t) for t in response.tasks] + + def cancel_tasks(self, task_ids: List[str], chunk_size: Optional[int] = 500): + """Cancel tasks. + + Args: + task_ids: IDs of the tasks. + chunk_size: Batch size for cancelling. + + Return: + The list of cancelled tasks. + """ + for task_id_batch in batched(task_ids, chunk_size): + request = CancelTasksRequest(task_ids=task_id_batch) + self._client.CancelTasks(request) + + def get_result_ids(self, task_ids: List[str], chunk_size: Optional[int] = 500) -> Dict[str, List[str]]: + """Get result IDs of a list of tasks. + + Args: + task_ids: The IDs of the tasks. + chunk_size: Batch size for retrieval. + + Return: + A dictionary mapping the ID of a task to the IDs of its results.. + """ + tasks_result_ids = {} + + for task_ids_batch in batched(task_ids, chunk_size): + request = GetResultIdsRequest(task_id=task_ids_batch) + result_ids_response: GetResultIdsResponse = self._client.GetResultIds(request) + for t in result_ids_response.task_results: + tasks_result_ids[t.task_id] = list(t.result_ids) + return tasks_result_ids + + def count_tasks_by_status(self, task_filter: Filter | None = None) -> Dict[TaskStatus, int]: + """Get number of tasks by status. + + Args: + task_filter: Filter for the tasks to be listed + + Return: + A dictionnary mapping each status to the number of filtered tasks. + """ + request = CountTasksByStatusRequest( + filters=cast(rawFilters, task_filter.to_disjunction().to_message()) if task_filter else None + ) + count_tasks_by_status_response: CountTasksByStatusResponse = self._client.CountTasksByStatus(request) + return {TaskStatus(status_count.status): status_count.count for status_count in count_tasks_by_status_response.status} + + def submit_tasks(self, session_id: str, tasks: List[TaskDefinition], default_task_options: Optional[TaskOptions | None] = None, chunk_size: Optional[int] = 100) -> List[Task]: + """Submit tasks to ArmoniK. + + Args: + session_id: Session Id + tasks: List of task definitions + default_task_options: Default Task Options used if a task has its options not set + chunk_size: Batch size for submission + + Returns: + Tuple containing the list of successfully sent tasks, and + the list of submission errors if any + """ + for tasks_batch in batched(tasks, chunk_size): + task_creations = [] + + for t in tasks_batch: + task_creation = SubmitTasksRequest.TaskCreation( + expected_output_keys=t.expected_output_ids, + payload_id=t.payload_id, + data_dependencies=t.data_dependencies, + task_options=t.options.to_message() if t.options else None + ) + task_creations.append(task_creation) + + request = SubmitTasksRequest( + session_id=session_id, + task_creations=task_creations, + task_options=default_task_options.to_message() if default_task_options else None + ) + + self._client.SubmitTasks(request) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 4f9527377..340821b8f 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -8,6 +8,7 @@ from ..protogen.common.objects_pb2 import Empty, Output as WorkerOutput, TaskOptions as RawTaskOptions from ..protogen.common.task_status_pb2 import TaskStatus as RawTaskStatus from .enumwrapper import TaskStatus, SessionStatus, ResultStatus +from ..protogen.common.partitions_common_pb2 import PartitionRaw from ..protogen.common.session_status_pb2 import SessionStatus as RawSessionStatus from ..protogen.common.sessions_common_pb2 import SessionRaw from ..protogen.common.result_status_pb2 import ResultStatus as RawResultStatus @@ -70,9 +71,11 @@ def to_message(self): @dataclass() class TaskDefinition: - payload: bytes + payload_id: str = field(default_factory=str) + payload: bytes = field(default_factory=bytes) expected_output_ids: List[str] = field(default_factory=list) data_dependencies: List[str] = field(default_factory=list) + options: Optional[TaskOptions] = None def __post_init__(self): if len(self.expected_output_ids) <= 0: @@ -89,6 +92,7 @@ class Task: expected_output_ids: List[str] = field(default_factory=list) retry_of_ids: List[str] = field(default_factory=list) status: RawTaskStatus = TaskStatus.UNSPECIFIED + payload_id: Optional[str] = None status_message: Optional[str] = None options: Optional[TaskOptions] = None created_at: Optional[datetime] = None diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index b5f363808..b4bb0af6f 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -3,9 +3,9 @@ import pytest import requests -from armonik.client import ArmoniKVersions +from armonik.client import ArmoniKTasks, ArmoniKVersions from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub -from typing import List +from typing import List, Union # Mock server endpoints used for the tests. @@ -54,7 +54,7 @@ def clean_up(request): print("An error occurred when resetting the server: " + str(e)) -def get_client(client_name: str, endpoint: str = grpc_endpoint) -> ArmoniKVersions: +def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[ArmoniKTasks, ArmoniKVersions]: """ Get the ArmoniK client instance based on the specified service name. @@ -63,7 +63,7 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> ArmoniKVersio endpoint (str, optional): The gRPC server endpoint. Defaults to grpc_endpoint. Returns: - ArmoniKVersions + Union[ArmoniKTasks, ArmoniKVersions] An instance of the specified ArmoniK client. Raises: @@ -75,6 +75,8 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> ArmoniKVersio """ channel = grpc.insecure_channel(endpoint).__enter__() match client_name: + case "Tasks": + return ArmoniKTasks(channel) case "Versions": return ArmoniKVersions(channel) case _: diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py new file mode 100644 index 000000000..f004cb8b3 --- /dev/null +++ b/packages/python/tests/test_tasks.py @@ -0,0 +1,123 @@ +import datetime + +from .conftest import all_rpc_called, rpc_called, get_client +from armonik.client import ArmoniKTasks, TaskFieldFilter +from armonik.common import Task, TaskDefinition, TaskOptions, TaskStatus, Output + + +class TestArmoniKTasks: + + def test_get_task(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + task = tasks_client.get_task("task-id") + + assert rpc_called("Tasks", "GetTask") + assert isinstance(task, Task) + assert task.id == 'task-id' + assert task.session_id == 'session-id' + assert task.data_dependencies == [] + assert task.expected_output_ids == [] + assert task.retry_of_ids == [] + assert task.status == TaskStatus.COMPLETED + assert task.payload_id is None + assert task.status_message == '' + assert task.options == TaskOptions( + max_duration=datetime.timedelta(seconds=1), + priority=1, + max_retries=1, + partition_id='partition-id', + application_name='application-name', + application_version='application-version', + application_namespace='application-namespace', + application_service='application-service', + engine_type='engine-type', + options={} + ) + assert task.created_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert task.submitted_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert task.started_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert task.ended_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert task.pod_ttl == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert task.output == Output(error='') + assert task.pod_hostname == '' + assert task.received_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert task.acquired_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + + def test_list_tasks_detailed_no_filter(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + num, tasks = tasks_client.list_tasks() + assert rpc_called("Tasks", "ListTasksDetailed") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert num == 0 + assert tasks == [] + + def test_list_tasks_detailed_with_filter(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + num, tasks = tasks_client.list_tasks(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) + assert rpc_called("Tasks", "ListTasksDetailed", 2) + # TODO: Mock must be updated to return something and so that changes the following assertions + assert num == 0 + assert tasks == [] + + def test_list_tasks_no_detailed_no_filter(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + num, tasks = tasks_client.list_tasks(detailed=False) + assert rpc_called("Tasks", "ListTasks") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert num == 0 + assert tasks == [] + + def test_cancel_tasks(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + tasks = tasks_client.cancel_tasks(["task-id-1", "task-id-2"]) + + assert rpc_called("Tasks", "CancelTasks") + assert tasks is None + + def test_get_result_ids(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + tasks_results = tasks_client.get_result_ids(["task-id-1", "task-id-2"]) + assert rpc_called("Tasks", "GetResultIds") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert tasks_results == {} + + def test_count_tasks_by_status_no_filter(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + count = tasks_client.count_tasks_by_status() + assert rpc_called("Tasks", "CountTasksByStatus") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert count == {} + + def test_count_tasks_by_status_with_filter(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + count = tasks_client.count_tasks_by_status(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) + assert rpc_called("Tasks", "CountTasksByStatus", 2) + # TODO: Mock must be updated to return something and so that changes the following assertions + assert count == {} + + def test_submit_tasks(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + tasks = tasks_client.submit_tasks( + "session-id", + [TaskDefinition(payload_id="payload-id", + expected_output_ids=["result-id"], + data_dependencies=[], + options=TaskOptions( + max_duration=datetime.timedelta(seconds=1), + priority=1, + max_retries=1 + ) + ) + ], + default_task_options=TaskOptions( + max_duration=datetime.timedelta(seconds=1), + priority=1, + max_retries=1 + ) + ) + assert rpc_called("Tasks", "SubmitTasks") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert tasks is None + + def test_service_fully_implemented(self): + assert all_rpc_called("Tasks") From 60dde00c260a5591f8bb40eabfe8a5b807ad8d2f Mon Sep 17 00:00:00 2001 From: qdelamea Date: Thu, 4 Jan 2024 12:02:15 +0100 Subject: [PATCH 130/344] feat: Python API update results service --- .../python/src/armonik/client/__init__.py | 2 +- packages/python/src/armonik/client/results.py | 167 +++++++++++++++++- .../python/src/armonik/common/__init__.py | 2 +- packages/python/tests/conftest.py | 4 +- packages/python/tests/test_results.py | 116 ++++++++++++ 5 files changed, 283 insertions(+), 8 deletions(-) create mode 100644 packages/python/tests/test_results.py diff --git a/packages/python/src/armonik/client/__init__.py b/packages/python/src/armonik/client/__init__.py index 8b74161dc..a4a7cd74e 100644 --- a/packages/python/src/armonik/client/__init__.py +++ b/packages/python/src/armonik/client/__init__.py @@ -1,4 +1,4 @@ from .submitter import ArmoniKSubmitter from .tasks import ArmoniKTasks, TaskFieldFilter -from .results import ArmoniKResult +from .results import ArmoniKResults, ResultFieldFilter from .versions import ArmoniKVersions diff --git a/packages/python/src/armonik/client/results.py b/packages/python/src/armonik/client/results.py index 942add9c1..1937bba7b 100644 --- a/packages/python/src/armonik/client/results.py +++ b/packages/python/src/armonik/client/results.py @@ -1,21 +1,26 @@ from __future__ import annotations from grpc import Channel +from deprecation import deprecated from typing import List, Dict, cast, Tuple from ..protogen.client.results_service_pb2_grpc import ResultsStub -from ..protogen.common.results_common_pb2 import CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, ListResultsRequest, ListResultsResponse +from ..protogen.common.results_common_pb2 import CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, ListResultsRequest, ListResultsResponse, GetOwnerTaskIdRequest, GetOwnerTaskIdResponse, CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, CreateResultsRequest, CreateResultsResponse, ResultsServiceConfigurationResponse, DeleteResultsDataRequest, DeleteResultsDataResponse, UploadResultDataRequest, UploadResultDataResponse, DownloadResultDataRequest, DownloadResultDataResponse, GetResultRequest, GetResultResponse from ..protogen.common.results_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus from ..protogen.common.results_fields_pb2 import ResultField +from ..protogen.common.objects_pb2 import Empty from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter from ..protogen.common.sort_direction_pb2 import SortDirection from ..common import Direction , Result -from ..protogen.common.results_fields_pb2 import ResultField, ResultRawField, ResultRawEnumField, RESULT_RAW_ENUM_FIELD_STATUS +from ..protogen.common.results_fields_pb2 import ResultField, ResultRawField, ResultRawEnumField, RESULT_RAW_ENUM_FIELD_STATUS, RESULT_RAW_ENUM_FIELD_RESULT_ID +from ..common.helpers import batched + class ResultFieldFilter: STATUS = StatusFilter(ResultField(result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus) + RESULT_ID = StringFilter(ResultField(result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_RESULT_ID)), rawFilters, rawFilterAnd, rawFilterField) -class ArmoniKResult: +class ArmoniKResults: def __init__(self, grpc_channel: Channel): """ Result service client @@ -24,10 +29,11 @@ def __init__(self, grpc_channel: Channel): """ self._client = ResultsStub(grpc_channel) + @deprecated(deprecated_in="3.15.0", details="Use create_result_metadata or create_result insted.") def get_results_ids(self, session_id: str, names: List[str]) -> Dict[str, str]: return {r.name : r.result_id for r in cast(CreateResultsMetaDataResponse, self._client.CreateResultsMetaData(CreateResultsMetaDataRequest(results=[CreateResultsMetaDataRequest.ResultCreate(name = n) for n in names], session_id=session_id))).results} - def list_results(self, result_filter: Filter, page: int = 0, page_size: int = 1000, sort_field: Filter = ResultFieldFilter.STATUS,sort_direction: SortDirection = Direction.ASC ) -> Tuple[int, List[Result]]: + def list_results(self, result_filter: Filter | None = None, page: int = 0, page_size: int = 1000, sort_field: Filter = ResultFieldFilter.STATUS,sort_direction: SortDirection = Direction.ASC ) -> Tuple[int, List[Result]]: """List results based on a filter. Args: @@ -44,8 +50,159 @@ def list_results(self, result_filter: Filter, page: int = 0, page_size: int = 10 request: ListResultsRequest = ListResultsRequest( page=page, page_size=page_size, - filters=cast(rawFilters, result_filter.to_disjunction().to_message()), + filters=cast(rawFilters, result_filter.to_disjunction().to_message()) if result_filter else None, sort=ListResultsRequest.Sort(field=cast(ResultField, sort_field.field), direction=sort_direction), ) list_response: ListResultsResponse = self._client.ListResults(request) return list_response.total, [Result.from_message(r) for r in list_response.results] + + def get_result(self, result_id: str) -> Result: + """Get a result by id. + + Args: + result_id: The ID of the result. + + Return: + The result summary. + """ + request = GetResultRequest(result_id=result_id) + response: GetResultResponse = self._client.GetResult(request) + return Result.from_message(response.result) + + def get_owner_task_id(self, result_ids: List[str], session_id: str, batch_size: int = 500) -> Dict[str, str]: + """Get the IDs of the tasks that should produce the results. + + Args: + result_ids: A list of results. + session_id: The ID of the session to which the results belongs. + batch_size: Batch size for querying. + + Return: + A dictionnary mapping results to owner task ID. + """ + results = {} + for result_ids_batch in batched(result_ids, batch_size): + request = GetOwnerTaskIdRequest(session_id=session_id, result_id=result_ids_batch) + response: GetOwnerTaskIdResponse = self._client.GetOwnerTaskId(request) + for result_task in response.result_task: + results[result_task.result_id] = result_task.task_id + return results + + def create_results_metadata(self, result_names: List[str], session_id: str, batch_size: int = 100) -> Dict[str, Result]: + """Create the metadata of multiple results at once. + Data have to be uploaded separately. + + Args: + result_names: The list of the names of the results to create. + session_id: The ID of the session to which the results belongs. + batch_size: Batch size for querying. + + Return: + A dictionnary mapping each result name to its corresponding result summary. + """ + results = {} + for result_names_batch in batched(result_names, batch_size): + request = CreateResultsMetaDataRequest( + results=[CreateResultsMetaDataRequest.ResultCreate(name=result_name) for result_name in result_names_batch], + session_id=session_id + ) + response: CreateResultsMetaDataResponse = self._client.CreateResultsMetaData(request) + for result_message in response.results: + results[result_message.name] = Result.from_message(result_message) + return results + + def create_results(self, results_data: Dict[str, bytes], session_id: str, batch_size: int = 1) -> Dict[str, Result]: + """Create one result with data included in the request. + + Args: + results_data: A dictionnary mapping the result names to their actual data. + session_id: The ID of the session to which the results belongs. + batch_size: Batch size for querying. + + Return: + A dictionnary mappin each result name to its corresponding result summary. + """ + results = {} + for results_names_batch in batched(results_data.keys(), batch_size): + request = CreateResultsRequest( + results=[CreateResultsRequest.ResultCreate(name=name, data=results_data[name]) for name in results_names_batch], + session_id=session_id + ) + response: CreateResultsResponse = self._client.CreateResults(request) + for message in response.results: + results[message.name] = Result.from_message(message) + return results + + def upload_result_data(self, result_id: str, session_id: str, result_data: bytes | bytearray) -> None: + """Upload data for an empty result already created. + + Args: + result_id: The ID of the result. + result_data: The result data. + session_id: The ID of the session. + """ + data_chunk_max_size = self.get_service_config() + + def upload_result_stream(): + request = UploadResultDataRequest( + id=UploadResultDataRequest.ResultIdentifier( + session_id=session_id, result_id=result_id + ) + ) + yield request + + start = 0 + data_len = len(result_data) + while start < data_len: + chunk_size = min(data_chunk_max_size, data_len - start) + request = UploadResultDataRequest( + data_chunk=result_data[start : start + chunk_size] + ) + yield request + start += chunk_size + + self._client.UploadResultData(upload_result_stream()) + + def download_result_data(self, result_id: str, session_id: str) -> bytes: + """Retrieve data of a result. + + Args: + result_id: The ID of the result. + session_id: The session of the result. + + Return: + Result data. + """ + request = DownloadResultDataRequest( + result_id=result_id, + session_id=session_id + ) + streaming_call = self._client.DownloadResultData(request) + return b''.join([message.data_chunk for message in streaming_call]) + + def delete_result_data(self, result_ids: List[str], session_id: str, batch_size: int = 100) -> None: + """Delete data from multiple results + + Args: + result_ids: The IDs of the results which data must be deleted. + session_id: The ID of the session to which the results belongs. + batch_size: Batch size for querying. + """ + for result_ids_batch in batched(result_ids, batch_size): + request = DeleteResultsDataRequest( + result_id=result_ids_batch, + session_id=session_id + ) + self._client.DeleteResultsData(request) + + def get_service_config(self) -> int: + """Get the configuration of the service. + + Return: + Maximum size supported by a data chunk for the result service. + """ + response: ResultsServiceConfigurationResponse = self._client.GetServiceConfiguration(Empty()) + return response.data_chunk_max_size + + def watch_results(self): + raise NotImplementedError() diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 001721868..5d44f4c9f 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,4 +1,4 @@ from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability, Session, Result -from .enumwrapper import HealthCheckStatus, TaskStatus, Direction +from .enumwrapper import HealthCheckStatus, TaskStatus, Direction, ResultStatus from .filter import StringFilter, StatusFilter diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index b4bb0af6f..b60a02483 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -3,7 +3,7 @@ import pytest import requests -from armonik.client import ArmoniKTasks, ArmoniKVersions +from armonik.client import ArmoniKResults, ArmoniKTasks, ArmoniKVersions from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub from typing import List, Union @@ -75,6 +75,8 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[ArmoniK """ channel = grpc.insecure_channel(endpoint).__enter__() match client_name: + case "Results": + return ArmoniKResults(channel) case "Tasks": return ArmoniKTasks(channel) case "Versions": diff --git a/packages/python/tests/test_results.py b/packages/python/tests/test_results.py new file mode 100644 index 000000000..cb3dd7d0f --- /dev/null +++ b/packages/python/tests/test_results.py @@ -0,0 +1,116 @@ +import datetime +import pytest +import warnings + +from .conftest import all_rpc_called, rpc_called, get_client +from armonik.client import ArmoniKResults, ResultFieldFilter +from armonik.common import Result, ResultStatus + + +class TestArmoniKResults: + + def test_get_result(self): + results_client: ArmoniKResults = get_client("Results") + result = results_client.get_result("result-name") + + assert rpc_called("Results", "GetResult") + assert isinstance(result, Result) + assert result.session_id == 'session-id' + assert result.name == 'result-name' + assert result.owner_task_id == 'owner-task-id' + assert result.status == 2 + assert result.created_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert result.completed_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert result.result_id == 'result-id' + assert result.size == 0 + + def test_get_owner_task_id(self): + results_client: ArmoniKResults = get_client("Results") + results_tasks = results_client.get_owner_task_id(["result-id"], "session-id") + + assert rpc_called("Results", "GetOwnerTaskId") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert results_tasks == {} + + def test_list_results_no_filter(self): + results_client: ArmoniKResults = get_client("Results") + num, results = results_client.list_results() + + assert rpc_called("Results", "ListResults") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert num == 0 + assert results == [] + + def test_list_results_with_filter(self): + results_client: ArmoniKResults = get_client("Results") + num, results = results_client.list_results(ResultFieldFilter.STATUS == ResultStatus.COMPLETED) + + assert rpc_called("Results", "ListResults", 2) + # TODO: Mock must be updated to return something and so that changes the following assertions + assert num == 0 + assert results == [] + + def test_create_results_metadata(self): + results_client: ArmoniKResults = get_client("Results") + results = results_client.create_results_metadata(["result-name"], "session-id") + + assert rpc_called("Results", "CreateResultsMetaData") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert results == {} + + def test_create_results(self): + results_client: ArmoniKResults = get_client("Results") + results = results_client.create_results({"result-name": b"test data"}, "session-id") + + assert rpc_called("Results", "CreateResults") + assert results == {} + + def test_get_service_config(self): + results_client: ArmoniKResults = get_client("Results") + chunk_size = results_client.get_service_config() + + assert rpc_called("Results", "GetServiceConfiguration") + assert isinstance(chunk_size, int) + assert chunk_size == 81920 + + def test_upload_result_data(self): + results_client: ArmoniKResults = get_client("Results") + result = results_client.upload_result_data("result-name", "session-id", b"test data") + + assert rpc_called("Results", "UploadResultData") + assert result is None + + def test_download_result_data(self): + results_client: ArmoniKResults = get_client("Results") + data = results_client.download_result_data("result-name", "session-id") + + assert rpc_called("Results", "DownloadResultData") + assert data == b"" + + def test_delete_result_data(self): + results_client: ArmoniKResults = get_client("Results") + result = results_client.delete_result_data(["result-name"], "session-id") + + assert rpc_called("Results", "DeleteResultsData") + assert result is None + + def test_watch_results(self): + results_client: ArmoniKResults = get_client("Results") + with pytest.raises(NotImplementedError, match=""): + results_client.watch_results() + assert rpc_called("Results", "WatchResults", 0) + + def test_get_results_ids(self): + with warnings.catch_warnings(record=True) as w: + # Cause all warnings to always be triggered. + warnings.simplefilter("always") + + results_client: ArmoniKResults = get_client("Results") + results = results_client.get_results_ids("session-id", ["result_1"]) + + assert issubclass(w[-1].category, DeprecationWarning) + assert rpc_called("Results", "CreateResultsMetaData", 2) + assert results == {} + + def test_service_fully_implemented(self): + assert all_rpc_called("Results", missings=["WatchResults"]) From f01b42f999c3cbd3329db7f87264a713428d1357 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 4 Jan 2024 12:12:03 +0100 Subject: [PATCH 131/344] refactor: replace click with arparse --- packages/python/fix_imports.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/python/fix_imports.py b/packages/python/fix_imports.py index 6ddf70390..75359adc7 100644 --- a/packages/python/fix_imports.py +++ b/packages/python/fix_imports.py @@ -11,19 +11,13 @@ else: from typing_extensions import TypedDict -import click - +import argparse class ProtobufFilePathInfo(TypedDict): dir: Path path: Path rel_path: Path - -@click.command() -@click.option("--dry", is_flag=True, show_default=True, default=False, - help="Do not write out the changes to the files.") -@click.argument("root_dir", type=click.Path(exists=True)) def fix_protobuf_imports(root_dir, dry): """ A script to fix relative imports (from and to nested sub-directories) within compiled `*_pb2*.py` Protobuf files. @@ -142,7 +136,11 @@ def fix_protobuf_imports_in_file(name, info: ProtobufFilePathInfo, pyi=False): def main(): - fix_protobuf_imports() + parser = argparse.ArgumentParser() + parser.add_argument("root_dir", type=str, help="Path to the root directory") + parser.add_argument("--dry", action="store_true", default=False, help="Do not write out the changes to the files.") + args = parser.parse_args() + fix_protobuf_imports(args.root_dir, args.dry) if __name__ == '__main__': From 888fa21302ede50b2eb2c26b55ca0311b879daf8 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Thu, 4 Jan 2024 13:07:21 +0100 Subject: [PATCH 132/344] feat: Python API update sessions and partitions services --- .../python/src/armonik/client/__init__.py | 2 + .../python/src/armonik/client/partitions.py | 65 +++++++++++++++++ .../python/src/armonik/client/sessions.py | 33 ++++++--- .../python/src/armonik/common/__init__.py | 4 +- .../python/src/armonik/common/enumwrapper.py | 22 ++++++ packages/python/src/armonik/common/objects.py | 22 ++++++ packages/python/tests/conftest.py | 10 ++- packages/python/tests/test_partitions.py | 41 +++++++++++ packages/python/tests/test_sessions.py | 72 +++++++++++++++++++ 9 files changed, 255 insertions(+), 16 deletions(-) create mode 100644 packages/python/src/armonik/client/partitions.py create mode 100644 packages/python/tests/test_partitions.py create mode 100644 packages/python/tests/test_sessions.py diff --git a/packages/python/src/armonik/client/__init__.py b/packages/python/src/armonik/client/__init__.py index a4a7cd74e..398b36ca2 100644 --- a/packages/python/src/armonik/client/__init__.py +++ b/packages/python/src/armonik/client/__init__.py @@ -1,3 +1,5 @@ +from .partitions import ArmoniKPartitions, PartitionFieldFilter +from .sessions import ArmoniKSessions, SessionFieldFilter from .submitter import ArmoniKSubmitter from .tasks import ArmoniKTasks, TaskFieldFilter from .results import ArmoniKResults, ResultFieldFilter diff --git a/packages/python/src/armonik/client/partitions.py b/packages/python/src/armonik/client/partitions.py new file mode 100644 index 000000000..9c72495cc --- /dev/null +++ b/packages/python/src/armonik/client/partitions.py @@ -0,0 +1,65 @@ +from typing import cast, List, Tuple + +from grpc import Channel + +from ..common import Direction, Partition +from ..common.filter import Filter, NumberFilter +from ..protogen.client.partitions_service_pb2_grpc import PartitionsStub +from ..protogen.common.partitions_common_pb2 import ListPartitionsRequest, ListPartitionsResponse, GetPartitionRequest, GetPartitionResponse +from ..protogen.common.partitions_fields_pb2 import PartitionField, PartitionRawField, PARTITION_RAW_ENUM_FIELD_PRIORITY +from ..protogen.common.partitions_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFiltersAnd, FilterField as rawFilterField +from ..protogen.common.sort_direction_pb2 import SortDirection + + +class PartitionFieldFilter: + PRIORITY = NumberFilter( + PartitionField(partition_raw_field=PartitionRawField(field=PARTITION_RAW_ENUM_FIELD_PRIORITY)), + rawFilters, + rawFiltersAnd, + rawFilterField + ) + + +class ArmoniKPartitions: + def __init__(self, grpc_channel: Channel): + """ Result service client + + Args: + grpc_channel: gRPC channel to use + """ + self._client = PartitionsStub(grpc_channel) + + def list_partitions(self, partition_filter: Filter | None = None, page: int = 0, page_size: int = 1000, sort_field: Filter = PartitionFieldFilter.PRIORITY, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Partition]]: + """List partitions based on a filter. + + Args: + partition_filter: Filter to apply when listing partitions + page: page number to request, useful for pagination, defaults to 0 + page_size: size of a page, defaults to 1000 + sort_field: field to sort the resulting list by, defaults to the status + sort_direction: direction of the sort, defaults to ascending + + Returns: + A tuple containing : + - The total number of results for the given filter + - The obtained list of results + """ + request = ListPartitionsRequest( + page=page, + page_size=page_size, + filters=cast(rawFilters, partition_filter.to_disjunction().to_message()) if partition_filter else None, + sort=ListPartitionsRequest.Sort(field=cast(PartitionField, sort_field.field), direction=sort_direction), + ) + response: ListPartitionsResponse = self._client.ListPartitions(request) + return response.total, [Partition.from_message(p) for p in response.partitions] + + def get_partition(self, partition_id: str) -> Partition: + """Get a partition by its ID. + + Args: + partition_id: The partition ID. + + Return: + The partition summary. + """ + return Partition.from_message(self._client.GetPartition(GetPartitionRequest(id=partition_id)).partition) diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 8f676144d..84c96abfd 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -53,14 +53,26 @@ def create_session(self, default_task_options: TaskOptions, partition_ids: Optio Returns: Session Id """ - if partition_ids is None: - partition_ids = [] - request = CreateSessionRequest(default_task_option=default_task_options.to_message()) - for partition in partition_ids: - request.partition_ids.append(partition) + request = CreateSessionRequest( + default_task_option=default_task_options.to_message(), + partition_ids=partition_ids if partition_ids else [] + ) return self._client.CreateSession(request).session_id - def list_sessions(self, task_filter: Filter, page: int = 0, page_size: int = 1000, sort_field: Filter = SessionFieldFilter.STATUS, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Session]]: + def get_session(self, session_id: str): + """Get a session by its ID. + + Args: + session_id: The ID of the session. + + Return: + The session summary. + """ + request = GetSessionRequest(session_id=session_id) + response: GetSessionResponse = self._client.GetSession(request) + return Session.from_message(response.session) + + def list_sessions(self, session_filter: Filter | None = None, page: int = 0, page_size: int = 1000, sort_field: Filter = SessionFieldFilter.STATUS, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Session]]: """ List sessions @@ -76,14 +88,14 @@ def list_sessions(self, task_filter: Filter, page: int = 0, page_size: int = 100 - The total number of sessions for the given filter - The obtained list of sessions """ - request : ListSessionsRequest = ListSessionsRequest( + request = ListSessionsRequest( page=page, page_size=page_size, - filters=cast(rawFilters, task_filter.to_disjunction().to_message()), + filters=cast(rawFilters, session_filter.to_disjunction().to_message()) if session_filter else None, sort=ListSessionsRequest.Sort(field=cast(SessionField, sort_field.field), direction=sort_direction), ) - list_response : ListSessionsResponse = self._client.ListSessions(request) - return list_response.total, [Session.from_message(t) for t in list_response.sessions] + response : ListSessionsResponse = self._client.ListSessions(request) + return response.total, [Session.from_message(s) for s in response.sessions] def cancel_session(self, session_id: str) -> None: """Cancel a session @@ -92,4 +104,3 @@ def cancel_session(self, session_id: str) -> None: session_id: Id of the session to b cancelled """ self._client.CancelSession(CancelSessionRequest(session_id=session_id)) - \ No newline at end of file diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 5d44f4c9f..5901a7262 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,4 +1,4 @@ from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter -from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability, Session, Result -from .enumwrapper import HealthCheckStatus, TaskStatus, Direction, ResultStatus +from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability, Session, Result, Partition +from .enumwrapper import HealthCheckStatus, TaskStatus, Direction, ResultStatus, SessionStatus from .filter import StringFilter, StatusFilter diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 9c19a9a82..d6fe134cb 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -1,8 +1,10 @@ from __future__ import annotations from ..protogen.common.task_status_pb2 import TaskStatus as RawStatus, _TASKSTATUS, TASK_STATUS_CANCELLED, TASK_STATUS_CANCELLING, TASK_STATUS_COMPLETED, TASK_STATUS_CREATING, TASK_STATUS_DISPATCHED, TASK_STATUS_ERROR, TASK_STATUS_PROCESSED, TASK_STATUS_PROCESSING, TASK_STATUS_SUBMITTED, TASK_STATUS_TIMEOUT, TASK_STATUS_UNSPECIFIED, TASK_STATUS_RETRIED +from ..protogen.common.events_common_pb2 import EventsEnum as rawEventsEnum, EVENTS_ENUM_UNSPECIFIED, EVENTS_ENUM_NEW_TASK, EVENTS_ENUM_TASK_STATUS_UPDATE, EVENTS_ENUM_NEW_RESULT, EVENTS_ENUM_RESULT_STATUS_UPDATE, EVENTS_ENUM_RESULT_OWNER_UPDATE from ..protogen.common.session_status_pb2 import SessionStatus as RawSessionStatus, _SESSIONSTATUS, SESSION_STATUS_UNSPECIFIED, SESSION_STATUS_CANCELLED, SESSION_STATUS_RUNNING from ..protogen.common.result_status_pb2 import ResultStatus as RawResultStatus, _RESULTSTATUS, RESULT_STATUS_UNSPECIFIED, RESULT_STATUS_CREATED, RESULT_STATUS_COMPLETED, RESULT_STATUS_ABORTED, RESULT_STATUS_NOTFOUND +from ..protogen.common.health_checks_common_pb2 import HEALTH_STATUS_ENUM_UNSPECIFIED, HEALTH_STATUS_ENUM_HEALTHY, HEALTH_STATUS_ENUM_DEGRADED, HEALTH_STATUS_ENUM_UNHEALTHY from ..protogen.common.worker_common_pb2 import HealthCheckReply from ..protogen.common.sort_direction_pb2 import SORT_DIRECTION_ASC, SORT_DIRECTION_DESC @@ -58,3 +60,23 @@ def name_from_value(status: RawResultStatus) -> str: COMPLETED = RESULT_STATUS_COMPLETED ABORTED = RESULT_STATUS_ABORTED NOTFOUND = RESULT_STATUS_NOTFOUND + + +class EventTypes: + UNSPECIFIED = EVENTS_ENUM_UNSPECIFIED + NEW_TASK = EVENTS_ENUM_NEW_TASK + TASK_STATUS_UPDATE = EVENTS_ENUM_TASK_STATUS_UPDATE + NEW_RESULT = EVENTS_ENUM_NEW_RESULT + RESULT_STATUS_UPDATE = EVENTS_ENUM_RESULT_STATUS_UPDATE + RESULT_OWNER_UPDATE = EVENTS_ENUM_RESULT_OWNER_UPDATE + + @classmethod + def from_string(cls, name: str): + return getattr(cls, name.upper()) + + +class ServiceHealthCheckStatus: + UNSPECIFIED = HEALTH_STATUS_ENUM_UNSPECIFIED + HEALTHY = HEALTH_STATUS_ENUM_HEALTHY + DEGRADED = HEALTH_STATUS_ENUM_DEGRADED + UNHEALTHY = HEALTH_STATUS_ENUM_UNHEALTHY diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 340821b8f..1b5801f7a 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -215,3 +215,25 @@ def from_message(cls, result_raw: ResultRaw) -> "Result": result_id=result_raw.result_id, size=result_raw.size ) + +@dataclass +class Partition: + id: str + parent_partition_ids: List[str] + pod_reserved: int + pod_max: int + pod_configuration: Dict[str, str] + preemption_percentage: int + priority: int + + @classmethod + def from_message(cls, partition_raw: PartitionRaw) -> "Partition": + return cls( + id=partition_raw.id, + parent_partition_ids=partition_raw.parent_partition_ids, + pod_reserved=partition_raw.pod_reserved, + pod_max=partition_raw.pod_max, + pod_configuration=partition_raw.pod_configuration, + preemption_percentage=partition_raw.preemption_percentage, + priority=partition_raw.priority + ) diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index b60a02483..0e3a46067 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -3,7 +3,7 @@ import pytest import requests -from armonik.client import ArmoniKResults, ArmoniKTasks, ArmoniKVersions +from armonik.client import ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub from typing import List, Union @@ -54,7 +54,7 @@ def clean_up(request): print("An error occurred when resetting the server: " + str(e)) -def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[ArmoniKTasks, ArmoniKVersions]: +def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions]: """ Get the ArmoniK client instance based on the specified service name. @@ -63,7 +63,7 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[ArmoniK endpoint (str, optional): The gRPC server endpoint. Defaults to grpc_endpoint. Returns: - Union[ArmoniKTasks, ArmoniKVersions] + Union[ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions] An instance of the specified ArmoniK client. Raises: @@ -75,8 +75,12 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[ArmoniK """ channel = grpc.insecure_channel(endpoint).__enter__() match client_name: + case "Partitions": + return ArmoniKPartitions(channel) case "Results": return ArmoniKResults(channel) + case "Sessions": + return ArmoniKSessions(channel) case "Tasks": return ArmoniKTasks(channel) case "Versions": diff --git a/packages/python/tests/test_partitions.py b/packages/python/tests/test_partitions.py new file mode 100644 index 000000000..d46bd3063 --- /dev/null +++ b/packages/python/tests/test_partitions.py @@ -0,0 +1,41 @@ +from .conftest import all_rpc_called, rpc_called, get_client +from armonik.client import ArmoniKPartitions, PartitionFieldFilter +from armonik.common import Partition + + +class TestArmoniKPartitions: + + def test_get_partitions(self): + partitions_client: ArmoniKPartitions = get_client("Partitions") + partition = partitions_client.get_partition("partition-id") + + assert rpc_called("Partitions", "GetPartition") + assert isinstance(partition, Partition) + assert partition.id == 'partition-id' + assert partition.parent_partition_ids == [] + assert partition.pod_reserved == 1 + assert partition.pod_max == 1 + assert partition.pod_configuration == {} + assert partition.preemption_percentage == 0 + assert partition.priority == 1 + + def test_list_partitions_no_filter(self): + partitions_client: ArmoniKPartitions = get_client("Partitions") + num, partitions = partitions_client.list_partitions() + + assert rpc_called("Partitions", "GetPartition") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert num == 0 + assert partitions == [] + + def test_list_partitions_with_filter(self): + partitions_client: ArmoniKPartitions = get_client("Partitions") + num, partitions = partitions_client.list_partitions(PartitionFieldFilter.PRIORITY == 1) + + assert rpc_called("Partitions", "GetPartition", 2) + # TODO: Mock must be updated to return something and so that changes the following assertions + assert num == 0 + assert partitions == [] + + def test_service_fully_implemented(self): + assert all_rpc_called("Partitions") diff --git a/packages/python/tests/test_sessions.py b/packages/python/tests/test_sessions.py new file mode 100644 index 000000000..c4c0173a4 --- /dev/null +++ b/packages/python/tests/test_sessions.py @@ -0,0 +1,72 @@ +import datetime + +from .conftest import all_rpc_called, rpc_called, get_client +from armonik.client import ArmoniKSessions, SessionFieldFilter +from armonik.common import Session, SessionStatus, TaskOptions + + +class TestArmoniKSessions: + + def test_create_session(self): + sessions_client: ArmoniKSessions = get_client("Sessions") + default_task_options = TaskOptions( + max_duration=datetime.timedelta(seconds=1), + priority=1, + max_retries=1 + ) + session_id = sessions_client.create_session(default_task_options) + + assert rpc_called("Sessions", "CreateSession") + assert session_id == "session-id" + + def test_get_session(self): + sessions_client: ArmoniKSessions = get_client("Sessions") + session = sessions_client.get_session("session-id") + + assert rpc_called("Sessions", "GetSession") + assert isinstance(session, Session) + assert session.session_id == 'session-id' + assert session.status == SessionStatus.CANCELLED + assert session.partition_ids == [] + assert session.options == TaskOptions( + max_duration=datetime.timedelta(0), + priority=0, + max_retries=0, + partition_id='', + application_name='', + application_version='', + application_namespace='', + application_service='', + engine_type='', + options={} + ) + assert session.created_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert session.cancelled_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + assert session.duration == datetime.timedelta(0) + + def test_list_session_no_filter(self): + sessions_client: ArmoniKSessions = get_client("Sessions") + num, sessions = sessions_client.list_sessions() + + assert rpc_called("Sessions", "ListSessions") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert num == 0 + assert sessions == [] + + def test_list_session_with_filter(self): + sessions_client: ArmoniKSessions = get_client("Sessions") + num, sessions = sessions_client.list_sessions(SessionFieldFilter.STATUS == SessionStatus.RUNNING) + + assert rpc_called("Sessions", "ListSessions", 2) + # TODO: Mock must be updated to return something and so that changes the following assertions + assert num == 0 + assert sessions == [] + + def test_cancel_session(self): + sessions_client: ArmoniKSessions = get_client("Sessions") + sessions_client.cancel_session("session-id") + + assert rpc_called("Sessions", "CancelSession") + + def test_service_fully_implemented(self): + assert all_rpc_called("Sessions") From cf8c860ce4cd928bcd7284e52750cff5630f1fb2 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 4 Jan 2024 13:38:58 +0100 Subject: [PATCH 133/344] refactor: remove click dependency from proto2python.sh --- packages/python/proto2python.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh index c2fe45244..1b6b45173 100755 --- a/packages/python/proto2python.sh +++ b/packages/python/proto2python.sh @@ -33,7 +33,7 @@ python -m pip install --upgrade pip python -m venv $PYTHON_VENV source $PYTHON_VENV/bin/activate # We need to fix grpc to 1.56 until this bug is solved : https://github.com/grpc/grpc/issues/34305 -python -m pip install build grpcio==1.56.2 grpcio-tools==1.56.2 click pytest setuptools_scm[toml] +python -m pip install build grpcio==1.56.2 grpcio-tools==1.56.2 pytest setuptools_scm[toml] unset proto_files for proto in ${armonik_worker_files[@]}; do From d500601eaeed37a9b3bf0bedf1b631878a4560b1 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 4 Jan 2024 14:11:31 +0100 Subject: [PATCH 134/344] refactor: explicit existing directroy error --- packages/python/fix_imports.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/python/fix_imports.py b/packages/python/fix_imports.py index 75359adc7..a6a319a9a 100644 --- a/packages/python/fix_imports.py +++ b/packages/python/fix_imports.py @@ -24,6 +24,9 @@ def fix_protobuf_imports(root_dir, dry): """ root_dir = Path(root_dir) + if not root_dir.is_dir(): + print(f"Error: The specified root directory '{root_dir}' does not exist.") + sys.exit(1) def generate_lookup(path: Path) -> Tuple[str, ProtobufFilePathInfo]: name = path.name.split(".")[0] From 7eaf603261f6c7bc5fbf1c721d7099da5191bb7a Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 4 Jan 2024 16:12:19 +0100 Subject: [PATCH 135/344] refactor: test on directory existence --- packages/python/fix_imports.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/python/fix_imports.py b/packages/python/fix_imports.py index a6a319a9a..b0aea720a 100644 --- a/packages/python/fix_imports.py +++ b/packages/python/fix_imports.py @@ -24,9 +24,6 @@ def fix_protobuf_imports(root_dir, dry): """ root_dir = Path(root_dir) - if not root_dir.is_dir(): - print(f"Error: The specified root directory '{root_dir}' does not exist.") - sys.exit(1) def generate_lookup(path: Path) -> Tuple[str, ProtobufFilePathInfo]: name = path.name.split(".")[0] @@ -140,9 +137,11 @@ def fix_protobuf_imports_in_file(name, info: ProtobufFilePathInfo, pyi=False): def main(): parser = argparse.ArgumentParser() - parser.add_argument("root_dir", type=str, help="Path to the root directory") + parser.add_argument("root_dir", type=Path, help="Path to the root directory") parser.add_argument("--dry", action="store_true", default=False, help="Do not write out the changes to the files.") args = parser.parse_args() + if not args.root_dir.is_dir(): + raise argparse.ArgumentTypeError(f"Directory '{args.root_dir}' does not exist.") fix_protobuf_imports(args.root_dir, args.dry) From 8db1c531b3d1495ccfbdbe7b2060e1e1bb14dc52 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo <136341946+jeremyzyngeraneo@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:20:59 +0100 Subject: [PATCH 136/344] Update packages/python/proto2python.sh Co-authored-by: ngruelaneo <100275739+ngruelaneo@users.noreply.github.com> --- packages/python/proto2python.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh index 1b6b45173..44860be05 100755 --- a/packages/python/proto2python.sh +++ b/packages/python/proto2python.sh @@ -33,7 +33,7 @@ python -m pip install --upgrade pip python -m venv $PYTHON_VENV source $PYTHON_VENV/bin/activate # We need to fix grpc to 1.56 until this bug is solved : https://github.com/grpc/grpc/issues/34305 -python -m pip install build grpcio==1.56.2 grpcio-tools==1.56.2 pytest setuptools_scm[toml] +python -m pip install build grpcio==1.56.2 grpcio-tools==1.56.2 setuptools_scm[toml] unset proto_files for proto in ${armonik_worker_files[@]}; do From 88a645f9a0dc14a0f12063824075f625d6abd699 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Thu, 4 Jan 2024 16:24:01 +0100 Subject: [PATCH 137/344] Fix partitions service tests --- packages/python/tests/test_partitions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/python/tests/test_partitions.py b/packages/python/tests/test_partitions.py index d46bd3063..2c7b9808b 100644 --- a/packages/python/tests/test_partitions.py +++ b/packages/python/tests/test_partitions.py @@ -23,7 +23,7 @@ def test_list_partitions_no_filter(self): partitions_client: ArmoniKPartitions = get_client("Partitions") num, partitions = partitions_client.list_partitions() - assert rpc_called("Partitions", "GetPartition") + assert rpc_called("Partitions", "ListPartitions") # TODO: Mock must be updated to return something and so that changes the following assertions assert num == 0 assert partitions == [] @@ -32,7 +32,7 @@ def test_list_partitions_with_filter(self): partitions_client: ArmoniKPartitions = get_client("Partitions") num, partitions = partitions_client.list_partitions(PartitionFieldFilter.PRIORITY == 1) - assert rpc_called("Partitions", "GetPartition", 2) + assert rpc_called("Partitions", "ListPartitions", 2) # TODO: Mock must be updated to return something and so that changes the following assertions assert num == 0 assert partitions == [] From a5117c88bd2a1cc9f9a627eedc7d7d78b8886123 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Fri, 5 Jan 2024 09:15:06 +0100 Subject: [PATCH 138/344] fix: Python API fix tasks service --- .../csharp/ArmoniK.Api.Mock/Services/Tasks.cs | 32 ++++++--- .../python/src/armonik/common/enumwrapper.py | 7 +- packages/python/tests/test_tasks.py | 71 ++++++++++--------- 3 files changed, 61 insertions(+), 49 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs index 2fa3a29c0..cc9780796 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs @@ -14,6 +14,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Collections.Generic; using System.Threading.Tasks; using ArmoniK.Api.gRPC.V1; @@ -67,8 +68,8 @@ public override Task ListTasks(ListTasksRequest request, ServerCallContext context) => Task.FromResult(new ListTasksResponse { - Page = 0, - Total = 0, + Page = 1, + Total = 1, PageSize = request.PageSize, }); @@ -87,19 +88,28 @@ public override Task CancelTasks(CancelTasksRequest request /// [Count] public override Task CountTasksByStatus(CountTasksByStatusRequest request, - ServerCallContext context) - => Task.FromResult(new CountTasksByStatusResponse()); + ServerCallContext context) + { + var result = new CountTasksByStatusResponse(); + result.Status.Add(new StatusCount{Status=TaskStatus.Completed, Count=2}); + result.Status.Add(new StatusCount{Status=TaskStatus.Submitted, Count=5}); + return Task.FromResult(result); + } /// [Count] - public override Task ListTasksDetailed(ListTasksRequest request, + public override Task ListTasksDetailed(ListTasksRequest request, ServerCallContext context) - => Task.FromResult(new ListTasksDetailedResponse - { - Page = 0, - Total = 0, - PageSize = request.PageSize, - }); + { + var result = new ListTasksDetailedResponse + { + Page = 0, + Total = 1, + PageSize = request.PageSize, + }; + result.Tasks.Add(MockTask); + return Task.FromResult(result); + } /// [Count] diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index d6fe134cb..65e8e3162 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -1,4 +1,5 @@ from __future__ import annotations +from enum import IntEnum from ..protogen.common.task_status_pb2 import TaskStatus as RawStatus, _TASKSTATUS, TASK_STATUS_CANCELLED, TASK_STATUS_CANCELLING, TASK_STATUS_COMPLETED, TASK_STATUS_CREATING, TASK_STATUS_DISPATCHED, TASK_STATUS_ERROR, TASK_STATUS_PROCESSED, TASK_STATUS_PROCESSING, TASK_STATUS_SUBMITTED, TASK_STATUS_TIMEOUT, TASK_STATUS_UNSPECIFIED, TASK_STATUS_RETRIED from ..protogen.common.events_common_pb2 import EventsEnum as rawEventsEnum, EVENTS_ENUM_UNSPECIFIED, EVENTS_ENUM_NEW_TASK, EVENTS_ENUM_TASK_STATUS_UPDATE, EVENTS_ENUM_NEW_RESULT, EVENTS_ENUM_RESULT_STATUS_UPDATE, EVENTS_ENUM_RESULT_OWNER_UPDATE @@ -17,11 +18,7 @@ class HealthCheckStatus: UNKNOWN = HealthCheckReply.UNKNOWN -class TaskStatus: - @staticmethod - def name_from_value(status: RawStatus) -> str: - return _TASKSTATUS.values_by_number[status].name - +class TaskStatus(IntEnum): CANCELLED = TASK_STATUS_CANCELLED CANCELLING = TASK_STATUS_CANCELLING COMPLETED = TASK_STATUS_COMPLETED diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py index f004cb8b3..91e5f4dff 100644 --- a/packages/python/tests/test_tasks.py +++ b/packages/python/tests/test_tasks.py @@ -6,22 +6,18 @@ class TestArmoniKTasks: - - def test_get_task(self): - tasks_client: ArmoniKTasks = get_client("Tasks") - task = tasks_client.get_task("task-id") - - assert rpc_called("Tasks", "GetTask") - assert isinstance(task, Task) - assert task.id == 'task-id' - assert task.session_id == 'session-id' - assert task.data_dependencies == [] - assert task.expected_output_ids == [] - assert task.retry_of_ids == [] - assert task.status == TaskStatus.COMPLETED - assert task.payload_id is None - assert task.status_message == '' - assert task.options == TaskOptions( + mock_task = Task( + id='task-id', + session_id='session-id', + owner_pod_id='', + parent_task_ids=[], + data_dependencies=[], + expected_output_ids=[], + retry_of_ids=[], + status=4, + payload_id=None, + status_message='', + options=TaskOptions( max_duration=datetime.timedelta(seconds=1), priority=1, max_retries=1, @@ -32,39 +28,48 @@ def test_get_task(self): application_service='application-service', engine_type='engine-type', options={} - ) - assert task.created_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) - assert task.submitted_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) - assert task.started_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) - assert task.ended_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) - assert task.pod_ttl == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) - assert task.output == Output(error='') - assert task.pod_hostname == '' - assert task.received_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) - assert task.acquired_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + ), + created_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + submitted_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + started_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + ended_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + pod_ttl=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + output=Output(error=''), + pod_hostname='', + received_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + acquired_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + ) + + def test_get_task(self): + tasks_client: ArmoniKTasks = get_client("Tasks") + task = tasks_client.get_task("task-id") + + assert rpc_called("Tasks", "GetTask") + assert isinstance(task, Task) + assert task == self.mock_task def test_list_tasks_detailed_no_filter(self): tasks_client: ArmoniKTasks = get_client("Tasks") num, tasks = tasks_client.list_tasks() assert rpc_called("Tasks", "ListTasksDetailed") # TODO: Mock must be updated to return something and so that changes the following assertions - assert num == 0 - assert tasks == [] + assert num == 1 + assert tasks == [self.mock_task] def test_list_tasks_detailed_with_filter(self): tasks_client: ArmoniKTasks = get_client("Tasks") num, tasks = tasks_client.list_tasks(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) assert rpc_called("Tasks", "ListTasksDetailed", 2) # TODO: Mock must be updated to return something and so that changes the following assertions - assert num == 0 - assert tasks == [] + assert num == 1 + assert tasks == [self.mock_task] def test_list_tasks_no_detailed_no_filter(self): tasks_client: ArmoniKTasks = get_client("Tasks") num, tasks = tasks_client.list_tasks(detailed=False) assert rpc_called("Tasks", "ListTasks") # TODO: Mock must be updated to return something and so that changes the following assertions - assert num == 0 + assert num == 1 assert tasks == [] def test_cancel_tasks(self): @@ -86,14 +91,14 @@ def test_count_tasks_by_status_no_filter(self): count = tasks_client.count_tasks_by_status() assert rpc_called("Tasks", "CountTasksByStatus") # TODO: Mock must be updated to return something and so that changes the following assertions - assert count == {} + assert count == {TaskStatus.COMPLETED: 2, TaskStatus.SUBMITTED: 5} def test_count_tasks_by_status_with_filter(self): tasks_client: ArmoniKTasks = get_client("Tasks") count = tasks_client.count_tasks_by_status(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) assert rpc_called("Tasks", "CountTasksByStatus", 2) # TODO: Mock must be updated to return something and so that changes the following assertions - assert count == {} + assert count == {TaskStatus.COMPLETED: 2, TaskStatus.SUBMITTED: 5} def test_submit_tasks(self): tasks_client: ArmoniKTasks = get_client("Tasks") From fa1cc51b2329875f579123ffd4a67942a0e090f5 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Fri, 5 Jan 2024 10:08:14 +0100 Subject: [PATCH 139/344] Refactor Mock update code --- .../csharp/ArmoniK.Api.Mock/Services/Tasks.cs | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs index cc9780796..fd1acfe18 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Tasks.cs @@ -14,7 +14,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System.Collections.Generic; using System.Threading.Tasks; using ArmoniK.Api.gRPC.V1; @@ -88,28 +87,38 @@ public override Task CancelTasks(CancelTasksRequest request /// [Count] public override Task CountTasksByStatus(CountTasksByStatusRequest request, - ServerCallContext context) - { - var result = new CountTasksByStatusResponse(); - result.Status.Add(new StatusCount{Status=TaskStatus.Completed, Count=2}); - result.Status.Add(new StatusCount{Status=TaskStatus.Submitted, Count=5}); - return Task.FromResult(result); - } + ServerCallContext context) + => Task.FromResult(new CountTasksByStatusResponse + { + Status = + { + new StatusCount + { + Status = TaskStatus.Completed, + Count = 2, + }, + new StatusCount + { + Status = TaskStatus.Submitted, + Count = 5, + }, + }, + }); /// [Count] - public override Task ListTasksDetailed(ListTasksRequest request, + public override Task ListTasksDetailed(ListTasksRequest request, ServerCallContext context) - { - var result = new ListTasksDetailedResponse - { - Page = 0, - Total = 1, - PageSize = request.PageSize, - }; - result.Tasks.Add(MockTask); - return Task.FromResult(result); - } + => Task.FromResult(new ListTasksDetailedResponse + { + Page = 0, + Total = 1, + PageSize = request.PageSize, + Tasks = + { + MockTask, + }, + }); /// [Count] From e3dda39ac32a602b5c648054a8f9add6464b4db8 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Fri, 5 Jan 2024 09:31:56 +0100 Subject: [PATCH 140/344] feat: Python API update taskhandler and worker --- .../python/src/armonik/worker/__init__.py | 6 + .../python/src/armonik/worker/taskhandler.py | 103 +++++++++++++++-- packages/python/tests/conftest.py | 7 +- packages/python/tests/test_taskhandler.py | 108 ++++++++++++++++++ packages/python/tests/test_worker.py | 80 +++++++++++++ 5 files changed, 291 insertions(+), 13 deletions(-) create mode 100644 packages/python/tests/test_taskhandler.py create mode 100644 packages/python/tests/test_worker.py diff --git a/packages/python/src/armonik/worker/__init__.py b/packages/python/src/armonik/worker/__init__.py index 508d49ae5..78a61174c 100644 --- a/packages/python/src/armonik/worker/__init__.py +++ b/packages/python/src/armonik/worker/__init__.py @@ -1,3 +1,9 @@ from .worker import ArmoniKWorker from .taskhandler import TaskHandler from .seqlogger import ClefLogger + +__all__ = [ + 'ArmoniKWorker', + 'TaskHandler', + 'ClefLogger', +] diff --git a/packages/python/src/armonik/worker/taskhandler.py b/packages/python/src/armonik/worker/taskhandler.py index 49eeb8ff3..7d18ef7db 100644 --- a/packages/python/src/armonik/worker/taskhandler.py +++ b/packages/python/src/armonik/worker/taskhandler.py @@ -1,12 +1,14 @@ from __future__ import annotations import os +from deprecation import deprecated from typing import Optional, Dict, List, Tuple, Union, cast -from ..common import TaskOptions, TaskDefinition, Task -from ..protogen.common.agent_common_pb2 import CreateTaskRequest, CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, NotifyResultDataRequest +from ..common import TaskOptions, TaskDefinition, Task, Result +from ..protogen.common.agent_common_pb2 import CreateTaskRequest, CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, NotifyResultDataRequest, CreateResultsRequest, CreateResultsResponse, SubmitTasksRequest, SubmitTasksResponse from ..protogen.common.objects_pb2 import TaskRequest, DataChunk, InitTaskRequest, TaskRequestHeader, Configuration from ..protogen.worker.agent_service_pb2_grpc import AgentStub from ..protogen.common.worker_common_pb2 import ProcessRequest +from ..common.helpers import batched class TaskHandler: @@ -31,6 +33,7 @@ def __init__(self, request: ProcessRequest, agent_client: AgentStub): with open(os.path.join(self.data_folder, dd), "rb") as f: self.data_dependencies[dd] = f.read() + @deprecated(deprecated_in="3.15.0", details="Use submit_tasks and instead and create the payload using create_result_metadata and send_result") def create_tasks(self, tasks: List[TaskDefinition], task_options: Optional[TaskOptions] = None) -> Tuple[List[Task], List[str]]: """Create new tasks for ArmoniK @@ -67,21 +70,99 @@ def create_tasks(self, tasks: List[TaskDefinition], task_options: Optional[TaskO raise Exception("Unknown value") return tasks_created, tasks_creation_failed - def send_result(self, key: str, data: Union[bytes, bytearray]) -> None: - """ Send task result + def submit_tasks(self, tasks: List[TaskDefinition], default_task_options: Optional[TaskOptions] = None, batch_size: Optional[int] = 100) -> None: + """Submit tasks to the agent. Args: - key: Result key - data: Result data + tasks: List of task definitions + default_task_options: Default Task Options used if a task has its options not set + batch_size: Batch size for submission """ - with open(os.path.join(self.data_folder, key), "wb") as f: - f.write(data) + for tasks_batch in batched(tasks, batch_size): + task_creations = [] + + for t in tasks_batch: + task_creation = SubmitTasksRequest.TaskCreation( + expected_output_keys=t.expected_output_ids, + payload_id=t.payload_id, + data_dependencies=t.data_dependencies + ) + if t.options: + task_creation.task_options=t.options.to_message() + task_creations.append(task_creation) + + request = SubmitTasksRequest( + session_id=self.session_id, + communication_token=self.token, + task_creations=task_creations + ) + + if default_task_options: + request.task_options=default_task_options.to_message(), - self._client.NotifyResultData(NotifyResultDataRequest(ids=[NotifyResultDataRequest.ResultIdentifier(session_id=self.session_id, result_id=key)], communication_token=self.token)) + self._client.SubmitTasks(request) - def get_results_ids(self, names: List[str]) -> Dict[str, str]: - return {r.name: r.result_id for r in cast(CreateResultsMetaDataResponse, self._client.CreateResultsMetaData(CreateResultsMetaDataRequest(results=[CreateResultsMetaDataRequest.ResultCreate(name=n) for n in names], session_id=self.session_id, communication_token=self.token))).results} + def send_results(self, results_data: Dict[str, bytes | bytearray]) -> None: + """Send results. + Args: + result_data: A dictionnary mapping each result ID to its data. + """ + for result_id, result_data in results_data.items(): + with open(os.path.join(self.data_folder, result_id), "wb") as f: + f.write(result_data) + + request = NotifyResultDataRequest( + ids=[NotifyResultDataRequest.ResultIdentifier(session_id=self.session_id, result_id=result_id) for result_id in results_data.keys()], + communication_token=self.token + ) + self._client.NotifyResultData(request) + + def create_results_metadata(self, result_names: List[str], batch_size: int = 100) -> Dict[str, List[Result]]: + """ + Create the metadata of multiple results at once. + Data have to be uploaded separately. + + Args: + result_names: The names of the results to create. + batch_size: Batch size for querying. + + Return: + A dictionnary mapping each result name to its result summary. + """ + results = {} + for result_names_batch in batched(result_names, batch_size): + request = CreateResultsMetaDataRequest( + results=[CreateResultsMetaDataRequest.ResultCreate(name=result_name) for result_name in result_names], + session_id=self.session_id, + communication_token=self.token + ) + response: CreateResultsMetaDataResponse = self._client.CreateResultsMetaData(request) + for result_message in response.results: + results[result_message.name] = Result.from_message(result_message) + return results + + def create_results(self, results_data: Dict[str, bytes], batch_size: int = 1) -> Dict[str, Result]: + """Create one result with data included in the request. + + Args: + results_data: A dictionnary mapping the result names to their actual data. + batch_size: Batch size for querying. + + Return: + A dictionnary mappin each result name to its corresponding result summary. + """ + results = {} + for results_ids_batch in batched(results_data.keys(), batch_size): + request = CreateResultsRequest( + results=[CreateResultsRequest.ResultCreate(name=name, data=results_data[name]) for name in results_ids_batch], + session_id=self.session_id, + communication_token=self.token + ) + response: CreateResultsResponse = self._client.CreateResults(request) + for message in response.results: + results[message.name] = Result.from_message(message) + return results def _to_request_stream_internal(request, communication_token, is_last, chunk_max_size): req = CreateTaskRequest( diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index 0e3a46067..c5eaada26 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -44,6 +44,7 @@ def clean_up(request): # Remove the temporary files created for testing os.remove(os.path.join(data_folder, "payload-id")) os.remove(os.path.join(data_folder, "dd-id")) + os.remove(os.path.join(data_folder, "result-id")) # Reset the mock server counters try: @@ -54,7 +55,7 @@ def clean_up(request): print("An error occurred when resetting the server: " + str(e)) -def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions]: +def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[AgentStub, ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions]: """ Get the ArmoniK client instance based on the specified service name. @@ -63,7 +64,7 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[ArmoniK endpoint (str, optional): The gRPC server endpoint. Defaults to grpc_endpoint. Returns: - Union[ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions] + Union[AgentStub, ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions] An instance of the specified ArmoniK client. Raises: @@ -75,6 +76,8 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[ArmoniK """ channel = grpc.insecure_channel(endpoint).__enter__() match client_name: + case "Agent": + return AgentStub(channel) case "Partitions": return ArmoniKPartitions(channel) case "Results": diff --git a/packages/python/tests/test_taskhandler.py b/packages/python/tests/test_taskhandler.py new file mode 100644 index 000000000..f5e8634eb --- /dev/null +++ b/packages/python/tests/test_taskhandler.py @@ -0,0 +1,108 @@ +import datetime +import logging +import warnings + +from .conftest import all_rpc_called, rpc_called, get_client, data_folder +from armonik.common import TaskDefinition, TaskOptions +from armonik.worker import TaskHandler +from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub +from armonik.protogen.common.worker_common_pb2 import ProcessRequest +from armonik.protogen.common.objects_pb2 import Configuration + + +logging.basicConfig() +logging.getLogger().setLevel(logging.INFO) + + +class TestTaskHandler: + + request =ProcessRequest( + communication_token="token", + session_id="session-id", + task_id="task-id", + expected_output_keys=["result-id"], + payload_id="payload-id", + data_dependencies=["dd-id"], + data_folder=data_folder, + configuration=Configuration(data_chunk_max_size=8000), + task_options=TaskOptions( + max_duration=datetime.timedelta(seconds=1), + priority=1, + max_retries=1 + ).to_message() + ) + + def test_taskhandler_init(self): + task_handler = TaskHandler(self.request, get_client("Agent")) + + assert task_handler.session_id == "session-id" + assert task_handler.task_id == "task-id" + assert task_handler.task_options == TaskOptions( + max_duration=datetime.timedelta(seconds=1), + priority=1, + max_retries=1, + partition_id='', + application_name='', + application_version='', + application_namespace='', + application_service='', + engine_type='', + options={} + ) + assert task_handler.token == "token" + assert task_handler.expected_results == ["result-id"] + assert task_handler.configuration == Configuration(data_chunk_max_size=8000) + assert task_handler.payload_id == "payload-id" + assert task_handler.data_folder == data_folder + assert task_handler.payload == "payload".encode() + assert task_handler.data_dependencies == {"dd-id": "dd".encode()} + + def test_create_task(self): + with warnings.catch_warnings(record=True) as w: + # Cause all warnings to always be triggered. + warnings.simplefilter("always") + + task_handler = TaskHandler(self.request, get_client("Agent")) + tasks, errors = task_handler.create_tasks([TaskDefinition( + payload=b"payload", + expected_output_ids=["result-id"], + data_dependencies=[])]) + + assert issubclass(w[-1].category, DeprecationWarning) + assert rpc_called("Agent", "CreateTask") + assert tasks == [] + assert errors == [] + + def test_submit_tasks(self): + task_handler = TaskHandler(self.request, get_client("Agent")) + tasks = task_handler.submit_tasks([TaskDefinition(payload_id="payload-id", + expected_output_ids=["result-id"], + data_dependencies=[])] + ) + + assert rpc_called("Agent", "SubmitTasks") + assert tasks is None + + def test_send_results(self): + task_handler = TaskHandler(self.request, get_client("Agent")) + resuls = task_handler.send_results({"result-id": b"result data"}) + assert rpc_called("Agent", "NotifyResultData") + assert resuls is None + + def test_create_result_metadata(self): + task_handler = TaskHandler(self.request, get_client("Agent")) + results = task_handler.create_results_metadata(["result-name"]) + + assert rpc_called("Agent", "CreateResultsMetaData") + # TODO: Mock must be updated to return something and so that changes the following assertions + assert results == {} + + def test_create_results(self): + task_handler = TaskHandler(self.request, get_client("Agent")) + results = task_handler.create_results({"result-name": b"test data"}) + + assert rpc_called("Agent", "CreateResults") + assert results == {} + + def test_service_fully_implemented(self): + assert all_rpc_called("Agent", missings=["GetCommonData", "GetDirectData", "GetResourceData"]) diff --git a/packages/python/tests/test_worker.py b/packages/python/tests/test_worker.py new file mode 100644 index 000000000..42198bcdf --- /dev/null +++ b/packages/python/tests/test_worker.py @@ -0,0 +1,80 @@ +import datetime +import grpc +import logging +import os +import pytest + +from .conftest import data_folder, grpc_endpoint +from armonik.worker import ArmoniKWorker, TaskHandler, ClefLogger +from armonik.common import Output, TaskOptions +from armonik.protogen.common.objects_pb2 import Empty, Configuration +from armonik.protogen.common.worker_common_pb2 import ProcessRequest + + +def do_nothing(_: TaskHandler) -> Output: + return Output() + + +def throw_error(_: TaskHandler) -> Output: + raise ValueError("TestError") + + +def return_error(_: TaskHandler) -> Output: + return Output("TestError") + + +def return_and_send(th: TaskHandler) -> Output: + th.send_results({th.expected_results[0]: b"result"}) + return Output() + + +class TestWorker: + + request = ProcessRequest( + communication_token="token", + session_id="session-id", + task_id="task-id", + expected_output_keys=["result-id"], + payload_id="payload-id", + data_dependencies=["dd-id"], + data_folder=data_folder, + configuration=Configuration(data_chunk_max_size=8000), + task_options=TaskOptions( + max_duration=datetime.timedelta(seconds=1), + priority=1, + max_retries=1 + ).to_message() + ) + + def test_do_nothing(self): + with grpc.insecure_channel(grpc_endpoint) as agent_channel: + worker = ArmoniKWorker(agent_channel, do_nothing, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) + reply = worker.Process(self.request, None) + assert Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None).success + worker.HealthCheck(Empty(), None) + + def test_should_return_none(self): + with grpc.insecure_channel(grpc_endpoint) as agent_channel: + worker = ArmoniKWorker(agent_channel, throw_error, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) + reply = worker.Process(self.request, None) + assert reply is None + + def test_should_error(self): + with grpc.insecure_channel(grpc_endpoint) as agent_channel: + worker = ArmoniKWorker(agent_channel, return_error, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) + reply = worker.Process(self.request, None) + output = Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None) + assert not output.success + assert output.error == "TestError" + + def test_should_write_result(self): + with grpc.insecure_channel(grpc_endpoint) as agent_channel: + worker = ArmoniKWorker(agent_channel, return_and_send, logger=ClefLogger("TestLogger", level=logging.DEBUG)) + reply = worker.Process(self.request, None) + assert reply is not None + output = Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None) + assert output.success + assert os.path.exists(os.path.join(data_folder, self.request.expected_output_keys[0])) + with open(os.path.join(data_folder, self.request.expected_output_keys[0]), "rb") as f: + value = f.read() + assert len(value) > 0 From ffd57c2932c4774741e6dc6e279505f39fb0702a Mon Sep 17 00:00:00 2001 From: qdelamea Date: Fri, 5 Jan 2024 11:03:01 +0100 Subject: [PATCH 141/344] feat: Python API add events and health checks services --- .../python/src/armonik/client/__init__.py | 17 ++++ packages/python/src/armonik/client/events.py | 86 +++++++++++++++++++ .../src/armonik/client/health_checks.py | 21 +++++ .../python/src/armonik/common/__init__.py | 43 +++++++++- packages/python/src/armonik/common/events.py | 53 ++++++++++++ packages/python/tests/conftest.py | 10 ++- packages/python/tests/test_events.py | 22 +++++ packages/python/tests/test_healthcheck.py | 18 ++++ 8 files changed, 264 insertions(+), 6 deletions(-) create mode 100644 packages/python/src/armonik/client/events.py create mode 100644 packages/python/src/armonik/client/health_checks.py create mode 100644 packages/python/src/armonik/common/events.py create mode 100644 packages/python/tests/test_events.py create mode 100644 packages/python/tests/test_healthcheck.py diff --git a/packages/python/src/armonik/client/__init__.py b/packages/python/src/armonik/client/__init__.py index 398b36ca2..cfef686b6 100644 --- a/packages/python/src/armonik/client/__init__.py +++ b/packages/python/src/armonik/client/__init__.py @@ -4,3 +4,20 @@ from .tasks import ArmoniKTasks, TaskFieldFilter from .results import ArmoniKResults, ResultFieldFilter from .versions import ArmoniKVersions +from .events import ArmoniKEvents +from .health_checks import ArmoniKHealthChecks + +__all__ = [ + 'ArmoniKPartitions', + 'ArmoniKSessions', + 'ArmoniKSubmitter', + 'ArmoniKTasks', + 'ArmoniKResults', + "ArmoniKVersions", + "ArmoniKEvents", + "ArmoniKHealthChecks", + "TaskFieldFilter", + "PartitionFieldFilter", + "SessionFieldFilter", + "ResultFieldFilter" +] diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py new file mode 100644 index 000000000..88695c31f --- /dev/null +++ b/packages/python/src/armonik/client/events.py @@ -0,0 +1,86 @@ +from typing import Any, Callable, cast, List + +from grpc import Channel + +from .results import ArmoniKResults +from ..common import EventTypes, Filter, NewTaskEvent, NewResultEvent, ResultOwnerUpdateEvent, ResultStatusUpdateEvent, TaskStatusUpdateEvent, ResultStatus, Event +from .results import ResultFieldFilter +from ..protogen.client.events_service_pb2_grpc import EventsStub +from ..protogen.common.events_common_pb2 import EventSubscriptionRequest, EventSubscriptionResponse +from ..protogen.common.results_filters_pb2 import Filters as rawResultFilters +from ..protogen.common.tasks_filters_pb2 import Filters as rawTaskFilters + +class ArmoniKEvents: + + _events_obj_mapping = { + "new_result": NewResultEvent, + "new_task": NewTaskEvent, + "result_owner_update": ResultOwnerUpdateEvent, + "result_status_update": ResultStatusUpdateEvent, + "task_status_update": TaskStatusUpdateEvent + } + + def __init__(self, grpc_channel: Channel): + """Events service client + + Args: + grpc_channel: gRPC channel to use + """ + self._client = EventsStub(grpc_channel) + self._results_client = ArmoniKResults(grpc_channel) + + def get_events(self, session_id: str, event_types: List[EventTypes], event_handlers: List[Callable[[str, EventTypes, Event], bool]], task_filter: Filter | None = None, result_filter: Filter | None = None) -> None: + """Get events that represents updates of result and tasks data. + + Args: + session_id: The ID of the session. + event_types: The list of the types of event to catch. + event_handlers: The list of handlers that process the events. Handlers are evaluated in he order they are provided. + An handler takes three positional arguments: the ID of the session, the type of event and the event as an object. + An handler returns a boolean, if True the process continues, otherwise the stream is closed and the service stops + listening to new events. + task_filter: A filter on tasks. + result_filter: A filter on results. + + """ + request = EventSubscriptionRequest( + session_id=session_id, + returned_events=event_types + ) + if task_filter: + request.tasks_filters=cast(rawTaskFilters, task_filter.to_disjunction().to_message()), + if result_filter: + request.results_filters=cast(rawResultFilters, result_filter.to_disjunction().to_message()), + + streaming_call = self._client.GetEvents(request) + for message in streaming_call: + event_type = message.WhichOneof("update") + if any([event_handler(session_id, EventTypes.from_string(event_type), self._events_obj_mapping[event_type].from_raw_event(getattr(message, event_type))) for event_handler in event_handlers]): + break + + def wait_for_result_availability(self, result_id: str, session_id: str) -> None: + """Wait until a result is ready i.e its status updates to COMPLETED. + + Args: + result_id: The ID of the result. + session_id: The ID of the session. + + Raises: + RuntimeError: If the result status is ABORTED. + """ + def handler(session_id, event_type, event): + if not isinstance(event, ResultStatusUpdateEvent): + raise ValueError("Handler should receive event of type 'ResultStatusUpdateEvent'.") + if event.status == ResultStatus.COMPLETED: + return False + elif event.status == ResultStatus.ABORTED: + raise RuntimeError(f"Result {result.name} with ID {result_id} is aborted.") + return True + + result = self._results_client.get_result(result_id) + if result.status == ResultStatus.COMPLETED: + return + elif result.status == ResultStatus.ABORTED: + raise RuntimeError(f"Result {result.name} with ID {result_id} is aborted.") + + self.get_events(session_id, [EventTypes.RESULT_STATUS_UPDATE], [handler], result_filter=(ResultFieldFilter.RESULT_ID == result_id)) diff --git a/packages/python/src/armonik/client/health_checks.py b/packages/python/src/armonik/client/health_checks.py new file mode 100644 index 000000000..76c04e251 --- /dev/null +++ b/packages/python/src/armonik/client/health_checks.py @@ -0,0 +1,21 @@ +from typing import cast, List, Tuple + +from grpc import Channel + +from ..common import HealthCheckStatus +from ..protogen.client.health_checks_service_pb2_grpc import HealthChecksServiceStub +from ..protogen.common.health_checks_common_pb2 import CheckHealthRequest, CheckHealthResponse + + +class ArmoniKHealthChecks: + def __init__(self, grpc_channel: Channel): + """ Result service client + + Args: + grpc_channel: gRPC channel to use + """ + self._client = HealthChecksServiceStub(grpc_channel) + + def check_health(self): + response: CheckHealthResponse = self._client.CheckHealth(CheckHealthRequest()) + return {service.name: {"message": service.message, "status": service.healthy} for service in response.services} diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 5901a7262..04105d3d4 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,4 +1,41 @@ -from .helpers import datetime_to_timestamp, timestamp_to_datetime, duration_to_timedelta, timedelta_to_duration, get_task_filter +from .helpers import ( + datetime_to_timestamp, + timestamp_to_datetime, + duration_to_timedelta, + timedelta_to_duration, + get_task_filter, + batched +) from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability, Session, Result, Partition -from .enumwrapper import HealthCheckStatus, TaskStatus, Direction, ResultStatus, SessionStatus -from .filter import StringFilter, StatusFilter +from .enumwrapper import HealthCheckStatus, TaskStatus, Direction, SessionStatus, ResultStatus, EventTypes, ServiceHealthCheckStatus +from .events import * +from .filter import Filter, StringFilter, StatusFilter + +__all__ = [ + 'datetime_to_timestamp', + 'timestamp_to_datetime', + 'duration_to_timedelta', + 'timedelta_to_duration', + 'get_task_filter', + 'batched', + 'Task', + 'TaskDefinition', + 'TaskOptions', + 'Output', + 'ResultAvailability', + 'Session', + 'Result', + 'Partition', + 'HealthCheckStatus', + 'TaskStatus', + 'Direction', + 'SessionStatus', + 'ResultStatus', + 'EventTypes', + # Include all names from events module + # Add names from filter module + 'Filter', + 'StringFilter', + 'StatusFilter', + 'ServiceHealthCheckStatus' +] diff --git a/packages/python/src/armonik/common/events.py b/packages/python/src/armonik/common/events.py new file mode 100644 index 000000000..34acbd2c0 --- /dev/null +++ b/packages/python/src/armonik/common/events.py @@ -0,0 +1,53 @@ +from abc import ABC +from typing import List + +from dataclasses import dataclass, fields + +from .enumwrapper import TaskStatus, ResultStatus + + +class Event(ABC): + @classmethod + def from_raw_event(cls, raw_event): + values = {} + for raw_field in cls.__annotations__.keys(): + values[raw_field] = getattr(raw_event, raw_field) + return cls(**values) + + +@dataclass +class TaskStatusUpdateEvent(Event): + task_id: str + status: TaskStatus + + +@dataclass +class ResultStatusUpdateEvent(Event): + result_id: str + status: ResultStatus + + +@dataclass +class ResultOwnerUpdateEvent(Event): + result_id: str + previous_owner_id: str + current_owner_id: str + + +@dataclass +class NewTaskEvent(Event): + task_id: str + payload_id: str + origin_task_id: str + status: TaskStatus + expected_output_keys: List[str] + data_dependencies: List[str] + retry_of_ids: List[str] + parent_task_ids: List[str] + + +@dataclass +class NewResultEvent(Event): + result_id: str + owner_id: str + status: ResultStatus diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index c5eaada26..f784c8e34 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -3,7 +3,7 @@ import pytest import requests -from armonik.client import ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions +from armonik.client import ArmoniKEvents, ArmoniKHealthChecks, ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub from typing import List, Union @@ -55,7 +55,7 @@ def clean_up(request): print("An error occurred when resetting the server: " + str(e)) -def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[AgentStub, ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions]: +def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[AgentStub, ArmoniKEvents, ArmoniKHealthChecks, ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions]: """ Get the ArmoniK client instance based on the specified service name. @@ -64,7 +64,7 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[AgentSt endpoint (str, optional): The gRPC server endpoint. Defaults to grpc_endpoint. Returns: - Union[AgentStub, ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions] + Union[AgentStub, ArmoniKEvents, ArmoniKHealthChecks, ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions] An instance of the specified ArmoniK client. Raises: @@ -78,6 +78,10 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[AgentSt match client_name: case "Agent": return AgentStub(channel) + case "Events": + return ArmoniKEvents(channel) + case "HealthChecks": + return ArmoniKHealthChecks(channel) case "Partitions": return ArmoniKPartitions(channel) case "Results": diff --git a/packages/python/tests/test_events.py b/packages/python/tests/test_events.py new file mode 100644 index 000000000..86ca9e42b --- /dev/null +++ b/packages/python/tests/test_events.py @@ -0,0 +1,22 @@ +from .conftest import all_rpc_called, rpc_called, get_client +from armonik.client import ArmoniKEvents +from armonik.common import EventTypes, NewResultEvent, ResultStatus + + +class TestArmoniKEvents: + def test_get_events_no_filter(self): + def test_handler(session_id, event_type, event): + assert session_id == "session-id" + assert event_type == EventTypes.NEW_RESULT + assert isinstance(event, NewResultEvent) + assert event.result_id == "result-id" + assert event.owner_id == "owner-id" + assert event.status == ResultStatus.CREATED + + tasks_client: ArmoniKEvents = get_client("Events") + tasks_client.get_events("session-id", [EventTypes.TASK_STATUS_UPDATE], [test_handler]) + + assert rpc_called("Events", "GetEvents") + + def test_service_fully_implemented(self): + assert all_rpc_called("Events") diff --git a/packages/python/tests/test_healthcheck.py b/packages/python/tests/test_healthcheck.py new file mode 100644 index 000000000..8062aaab6 --- /dev/null +++ b/packages/python/tests/test_healthcheck.py @@ -0,0 +1,18 @@ +import datetime + +from .conftest import all_rpc_called, rpc_called, get_client +from armonik.client import ArmoniKHealthChecks +from armonik.common import ServiceHealthCheckStatus + + +class TestArmoniKHealthChecks: + + def test_check_health(self): + health_checks_client: ArmoniKHealthChecks = get_client("HealthChecks") + services_health = health_checks_client.check_health() + + assert rpc_called("HealthChecks", "CheckHealth") + assert services_health == {'mock': {'message': 'Mock is healthy', 'status': ServiceHealthCheckStatus.HEALTHY}} + + def test_service_fully_implemented(self): + assert all_rpc_called("HealthChecks") From ce1e8ab60c0a90811b6436789043cc94c6888a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Tue, 9 Jan 2024 16:32:48 +0100 Subject: [PATCH 142/344] feat: add processed at field in task data --- Protos/V1/tasks_common.proto | 19 ++++++++++++------- Protos/V1/tasks_fields.proto | 2 ++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Protos/V1/tasks_common.proto b/Protos/V1/tasks_common.proto index e497e98bd..9bf5c1a97 100644 --- a/Protos/V1/tasks_common.proto +++ b/Protos/V1/tasks_common.proto @@ -38,11 +38,16 @@ message TaskDetailed { google.protobuf.Timestamp created_at = 11; /** The task creation date. */ google.protobuf.Timestamp submitted_at = 12; /** The task submission date. */ + google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ + google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ google.protobuf.Timestamp started_at = 13; /** The task start date. */ + google.protobuf.Timestamp processed_at = 24; /** The end of task processing date. */ google.protobuf.Timestamp ended_at = 14; /** The task end date. Also used when task failed. */ + google.protobuf.Timestamp pod_ttl = 15; /** The pod TTL (Time To Live). */ + google.protobuf.Duration creation_to_end_duration = 20; /** The task duration. Between the creation date and the end date. */ google.protobuf.Duration processing_to_end_duration = 21; /** The task calculated duration. Between the start date and the end date. */ - google.protobuf.Timestamp pod_ttl = 15; /** The pod TTL (Time To Live). */ + google.protobuf.Duration received_to_end_duration = 23; /** The task calculated duration. Between the received date and the end date. */ /** * Represents the task output. @@ -55,8 +60,6 @@ message TaskDetailed { Output output = 16; /** The task output. */ string pod_hostname = 17; /** The hostname of the container running the task. */ - google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ - google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ } /** @@ -83,17 +86,19 @@ message TaskSummary { google.protobuf.Timestamp created_at = 5; /** The task creation date. */ google.protobuf.Timestamp submitted_at = 12; /** The task submission date. */ + google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ + google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ google.protobuf.Timestamp started_at = 6; /** The task start date. */ + google.protobuf.Timestamp processed_at = 23; /** The end of task processing date. */ google.protobuf.Timestamp ended_at = 7; /** The task end date. Also used when task failed. */ + google.protobuf.Timestamp pod_ttl = 20; /** The pod TTL (Time To Live). */ + google.protobuf.Duration creation_to_end_duration = 15; /** The task duration. Between the creation date and the end date. */ google.protobuf.Duration processing_to_end_duration = 16; /** The task calculated duration. Between the start date and the end date. */ - google.protobuf.Timestamp pod_ttl = 20; /** The pod TTL (Time To Live). */ + google.protobuf.Duration received_to_end_duration = 24; /** The task calculated duration. Between the received date and the end date. */ string error = 8; /** The error message. Only set if task have failed. */ - string pod_hostname = 17; /** The hostname of the container running the task. */ - google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ - google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ } /** diff --git a/Protos/V1/tasks_fields.proto b/Protos/V1/tasks_fields.proto index 328e4a858..548686f13 100644 --- a/Protos/V1/tasks_fields.proto +++ b/Protos/V1/tasks_fields.proto @@ -20,10 +20,12 @@ enum TaskSummaryEnumField { TASK_SUMMARY_ENUM_FIELD_ENDED_AT = 5; /** The task end date. */ TASK_SUMMARY_ENUM_FIELD_CREATION_TO_END_DURATION = 6; /** The task duration. Between the creation date and the end date. */ TASK_SUMMARY_ENUM_FIELD_PROCESSING_TO_END_DURATION = 7; /** The task calculated duration. Between the start date and the end date. */ + TASK_SUMMARY_ENUM_FIELD_RECEIVED_TO_END_DURATION = 18; /** The task calculated duration. Between the received date and the end date. */ TASK_SUMMARY_ENUM_FIELD_POD_TTL = 12; /** The pod TTL (Time To Live). */ TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME = 13; /** The hostname of the container running the task. */ TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT = 14; /** When the task is received by the agent. */ TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT = 15; /** When the task is acquired by the agent. */ + TASK_SUMMARY_ENUM_FIELD_PROCESSED_AT = 17; /** When the task is processed by the agent. */ TASK_SUMMARY_ENUM_FIELD_ERROR = 8; /** The error message. Only set if task have failed. */ } From 75b7a57f84d7593e3ca945ec653665b1063e888b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Wed, 10 Jan 2024 08:37:29 +0100 Subject: [PATCH 143/344] feat: Add RPC and statuses for session lifecycle management --- Protos/V1/session_status.proto | 3 ++ Protos/V1/sessions_common.proto | 64 ++++++++++++++++++++++++++++++++ Protos/V1/sessions_service.proto | 20 ++++++++++ 3 files changed, 87 insertions(+) diff --git a/Protos/V1/session_status.proto b/Protos/V1/session_status.proto index ab9a8d903..4f59479ca 100644 --- a/Protos/V1/session_status.proto +++ b/Protos/V1/session_status.proto @@ -14,4 +14,7 @@ enum SessionStatus { SESSION_STATUS_UNSPECIFIED = 0; /** Session is in an unknown state. */ SESSION_STATUS_RUNNING = 1; /** Session is open and accepting tasks for execution. */ SESSION_STATUS_CANCELLED = 2; /** Session is cancelled. No more tasks can be submitted and no more tasks will be executed. */ + SESSION_STATUS_PAUSED = 3; /** Session is paused. Tasks can be submitted but no more new tasks will be executed. Already running tasks will continue until they finish. */ + SESSION_STATUS_CLOSED = 4; /** Session is closed. No more tasks can be submitted and executed. Results data will be deleted. */ + SESSION_STATUS_DELETED = 5; /** Session is deleted. Sessions, tasks and results metadata associated to the session will be deleted. */ } diff --git a/Protos/V1/sessions_common.proto b/Protos/V1/sessions_common.proto index 15609538e..079a48972 100644 --- a/Protos/V1/sessions_common.proto +++ b/Protos/V1/sessions_common.proto @@ -122,3 +122,67 @@ message CreateSessionRequest { message CreateSessionReply { string session_id = 1; /** Session id of the created session if successful */ } + +/** + * Request for pausing a single session. + */ +message PauseSessionRequest { + string session_id = 1; /** The session ID. */ +} + +/** + * Response for pausing a single session. + * + * Return a raw session. + */ +message PauseSessionResponse { + SessionRaw session = 1; /** The session. */ +} + +/** + * Request for resuming a single session. + */ +message ResumeSessionRequest { + string session_id = 1; /** The session ID. */ +} + +/** + * Response for resuming a single session. + * + * Return a raw session. + */ +message ResumeSessionResponse { + SessionRaw session = 1; /** The session. */ +} + +/** + * Request for closing a single session. + */ +message CloseSessionRequest { + string session_id = 1; /** The session ID. */ +} + +/** + * Response for closing a single session. + * + * Return a raw session. + */ +message CloseSessionResponse { + SessionRaw session = 1; /** The session. */ +} + +/** + * Request for deleting a single session. + */ +message DeleteSessionRequest { + string session_id = 1; /** The session ID. */ +} + +/** + * Response for deleting a single session. + * + * Return a raw session. + */ +message DeleteSessionResponse { + SessionRaw session = 1; /** The session. */ +} diff --git a/Protos/V1/sessions_service.proto b/Protos/V1/sessions_service.proto index e44433f3a..f3ad8ed78 100644 --- a/Protos/V1/sessions_service.proto +++ b/Protos/V1/sessions_service.proto @@ -32,4 +32,24 @@ service Sessions { * Create a session */ rpc CreateSession(CreateSessionRequest) returns (CreateSessionReply); + + /** + * Pause a session by its id. + */ + rpc PauseSession(PauseSessionRequest) returns (PauseSessionResponse); + + /** + * Resume a paused session by its id. + */ + rpc ResumeSession(ResumeSessionRequest) returns (ResumeSessionResponse); + + /** + * Close a session by its id. Removes Results data. + */ + rpc CloseSession(CloseSessionRequest) returns (CloseSessionResponse); + + /** + * Delete a session by its id. Removes metadata from Results, Sessions and Tasks associated to the session. + */ + rpc DeleteSession(DeleteSessionRequest) returns (DeleteSessionResponse); } From 56ea8e9330a09bc30e8d6b35a57dd7a9a2e1b77b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Wed, 10 Jan 2024 09:59:31 +0100 Subject: [PATCH 144/344] test: add session rpc in mock --- .../ArmoniK.Api.Mock/Services/Sessions.cs | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs index 3b3533717..5ee65b5e5 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs @@ -69,4 +69,40 @@ public override Task ListSessions(ListSessionsRequest requ PageSize = request.PageSize, Total = 0, }); + + /// + [Count] + public override Task CloseSession(CloseSessionRequest request, + ServerCallContext context) + => Task.FromResult(new CloseSessionResponse + { + Session = MockSession, + }); + + /// + [Count] + public override Task DeleteSession(DeleteSessionRequest request, + ServerCallContext context) + => Task.FromResult(new DeleteSessionResponse + { + Session = MockSession, + }); + + /// + [Count] + public override Task PauseSession(PauseSessionRequest request, + ServerCallContext context) + => Task.FromResult(new PauseSessionResponse + { + Session = MockSession, + }); + + /// + [Count] + public override Task ResumeSession(ResumeSessionRequest request, + ServerCallContext context) + => Task.FromResult(new ResumeSessionResponse + { + Session = MockSession, + }); } From a358e8e57d2114f14ae62834d619ee3b3e2c42f3 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Fri, 5 Jan 2024 12:56:54 +0100 Subject: [PATCH 145/344] refactor: Python API lint and format --- packages/python/fix_imports.py | 23 +- packages/python/genversion.py | 21 +- packages/python/ruff.toml | 62 +++ packages/python/src/armonik/__init__.py | 1 - .../python/src/armonik/client/__init__.py | 12 +- packages/python/src/armonik/client/events.py | 77 ++- .../src/armonik/client/health_checks.py | 15 +- .../python/src/armonik/client/partitions.py | 59 +- packages/python/src/armonik/client/results.py | 513 +++++++++++------- .../python/src/armonik/client/sessions.py | 95 +++- .../python/src/armonik/client/submitter.py | 187 +++++-- packages/python/src/armonik/client/tasks.py | 431 +++++++++++++-- .../python/src/armonik/client/versions.py | 9 +- .../python/src/armonik/common/__init__.py | 91 ++-- .../python/src/armonik/common/enumwrapper.py | 50 +- packages/python/src/armonik/common/events.py | 2 +- packages/python/src/armonik/common/filter.py | 346 ++++++++++-- packages/python/src/armonik/common/helpers.py | 37 +- packages/python/src/armonik/common/objects.py | 93 ++-- .../python/src/armonik/worker/__init__.py | 6 +- .../python/src/armonik/worker/seqlogger.py | 78 ++- .../python/src/armonik/worker/taskhandler.py | 148 +++-- packages/python/src/armonik/worker/worker.py | 30 +- packages/python/tests/conftest.py | 41 +- packages/python/tests/test_events.py | 4 +- packages/python/tests/test_filters.py | 85 ++- packages/python/tests/test_healthcheck.py | 10 +- packages/python/tests/test_helpers.py | 52 +- packages/python/tests/test_partitions.py | 7 +- packages/python/tests/test_results.py | 31 +- packages/python/tests/test_sessions.py | 33 +- packages/python/tests/test_submitter.py | 0 packages/python/tests/test_taskhandler.py | 58 +- packages/python/tests/test_tasks.py | 60 +- packages/python/tests/test_versions.py | 3 - packages/python/tests/test_worker.py | 58 +- 36 files changed, 2074 insertions(+), 754 deletions(-) create mode 100644 packages/python/ruff.toml create mode 100644 packages/python/tests/test_submitter.py diff --git a/packages/python/fix_imports.py b/packages/python/fix_imports.py index b0aea720a..216eb4830 100644 --- a/packages/python/fix_imports.py +++ b/packages/python/fix_imports.py @@ -13,14 +13,16 @@ import argparse + class ProtobufFilePathInfo(TypedDict): dir: Path path: Path rel_path: Path + def fix_protobuf_imports(root_dir, dry): """ - A script to fix relative imports (from and to nested sub-directories) within compiled `*_pb2*.py` Protobuf files. + A script to fix relative imports (from and to nested sub-directories) within compiled `*_pb2*.py` Protobuf files. """ root_dir = Path(root_dir) @@ -72,10 +74,12 @@ def fix_protobuf_import_in_line( ) if referenced_alias: line = f'from .{"." * uppath_levels}{downpath if downpath != "." else ""} import {referenced_name} as {referenced_alias}\n'.replace( - "from ...", "from ..") + "from ...", "from .." + ) else: line = f'from .{"." * uppath_levels}{downpath if downpath != "." else ""} import {referenced_name}\n'.replace( - "from ...", "from ..") + "from ...", "from .." + ) new_line = line.replace("\n", "") @@ -125,7 +129,7 @@ def fix_protobuf_imports_in_file(name, info: ProtobufFilePathInfo, pyi=False): f.truncate() f.close() - for (name, info) in py_files_dictionary.items(): + for name, info in py_files_dictionary.items(): fix_protobuf_imports_in_file(name, info) for ( @@ -138,13 +142,18 @@ def fix_protobuf_imports_in_file(name, info: ProtobufFilePathInfo, pyi=False): def main(): parser = argparse.ArgumentParser() parser.add_argument("root_dir", type=Path, help="Path to the root directory") - parser.add_argument("--dry", action="store_true", default=False, help="Do not write out the changes to the files.") + parser.add_argument( + "--dry", + action="store_true", + default=False, + help="Do not write out the changes to the files.", + ) args = parser.parse_args() if not args.root_dir.is_dir(): raise argparse.ArgumentTypeError(f"Directory '{args.root_dir}' does not exist.") fix_protobuf_imports(args.root_dir, args.dry) -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) +if __name__ == "__main__": + sys.argv[0] = re.sub(r"(-script\.pyw|\.exe)?$", "", sys.argv[0]) exit(main()) diff --git a/packages/python/genversion.py b/packages/python/genversion.py index c71a7389c..77148690f 100644 --- a/packages/python/genversion.py +++ b/packages/python/genversion.py @@ -12,15 +12,22 @@ def __init__(self, consider_dirty=True, dev_version=None): self.dev_version = dev_version def get_version(self, version: ScmVersion): - dev = self.dev_version if self.dev_version is not None else (version.distance if version.distance else 0) + int(version.dirty and self.consider_dirty) + dev = ( + self.dev_version + if self.dev_version is not None + else (version.distance if version.distance else 0) + + int(version.dirty and self.consider_dirty) + ) if dev: - return version.format_next_version(guess_next_version,"{guessed}" + f".dev{dev}") + return version.format_next_version( + guess_next_version, "{guessed}" + f".dev{dev}" + ) return version.format_with("{tag}") def main(): parser = ArgumentParser("ArmoniK Python version generator") - parser.add_argument("-n", "--no-dirty", action='store_true') + parser.add_argument("-n", "--no-dirty", action="store_true") parser.add_argument("-w", "--write-to", required=False, type=str) parser.add_argument("-d", "--dev", type=int) args = parser.parse_args() @@ -32,7 +39,13 @@ def main(): if args.write_to: try: with open(args.write_to, "w") as f: - f.writelines(["# generated by genversion.py, based on setuptools_scm\n", f'__version__ = "{version}"\n', f"__version_tuple__ = {_version_as_tuple(version)}\n"]) + f.writelines( + [ + "# generated by genversion.py, based on setuptools_scm\n", + f'__version__ = "{version}"\n', + f"__version_tuple__ = {_version_as_tuple(version)}\n", + ] + ) except Exception as e: print(f"Couldn't write to file {e}", file=sys.stderr) diff --git a/packages/python/ruff.toml b/packages/python/ruff.toml new file mode 100644 index 000000000..1ed8e7f06 --- /dev/null +++ b/packages/python/ruff.toml @@ -0,0 +1,62 @@ +# A path to the cache directory. +cache-dir = ".ruff_cache" + +# The style in which violation messages should be formatted. +output-format = "grouped" + +# Enable fix behavior by-default when running `ruff` +fix = false + +# Enable application of unsafe fixes. +unsafe-fixes = false + +# Whether to show source code snippets when reporting lint violation. +show-source = false + +# Enumerate all fixed violations. +show-fixes = true + +# Disable preview features. +preview = false + +# The minimum Python version targetted is Python 3.10. +target-version = "py310" + +# Allow imports relative to the "src/armonik" and "test" directories. +src = ["src/armonik", "test"] + +# Allow lines to be as long as 110. +line-length = 88 + +# Use 4-long indents +indent-width = 4 + +[lint] +# A list of file patterns to exclude from formatting and linting. +exclude = ["*.pyi"] + +# By default all rules are considered fixable. +fixable = ["ALL"] + +# Avoid automatically removing unused imports in `__init__.py` files. +ignore-init-module-imports = true + +[format] +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false + +# Use `\n` line endings for all files +line-ending = "lf" + +# Enable auto-formatting of code examples in docstrings. +docstring-code-format = true + +# Allow lines to be as long as 110 for code snippets in +# docstrings. +docstring-code-line-length = 110 diff --git a/packages/python/src/armonik/__init__.py b/packages/python/src/armonik/__init__.py index e8f0bce3a..e69de29bb 100644 --- a/packages/python/src/armonik/__init__.py +++ b/packages/python/src/armonik/__init__.py @@ -1 +0,0 @@ -from ._version import __version__, __version_tuple__ \ No newline at end of file diff --git a/packages/python/src/armonik/client/__init__.py b/packages/python/src/armonik/client/__init__.py index cfef686b6..3df30798f 100644 --- a/packages/python/src/armonik/client/__init__.py +++ b/packages/python/src/armonik/client/__init__.py @@ -8,16 +8,16 @@ from .health_checks import ArmoniKHealthChecks __all__ = [ - 'ArmoniKPartitions', - 'ArmoniKSessions', - 'ArmoniKSubmitter', - 'ArmoniKTasks', - 'ArmoniKResults', + "ArmoniKPartitions", + "ArmoniKSessions", + "ArmoniKSubmitter", + "ArmoniKTasks", + "ArmoniKResults", "ArmoniKVersions", "ArmoniKEvents", "ArmoniKHealthChecks", "TaskFieldFilter", "PartitionFieldFilter", "SessionFieldFilter", - "ResultFieldFilter" + "ResultFieldFilter", ] diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index 88695c31f..0ef34426f 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -1,23 +1,33 @@ -from typing import Any, Callable, cast, List +from typing import Callable, cast, List from grpc import Channel from .results import ArmoniKResults -from ..common import EventTypes, Filter, NewTaskEvent, NewResultEvent, ResultOwnerUpdateEvent, ResultStatusUpdateEvent, TaskStatusUpdateEvent, ResultStatus, Event +from ..common import ( + EventTypes, + Filter, + NewTaskEvent, + NewResultEvent, + ResultOwnerUpdateEvent, + ResultStatusUpdateEvent, + TaskStatusUpdateEvent, + ResultStatus, + Event, +) from .results import ResultFieldFilter from ..protogen.client.events_service_pb2_grpc import EventsStub -from ..protogen.common.events_common_pb2 import EventSubscriptionRequest, EventSubscriptionResponse +from ..protogen.common.events_common_pb2 import EventSubscriptionRequest from ..protogen.common.results_filters_pb2 import Filters as rawResultFilters from ..protogen.common.tasks_filters_pb2 import Filters as rawTaskFilters -class ArmoniKEvents: +class ArmoniKEvents: _events_obj_mapping = { "new_result": NewResultEvent, "new_task": NewTaskEvent, "result_owner_update": ResultOwnerUpdateEvent, "result_status_update": ResultStatusUpdateEvent, - "task_status_update": TaskStatusUpdateEvent + "task_status_update": TaskStatusUpdateEvent, } def __init__(self, grpc_channel: Channel): @@ -29,9 +39,16 @@ def __init__(self, grpc_channel: Channel): self._client = EventsStub(grpc_channel) self._results_client = ArmoniKResults(grpc_channel) - def get_events(self, session_id: str, event_types: List[EventTypes], event_handlers: List[Callable[[str, EventTypes, Event], bool]], task_filter: Filter | None = None, result_filter: Filter | None = None) -> None: + def get_events( + self, + session_id: str, + event_types: List[EventTypes], + event_handlers: List[Callable[[str, EventTypes, Event], bool]], + task_filter: Filter | None = None, + result_filter: Filter | None = None, + ) -> None: """Get events that represents updates of result and tasks data. - + Args: session_id: The ID of the session. event_types: The list of the types of event to catch. @@ -44,43 +61,67 @@ def get_events(self, session_id: str, event_types: List[EventTypes], event_handl """ request = EventSubscriptionRequest( - session_id=session_id, - returned_events=event_types + session_id=session_id, returned_events=event_types ) if task_filter: - request.tasks_filters=cast(rawTaskFilters, task_filter.to_disjunction().to_message()), + request.tasks_filters = ( + cast(rawTaskFilters, task_filter.to_disjunction().to_message()), + ) if result_filter: - request.results_filters=cast(rawResultFilters, result_filter.to_disjunction().to_message()), + request.results_filters = ( + cast(rawResultFilters, result_filter.to_disjunction().to_message()), + ) streaming_call = self._client.GetEvents(request) for message in streaming_call: event_type = message.WhichOneof("update") - if any([event_handler(session_id, EventTypes.from_string(event_type), self._events_obj_mapping[event_type].from_raw_event(getattr(message, event_type))) for event_handler in event_handlers]): + if any( + [ + event_handler( + session_id, + EventTypes.from_string(event_type), + self._events_obj_mapping[event_type].from_raw_event( + getattr(message, event_type) + ), + ) + for event_handler in event_handlers + ] + ): break def wait_for_result_availability(self, result_id: str, session_id: str) -> None: """Wait until a result is ready i.e its status updates to COMPLETED. - + Args: result_id: The ID of the result. session_id: The ID of the session. - + Raises: RuntimeError: If the result status is ABORTED. """ + def handler(session_id, event_type, event): if not isinstance(event, ResultStatusUpdateEvent): - raise ValueError("Handler should receive event of type 'ResultStatusUpdateEvent'.") + raise ValueError( + "Handler should receive event of type 'ResultStatusUpdateEvent'." + ) if event.status == ResultStatus.COMPLETED: return False elif event.status == ResultStatus.ABORTED: - raise RuntimeError(f"Result {result.name} with ID {result_id} is aborted.") + raise RuntimeError( + f"Result {result.name} with ID {result_id} is aborted." + ) return True - result = self._results_client.get_result(result_id) + result = self._results_client.get_result(result_id) if result.status == ResultStatus.COMPLETED: return elif result.status == ResultStatus.ABORTED: raise RuntimeError(f"Result {result.name} with ID {result_id} is aborted.") - self.get_events(session_id, [EventTypes.RESULT_STATUS_UPDATE], [handler], result_filter=(ResultFieldFilter.RESULT_ID == result_id)) + self.get_events( + session_id, + [EventTypes.RESULT_STATUS_UPDATE], + [handler], + result_filter=(ResultFieldFilter.RESULT_ID == result_id), + ) diff --git a/packages/python/src/armonik/client/health_checks.py b/packages/python/src/armonik/client/health_checks.py index 76c04e251..03e1a4ea8 100644 --- a/packages/python/src/armonik/client/health_checks.py +++ b/packages/python/src/armonik/client/health_checks.py @@ -1,15 +1,15 @@ -from typing import cast, List, Tuple - from grpc import Channel -from ..common import HealthCheckStatus from ..protogen.client.health_checks_service_pb2_grpc import HealthChecksServiceStub -from ..protogen.common.health_checks_common_pb2 import CheckHealthRequest, CheckHealthResponse +from ..protogen.common.health_checks_common_pb2 import ( + CheckHealthRequest, + CheckHealthResponse, +) class ArmoniKHealthChecks: def __init__(self, grpc_channel: Channel): - """ Result service client + """Result service client Args: grpc_channel: gRPC channel to use @@ -18,4 +18,7 @@ def __init__(self, grpc_channel: Channel): def check_health(self): response: CheckHealthResponse = self._client.CheckHealth(CheckHealthRequest()) - return {service.name: {"message": service.message, "status": service.healthy} for service in response.services} + return { + service.name: {"message": service.message, "status": service.healthy} + for service in response.services + } diff --git a/packages/python/src/armonik/client/partitions.py b/packages/python/src/armonik/client/partitions.py index 9c72495cc..1aa0daf51 100644 --- a/packages/python/src/armonik/client/partitions.py +++ b/packages/python/src/armonik/client/partitions.py @@ -1,35 +1,62 @@ -from typing import cast, List, Tuple +from typing import List, Tuple, cast from grpc import Channel from ..common import Direction, Partition from ..common.filter import Filter, NumberFilter from ..protogen.client.partitions_service_pb2_grpc import PartitionsStub -from ..protogen.common.partitions_common_pb2 import ListPartitionsRequest, ListPartitionsResponse, GetPartitionRequest, GetPartitionResponse -from ..protogen.common.partitions_fields_pb2 import PartitionField, PartitionRawField, PARTITION_RAW_ENUM_FIELD_PRIORITY -from ..protogen.common.partitions_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFiltersAnd, FilterField as rawFilterField +from ..protogen.common.partitions_common_pb2 import ( + GetPartitionRequest, + ListPartitionsRequest, + ListPartitionsResponse, +) +from ..protogen.common.partitions_fields_pb2 import ( + PARTITION_RAW_ENUM_FIELD_PRIORITY, + PartitionField, + PartitionRawField, +) +from ..protogen.common.partitions_filters_pb2 import ( + FilterField as rawFilterField, +) +from ..protogen.common.partitions_filters_pb2 import ( + Filters as rawFilters, +) +from ..protogen.common.partitions_filters_pb2 import ( + FiltersAnd as rawFiltersAnd, +) from ..protogen.common.sort_direction_pb2 import SortDirection class PartitionFieldFilter: PRIORITY = NumberFilter( - PartitionField(partition_raw_field=PartitionRawField(field=PARTITION_RAW_ENUM_FIELD_PRIORITY)), + PartitionField( + partition_raw_field=PartitionRawField( + field=PARTITION_RAW_ENUM_FIELD_PRIORITY + ) + ), rawFilters, rawFiltersAnd, - rawFilterField + rawFilterField, ) class ArmoniKPartitions: def __init__(self, grpc_channel: Channel): - """ Result service client + """Result service client Args: grpc_channel: gRPC channel to use """ self._client = PartitionsStub(grpc_channel) - def list_partitions(self, partition_filter: Filter | None = None, page: int = 0, page_size: int = 1000, sort_field: Filter = PartitionFieldFilter.PRIORITY, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Partition]]: + def list_partitions( + self, + partition_filter: Filter | None = None, + page: int = 0, + page_size: int = 1000, + sort_field: Filter = PartitionFieldFilter.PRIORITY, + sort_direction: SortDirection = Direction.ASC, + ) -> Tuple[int, List[Partition]]: """List partitions based on a filter. Args: @@ -47,19 +74,25 @@ def list_partitions(self, partition_filter: Filter | None = None, page: int = 0, request = ListPartitionsRequest( page=page, page_size=page_size, - filters=cast(rawFilters, partition_filter.to_disjunction().to_message()) if partition_filter else None, - sort=ListPartitionsRequest.Sort(field=cast(PartitionField, sort_field.field), direction=sort_direction), + filters=cast(rawFilters, partition_filter.to_disjunction().to_message()) + if partition_filter + else None, + sort=ListPartitionsRequest.Sort( + field=cast(PartitionField, sort_field.field), direction=sort_direction + ), ) response: ListPartitionsResponse = self._client.ListPartitions(request) return response.total, [Partition.from_message(p) for p in response.partitions] def get_partition(self, partition_id: str) -> Partition: """Get a partition by its ID. - + Args: partition_id: The partition ID. - + Return: The partition summary. """ - return Partition.from_message(self._client.GetPartition(GetPartitionRequest(id=partition_id)).partition) + return Partition.from_message( + self._client.GetPartition(GetPartitionRequest(id=partition_id)).partition + ) diff --git a/packages/python/src/armonik/client/results.py b/packages/python/src/armonik/client/results.py index 1937bba7b..a62cd1812 100644 --- a/packages/python/src/armonik/client/results.py +++ b/packages/python/src/armonik/client/results.py @@ -1,208 +1,305 @@ -from __future__ import annotations -from grpc import Channel -from deprecation import deprecated - -from typing import List, Dict, cast, Tuple - -from ..protogen.client.results_service_pb2_grpc import ResultsStub -from ..protogen.common.results_common_pb2 import CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, ListResultsRequest, ListResultsResponse, GetOwnerTaskIdRequest, GetOwnerTaskIdResponse, CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, CreateResultsRequest, CreateResultsResponse, ResultsServiceConfigurationResponse, DeleteResultsDataRequest, DeleteResultsDataResponse, UploadResultDataRequest, UploadResultDataResponse, DownloadResultDataRequest, DownloadResultDataResponse, GetResultRequest, GetResultResponse -from ..protogen.common.results_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus -from ..protogen.common.results_fields_pb2 import ResultField -from ..protogen.common.objects_pb2 import Empty -from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter -from ..protogen.common.sort_direction_pb2 import SortDirection -from ..common import Direction , Result -from ..protogen.common.results_fields_pb2 import ResultField, ResultRawField, ResultRawEnumField, RESULT_RAW_ENUM_FIELD_STATUS, RESULT_RAW_ENUM_FIELD_RESULT_ID -from ..common.helpers import batched - - -class ResultFieldFilter: - STATUS = StatusFilter(ResultField(result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus) - RESULT_ID = StringFilter(ResultField(result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_RESULT_ID)), rawFilters, rawFilterAnd, rawFilterField) - -class ArmoniKResults: - def __init__(self, grpc_channel: Channel): - """ Result service client - - Args: - grpc_channel: gRPC channel to use - """ - self._client = ResultsStub(grpc_channel) - - @deprecated(deprecated_in="3.15.0", details="Use create_result_metadata or create_result insted.") - def get_results_ids(self, session_id: str, names: List[str]) -> Dict[str, str]: - return {r.name : r.result_id for r in cast(CreateResultsMetaDataResponse, self._client.CreateResultsMetaData(CreateResultsMetaDataRequest(results=[CreateResultsMetaDataRequest.ResultCreate(name = n) for n in names], session_id=session_id))).results} - - def list_results(self, result_filter: Filter | None = None, page: int = 0, page_size: int = 1000, sort_field: Filter = ResultFieldFilter.STATUS,sort_direction: SortDirection = Direction.ASC ) -> Tuple[int, List[Result]]: - """List results based on a filter. - - Args: - result_filter (Filter): Filter to apply when listing results - page: page number to request, useful for pagination, defaults to 0 - page_size: size of a page, defaults to 1000 - sort_field: field to sort the resulting list by, defaults to the status - sort_direction: direction of the sort, defaults to ascending - Returns: - A tuple containing : - - The total number of results for the given filter - - The obtained list of results - """ - request: ListResultsRequest = ListResultsRequest( - page=page, - page_size=page_size, - filters=cast(rawFilters, result_filter.to_disjunction().to_message()) if result_filter else None, - sort=ListResultsRequest.Sort(field=cast(ResultField, sort_field.field), direction=sort_direction), - ) - list_response: ListResultsResponse = self._client.ListResults(request) - return list_response.total, [Result.from_message(r) for r in list_response.results] - - def get_result(self, result_id: str) -> Result: - """Get a result by id. - - Args: - result_id: The ID of the result. - - Return: - The result summary. - """ - request = GetResultRequest(result_id=result_id) - response: GetResultResponse = self._client.GetResult(request) - return Result.from_message(response.result) - - def get_owner_task_id(self, result_ids: List[str], session_id: str, batch_size: int = 500) -> Dict[str, str]: - """Get the IDs of the tasks that should produce the results. - - Args: - result_ids: A list of results. - session_id: The ID of the session to which the results belongs. - batch_size: Batch size for querying. - - Return: - A dictionnary mapping results to owner task ID. - """ - results = {} - for result_ids_batch in batched(result_ids, batch_size): - request = GetOwnerTaskIdRequest(session_id=session_id, result_id=result_ids_batch) - response: GetOwnerTaskIdResponse = self._client.GetOwnerTaskId(request) - for result_task in response.result_task: - results[result_task.result_id] = result_task.task_id - return results - - def create_results_metadata(self, result_names: List[str], session_id: str, batch_size: int = 100) -> Dict[str, Result]: - """Create the metadata of multiple results at once. - Data have to be uploaded separately. - - Args: - result_names: The list of the names of the results to create. - session_id: The ID of the session to which the results belongs. - batch_size: Batch size for querying. - - Return: - A dictionnary mapping each result name to its corresponding result summary. - """ - results = {} - for result_names_batch in batched(result_names, batch_size): - request = CreateResultsMetaDataRequest( - results=[CreateResultsMetaDataRequest.ResultCreate(name=result_name) for result_name in result_names_batch], - session_id=session_id - ) - response: CreateResultsMetaDataResponse = self._client.CreateResultsMetaData(request) - for result_message in response.results: - results[result_message.name] = Result.from_message(result_message) - return results - - def create_results(self, results_data: Dict[str, bytes], session_id: str, batch_size: int = 1) -> Dict[str, Result]: - """Create one result with data included in the request. - - Args: - results_data: A dictionnary mapping the result names to their actual data. - session_id: The ID of the session to which the results belongs. - batch_size: Batch size for querying. - - Return: - A dictionnary mappin each result name to its corresponding result summary. - """ - results = {} - for results_names_batch in batched(results_data.keys(), batch_size): - request = CreateResultsRequest( - results=[CreateResultsRequest.ResultCreate(name=name, data=results_data[name]) for name in results_names_batch], - session_id=session_id - ) - response: CreateResultsResponse = self._client.CreateResults(request) - for message in response.results: - results[message.name] = Result.from_message(message) - return results - - def upload_result_data(self, result_id: str, session_id: str, result_data: bytes | bytearray) -> None: - """Upload data for an empty result already created. - - Args: - result_id: The ID of the result. - result_data: The result data. - session_id: The ID of the session. - """ - data_chunk_max_size = self.get_service_config() - - def upload_result_stream(): - request = UploadResultDataRequest( - id=UploadResultDataRequest.ResultIdentifier( - session_id=session_id, result_id=result_id - ) - ) - yield request - - start = 0 - data_len = len(result_data) - while start < data_len: - chunk_size = min(data_chunk_max_size, data_len - start) - request = UploadResultDataRequest( - data_chunk=result_data[start : start + chunk_size] - ) - yield request - start += chunk_size - - self._client.UploadResultData(upload_result_stream()) - - def download_result_data(self, result_id: str, session_id: str) -> bytes: - """Retrieve data of a result. - - Args: - result_id: The ID of the result. - session_id: The session of the result. - - Return: - Result data. - """ - request = DownloadResultDataRequest( - result_id=result_id, - session_id=session_id - ) - streaming_call = self._client.DownloadResultData(request) - return b''.join([message.data_chunk for message in streaming_call]) - - def delete_result_data(self, result_ids: List[str], session_id: str, batch_size: int = 100) -> None: - """Delete data from multiple results - - Args: - result_ids: The IDs of the results which data must be deleted. - session_id: The ID of the session to which the results belongs. - batch_size: Batch size for querying. - """ - for result_ids_batch in batched(result_ids, batch_size): - request = DeleteResultsDataRequest( - result_id=result_ids_batch, - session_id=session_id - ) - self._client.DeleteResultsData(request) - - def get_service_config(self) -> int: - """Get the configuration of the service. - - Return: - Maximum size supported by a data chunk for the result service. - """ - response: ResultsServiceConfigurationResponse = self._client.GetServiceConfiguration(Empty()) - return response.data_chunk_max_size - - def watch_results(self): - raise NotImplementedError() +from __future__ import annotations + +from typing import Dict, List, Tuple, cast + +from deprecation import deprecated +from grpc import Channel + +from ..common import Direction, Result +from ..common.filter import Filter, StatusFilter, StringFilter +from ..common.helpers import batched +from ..protogen.client.results_service_pb2_grpc import ResultsStub +from ..protogen.common.objects_pb2 import Empty +from ..protogen.common.results_common_pb2 import ( + CreateResultsMetaDataRequest, + CreateResultsMetaDataResponse, + CreateResultsRequest, + CreateResultsResponse, + DeleteResultsDataRequest, + DownloadResultDataRequest, + GetOwnerTaskIdRequest, + GetOwnerTaskIdResponse, + GetResultRequest, + GetResultResponse, + ListResultsRequest, + ListResultsResponse, + ResultsServiceConfigurationResponse, + UploadResultDataRequest, +) +from ..protogen.common.results_fields_pb2 import ( + RESULT_RAW_ENUM_FIELD_RESULT_ID, + RESULT_RAW_ENUM_FIELD_STATUS, + ResultField, + ResultRawField, +) +from ..protogen.common.results_filters_pb2 import ( + FilterField as rawFilterField, +) +from ..protogen.common.results_filters_pb2 import ( + Filters as rawFilters, +) +from ..protogen.common.results_filters_pb2 import ( + FiltersAnd as rawFilterAnd, +) +from ..protogen.common.results_filters_pb2 import ( + FilterStatus as rawFilterStatus, +) +from ..protogen.common.sort_direction_pb2 import SortDirection + + +class ResultFieldFilter: + STATUS = StatusFilter( + ResultField( + result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_STATUS) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + rawFilterStatus, + ) + RESULT_ID = StringFilter( + ResultField( + result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_RESULT_ID) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + + +class ArmoniKResults: + def __init__(self, grpc_channel: Channel): + """Result service client + + Args: + grpc_channel: gRPC channel to use + """ + self._client = ResultsStub(grpc_channel) + + @deprecated( + deprecated_in="3.15.0", + details="Use create_result_metadata or create_result insted.", + ) + def get_results_ids(self, session_id: str, names: List[str]) -> Dict[str, str]: + return { + r.name: r.result_id + for r in cast( + CreateResultsMetaDataResponse, + self._client.CreateResultsMetaData( + CreateResultsMetaDataRequest( + results=[ + CreateResultsMetaDataRequest.ResultCreate(name=n) + for n in names + ], + session_id=session_id, + ) + ), + ).results + } + + def list_results( + self, + result_filter: Filter | None = None, + page: int = 0, + page_size: int = 1000, + sort_field: Filter = ResultFieldFilter.STATUS, + sort_direction: SortDirection = Direction.ASC, + ) -> Tuple[int, List[Result]]: + """List results based on a filter. + + Args: + result_filter (Filter): Filter to apply when listing results + page: page number to request, useful for pagination, defaults to 0 + page_size: size of a page, defaults to 1000 + sort_field: field to sort the resulting list by, defaults to the status + sort_direction: direction of the sort, defaults to ascending + Returns: + A tuple containing : + - The total number of results for the given filter + - The obtained list of results + """ + request: ListResultsRequest = ListResultsRequest( + page=page, + page_size=page_size, + filters=cast(rawFilters, result_filter.to_disjunction().to_message()) + if result_filter + else None, + sort=ListResultsRequest.Sort( + field=cast(ResultField, sort_field.field), direction=sort_direction + ), + ) + list_response: ListResultsResponse = self._client.ListResults(request) + return list_response.total, [ + Result.from_message(r) for r in list_response.results + ] + + def get_result(self, result_id: str) -> Result: + """Get a result by id. + + Args: + result_id: The ID of the result. + + Return: + The result summary. + """ + request = GetResultRequest(result_id=result_id) + response: GetResultResponse = self._client.GetResult(request) + return Result.from_message(response.result) + + def get_owner_task_id( + self, result_ids: List[str], session_id: str, batch_size: int = 500 + ) -> Dict[str, str]: + """Get the IDs of the tasks that should produce the results. + + Args: + result_ids: A list of results. + session_id: The ID of the session to which the results belongs. + batch_size: Batch size for querying. + + Return: + A dictionnary mapping results to owner task ID. + """ + results = {} + for result_ids_batch in batched(result_ids, batch_size): + request = GetOwnerTaskIdRequest( + session_id=session_id, result_id=result_ids_batch + ) + response: GetOwnerTaskIdResponse = self._client.GetOwnerTaskId(request) + for result_task in response.result_task: + results[result_task.result_id] = result_task.task_id + return results + + def create_results_metadata( + self, result_names: List[str], session_id: str, batch_size: int = 100 + ) -> Dict[str, Result]: + """Create the metadata of multiple results at once. + Data have to be uploaded separately. + + Args: + result_names: The list of the names of the results to create. + session_id: The ID of the session to which the results belongs. + batch_size: Batch size for querying. + + Return: + A dictionnary mapping each result name to its corresponding result summary. + """ + results = {} + for result_names_batch in batched(result_names, batch_size): + request = CreateResultsMetaDataRequest( + results=[ + CreateResultsMetaDataRequest.ResultCreate(name=result_name) + for result_name in result_names_batch + ], + session_id=session_id, + ) + response: CreateResultsMetaDataResponse = ( + self._client.CreateResultsMetaData(request) + ) + for result_message in response.results: + results[result_message.name] = Result.from_message(result_message) + return results + + def create_results( + self, results_data: Dict[str, bytes], session_id: str, batch_size: int = 1 + ) -> Dict[str, Result]: + """Create one result with data included in the request. + + Args: + results_data: A dictionnary mapping the result names to their actual data. + session_id: The ID of the session to which the results belongs. + batch_size: Batch size for querying. + + Return: + A dictionnary mappin each result name to its corresponding result summary. + """ + results = {} + for results_names_batch in batched(results_data.keys(), batch_size): + request = CreateResultsRequest( + results=[ + CreateResultsRequest.ResultCreate( + name=name, data=results_data[name] + ) + for name in results_names_batch + ], + session_id=session_id, + ) + response: CreateResultsResponse = self._client.CreateResults(request) + for message in response.results: + results[message.name] = Result.from_message(message) + return results + + def upload_result_data( + self, result_id: str, session_id: str, result_data: bytes | bytearray + ) -> None: + """Upload data for an empty result already created. + + Args: + result_id: The ID of the result. + result_data: The result data. + session_id: The ID of the session. + """ + data_chunk_max_size = self.get_service_config() + + def upload_result_stream(): + request = UploadResultDataRequest( + id=UploadResultDataRequest.ResultIdentifier( + session_id=session_id, result_id=result_id + ) + ) + yield request + + start = 0 + data_len = len(result_data) + while start < data_len: + chunk_size = min(data_chunk_max_size, data_len - start) + request = UploadResultDataRequest( + data_chunk=result_data[start : start + chunk_size] + ) + yield request + start += chunk_size + + self._client.UploadResultData(upload_result_stream()) + + def download_result_data(self, result_id: str, session_id: str) -> bytes: + """Retrieve data of a result. + + Args: + result_id: The ID of the result. + session_id: The session of the result. + + Return: + Result data. + """ + request = DownloadResultDataRequest(result_id=result_id, session_id=session_id) + streaming_call = self._client.DownloadResultData(request) + return b"".join([message.data_chunk for message in streaming_call]) + + def delete_result_data( + self, result_ids: List[str], session_id: str, batch_size: int = 100 + ) -> None: + """Delete data from multiple results + + Args: + result_ids: The IDs of the results which data must be deleted. + session_id: The ID of the session to which the results belongs. + batch_size: Batch size for querying. + """ + for result_ids_batch in batched(result_ids, batch_size): + request = DeleteResultsDataRequest( + result_id=result_ids_batch, session_id=session_id + ) + self._client.DeleteResultsData(request) + + def get_service_config(self) -> int: + """Get the configuration of the service. + + Return: + Maximum size supported by a data chunk for the result service. + """ + response: ResultsServiceConfigurationResponse = ( + self._client.GetServiceConfiguration(Empty()) + ) + return response.data_chunk_max_size + + def watch_results(self): + raise NotImplementedError() diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 84c96abfd..247f3bffb 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -1,22 +1,55 @@ from __future__ import annotations + +from typing import List, Optional, Tuple, cast + from grpc import Channel -from typing import cast, Tuple, List, Optional +from ..common import Direction, Session, TaskOptions +from ..common.filter import Filter, StatusFilter, StringFilter from ..protogen.client.sessions_service_pb2_grpc import SessionsStub -from ..protogen.common.submitter_common_pb2 import SessionFilter -from ..protogen.common.sessions_common_pb2 import GetSessionRequest, GetSessionResponse, ListSessionsRequest, ListSessionsResponse, SessionRaw, CancelSessionRequest, CancelSessionResponse, CreateSessionRequest -from ..protogen.common.sessions_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus -from ..protogen.common.sessions_fields_pb2 import * -from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter +from ..protogen.common.sessions_common_pb2 import ( + CancelSessionRequest, + CreateSessionRequest, + GetSessionRequest, + GetSessionResponse, + ListSessionsRequest, + ListSessionsResponse, +) +from ..protogen.common.sessions_fields_pb2 import ( + SESSION_RAW_ENUM_FIELD_STATUS, + SessionField, + SessionRawField, + TaskOptionGenericField, +) +from ..protogen.common.sessions_filters_pb2 import ( + FilterField as rawFilterField, +) +from ..protogen.common.sessions_filters_pb2 import ( + Filters as rawFilters, +) +from ..protogen.common.sessions_filters_pb2 import ( + FiltersAnd as rawFilterAnd, +) +from ..protogen.common.sessions_filters_pb2 import ( + FilterStatus as rawFilterStatus, +) from ..protogen.common.sort_direction_pb2 import SortDirection -from ..common import Direction, Session, TaskOptions -from ..protogen.common.sessions_fields_pb2 import SessionField, SessionRawField, SESSION_RAW_ENUM_FIELD_STATUS, TaskOptionGenericField + class SessionFieldFilter: """ Enumeration of the available filters """ - STATUS = StatusFilter(SessionField(session_raw_field=SessionRawField(field=SESSION_RAW_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus) + + STATUS = StatusFilter( + SessionField( + session_raw_field=SessionRawField(field=SESSION_RAW_ENUM_FIELD_STATUS) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + rawFilterStatus, + ) @staticmethod def task_options_key(option_key: str) -> StringFilter: @@ -28,19 +61,30 @@ def task_options_key(option_key: str) -> StringFilter: Returns: Corresponding filter """ - return StringFilter(SessionField(task_option_generic_field=TaskOptionGenericField(field=option_key)), rawFilters, rawFilterAnd, rawFilterField) + return StringFilter( + SessionField( + task_option_generic_field=TaskOptionGenericField(field=option_key) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) -class ArmoniKSessions: +class ArmoniKSessions: def __init__(self, grpc_channel: Channel): - """ Session service client + """Session service client Args: grpc_channel: gRPC channel to use """ self._client = SessionsStub(grpc_channel) - def create_session(self, default_task_options: TaskOptions, partition_ids: Optional[List[str]] = None) -> str: + def create_session( + self, + default_task_options: TaskOptions, + partition_ids: Optional[List[str]] = None, + ) -> str: """Create a session Args: @@ -55,16 +99,16 @@ def create_session(self, default_task_options: TaskOptions, partition_ids: Optio """ request = CreateSessionRequest( default_task_option=default_task_options.to_message(), - partition_ids=partition_ids if partition_ids else [] + partition_ids=partition_ids if partition_ids else [], ) return self._client.CreateSession(request).session_id def get_session(self, session_id: str): """Get a session by its ID. - + Args: session_id: The ID of the session. - + Return: The session summary. """ @@ -72,7 +116,14 @@ def get_session(self, session_id: str): response: GetSessionResponse = self._client.GetSession(request) return Session.from_message(response.session) - def list_sessions(self, session_filter: Filter | None = None, page: int = 0, page_size: int = 1000, sort_field: Filter = SessionFieldFilter.STATUS, sort_direction: SortDirection = Direction.ASC) -> Tuple[int, List[Session]]: + def list_sessions( + self, + session_filter: Filter | None = None, + page: int = 0, + page_size: int = 1000, + sort_field: Filter = SessionFieldFilter.STATUS, + sort_direction: SortDirection = Direction.ASC, + ) -> Tuple[int, List[Session]]: """ List sessions @@ -91,10 +142,14 @@ def list_sessions(self, session_filter: Filter | None = None, page: int = 0, pag request = ListSessionsRequest( page=page, page_size=page_size, - filters=cast(rawFilters, session_filter.to_disjunction().to_message()) if session_filter else None, - sort=ListSessionsRequest.Sort(field=cast(SessionField, sort_field.field), direction=sort_direction), + filters=cast(rawFilters, session_filter.to_disjunction().to_message()) + if session_filter + else None, + sort=ListSessionsRequest.Sort( + field=cast(SessionField, sort_field.field), direction=sort_direction + ), ) - response : ListSessionsResponse = self._client.ListSessions(request) + response: ListSessionsResponse = self._client.ListSessions(request) return response.total, [Session.from_message(s) for s in response.sessions] def cancel_session(self, session_id: str) -> None: diff --git a/packages/python/src/armonik/client/submitter.py b/packages/python/src/armonik/client/submitter.py index b50be07b4..3484ecb87 100644 --- a/packages/python/src/armonik/client/submitter.py +++ b/packages/python/src/armonik/client/submitter.py @@ -4,21 +4,44 @@ from grpc import Channel -from ..common import get_task_filter, TaskOptions, TaskDefinition, Task, ResultAvailability +from ..common import ( + get_task_filter, + TaskOptions, + TaskDefinition, + Task, + ResultAvailability, +) from ..protogen.client.submitter_service_pb2_grpc import SubmitterStub -from ..protogen.common.objects_pb2 import Empty, TaskRequest, ResultRequest, DataChunk, InitTaskRequest, \ - TaskRequestHeader, Configuration, Session, TaskOptions as InnerTaskOptions -from ..protogen.common.submitter_common_pb2 import CreateSessionRequest, GetTaskStatusRequest, CreateLargeTaskRequest, \ - WaitRequest, GetTaskStatusReply +from ..protogen.common.objects_pb2 import ( + Empty, + TaskRequest, + ResultRequest, + DataChunk, + InitTaskRequest, + TaskRequestHeader, + Configuration, + Session, + TaskOptions as InnerTaskOptions, +) +from ..protogen.common.submitter_common_pb2 import ( + CreateSessionRequest, + GetTaskStatusRequest, + CreateLargeTaskRequest, + WaitRequest, + GetTaskStatusReply, +) from ..protogen.common.task_status_pb2 import TaskStatus -@deprecated(deprecated_in="3.14.0", details="Use sessions, task and results client instead") +@deprecated( + deprecated_in="3.14.0", details="Use sessions, task and results client instead" +) class ArmoniKSubmitter: """ Deprecated: Use Session client, Task client and Result client instead """ + def __init__(self, grpc_channel: Channel): """Create a Submitter with the given channel @@ -35,7 +58,11 @@ def get_service_configuration(self) -> Configuration: """ return self._client.GetServiceConfiguration(Empty()) - def create_session(self, default_task_options: TaskOptions, partition_ids: Optional[List[str]] = None) -> str: + def create_session( + self, + default_task_options: TaskOptions, + partition_ids: Optional[List[str]] = None, + ) -> str: """Create a session Args: @@ -50,7 +77,9 @@ def create_session(self, default_task_options: TaskOptions, partition_ids: Optio """ if partition_ids is None: partition_ids = [] - request = CreateSessionRequest(default_task_option=default_task_options.to_message()) + request = CreateSessionRequest( + default_task_option=default_task_options.to_message() + ) for partition in partition_ids: request.partition_ids.append(partition) return self._client.CreateSession(request).session_id @@ -63,7 +92,12 @@ def cancel_session(self, session_id: str) -> None: """ self._client.CancelSession(Session(id=session_id)) - def submit(self, session_id: str, tasks: List[TaskDefinition], task_options: Optional[TaskOptions] = None) -> Tuple[List[Task], List[str]]: + def submit( + self, + session_id: str, + tasks: List[TaskDefinition], + task_options: Optional[TaskOptions] = None, + ) -> Tuple[List[Task], List[str]]: """Send tasks to ArmoniK Args: @@ -87,29 +121,51 @@ def submit(self, session_id: str, tasks: List[TaskDefinition], task_options: Opt configuration = self.get_service_configuration() create_tasks_reply = self._client.CreateLargeTasks( - _to_request_stream(task_requests, session_id, task_options.to_message() if task_options is not None else None, configuration.data_chunk_max_size)) + _to_request_stream( + task_requests, + session_id, + task_options.to_message() if task_options is not None else None, + configuration.data_chunk_max_size, + ) + ) ret = create_tasks_reply.WhichOneof("Response") if ret is None or ret == "error": - raise Exception(f'Issue with server when submitting tasks : {create_tasks_reply.error}') + raise Exception( + f"Issue with server when submitting tasks : {create_tasks_reply.error}" + ) elif ret == "creation_status_list": tasks_created = [] tasks_creation_failed = [] - for creation_status in create_tasks_reply.creation_status_list.creation_statuses: + for ( + creation_status + ) in create_tasks_reply.creation_status_list.creation_statuses: if creation_status.WhichOneof("Status") == "task_info": - tasks_created.append(Task(id=creation_status.task_info.task_id, session_id=session_id, - expected_output_ids=[k for k in - creation_status.task_info.expected_output_keys], - data_dependencies=[k for k in - creation_status.task_info.data_dependencies])) + tasks_created.append( + Task( + id=creation_status.task_info.task_id, + session_id=session_id, + expected_output_ids=[ + k + for k in creation_status.task_info.expected_output_keys + ], + data_dependencies=[ + k for k in creation_status.task_info.data_dependencies + ], + ) + ) else: tasks_creation_failed.append(creation_status.error) else: raise Exception("Unknown value") return tasks_created, tasks_creation_failed - def list_tasks(self, session_ids: Optional[List[str]] = None, task_ids: Optional[List[str]] = None, - included_statuses: Optional[List[TaskStatus]] = None, - excluded_statuses: Optional[List[TaskStatus]] = None) -> List[str]: + def list_tasks( + self, + session_ids: Optional[List[str]] = None, + task_ids: Optional[List[str]] = None, + included_statuses: Optional[List[TaskStatus]] = None, + excluded_statuses: Optional[List[TaskStatus]] = None, + ) -> List[str]: """List tasks Args: @@ -127,8 +183,14 @@ def list_tasks(self, session_ids: Optional[List[str]] = None, task_ids: Optional Returns: List of task ids """ - return [t for t in self._client.ListTasks( - get_task_filter(session_ids, task_ids, included_statuses, excluded_statuses)).task_ids] + return [ + t + for t in self._client.ListTasks( + get_task_filter( + session_ids, task_ids, included_statuses, excluded_statuses + ) + ).task_ids + ] def get_task_status(self, task_ids: List[str]) -> Dict[str, TaskStatus]: """Get statuses of a given task list @@ -145,13 +207,15 @@ def get_task_status(self, task_ids: List[str]) -> Dict[str, TaskStatus]: reply: GetTaskStatusReply = self._client.GetTaskStatus(request) return {s.task_id: s.status for s in reply.id_statuses} - def wait_for_completion(self, - session_ids: Optional[List[str]] = None, - task_ids: Optional[List[str]] = None, - included_statuses: Optional[List[TaskStatus]] = None, - excluded_statuses: Optional[List[TaskStatus]] = None, - stop_on_first_task_error: bool = False, - stop_on_first_task_cancellation: bool = False) -> Dict[TaskStatus, int]: + def wait_for_completion( + self, + session_ids: Optional[List[str]] = None, + task_ids: Optional[List[str]] = None, + included_statuses: Optional[List[TaskStatus]] = None, + excluded_statuses: Optional[List[TaskStatus]] = None, + stop_on_first_task_error: bool = False, + stop_on_first_task_cancellation: bool = False, + ) -> Dict[TaskStatus, int]: """Wait for the tasks matching the filters Args: @@ -174,10 +238,18 @@ def wait_for_completion(self, Dictionary containing the number of tasks in each status after waiting for completion """ - return {sc.status: sc.count for sc in self._client.WaitForCompletion( - WaitRequest(filter=get_task_filter(session_ids, task_ids, included_statuses, excluded_statuses), - stop_on_first_task_error=stop_on_first_task_error, - stop_on_first_task_cancellation=stop_on_first_task_cancellation)).values} + return { + sc.status: sc.count + for sc in self._client.WaitForCompletion( + WaitRequest( + filter=get_task_filter( + session_ids, task_ids, included_statuses, excluded_statuses + ), + stop_on_first_task_error=stop_on_first_task_error, + stop_on_first_task_cancellation=stop_on_first_task_cancellation, + ) + ).values + } def get_result(self, session_id: str, result_id: str) -> Union[bytes, None]: """Get a result @@ -189,10 +261,7 @@ def get_result(self, session_id: str, result_id: str) -> Union[bytes, None]: Returns: content of the result as bytes """ - result_request = ResultRequest( - result_id=result_id, - session=session_id - ) + result_request = ResultRequest(result_id=result_id, session=session_id) streaming_call = self._client.TryGetResultStream(result_request) result = bytearray() valid = False @@ -216,7 +285,9 @@ def get_result(self, session_id: str, result_id: str) -> Union[bytes, None]: return result raise Exception("Incomplete Data") - def wait_for_availability(self, session_id: str, result_id: str) -> Union[ResultAvailability, None]: + def wait_for_availability( + self, session_id: str, result_id: str + ) -> Union[ResultAvailability, None]: """Blocks until the result is available or is in error Args: @@ -227,10 +298,7 @@ def wait_for_availability(self, session_id: str, result_id: str) -> Union[Result None if the wait was cancelled unexpectedly, otherwise a ResultAvailability with potential errors """ - result_request = ResultRequest( - result_id=result_id, - session=session_id - ) + result_request = ResultRequest(result_id=result_id, session=session_id) response = self._client.WaitForAvailability(result_request) response_type = response.WhichOneof("type") if response_type == "ok": @@ -240,8 +308,10 @@ def wait_for_availability(self, session_id: str, result_id: str) -> Union[Result return None -def _to_request_stream_internal(request: TaskRequest, is_last: bool, chunk_max_size: int) -> Generator[CreateLargeTaskRequest, None, None]: - """ Generate the CreateLargeTaskRequests for the given request +def _to_request_stream_internal( + request: TaskRequest, is_last: bool, chunk_max_size: int +) -> Generator[CreateLargeTaskRequest, None, None]: + """Generate the CreateLargeTaskRequests for the given request Args: request: TaskRequest @@ -255,7 +325,7 @@ def _to_request_stream_internal(request: TaskRequest, is_last: bool, chunk_max_s init_task=InitTaskRequest( header=TaskRequestHeader( data_dependencies=request.data_dependencies, - expected_output_keys=request.expected_output_keys + expected_output_keys=request.expected_output_keys, ) ) ) @@ -263,31 +333,30 @@ def _to_request_stream_internal(request: TaskRequest, is_last: bool, chunk_max_s start = 0 payload_length = len(request.payload) if payload_length == 0: - req = CreateLargeTaskRequest( - task_payload=DataChunk(data=b'') - ) + req = CreateLargeTaskRequest(task_payload=DataChunk(data=b"")) yield req while start < payload_length: chunk_size = min(chunk_max_size, payload_length - start) req = CreateLargeTaskRequest( - task_payload=DataChunk(data=request.payload[start:start + chunk_size]) + task_payload=DataChunk(data=request.payload[start : start + chunk_size]) ) yield req start += chunk_size - req = CreateLargeTaskRequest( - task_payload=DataChunk(data_complete=True) - ) + req = CreateLargeTaskRequest(task_payload=DataChunk(data_complete=True)) yield req if is_last: - req = CreateLargeTaskRequest( - init_task=InitTaskRequest(last_task=True) - ) + req = CreateLargeTaskRequest(init_task=InitTaskRequest(last_task=True)) yield req -def _to_request_stream(requests: List[TaskRequest], s_id: str, t_options: Optional[InnerTaskOptions], chunk_max_size: int) -> Generator[CreateLargeTaskRequest, None, None]: - """ Generate the CreateLargeTaskRequests from a list of TaskRequest +def _to_request_stream( + requests: List[TaskRequest], + s_id: str, + t_options: Optional[InnerTaskOptions], + chunk_max_size: int, +) -> Generator[CreateLargeTaskRequest, None, None]: + """Generate the CreateLargeTaskRequests from a list of TaskRequest This is necessary to respect the payload size limit Args: requests: List of Task requests @@ -300,7 +369,9 @@ def _to_request_stream(requests: List[TaskRequest], s_id: str, t_options: Option """ req = CreateLargeTaskRequest( init_request=CreateLargeTaskRequest.InitRequest( - session_id=s_id, task_options=t_options)) + session_id=s_id, task_options=t_options + ) + ) yield req if len(requests) == 0: return diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 67c508b74..00657446e 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -1,47 +1,316 @@ from __future__ import annotations + +from typing import Dict, List, Optional, Tuple, cast + from grpc import Channel -from typing import cast, Dict, Optional, Tuple, List -from ..common import Task, Direction, TaskDefinition, TaskOptions, TaskStatus -from ..common.filter import StringFilter, StatusFilter, DateFilter, NumberFilter, Filter, DurationFilter +from ..common import Direction, Task, TaskDefinition, TaskOptions, TaskStatus +from ..common.filter import ( + DateFilter, + DurationFilter, + Filter, + NumberFilter, + StatusFilter, + StringFilter, +) +from ..common.helpers import batched from ..protogen.client.tasks_service_pb2_grpc import TasksStub -from ..protogen.common.tasks_common_pb2 import GetTaskRequest, GetTaskResponse, ListTasksRequest, ListTasksDetailedResponse, CancelTasksRequest, CancelTasksResponse, GetResultIdsRequest, GetResultIdsResponse, SubmitTasksRequest, SubmitTasksResponse, CountTasksByStatusRequest, CountTasksByStatusResponse, ListTasksResponse -from ..protogen.common.tasks_filters_pb2 import Filters as rawFilters, FiltersAnd as rawFilterAnd, FilterField as rawFilterField, FilterStatus as rawFilterStatus from ..protogen.common.sort_direction_pb2 import SortDirection -from ..protogen.common.tasks_fields_pb2 import * -from ..common.helpers import batched +from ..protogen.common.tasks_common_pb2 import ( + CancelTasksRequest, + CountTasksByStatusRequest, + CountTasksByStatusResponse, + GetResultIdsRequest, + GetResultIdsResponse, + GetTaskRequest, + GetTaskResponse, + ListTasksDetailedResponse, + ListTasksRequest, + ListTasksResponse, + SubmitTasksRequest, +) +from ..protogen.common.tasks_fields_pb2 import ( + TASK_OPTION_ENUM_FIELD_APPLICATION_NAME, + TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE, + TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE, + TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, + TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, + TASK_OPTION_ENUM_FIELD_MAX_DURATION, + TASK_OPTION_ENUM_FIELD_MAX_RETRIES, + TASK_OPTION_ENUM_FIELD_PARTITION_ID, + TASK_OPTION_ENUM_FIELD_PRIORITY, + TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT, + TASK_SUMMARY_ENUM_FIELD_CREATED_AT, + TASK_SUMMARY_ENUM_FIELD_CREATION_TO_END_DURATION, + TASK_SUMMARY_ENUM_FIELD_ENDED_AT, + TASK_SUMMARY_ENUM_FIELD_ERROR, + TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID, + TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID, + TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME, + TASK_SUMMARY_ENUM_FIELD_POD_TTL, + TASK_SUMMARY_ENUM_FIELD_PROCESSING_TO_END_DURATION, + TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT, + TASK_SUMMARY_ENUM_FIELD_SESSION_ID, + TASK_SUMMARY_ENUM_FIELD_STARTED_AT, + TASK_SUMMARY_ENUM_FIELD_STATUS, + TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT, + TASK_SUMMARY_ENUM_FIELD_TASK_ID, + TaskField, + TaskOptionField, + TaskOptionGenericField, + TaskSummaryField, +) +from ..protogen.common.tasks_filters_pb2 import ( + FilterField as rawFilterField, +) +from ..protogen.common.tasks_filters_pb2 import ( + Filters as rawFilters, +) +from ..protogen.common.tasks_filters_pb2 import ( + FiltersAnd as rawFilterAnd, +) +from ..protogen.common.tasks_filters_pb2 import ( + FilterStatus as rawFilterStatus, +) class TaskFieldFilter: """ Enumeration of the available filters """ - TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID)), rawFilters, rawFilterAnd, rawFilterField) - SESSION_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID)), rawFilters, rawFilterAnd, rawFilterField) - OWNER_POD_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID)), rawFilters, rawFilterAnd, rawFilterField) - INITIAL_TASK_ID = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID)), rawFilters, rawFilterAnd, rawFilterField) - STATUS = StatusFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus) - CREATED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT)), rawFilters, rawFilterAnd, rawFilterField) - SUBMITTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT)), rawFilters, rawFilterAnd, rawFilterField) - STARTED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT)), rawFilters, rawFilterAnd, rawFilterField) - ENDED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT)), rawFilters, rawFilterAnd, rawFilterField) - CREATION_TO_END_DURATION = DurationFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATION_TO_END_DURATION)), rawFilters, rawFilterAnd, rawFilterField) - PROCESSING_TO_END_DURATION = DurationFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_PROCESSING_TO_END_DURATION)), rawFilters, rawFilterAnd, rawFilterField) - POD_TTL = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL)), rawFilters, rawFilterAnd, rawFilterField) - POD_HOSTNAME = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME)), rawFilters, rawFilterAnd, rawFilterField) - RECEIVED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT)), rawFilters, rawFilterAnd, rawFilterField) - ACQUIRED_AT = DateFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT)), rawFilters, rawFilterAnd, rawFilterField) - ERROR = StringFilter(TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ERROR)), rawFilters, rawFilterAnd, rawFilterField) - - MAX_DURATION = DurationFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_DURATION)), rawFilters, rawFilterAnd, rawFilterField) - MAX_RETRIES = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_RETRIES)), rawFilters, rawFilterAnd, rawFilterField) - PRIORITY = NumberFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PRIORITY)), rawFilters, rawFilterAnd, rawFilterField) - PARTITION_ID = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PARTITION_ID)), rawFilters, rawFilterAnd, rawFilterField) - APPLICATION_NAME = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAME)), rawFilters, rawFilterAnd, rawFilterField) - APPLICATION_VERSION = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION)), rawFilters, rawFilterAnd, rawFilterField) - APPLICATION_NAMESPACE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE)), rawFilters, rawFilterAnd, rawFilterField) - APPLICATION_SERVICE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE)), rawFilters, rawFilterAnd, rawFilterField) - ENGINE_TYPE = StringFilter(TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE)), rawFilters, rawFilterAnd, rawFilterField) + + TASK_ID = StringFilter( + TaskField( + task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + SESSION_ID = StringFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + OWNER_POD_ID = StringFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + INITIAL_TASK_ID = StringFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + STATUS = StatusFilter( + TaskField( + task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STATUS) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + rawFilterStatus, + ) + CREATED_AT = DateFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + SUBMITTED_AT = DateFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + STARTED_AT = DateFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + ENDED_AT = DateFilter( + TaskField( + task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + CREATION_TO_END_DURATION = DurationFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_CREATION_TO_END_DURATION + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + PROCESSING_TO_END_DURATION = DurationFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_PROCESSING_TO_END_DURATION + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + POD_TTL = DateFilter( + TaskField( + task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + POD_HOSTNAME = StringFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + RECEIVED_AT = DateFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + ACQUIRED_AT = DateFilter( + TaskField( + task_summary_field=TaskSummaryField( + field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + ERROR = StringFilter( + TaskField( + task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ERROR) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + + MAX_DURATION = DurationFilter( + TaskField( + task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_DURATION) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + MAX_RETRIES = NumberFilter( + TaskField( + task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_RETRIES) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + PRIORITY = NumberFilter( + TaskField( + task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PRIORITY) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + PARTITION_ID = StringFilter( + TaskField( + task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PARTITION_ID) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + APPLICATION_NAME = StringFilter( + TaskField( + task_option_field=TaskOptionField( + field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAME + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + APPLICATION_VERSION = StringFilter( + TaskField( + task_option_field=TaskOptionField( + field=TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + APPLICATION_NAMESPACE = StringFilter( + TaskField( + task_option_field=TaskOptionField( + field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + APPLICATION_SERVICE = StringFilter( + TaskField( + task_option_field=TaskOptionField( + field=TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE + ) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) + ENGINE_TYPE = StringFilter( + TaskField( + task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) @staticmethod def task_options_key(option_key: str) -> StringFilter: @@ -53,12 +322,19 @@ def task_options_key(option_key: str) -> StringFilter: Returns: Corresponding filter """ - return StringFilter(TaskField(task_option_generic_field=TaskOptionGenericField(field=option_key)), rawFilters, rawFilterAnd, rawFilterField) + return StringFilter( + TaskField( + task_option_generic_field=TaskOptionGenericField(field=option_key) + ), + rawFilters, + rawFilterAnd, + rawFilterField, + ) class ArmoniKTasks: def __init__(self, grpc_channel: Channel): - """ Tasks service client + """Tasks service client Args: grpc_channel: gRPC channel to use @@ -74,10 +350,21 @@ def get_task(self, task_id: str) -> Task: Returns: Task object with the information """ - task_response: GetTaskResponse = self._client.GetTask(GetTaskRequest(task_id=task_id)) + task_response: GetTaskResponse = self._client.GetTask( + GetTaskRequest(task_id=task_id) + ) return Task.from_message(task_response.task) - def list_tasks(self, task_filter: Filter | None = None, with_errors: bool = False, page: int = 0, page_size: int = 1000, sort_field: Filter = TaskFieldFilter.TASK_ID, sort_direction: SortDirection = Direction.ASC, detailed: bool = True) -> Tuple[int, List[Task]]: + def list_tasks( + self, + task_filter: Filter | None = None, + with_errors: bool = False, + page: int = 0, + page_size: int = 1000, + sort_field: Filter = TaskFieldFilter.TASK_ID, + sort_direction: SortDirection = Direction.ASC, + detailed: bool = True, + ) -> Tuple[int, List[Task]]: """List tasks If the total returned exceeds the requested page size, you may want to use this function again and ask for subsequent pages. @@ -96,25 +383,32 @@ def list_tasks(self, task_filter: Filter | None = None, with_errors: bool = Fals - The total number of tasks for the given filter - The obtained list of tasks """ - request = ListTasksRequest(page=page, - page_size=page_size, - filters=cast(rawFilters, task_filter.to_disjunction().to_message()) if task_filter else None, - sort=ListTasksRequest.Sort(field=cast(TaskField, sort_field.field), direction=sort_direction), - with_errors=with_errors - ) + request = ListTasksRequest( + page=page, + page_size=page_size, + filters=cast(rawFilters, task_filter.to_disjunction().to_message()) + if task_filter + else None, + sort=ListTasksRequest.Sort( + field=cast(TaskField, sort_field.field), direction=sort_direction + ), + with_errors=with_errors, + ) if detailed: - response: ListTasksDetailedResponse = self._client.ListTasksDetailed(request) + response: ListTasksDetailedResponse = self._client.ListTasksDetailed( + request + ) return response.total, [Task.from_message(t) for t in response.tasks] response: ListTasksResponse = self._client.ListTasks(request) return response.total, [Task.from_message(t) for t in response.tasks] def cancel_tasks(self, task_ids: List[str], chunk_size: Optional[int] = 500): """Cancel tasks. - + Args: task_ids: IDs of the tasks. chunk_size: Batch size for cancelling. - + Return: The list of cancelled tasks. """ @@ -122,13 +416,15 @@ def cancel_tasks(self, task_ids: List[str], chunk_size: Optional[int] = 500): request = CancelTasksRequest(task_ids=task_id_batch) self._client.CancelTasks(request) - def get_result_ids(self, task_ids: List[str], chunk_size: Optional[int] = 500) -> Dict[str, List[str]]: + def get_result_ids( + self, task_ids: List[str], chunk_size: Optional[int] = 500 + ) -> Dict[str, List[str]]: """Get result IDs of a list of tasks. - + Args: task_ids: The IDs of the tasks. chunk_size: Batch size for retrieval. - + Return: A dictionary mapping the ID of a task to the IDs of its results.. """ @@ -136,27 +432,44 @@ def get_result_ids(self, task_ids: List[str], chunk_size: Optional[int] = 500) - for task_ids_batch in batched(task_ids, chunk_size): request = GetResultIdsRequest(task_id=task_ids_batch) - result_ids_response: GetResultIdsResponse = self._client.GetResultIds(request) + result_ids_response: GetResultIdsResponse = self._client.GetResultIds( + request + ) for t in result_ids_response.task_results: tasks_result_ids[t.task_id] = list(t.result_ids) return tasks_result_ids - def count_tasks_by_status(self, task_filter: Filter | None = None) -> Dict[TaskStatus, int]: + def count_tasks_by_status( + self, task_filter: Filter | None = None + ) -> Dict[TaskStatus, int]: """Get number of tasks by status. Args: task_filter: Filter for the tasks to be listed - + Return: A dictionnary mapping each status to the number of filtered tasks. """ request = CountTasksByStatusRequest( - filters=cast(rawFilters, task_filter.to_disjunction().to_message()) if task_filter else None + filters=cast(rawFilters, task_filter.to_disjunction().to_message()) + if task_filter + else None + ) + count_tasks_by_status_response: CountTasksByStatusResponse = ( + self._client.CountTasksByStatus(request) ) - count_tasks_by_status_response: CountTasksByStatusResponse = self._client.CountTasksByStatus(request) - return {TaskStatus(status_count.status): status_count.count for status_count in count_tasks_by_status_response.status} + return { + TaskStatus(status_count.status): status_count.count + for status_count in count_tasks_by_status_response.status + } - def submit_tasks(self, session_id: str, tasks: List[TaskDefinition], default_task_options: Optional[TaskOptions | None] = None, chunk_size: Optional[int] = 100) -> List[Task]: + def submit_tasks( + self, + session_id: str, + tasks: List[TaskDefinition], + default_task_options: Optional[TaskOptions | None] = None, + chunk_size: Optional[int] = 100, + ) -> List[Task]: """Submit tasks to ArmoniK. Args: @@ -177,14 +490,16 @@ def submit_tasks(self, session_id: str, tasks: List[TaskDefinition], default_tas expected_output_keys=t.expected_output_ids, payload_id=t.payload_id, data_dependencies=t.data_dependencies, - task_options=t.options.to_message() if t.options else None + task_options=t.options.to_message() if t.options else None, ) task_creations.append(task_creation) request = SubmitTasksRequest( session_id=session_id, task_creations=task_creations, - task_options=default_task_options.to_message() if default_task_options else None + task_options=default_task_options.to_message() + if default_task_options + else None, ) self._client.SubmitTasks(request) diff --git a/packages/python/src/armonik/client/versions.py b/packages/python/src/armonik/client/versions.py index db6f23a69..5675d7b44 100644 --- a/packages/python/src/armonik/client/versions.py +++ b/packages/python/src/armonik/client/versions.py @@ -3,12 +3,15 @@ from grpc import Channel from ..protogen.client.versions_service_pb2_grpc import VersionsStub -from ..protogen.common.versions_common_pb2 import ListVersionsRequest, ListVersionsResponse +from ..protogen.common.versions_common_pb2 import ( + ListVersionsRequest, + ListVersionsResponse, +) class ArmoniKVersions: def __init__(self, grpc_channel: Channel): - """ Result service client + """Result service client Args: grpc_channel: gRPC channel to use @@ -17,7 +20,7 @@ def __init__(self, grpc_channel: Channel): def list_versions(self) -> Dict[str, str]: """Get versions of ArmoniK components. - + Return: A dictionnary mapping each component to its version. """ diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 04105d3d4..81c7293a2 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -1,41 +1,68 @@ +from .enumwrapper import ( + Direction, + EventTypes, + HealthCheckStatus, + ResultStatus, + ServiceHealthCheckStatus, + SessionStatus, + TaskStatus, +) +from .events import ( + NewResultEvent, + NewTaskEvent, + ResultOwnerUpdateEvent, + ResultStatusUpdateEvent, + TaskStatusUpdateEvent, +) +from .filter import Filter, StatusFilter, StringFilter from .helpers import ( + batched, datetime_to_timestamp, - timestamp_to_datetime, duration_to_timedelta, - timedelta_to_duration, get_task_filter, - batched + timedelta_to_duration, + timestamp_to_datetime, +) +from .objects import ( + Output, + Partition, + Result, + ResultAvailability, + Session, + Task, + TaskDefinition, + TaskOptions, ) -from .objects import Task, TaskDefinition, TaskOptions, Output, ResultAvailability, Session, Result, Partition -from .enumwrapper import HealthCheckStatus, TaskStatus, Direction, SessionStatus, ResultStatus, EventTypes, ServiceHealthCheckStatus -from .events import * -from .filter import Filter, StringFilter, StatusFilter __all__ = [ - 'datetime_to_timestamp', - 'timestamp_to_datetime', - 'duration_to_timedelta', - 'timedelta_to_duration', - 'get_task_filter', - 'batched', - 'Task', - 'TaskDefinition', - 'TaskOptions', - 'Output', - 'ResultAvailability', - 'Session', - 'Result', - 'Partition', - 'HealthCheckStatus', - 'TaskStatus', - 'Direction', - 'SessionStatus', - 'ResultStatus', - 'EventTypes', + "datetime_to_timestamp", + "timestamp_to_datetime", + "duration_to_timedelta", + "timedelta_to_duration", + "get_task_filter", + "batched", + "Task", + "TaskDefinition", + "TaskOptions", + "Output", + "ResultAvailability", + "Session", + "Result", + "Partition", + "HealthCheckStatus", + "TaskStatus", + "Direction", + "SessionStatus", + "ResultStatus", + "EventTypes", # Include all names from events module - # Add names from filter module - 'Filter', - 'StringFilter', - 'StatusFilter', - 'ServiceHealthCheckStatus' + "Filter", + "StringFilter", + "StatusFilter", + "ServiceHealthCheckStatus", + "NewResultEvent", + "NewTaskEvent", + "ResultOwnerUpdateEvent", + "ResultStatusUpdateEvent", + "TaskStatusUpdateEvent", ] diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 65e8e3162..38cd65472 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -1,11 +1,50 @@ from __future__ import annotations from enum import IntEnum -from ..protogen.common.task_status_pb2 import TaskStatus as RawStatus, _TASKSTATUS, TASK_STATUS_CANCELLED, TASK_STATUS_CANCELLING, TASK_STATUS_COMPLETED, TASK_STATUS_CREATING, TASK_STATUS_DISPATCHED, TASK_STATUS_ERROR, TASK_STATUS_PROCESSED, TASK_STATUS_PROCESSING, TASK_STATUS_SUBMITTED, TASK_STATUS_TIMEOUT, TASK_STATUS_UNSPECIFIED, TASK_STATUS_RETRIED -from ..protogen.common.events_common_pb2 import EventsEnum as rawEventsEnum, EVENTS_ENUM_UNSPECIFIED, EVENTS_ENUM_NEW_TASK, EVENTS_ENUM_TASK_STATUS_UPDATE, EVENTS_ENUM_NEW_RESULT, EVENTS_ENUM_RESULT_STATUS_UPDATE, EVENTS_ENUM_RESULT_OWNER_UPDATE -from ..protogen.common.session_status_pb2 import SessionStatus as RawSessionStatus, _SESSIONSTATUS, SESSION_STATUS_UNSPECIFIED, SESSION_STATUS_CANCELLED, SESSION_STATUS_RUNNING -from ..protogen.common.result_status_pb2 import ResultStatus as RawResultStatus, _RESULTSTATUS, RESULT_STATUS_UNSPECIFIED, RESULT_STATUS_CREATED, RESULT_STATUS_COMPLETED, RESULT_STATUS_ABORTED, RESULT_STATUS_NOTFOUND -from ..protogen.common.health_checks_common_pb2 import HEALTH_STATUS_ENUM_UNSPECIFIED, HEALTH_STATUS_ENUM_HEALTHY, HEALTH_STATUS_ENUM_DEGRADED, HEALTH_STATUS_ENUM_UNHEALTHY +from ..protogen.common.task_status_pb2 import ( + TASK_STATUS_CANCELLED, + TASK_STATUS_CANCELLING, + TASK_STATUS_COMPLETED, + TASK_STATUS_CREATING, + TASK_STATUS_DISPATCHED, + TASK_STATUS_ERROR, + TASK_STATUS_PROCESSED, + TASK_STATUS_PROCESSING, + TASK_STATUS_SUBMITTED, + TASK_STATUS_TIMEOUT, + TASK_STATUS_UNSPECIFIED, + TASK_STATUS_RETRIED, +) +from ..protogen.common.events_common_pb2 import ( + EVENTS_ENUM_UNSPECIFIED, + EVENTS_ENUM_NEW_TASK, + EVENTS_ENUM_TASK_STATUS_UPDATE, + EVENTS_ENUM_NEW_RESULT, + EVENTS_ENUM_RESULT_STATUS_UPDATE, + EVENTS_ENUM_RESULT_OWNER_UPDATE, +) +from ..protogen.common.session_status_pb2 import ( + SessionStatus as RawSessionStatus, + _SESSIONSTATUS, + SESSION_STATUS_UNSPECIFIED, + SESSION_STATUS_CANCELLED, + SESSION_STATUS_RUNNING, +) +from ..protogen.common.result_status_pb2 import ( + ResultStatus as RawResultStatus, + _RESULTSTATUS, + RESULT_STATUS_UNSPECIFIED, + RESULT_STATUS_CREATED, + RESULT_STATUS_COMPLETED, + RESULT_STATUS_ABORTED, + RESULT_STATUS_NOTFOUND, +) +from ..protogen.common.health_checks_common_pb2 import ( + HEALTH_STATUS_ENUM_UNSPECIFIED, + HEALTH_STATUS_ENUM_HEALTHY, + HEALTH_STATUS_ENUM_DEGRADED, + HEALTH_STATUS_ENUM_UNHEALTHY, +) from ..protogen.common.worker_common_pb2 import HealthCheckReply from ..protogen.common.sort_direction_pb2 import SORT_DIRECTION_ASC, SORT_DIRECTION_DESC @@ -47,6 +86,7 @@ def name_from_value(status: RawSessionStatus) -> str: RUNNING = SESSION_STATUS_RUNNING CANCELLED = SESSION_STATUS_CANCELLED + class ResultStatus: @staticmethod def name_from_value(status: RawResultStatus) -> str: diff --git a/packages/python/src/armonik/common/events.py b/packages/python/src/armonik/common/events.py index 34acbd2c0..f5f66c6a4 100644 --- a/packages/python/src/armonik/common/events.py +++ b/packages/python/src/armonik/common/events.py @@ -1,7 +1,7 @@ from abc import ABC from typing import List -from dataclasses import dataclass, fields +from dataclasses import dataclass from .enumwrapper import TaskStatus, ResultStatus diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 728f9a0bc..537190a60 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -1,11 +1,50 @@ from __future__ import annotations + +import json from abc import abstractmethod -from typing import List, Any, Type, Optional, Dict -from google.protobuf.message import Message -import google.protobuf.timestamp_pb2 as timestamp +from typing import Any, Dict, List, Optional, Type + import google.protobuf.duration_pb2 as duration -from ..protogen.common.filters_common_pb2 import * -import json +import google.protobuf.timestamp_pb2 as timestamp +from google.protobuf.message import Message + +from ..protogen.common.filters_common_pb2 import ( + FILTER_ARRAY_OPERATOR_CONTAINS, + FILTER_ARRAY_OPERATOR_NOT_CONTAINS, + FILTER_BOOLEAN_OPERATOR_IS, + FILTER_DATE_OPERATOR_AFTER, + FILTER_DATE_OPERATOR_AFTER_OR_EQUAL, + FILTER_DATE_OPERATOR_BEFORE, + FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL, + FILTER_DATE_OPERATOR_EQUAL, + FILTER_DATE_OPERATOR_NOT_EQUAL, + FILTER_DURATION_OPERATOR_EQUAL, + FILTER_DURATION_OPERATOR_LONGER_THAN, + FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL, + FILTER_DURATION_OPERATOR_NOT_EQUAL, + FILTER_DURATION_OPERATOR_SHORTER_THAN, + FILTER_DURATION_OPERATOR_SHORTER_THAN_OR_EQUAL, + FILTER_NUMBER_OPERATOR_EQUAL, + FILTER_NUMBER_OPERATOR_GREATER_THAN, + FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL, + FILTER_NUMBER_OPERATOR_LESS_THAN, + FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL, + FILTER_NUMBER_OPERATOR_NOT_EQUAL, + FILTER_STATUS_OPERATOR_EQUAL, + FILTER_STATUS_OPERATOR_NOT_EQUAL, + FILTER_STRING_OPERATOR_CONTAINS, + FILTER_STRING_OPERATOR_ENDS_WITH, + FILTER_STRING_OPERATOR_EQUAL, + FILTER_STRING_OPERATOR_NOT_CONTAINS, + FILTER_STRING_OPERATOR_NOT_EQUAL, + FILTER_STRING_OPERATOR_STARTS_WITH, + FilterArray, + FilterBoolean, + FilterDate, + FilterDuration, + FilterNumber, + FilterString, +) class Filter: @@ -30,6 +69,7 @@ class Filter: value: value to test against in this filter if it's a simple filter operator: operator to apply for this filter if it's a simple filter """ + eq_ = None ne_ = None lt_ = None @@ -40,7 +80,17 @@ class Filter: notcontains_ = None value_type_ = None - def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]], filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): + def __init__( + self, + field: Optional[Message], + disjunction_message_type: Type[Message], + conjunction_message_type: Type[Message], + message_type: Type[Message], + inner_message_type: Optional[Type[Message]], + filters: Optional[List[List["Filter"]]] = None, + value=None, + operator=None, + ): self._filters: List[List["Filter"]] = [[]] if filters is None else filters self.field = field self.message_type = message_type @@ -55,7 +105,9 @@ def is_true_conjunction(self) -> bool: Tests whether the filter is a conjunction (logical and) Note : This will only output true if it's an actual conjunction with multiple filters and no disjunction """ - return self.message_type == self.conjunction_type or (len(self._filters) == 1 and len(self._filters[0]) > 1) + return self.message_type == self.conjunction_type or ( + len(self._filters) == 1 and len(self._filters[0]) > 1 + ) def is_true_disjunction(self) -> bool: """ @@ -72,8 +124,22 @@ def to_disjunction(self) -> Filter: if self.is_true_disjunction(): return self if self.is_true_conjunction(): - return Filter(None, self.disjunction_type, self.conjunction_type, self.disjunction_type, None, self._filters) - return Filter(None, self.disjunction_type, self.conjunction_type, self.disjunction_type, None, [[self]]) + return Filter( + None, + self.disjunction_type, + self.conjunction_type, + self.disjunction_type, + None, + self._filters, + ) + return Filter( + None, + self.disjunction_type, + self.conjunction_type, + self.disjunction_type, + None, + [[self]], + ) def __and__(self, other: "Filter") -> "Filter": if not isinstance(other, Filter): @@ -83,7 +149,14 @@ def __and__(self, other: "Filter") -> "Filter": raise Exception("Cannot make a conjunction of disjunctions") if self.conjunction_type != other.conjunction_type: raise Exception("Conjunction types are different") - return Filter(None, self.disjunction_type, self.conjunction_type, self.conjunction_type, None, [self.to_disjunction()._filters[0] + other.to_disjunction()._filters[0]]) + return Filter( + None, + self.disjunction_type, + self.conjunction_type, + self.conjunction_type, + None, + [self.to_disjunction()._filters[0] + other.to_disjunction()._filters[0]], + ) def __mul__(self, other: Filter) -> "Filter": return self & other @@ -94,7 +167,14 @@ def __or__(self, other: "Filter") -> "Filter": raise Exception(msg) if self.disjunction_type != other.disjunction_type: raise Exception("Disjunction types are different") - return Filter(None, self.disjunction_type, self.conjunction_type, self.disjunction_type, None, self.to_disjunction()._filters + other.to_disjunction()._filters) + return Filter( + None, + self.disjunction_type, + self.conjunction_type, + self.disjunction_type, + None, + self.to_disjunction()._filters + other.to_disjunction()._filters, + ) def __add__(self, other: "Filter") -> "Filter": return self | other @@ -164,7 +244,11 @@ def to_dict(self) -> Dict: return rep if len(self._filters) == 1 and len(self._filters[0]) == 1: return self._filters[0][0].to_dict() - return {"field": str(self.field), "value": str(self.value), "operator": str(self.operator)} + return { + "field": str(self.field), + "value": str(self.value), + "operator": str(self.operator), + } def __str__(self) -> str: return json.dumps(self.to_dict()) @@ -179,7 +263,9 @@ def _verify_value(self, value): Exception if value is not of the expected type """ - if self.__class__.value_type_ is None or isinstance(value, self.__class__.value_type_): + if self.__class__.value_type_ is None or isinstance( + value, self.__class__.value_type_ + ): return msg = f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead" raise Exception(msg) @@ -204,7 +290,16 @@ def _check(self, value: Any, operator: Any, operator_str: str = "") -> "Filter": if operator is None: msg = f"Operator {operator_str} is not available for {self.__class__.__name__}" raise NotImplementedError(msg) - return self.__class__(self.field, self.disjunction_type, self.conjunction_type, self.message_type, self.inner_message_type, self._filters, value, operator) + return self.__class__( + self.field, + self.disjunction_type, + self.conjunction_type, + self.message_type, + self.inner_message_type, + self._filters, + value, + operator, + ) @abstractmethod def to_basic_message(self) -> Message: @@ -218,7 +313,9 @@ def to_conjunction_message(conj: List[Filter]) -> Message: if self.message_type == self.disjunction_type: raw = self.to_disjunction().disjunction_type() - getattr(raw, "or").extend([to_conjunction_message(conj) for conj in self._filters]) + getattr(raw, "or").extend( + [to_conjunction_message(conj) for conj in self._filters] + ) return raw if self.message_type == self.conjunction_type: return to_conjunction_message(self.to_disjunction()._filters[0]) @@ -229,14 +326,34 @@ class StringFilter(Filter): """ Filter for string comparisons """ + eq_ = FILTER_STRING_OPERATOR_EQUAL ne_ = FILTER_STRING_OPERATOR_NOT_EQUAL contains_ = FILTER_STRING_OPERATOR_CONTAINS notcontains_ = FILTER_STRING_OPERATOR_NOT_CONTAINS value_type_ = str - def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterString, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): - super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) + def __init__( + self, + field: Optional[Message], + disjunction_message_type: Type[Message], + conjunction_message_type: Type[Message], + message_type: Type[Message], + inner_message_type: Optional[Type[Message]] = FilterString, + filters: Optional[List[List["Filter"]]] = None, + value=None, + operator=None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + filters, + value, + operator, + ) def startswith(self, value: str) -> "StringFilter": return self._check(value, FILTER_STRING_OPERATOR_STARTS_WITH, "startswith") @@ -245,30 +362,61 @@ def endswith(self, value: str) -> "StringFilter": return self._check(value, FILTER_STRING_OPERATOR_ENDS_WITH, "endswith") def to_basic_message(self) -> Message: - return self.message_type(field=self.field, filter_string=self.inner_message_type(value=self.value, operator=self.operator)) + return self.message_type( + field=self.field, + filter_string=self.inner_message_type( + value=self.value, operator=self.operator + ), + ) def __repr__(self) -> str: - return f"{str(self.field)} {str(self.operator)} \"{str(self.value)}\"" + return f'{str(self.field)} {str(self.operator)} "{str(self.value)}"' class StatusFilter(Filter): """ Filter for status comparison """ + eq_ = FILTER_STATUS_OPERATOR_EQUAL ne_ = FILTER_STATUS_OPERATOR_NOT_EQUAL - def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Type[Message], filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): - super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) + def __init__( + self, + field: Optional[Message], + disjunction_message_type: Type[Message], + conjunction_message_type: Type[Message], + message_type: Type[Message], + inner_message_type: Type[Message], + filters: Optional[List[List["Filter"]]] = None, + value=None, + operator=None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + filters, + value, + operator, + ) def to_basic_message(self) -> Message: - return self.message_type(field=self.field, filter_status=self.inner_message_type(value=self.value, operator=self.operator)) + return self.message_type( + field=self.field, + filter_status=self.inner_message_type( + value=self.value, operator=self.operator + ), + ) class DateFilter(Filter): """ Filter for timestamp comparison """ + eq_ = FILTER_DATE_OPERATOR_EQUAL ne_ = FILTER_DATE_OPERATOR_NOT_EQUAL lt_ = FILTER_DATE_OPERATOR_BEFORE @@ -277,17 +425,42 @@ class DateFilter(Filter): ge_ = FILTER_DATE_OPERATOR_AFTER_OR_EQUAL value_type = timestamp.Timestamp - def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterDate, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): - super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) + def __init__( + self, + field: Optional[Message], + disjunction_message_type: Type[Message], + conjunction_message_type: Type[Message], + message_type: Type[Message], + inner_message_type: Optional[Type[Message]] = FilterDate, + filters: Optional[List[List["Filter"]]] = None, + value=None, + operator=None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + filters, + value, + operator, + ) def to_basic_message(self) -> Message: - return self.message_type(field=self.field, filter_date=self.inner_message_type(value=self.value, operator=self.operator)) + return self.message_type( + field=self.field, + filter_date=self.inner_message_type( + value=self.value, operator=self.operator + ), + ) class NumberFilter(Filter): """ Filter for int comparison """ + eq_ = FILTER_NUMBER_OPERATOR_EQUAL ne_ = FILTER_NUMBER_OPERATOR_NOT_EQUAL lt_ = FILTER_NUMBER_OPERATOR_LESS_THAN @@ -296,22 +469,66 @@ class NumberFilter(Filter): ge_ = FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL value_type_ = int - def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterNumber, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): - super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) + def __init__( + self, + field: Optional[Message], + disjunction_message_type: Type[Message], + conjunction_message_type: Type[Message], + message_type: Type[Message], + inner_message_type: Optional[Type[Message]] = FilterNumber, + filters: Optional[List[List["Filter"]]] = None, + value=None, + operator=None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + filters, + value, + operator, + ) def to_basic_message(self) -> Message: - return self.message_type(field=self.field, filter_number=self.inner_message_type(value=self.value, operator=self.operator)) + return self.message_type( + field=self.field, + filter_number=self.inner_message_type( + value=self.value, operator=self.operator + ), + ) class BooleanFilter(Filter): """ Filter for boolean comparison """ + eq_ = FILTER_BOOLEAN_OPERATOR_IS value_type_ = bool - def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterBoolean, filters: Optional[List[List["Filter"]]] = None, value=True, operator=FILTER_BOOLEAN_OPERATOR_IS): - super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) + def __init__( + self, + field: Optional[Message], + disjunction_message_type: Type[Message], + conjunction_message_type: Type[Message], + message_type: Type[Message], + inner_message_type: Optional[Type[Message]] = FilterBoolean, + filters: Optional[List[List["Filter"]]] = None, + value=True, + operator=FILTER_BOOLEAN_OPERATOR_IS, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + filters, + value, + operator, + ) def __ne__(self, value: bool) -> "BooleanFilter": return self.__eq__(not value) @@ -320,28 +537,59 @@ def __invert__(self) -> "BooleanFilter": return self.__eq__(not self.value) def to_basic_message(self) -> Message: - return self.message_type(field=self.field, filter_boolean=self.inner_message_type(value=self.value, operator=self.operator)) + return self.message_type( + field=self.field, + filter_boolean=self.inner_message_type( + value=self.value, operator=self.operator + ), + ) class ArrayFilter(Filter): """ Filter for array comparisons """ + contains_ = FILTER_ARRAY_OPERATOR_CONTAINS notcontains_ = FILTER_ARRAY_OPERATOR_NOT_CONTAINS value_type_ = str - def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterArray, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): - super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) + def __init__( + self, + field: Optional[Message], + disjunction_message_type: Type[Message], + conjunction_message_type: Type[Message], + message_type: Type[Message], + inner_message_type: Optional[Type[Message]] = FilterArray, + filters: Optional[List[List["Filter"]]] = None, + value=None, + operator=None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + filters, + value, + operator, + ) def to_basic_message(self) -> Message: - return self.message_type(field=self.field, filter_array=self.inner_message_type(value=self.value, operator=self.operator)) + return self.message_type( + field=self.field, + filter_array=self.inner_message_type( + value=self.value, operator=self.operator + ), + ) class DurationFilter(Filter): """ Filter for duration comparison """ + eq_ = FILTER_DURATION_OPERATOR_EQUAL ne_ = FILTER_DURATION_OPERATOR_NOT_EQUAL lt_ = FILTER_DURATION_OPERATOR_SHORTER_THAN @@ -350,8 +598,32 @@ class DurationFilter(Filter): ge_ = FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL value_type_ = duration.Duration - def __init__(self, field: Optional[Message], disjunction_message_type: Type[Message], conjunction_message_type: Type[Message], message_type: Type[Message], inner_message_type: Optional[Type[Message]] = FilterDuration, filters: Optional[List[List["Filter"]]] = None, value=None, operator=None): - super().__init__(field, disjunction_message_type, conjunction_message_type, message_type, inner_message_type, filters, value, operator) + def __init__( + self, + field: Optional[Message], + disjunction_message_type: Type[Message], + conjunction_message_type: Type[Message], + message_type: Type[Message], + inner_message_type: Optional[Type[Message]] = FilterDuration, + filters: Optional[List[List["Filter"]]] = None, + value=None, + operator=None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + filters, + value, + operator, + ) def to_basic_message(self) -> Message: - return self.message_type(field=self.field, filter_duration=self.inner_message_type(value=self.value, operator=self.operator)) + return self.message_type( + field=self.field, + filter_duration=self.inner_message_type( + value=self.value, operator=self.operator + ), + ) diff --git a/packages/python/src/armonik/common/helpers.py b/packages/python/src/armonik/common/helpers.py index 3a9cb8324..6de6dcce0 100644 --- a/packages/python/src/armonik/common/helpers.py +++ b/packages/python/src/armonik/common/helpers.py @@ -9,13 +9,16 @@ from .enumwrapper import TaskStatus -T = TypeVar('T') +T = TypeVar("T") -def get_task_filter(session_ids: Optional[List[str]] = None, task_ids: Optional[List[str]] = None, - included_statuses: Optional[List[TaskStatus]] = None, - excluded_statuses: Optional[List[TaskStatus]] = None) -> TaskFilter: - """ Helper function to generate a task filter from the parameters +def get_task_filter( + session_ids: Optional[List[str]] = None, + task_ids: Optional[List[str]] = None, + included_statuses: Optional[List[TaskStatus]] = None, + excluded_statuses: Optional[List[TaskStatus]] = None, +) -> TaskFilter: + """Helper function to generate a task filter from the parameters Args: session_ids: Optional list of session Ids to filter against, mutually exclusive with task_ids @@ -29,12 +32,14 @@ def get_task_filter(session_ids: Optional[List[str]] = None, task_ids: Optional[ if session_ids and task_ids: raise ValueError("session_ids and task_ids cannot be defined at the same time") if included_statuses and excluded_statuses: - raise ValueError("included_statuses and excluded_statuses cannot be defined at the same time") + raise ValueError( + "included_statuses and excluded_statuses cannot be defined at the same time" + ) task_filter = TaskFilter( session=TaskFilter.IdsRequest() if session_ids else None, task=TaskFilter.IdsRequest() if task_ids else None, included=TaskFilter.StatusesRequest() if included_statuses else None, - excluded=TaskFilter.StatusesRequest() if excluded_statuses else None + excluded=TaskFilter.StatusesRequest() if excluded_statuses else None, ) if session_ids: task_filter.session.ids.extend(session_ids) @@ -48,7 +53,7 @@ def get_task_filter(session_ids: Optional[List[str]] = None, task_ids: Optional[ def datetime_to_timestamp(time_stamp: datetime) -> timestamp.Timestamp: - """ Helper function to convert a Python Datetime to a gRPC Timestamp + """Helper function to convert a Python Datetime to a gRPC Timestamp Args: time_stamp: Python datetime timestamp to convert @@ -62,7 +67,7 @@ def datetime_to_timestamp(time_stamp: datetime) -> timestamp.Timestamp: def timestamp_to_datetime(time_stamp: timestamp.Timestamp) -> datetime: - """ Helper function to convert a gRPC Timestamp to a Python Datetime + """Helper function to convert a gRPC Timestamp to a Python Datetime Note that datetime has microseconds accuracy instead of nanosecond accuracy for gRPC Timestamp Therefore, the conversion may not be lossless. Args: @@ -75,7 +80,7 @@ def timestamp_to_datetime(time_stamp: timestamp.Timestamp) -> datetime: def duration_to_timedelta(delta: duration.Duration) -> timedelta: - """ Helper function to convert a gRPC Duration into a Python timedelta + """Helper function to convert a gRPC Duration into a Python timedelta Note that timedelta has microseconds accuracy instead of nanosecond accuracy for gRPC Duration. Therefore, the conversion may not be lossless. Args: @@ -88,13 +93,13 @@ def duration_to_timedelta(delta: duration.Duration) -> timedelta: def timedelta_to_duration(delta: timedelta) -> duration.Duration: - """ Helper function to convert a gRPC Duration to a Python Datetime + """Helper function to convert a gRPC Duration to a Python Datetime - Args: - delta: Python timedelta to convert + Args: + delta: Python timedelta to convert - Returns: - Equivalent gRPC Duration + Returns: + Equivalent gRPC Duration """ d = duration.Duration() d.FromTimedelta(delta) @@ -113,7 +118,7 @@ def batched(iterable: Iterable[T], n: int) -> Iterable[List[T]]: A generator yielding batches of elements from the input iterable. """ it = iter(iterable) - + sentinel = object() batch = [] c = next(it, sentinel) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 1b5801f7a..1e0465e33 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -1,18 +1,28 @@ from __future__ import annotations -from dataclasses import dataclass, field -from datetime import timedelta, datetime -from typing import Optional, List, Dict -from ..protogen.common.tasks_common_pb2 import TaskDetailed -from .helpers import duration_to_timedelta, timedelta_to_duration, timestamp_to_datetime -from ..protogen.common.objects_pb2 import Empty, Output as WorkerOutput, TaskOptions as RawTaskOptions -from ..protogen.common.task_status_pb2 import TaskStatus as RawTaskStatus -from .enumwrapper import TaskStatus, SessionStatus, ResultStatus +from dataclasses import dataclass, field +from datetime import datetime, timedelta +from typing import Dict, List, Optional + +from ..protogen.common.objects_pb2 import ( + Empty, +) +from ..protogen.common.objects_pb2 import ( + Output as WorkerOutput, +) +from ..protogen.common.objects_pb2 import ( + TaskOptions as RawTaskOptions, +) from ..protogen.common.partitions_common_pb2 import PartitionRaw -from ..protogen.common.session_status_pb2 import SessionStatus as RawSessionStatus -from ..protogen.common.sessions_common_pb2 import SessionRaw from ..protogen.common.result_status_pb2 import ResultStatus as RawResultStatus from ..protogen.common.results_common_pb2 import ResultRaw +from ..protogen.common.session_status_pb2 import SessionStatus as RawSessionStatus +from ..protogen.common.sessions_common_pb2 import SessionRaw +from ..protogen.common.task_status_pb2 import TaskStatus as RawTaskStatus +from ..protogen.common.tasks_common_pb2 import TaskDetailed +from .enumwrapper import ResultStatus, SessionStatus, TaskStatus +from .helpers import duration_to_timedelta, timedelta_to_duration, timestamp_to_datetime + @dataclass() class TaskOptions: @@ -29,30 +39,32 @@ class TaskOptions: @classmethod def from_message(cls, task_options): - return cls(max_duration=duration_to_timedelta(task_options.max_duration), - max_retries=task_options.max_retries, - priority=task_options.priority, - partition_id=task_options.partition_id, - application_name=task_options.application_name, - application_version=task_options.application_version, - application_namespace=task_options.application_namespace, - application_service=task_options.application_service, - engine_type=task_options.engine_type, - options=task_options.options - ) + return cls( + max_duration=duration_to_timedelta(task_options.max_duration), + max_retries=task_options.max_retries, + priority=task_options.priority, + partition_id=task_options.partition_id, + application_name=task_options.application_name, + application_version=task_options.application_version, + application_namespace=task_options.application_namespace, + application_service=task_options.application_service, + engine_type=task_options.engine_type, + options=task_options.options, + ) def to_message(self) -> RawTaskOptions: - return RawTaskOptions(max_duration=timedelta_to_duration(self.max_duration), - max_retries=self.max_retries, - priority=self.priority, - partition_id=self.partition_id, - application_name=self.application_name, - application_version=self.application_version, - application_namespace=self.application_namespace, - application_service=self.application_service, - engine_type=self.engine_type, - options=self.options - ) + return RawTaskOptions( + max_duration=timedelta_to_duration(self.max_duration), + max_retries=self.max_retries, + priority=self.priority, + partition_id=self.partition_id, + application_name=self.application_name, + application_version=self.application_version, + application_namespace=self.application_namespace, + application_service=self.application_service, + engine_type=self.engine_type, + options=self.options, + ) @dataclass() @@ -111,7 +123,7 @@ def refresh(self, task_client) -> None: Args: task_client: ArmoniKTasks client """ - result : "Task" = task_client.get_task(self.id) + result: "Task" = task_client.get_task(self.id) self.session_id = result.session_id self.owner_pod_id = result.owner_pod_id self.parent_task_ids = result.parent_task_ids @@ -151,10 +163,11 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": ended_at=timestamp_to_datetime(task_raw.ended_at), pod_ttl=timestamp_to_datetime(task_raw.pod_ttl), output=Output( - error=(task_raw.output.error if not task_raw.output.success else None)), + error=(task_raw.output.error if not task_raw.output.success else None) + ), pod_hostname=task_raw.pod_hostname, received_at=timestamp_to_datetime(task_raw.received_at), - acquired_at=timestamp_to_datetime(task_raw.acquired_at) + acquired_at=timestamp_to_datetime(task_raw.acquired_at), ) @@ -185,12 +198,9 @@ def from_message(cls, session_raw: SessionRaw) -> "Session": options=TaskOptions.from_message(session_raw.options), created_at=timestamp_to_datetime(session_raw.created_at), cancelled_at=timestamp_to_datetime(session_raw.cancelled_at), - duration=duration_to_timedelta(session_raw.duration) + duration=duration_to_timedelta(session_raw.duration), ) -from dataclasses import dataclass, field -from typing import List, Optional -from datetime import datetime @dataclass class Result: @@ -213,9 +223,10 @@ def from_message(cls, result_raw: ResultRaw) -> "Result": created_at=timestamp_to_datetime(result_raw.created_at), completed_at=timestamp_to_datetime(result_raw.completed_at), result_id=result_raw.result_id, - size=result_raw.size + size=result_raw.size, ) + @dataclass class Partition: id: str @@ -235,5 +246,5 @@ def from_message(cls, partition_raw: PartitionRaw) -> "Partition": pod_max=partition_raw.pod_max, pod_configuration=partition_raw.pod_configuration, preemption_percentage=partition_raw.preemption_percentage, - priority=partition_raw.priority + priority=partition_raw.priority, ) diff --git a/packages/python/src/armonik/worker/__init__.py b/packages/python/src/armonik/worker/__init__.py index 78a61174c..cc0259557 100644 --- a/packages/python/src/armonik/worker/__init__.py +++ b/packages/python/src/armonik/worker/__init__.py @@ -3,7 +3,7 @@ from .seqlogger import ClefLogger __all__ = [ - 'ArmoniKWorker', - 'TaskHandler', - 'ClefLogger', + "ArmoniKWorker", + "TaskHandler", + "ClefLogger", ] diff --git a/packages/python/src/armonik/worker/seqlogger.py b/packages/python/src/armonik/worker/seqlogger.py index 4d5d48ec7..b08a13d54 100644 --- a/packages/python/src/armonik/worker/seqlogger.py +++ b/packages/python/src/armonik/worker/seqlogger.py @@ -14,7 +14,7 @@ class ClefLogger: @classmethod def setup_logging(cls, minlevel: int = logging.INFO) -> None: - """ Activates logging, should only be done once per process + """Activates logging, should only be done once per process Args: minlevel: Minimum level of logging for the whole process @@ -23,7 +23,7 @@ def setup_logging(cls, minlevel: int = logging.INFO) -> None: @classmethod def getLogger(cls, name: str) -> "ClefLogger": - """ Get the logger with the given name. Creates it if it doesn't exist + """Get the logger with the given name. Creates it if it doesn't exist Args: name: Name of the logger @@ -41,7 +41,7 @@ def __init__(self, name: Optional[str] = None, level: int = logging.INFO): self._logger.setLevel(level) def info(self, message: str, **kwargs): - """ Log a message at the info level + """Log a message at the info level Args: message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) @@ -50,43 +50,53 @@ def info(self, message: str, **kwargs): self.log(logging.INFO, message, **kwargs) def debug(self, message: str, **kwargs): - """ Log a message at the debug level + """Log a message at the debug level - Args: - message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) - **kwargs: Keyword arguments added to the record + Args: + message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) + **kwargs: Keyword arguments added to the record """ self.log(logging.DEBUG, message, **kwargs) def warning(self, message: str, **kwargs): - """ Log a message at the warning level + """Log a message at the warning level - Args: - message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) - **kwargs: Keyword arguments added to the record + Args: + message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) + **kwargs: Keyword arguments added to the record """ self.log(logging.WARNING, message, **kwargs) def error(self, message: str, **kwargs): - """ Log a message at the error level + """Log a message at the error level - Args: - message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) - **kwargs: Keyword arguments added to the record + Args: + message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) + **kwargs: Keyword arguments added to the record """ self.log(logging.ERROR, message, **kwargs) def critical(self, message: str, **kwargs): - """ Log a message at the critical level + """Log a message at the critical level - Args: - message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) - **kwargs: Keyword arguments added to the record + Args: + message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) + **kwargs: Keyword arguments added to the record """ self.log(logging.CRITICAL, message, **kwargs) - def exception(self, message: str, exc_info: Union[BaseException, Tuple[Type[BaseException], BaseException, Optional[TracebackType]], bool, None] = None, **kwargs): - """ Log a message at the error level with an optional exc_info + def exception( + self, + message: str, + exc_info: Union[ + BaseException, + Tuple[Type[BaseException], BaseException, Optional[TracebackType]], + bool, + None, + ] = None, + **kwargs, + ): + """Log a message at the error level with an optional exc_info Args: message: Message content, can contain '{name}' where name is a keyword argument given to this function (see kwargs) @@ -95,8 +105,26 @@ def exception(self, message: str, exc_info: Union[BaseException, Tuple[Type[Base """ self.log(logging.ERROR, message, exc_info=exc_info, **kwargs) - def log(self, level: int, message: str, exc_info: Union[BaseException, Union[Tuple[Union[Type[BaseException], None], Union[BaseException, None], Optional[TracebackType]], None], bool, None] = None, **kwargs): - """ Log a message + def log( + self, + level: int, + message: str, + exc_info: Union[ + BaseException, + Union[ + Tuple[ + Union[Type[BaseException], None], + Union[BaseException, None], + Optional[TracebackType], + ], + None, + ], + bool, + None, + ] = None, + **kwargs, + ): + """Log a message Args: level: level of the message @@ -119,14 +147,14 @@ def log(self, level: int, message: str, exc_info: Union[BaseException, Union[Tup payload["@x"] = "\n".join(traceback.format_exception(*exc_info)) for k, v in kwargs: if k.startswith("@"): - k = "@"+k + k = "@" + k payload[k] = str(v) self._logger.log(level, msg=json.dumps(payload)) except Exception as e: print(f"Couldn't log message : {e}") def setLevel(self, level: int): - """ Sets the level of this logger + """Sets the level of this logger Args: level: Logging level diff --git a/packages/python/src/armonik/worker/taskhandler.py b/packages/python/src/armonik/worker/taskhandler.py index 7d18ef7db..da6ce3f77 100644 --- a/packages/python/src/armonik/worker/taskhandler.py +++ b/packages/python/src/armonik/worker/taskhandler.py @@ -1,11 +1,25 @@ from __future__ import annotations import os from deprecation import deprecated -from typing import Optional, Dict, List, Tuple, Union, cast +from typing import Optional, Dict, List, Tuple from ..common import TaskOptions, TaskDefinition, Task, Result -from ..protogen.common.agent_common_pb2 import CreateTaskRequest, CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, NotifyResultDataRequest, CreateResultsRequest, CreateResultsResponse, SubmitTasksRequest, SubmitTasksResponse -from ..protogen.common.objects_pb2 import TaskRequest, DataChunk, InitTaskRequest, TaskRequestHeader, Configuration +from ..protogen.common.agent_common_pb2 import ( + CreateTaskRequest, + CreateResultsMetaDataRequest, + CreateResultsMetaDataResponse, + NotifyResultDataRequest, + CreateResultsRequest, + CreateResultsResponse, + SubmitTasksRequest, +) +from ..protogen.common.objects_pb2 import ( + TaskRequest, + DataChunk, + InitTaskRequest, + TaskRequestHeader, + Configuration, +) from ..protogen.worker.agent_service_pb2_grpc import AgentStub from ..protogen.common.worker_common_pb2 import ProcessRequest from ..common.helpers import batched @@ -33,8 +47,13 @@ def __init__(self, request: ProcessRequest, agent_client: AgentStub): with open(os.path.join(self.data_folder, dd), "rb") as f: self.data_dependencies[dd] = f.read() - @deprecated(deprecated_in="3.15.0", details="Use submit_tasks and instead and create the payload using create_result_metadata and send_result") - def create_tasks(self, tasks: List[TaskDefinition], task_options: Optional[TaskOptions] = None) -> Tuple[List[Task], List[str]]: + @deprecated( + deprecated_in="3.15.0", + details="Use submit_tasks and instead and create the payload using create_result_metadata and send_result", + ) + def create_tasks( + self, tasks: List[TaskDefinition], task_options: Optional[TaskOptions] = None + ) -> Tuple[List[Task], List[str]]: """Create new tasks for ArmoniK Args: @@ -54,23 +73,51 @@ def create_tasks(self, tasks: List[TaskDefinition], task_options: Optional[TaskO task_request.payload = t.payload task_requests.append(task_request) assert self.configuration is not None - create_tasks_reply = self._client.CreateTask(_to_request_stream(task_requests, self.token, task_options.to_message() if task_options is not None else None, self.configuration.data_chunk_max_size)) + create_tasks_reply = self._client.CreateTask( + _to_request_stream( + task_requests, + self.token, + task_options.to_message() if task_options is not None else None, + self.configuration.data_chunk_max_size, + ) + ) ret = create_tasks_reply.WhichOneof("Response") if ret is None or ret == "error": - raise Exception(f'Issue with server when submitting tasks : {create_tasks_reply.error}') + raise Exception( + f"Issue with server when submitting tasks : {create_tasks_reply.error}" + ) elif ret == "creation_status_list": tasks_created = [] tasks_creation_failed = [] - for creation_status in create_tasks_reply.creation_status_list.creation_statuses: + for ( + creation_status + ) in create_tasks_reply.creation_status_list.creation_statuses: if creation_status.WhichOneof("Status") == "task_info": - tasks_created.append(Task(id=creation_status.task_info.task_id, session_id=self.session_id, expected_output_ids=[k for k in creation_status.task_info.expected_output_keys], data_dependencies=[k for k in creation_status.task_info.data_dependencies])) + tasks_created.append( + Task( + id=creation_status.task_info.task_id, + session_id=self.session_id, + expected_output_ids=[ + k + for k in creation_status.task_info.expected_output_keys + ], + data_dependencies=[ + k for k in creation_status.task_info.data_dependencies + ], + ) + ) else: tasks_creation_failed.append(creation_status.error) else: raise Exception("Unknown value") return tasks_created, tasks_creation_failed - def submit_tasks(self, tasks: List[TaskDefinition], default_task_options: Optional[TaskOptions] = None, batch_size: Optional[int] = 100) -> None: + def submit_tasks( + self, + tasks: List[TaskDefinition], + default_task_options: Optional[TaskOptions] = None, + batch_size: Optional[int] = 100, + ) -> None: """Submit tasks to the agent. Args: @@ -85,20 +132,20 @@ def submit_tasks(self, tasks: List[TaskDefinition], default_task_options: Option task_creation = SubmitTasksRequest.TaskCreation( expected_output_keys=t.expected_output_ids, payload_id=t.payload_id, - data_dependencies=t.data_dependencies + data_dependencies=t.data_dependencies, ) if t.options: - task_creation.task_options=t.options.to_message() + task_creation.task_options = t.options.to_message() task_creations.append(task_creation) request = SubmitTasksRequest( session_id=self.session_id, communication_token=self.token, - task_creations=task_creations + task_creations=task_creations, ) if default_task_options: - request.task_options=default_task_options.to_message(), + request.task_options = (default_task_options.to_message(),) self._client.SubmitTasks(request) @@ -113,12 +160,19 @@ def send_results(self, results_data: Dict[str, bytes | bytearray]) -> None: f.write(result_data) request = NotifyResultDataRequest( - ids=[NotifyResultDataRequest.ResultIdentifier(session_id=self.session_id, result_id=result_id) for result_id in results_data.keys()], - communication_token=self.token + ids=[ + NotifyResultDataRequest.ResultIdentifier( + session_id=self.session_id, result_id=result_id + ) + for result_id in results_data.keys() + ], + communication_token=self.token, ) self._client.NotifyResultData(request) - def create_results_metadata(self, result_names: List[str], batch_size: int = 100) -> Dict[str, List[Result]]: + def create_results_metadata( + self, result_names: List[str], batch_size: int = 100 + ) -> Dict[str, List[Result]]: """ Create the metadata of multiple results at once. Data have to be uploaded separately. @@ -126,81 +180,93 @@ def create_results_metadata(self, result_names: List[str], batch_size: int = 100 Args: result_names: The names of the results to create. batch_size: Batch size for querying. - + Return: A dictionnary mapping each result name to its result summary. """ results = {} for result_names_batch in batched(result_names, batch_size): request = CreateResultsMetaDataRequest( - results=[CreateResultsMetaDataRequest.ResultCreate(name=result_name) for result_name in result_names], + results=[ + CreateResultsMetaDataRequest.ResultCreate(name=result_name) + for result_name in result_names + ], session_id=self.session_id, - communication_token=self.token + communication_token=self.token, + ) + response: CreateResultsMetaDataResponse = ( + self._client.CreateResultsMetaData(request) ) - response: CreateResultsMetaDataResponse = self._client.CreateResultsMetaData(request) for result_message in response.results: results[result_message.name] = Result.from_message(result_message) return results - def create_results(self, results_data: Dict[str, bytes], batch_size: int = 1) -> Dict[str, Result]: + def create_results( + self, results_data: Dict[str, bytes], batch_size: int = 1 + ) -> Dict[str, Result]: """Create one result with data included in the request. - + Args: results_data: A dictionnary mapping the result names to their actual data. batch_size: Batch size for querying. Return: - A dictionnary mappin each result name to its corresponding result summary. + A dictionnary mappin each result name to its corresponding result summary. """ results = {} for results_ids_batch in batched(results_data.keys(), batch_size): request = CreateResultsRequest( - results=[CreateResultsRequest.ResultCreate(name=name, data=results_data[name]) for name in results_ids_batch], + results=[ + CreateResultsRequest.ResultCreate( + name=name, data=results_data[name] + ) + for name in results_ids_batch + ], session_id=self.session_id, - communication_token=self.token + communication_token=self.token, ) response: CreateResultsResponse = self._client.CreateResults(request) for message in response.results: results[message.name] = Result.from_message(message) return results + def _to_request_stream_internal(request, communication_token, is_last, chunk_max_size): req = CreateTaskRequest( init_task=InitTaskRequest( header=TaskRequestHeader( data_dependencies=request.data_dependencies, - expected_output_keys=request.expected_output_keys + expected_output_keys=request.expected_output_keys, ) ), - communication_token=communication_token + communication_token=communication_token, ) yield req start = 0 payload_length = len(request.payload) if payload_length == 0: req = CreateTaskRequest( - task_payload=DataChunk(data=b''), - communication_token=communication_token + task_payload=DataChunk(data=b""), communication_token=communication_token ) yield req while start < payload_length: chunk_size = min(chunk_max_size, payload_length - start) req = CreateTaskRequest( - task_payload=DataChunk(data=request.payload[start:start + chunk_size]), - communication_token=communication_token + task_payload=DataChunk(data=request.payload[start : start + chunk_size]), + communication_token=communication_token, ) yield req start += chunk_size req = CreateTaskRequest( task_payload=DataChunk(data_complete=True), - communication_token=communication_token + communication_token=communication_token, ) yield req if is_last: req = CreateTaskRequest( init_task=InitTaskRequest(last_task=True), - communication_token=communication_token + communication_token=communication_token, ) yield req @@ -209,16 +275,22 @@ def _to_request_stream(requests, communication_token, t_options, chunk_max_size) if t_options is None: req = CreateTaskRequest( init_request=CreateTaskRequest.InitRequest(), - communication_token=communication_token) + communication_token=communication_token, + ) else: req = CreateTaskRequest( init_request=CreateTaskRequest.InitRequest(task_options=t_options), - communication_token=communication_token) + communication_token=communication_token, + ) yield req if len(requests) == 0: return for r in requests[:-1]: - for req in _to_request_stream_internal(r, communication_token, False, chunk_max_size): + for req in _to_request_stream_internal( + r, communication_token, False, chunk_max_size + ): yield req - for req in _to_request_stream_internal(requests[-1], communication_token, True, chunk_max_size): + for req in _to_request_stream_internal( + requests[-1], communication_token, True, chunk_max_size + ): yield req diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index 2de34aad1..f213dd470 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -9,14 +9,29 @@ from .seqlogger import ClefLogger from ..common import Output, HealthCheckStatus from ..protogen.common.objects_pb2 import Empty -from ..protogen.common.worker_common_pb2 import ProcessReply, ProcessRequest, HealthCheckReply +from ..protogen.common.worker_common_pb2 import ( + ProcessReply, + ProcessRequest, + HealthCheckReply, +) from ..protogen.worker.agent_service_pb2_grpc import AgentStub -from ..protogen.worker.worker_service_pb2_grpc import WorkerServicer, add_WorkerServicer_to_server +from ..protogen.worker.worker_service_pb2_grpc import ( + WorkerServicer, + add_WorkerServicer_to_server, +) from .taskhandler import TaskHandler class ArmoniKWorker(WorkerServicer): - def __init__(self, agent_channel: Channel, processing_function: Callable[[TaskHandler], Output], health_check: Callable[[], HealthCheckReply.ServingStatus] = lambda: HealthCheckStatus.SERVING, logger=ClefLogger.getLogger("ArmoniKWorker")): + def __init__( + self, + agent_channel: Channel, + processing_function: Callable[[TaskHandler], Output], + health_check: Callable[ + [], HealthCheckReply.ServingStatus + ] = lambda: HealthCheckStatus.SERVING, + logger=ClefLogger.getLogger("ArmoniKWorker"), + ): """Creates a worker for ArmoniK Args: @@ -50,9 +65,14 @@ def Process(self, request: ProcessRequest, context) -> Union[ProcessReply, None] try: self._logger.debug("Received task") task_handler = TaskHandler(request, self._client) - return ProcessReply(output=self.processing_function(task_handler).to_message()) + return ProcessReply( + output=self.processing_function(task_handler).to_message() + ) except Exception as e: - self._logger.exception(f"Failed task {''.join(traceback.format_exception(type(e) ,e, e.__traceback__))}", exc_info=e) + self._logger.exception( + f"Failed task {''.join(traceback.format_exception(type(e) ,e, e.__traceback__))}", + exc_info=e, + ) def HealthCheck(self, request: Empty, context) -> HealthCheckReply: return HealthCheckReply(status=self.health_check()) diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index f784c8e34..edc74ff6f 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -3,7 +3,15 @@ import pytest import requests -from armonik.client import ArmoniKEvents, ArmoniKHealthChecks, ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions +from armonik.client import ( + ArmoniKEvents, + ArmoniKHealthChecks, + ArmoniKPartitions, + ArmoniKResults, + ArmoniKSessions, + ArmoniKTasks, + ArmoniKVersions, +) from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub from typing import List, Union @@ -55,7 +63,18 @@ def clean_up(request): print("An error occurred when resetting the server: " + str(e)) -def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[AgentStub, ArmoniKEvents, ArmoniKHealthChecks, ArmoniKPartitions, ArmoniKResults, ArmoniKSessions, ArmoniKTasks, ArmoniKVersions]: +def get_client( + client_name: str, endpoint: str = grpc_endpoint +) -> Union[ + AgentStub, + ArmoniKEvents, + ArmoniKHealthChecks, + ArmoniKPartitions, + ArmoniKResults, + ArmoniKSessions, + ArmoniKTasks, + ArmoniKVersions, +]: """ Get the ArmoniK client instance based on the specified service name. @@ -93,10 +112,12 @@ def get_client(client_name: str, endpoint: str = grpc_endpoint) -> Union[AgentSt case "Versions": return ArmoniKVersions(channel) case _: - raise ValueError("Unknown service name: " + str(service_name)) + raise ValueError("Unknown service name: " + str(client_name)) -def rpc_called(service_name: str, rpc_name: str, n_calls: int = 1, endpoint: str = calls_endpoint) -> bool: +def rpc_called( + service_name: str, rpc_name: str, n_calls: int = 1, endpoint: str = calls_endpoint +) -> bool: """Check if a remote procedure call (RPC) has been made a specified number of times. This function uses ArmoniK.Api.Mock. It just gets the '/calls.json' endpoint. @@ -114,20 +135,22 @@ def rpc_called(service_name: str, rpc_name: str, n_calls: int = 1, endpoint: str requests.exceptions.RequestException: If an error occurs when requesting ArmoniK.Api.Mock. Example: - >>> rpc_called('http://localhost:5000/calls.json', 'Versions', 'ListVersionss', 0) + >>> rpc_called("http://localhost:5000/calls.json", "Versions", "ListVersionss", 0) True """ response = requests.get(endpoint) response.raise_for_status() data = response.json() - + # Check if the RPC has been called n_calls times if data[service_name][rpc_name] == n_calls: return True return False -def all_rpc_called(service_name: str, missings: List[str] = [], endpoint: str = calls_endpoint) -> bool: +def all_rpc_called( + service_name: str, missings: List[str] = [], endpoint: str = calls_endpoint +) -> bool: """ Check if all remote procedure calls (RPCs) in a service have been made at least once. This function uses ArmoniK.Api.Mock. It just gets the '/calls.json' endpoint. @@ -145,13 +168,13 @@ def all_rpc_called(service_name: str, missings: List[str] = [], endpoint: str = requests.exceptions.RequestException: If an error occurs when requesting ArmoniK.Api.Mock. Example: - >>> all_rpc_called('http://localhost:5000/calls.json', 'Versions') + >>> all_rpc_called("http://localhost:5000/calls.json", "Versions") False """ response = requests.get(endpoint) response.raise_for_status() data = response.json() - + missing_rpcs = [] # Check if all RPCs in the service have been called at least once diff --git a/packages/python/tests/test_events.py b/packages/python/tests/test_events.py index 86ca9e42b..2e8d3845f 100644 --- a/packages/python/tests/test_events.py +++ b/packages/python/tests/test_events.py @@ -14,7 +14,9 @@ def test_handler(session_id, event_type, event): assert event.status == ResultStatus.CREATED tasks_client: ArmoniKEvents = get_client("Events") - tasks_client.get_events("session-id", [EventTypes.TASK_STATUS_UPDATE], [test_handler]) + tasks_client.get_events( + "session-id", [EventTypes.TASK_STATUS_UPDATE], [test_handler] + ) assert rpc_called("Events", "GetEvents") diff --git a/packages/python/tests/test_filters.py b/packages/python/tests/test_filters.py index b67f7341f..c046efe00 100644 --- a/packages/python/tests/test_filters.py +++ b/packages/python/tests/test_filters.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -from typing import Type import pytest @@ -24,27 +23,79 @@ class Field(Message): pass -@pytest.mark.parametrize("filt,inverted", [ - (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) == "Test", StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) != "Test"), - (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains("Test"), ~(StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains("Test"))), - (BooleanFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage), BooleanFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage, FilterBoolean, None, False)), - (NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) > 0, NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) <= 0), - (NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) >= 0, NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) < 0), - (NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) < 0, NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) >= 0), - (NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) <= 0, NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) > 0) - -]) +@pytest.mark.parametrize( + "filt,inverted", + [ + ( + StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) + == "Test", + StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) + != "Test", + ), + ( + StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains( + "Test" + ), + ~( + StringFilter( + Field(), DummyMessage, DummyMessageAnd, DummyMessage + ).contains("Test") + ), + ), + ( + BooleanFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage), + BooleanFilter( + Field(), + DummyMessage, + DummyMessageAnd, + DummyMessage, + FilterBoolean, + None, + False, + ), + ), + ( + NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) > 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) <= 0, + ), + ( + NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) >= 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) < 0, + ), + ( + NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) < 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) >= 0, + ), + ( + NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) <= 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) > 0, + ), + ], +) def test_inversion(filt: Filter, inverted: Filter): - assert filt.operator != inverted.operator or filt.value == (not inverted.value) # In case of BooleanFilter, the value is inverted, not the operator + assert filt.operator != inverted.operator or filt.value == ( + not inverted.value + ) # In case of BooleanFilter, the value is inverted, not the operator assert (~filt).operator == inverted.operator and (~filt).value == inverted.value assert filt.operator == (~(~filt)).operator and filt.value == (~(~filt)).value -@pytest.mark.parametrize("filt", [ - (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).startswith("Test")), - (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).endswith("Test")), - (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage)) # No op -]) +@pytest.mark.parametrize( + "filt", + [ + ( + StringFilter( + Field(), DummyMessage, DummyMessageAnd, DummyMessage + ).startswith("Test") + ), + ( + StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).endswith( + "Test" + ) + ), + (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage)), # No op + ], +) def test_inversion_raises(filt: Filter): with pytest.raises(Exception): test = ~filt diff --git a/packages/python/tests/test_healthcheck.py b/packages/python/tests/test_healthcheck.py index 8062aaab6..38c87d7bf 100644 --- a/packages/python/tests/test_healthcheck.py +++ b/packages/python/tests/test_healthcheck.py @@ -1,18 +1,20 @@ -import datetime - from .conftest import all_rpc_called, rpc_called, get_client from armonik.client import ArmoniKHealthChecks from armonik.common import ServiceHealthCheckStatus class TestArmoniKHealthChecks: - def test_check_health(self): health_checks_client: ArmoniKHealthChecks = get_client("HealthChecks") services_health = health_checks_client.check_health() assert rpc_called("HealthChecks", "CheckHealth") - assert services_health == {'mock': {'message': 'Mock is healthy', 'status': ServiceHealthCheckStatus.HEALTHY}} + assert services_health == { + "mock": { + "message": "Mock is healthy", + "status": ServiceHealthCheckStatus.HEALTHY, + } + } def test_service_fully_implemented(self): assert all_rpc_called("HealthChecks") diff --git a/packages/python/tests/test_helpers.py b/packages/python/tests/test_helpers.py index 1c0cf517b..2573cfd49 100644 --- a/packages/python/tests/test_helpers.py +++ b/packages/python/tests/test_helpers.py @@ -5,7 +5,13 @@ from google.protobuf.duration_pb2 import Duration from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from armonik.common.helpers import datetime_to_timestamp, timestamp_to_datetime, timedelta_to_duration, duration_to_timedelta, batched +from armonik.common.helpers import ( + datetime_to_timestamp, + timestamp_to_datetime, + timedelta_to_duration, + duration_to_timedelta, + batched, +) from typing import Iterable, List @@ -21,7 +27,9 @@ def timestamp(self) -> Timestamp: @property def date_time(self) -> datetime: - return datetime.utcfromtimestamp(self.seconds + self.nanos * 1e-9).replace(tzinfo=timezone.utc) + return datetime.utcfromtimestamp(self.seconds + self.nanos * 1e-9).replace( + tzinfo=timezone.utc + ) @property def duration(self) -> Duration: @@ -32,18 +40,16 @@ def delta(self) -> timedelta: return timedelta(seconds=self.seconds, microseconds=self.nanos / 1000) -test_cases = [ - Case(1234, 1234), - Case(0, 0), - Case(12345, 12345), - Case(100000, 100000) -] +test_cases = [Case(1234, 1234), Case(0, 0), Case(12345, 12345), Case(100000, 100000)] @pytest.mark.parametrize("case", test_cases) def test_datetime_to_timestamp(case: Case): ts = datetime_to_timestamp(case.date_time) - assert ts.seconds == case.timestamp.seconds and abs(ts.nanos - case.timestamp.nanos) < 1000 + assert ( + ts.seconds == case.timestamp.seconds + and abs(ts.nanos - case.timestamp.nanos) < 1000 + ) @pytest.mark.parametrize("case", test_cases) @@ -61,15 +67,25 @@ def test_duration_to_timedelta(case: Case): @pytest.mark.parametrize("case", test_cases) def test_timedelta_to_duration(case: Case): ts = timedelta_to_duration(case.delta) - assert ts.seconds == case.duration.seconds and abs(ts.nanos - case.duration.nanos) < 1000 - - -@pytest.mark.parametrize(["iterable", "batch_size", "iterations"], [ - ([1, 2, 3], 3, [[1, 2, 3]]), - ([1, 2, 3], 5, [[1, 2, 3]]), - ([1, 2, 3], 2, [[1, 2], [3]]), - ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]]) -]) + assert ( + ts.seconds == case.duration.seconds + and abs(ts.nanos - case.duration.nanos) < 1000 + ) + + +@pytest.mark.parametrize( + ["iterable", "batch_size", "iterations"], + [ + ([1, 2, 3], 3, [[1, 2, 3]]), + ([1, 2, 3], 5, [[1, 2, 3]]), + ([1, 2, 3], 2, [[1, 2], [3]]), + ( + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + 3, + [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]], + ), + ], +) def test_batched(iterable: Iterable, batch_size: int, iterations: List[Iterable]): for index, batch in enumerate(batched(iterable, batch_size)): assert batch == iterations[index] diff --git a/packages/python/tests/test_partitions.py b/packages/python/tests/test_partitions.py index 2c7b9808b..b2f26d754 100644 --- a/packages/python/tests/test_partitions.py +++ b/packages/python/tests/test_partitions.py @@ -4,14 +4,13 @@ class TestArmoniKPartitions: - def test_get_partitions(self): partitions_client: ArmoniKPartitions = get_client("Partitions") partition = partitions_client.get_partition("partition-id") assert rpc_called("Partitions", "GetPartition") assert isinstance(partition, Partition) - assert partition.id == 'partition-id' + assert partition.id == "partition-id" assert partition.parent_partition_ids == [] assert partition.pod_reserved == 1 assert partition.pod_max == 1 @@ -30,7 +29,9 @@ def test_list_partitions_no_filter(self): def test_list_partitions_with_filter(self): partitions_client: ArmoniKPartitions = get_client("Partitions") - num, partitions = partitions_client.list_partitions(PartitionFieldFilter.PRIORITY == 1) + num, partitions = partitions_client.list_partitions( + PartitionFieldFilter.PRIORITY == 1 + ) assert rpc_called("Partitions", "ListPartitions", 2) # TODO: Mock must be updated to return something and so that changes the following assertions diff --git a/packages/python/tests/test_results.py b/packages/python/tests/test_results.py index cb3dd7d0f..dc65a49c9 100644 --- a/packages/python/tests/test_results.py +++ b/packages/python/tests/test_results.py @@ -8,20 +8,23 @@ class TestArmoniKResults: - def test_get_result(self): results_client: ArmoniKResults = get_client("Results") result = results_client.get_result("result-name") assert rpc_called("Results", "GetResult") assert isinstance(result, Result) - assert result.session_id == 'session-id' - assert result.name == 'result-name' - assert result.owner_task_id == 'owner-task-id' + assert result.session_id == "session-id" + assert result.name == "result-name" + assert result.owner_task_id == "owner-task-id" assert result.status == 2 - assert result.created_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) - assert result.completed_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) - assert result.result_id == 'result-id' + assert result.created_at == datetime.datetime( + 1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc + ) + assert result.completed_at == datetime.datetime( + 1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc + ) + assert result.result_id == "result-id" assert result.size == 0 def test_get_owner_task_id(self): @@ -43,7 +46,9 @@ def test_list_results_no_filter(self): def test_list_results_with_filter(self): results_client: ArmoniKResults = get_client("Results") - num, results = results_client.list_results(ResultFieldFilter.STATUS == ResultStatus.COMPLETED) + num, results = results_client.list_results( + ResultFieldFilter.STATUS == ResultStatus.COMPLETED + ) assert rpc_called("Results", "ListResults", 2) # TODO: Mock must be updated to return something and so that changes the following assertions @@ -60,7 +65,9 @@ def test_create_results_metadata(self): def test_create_results(self): results_client: ArmoniKResults = get_client("Results") - results = results_client.create_results({"result-name": b"test data"}, "session-id") + results = results_client.create_results( + {"result-name": b"test data"}, "session-id" + ) assert rpc_called("Results", "CreateResults") assert results == {} @@ -75,7 +82,9 @@ def test_get_service_config(self): def test_upload_result_data(self): results_client: ArmoniKResults = get_client("Results") - result = results_client.upload_result_data("result-name", "session-id", b"test data") + result = results_client.upload_result_data( + "result-name", "session-id", b"test data" + ) assert rpc_called("Results", "UploadResultData") assert result is None @@ -107,7 +116,7 @@ def test_get_results_ids(self): results_client: ArmoniKResults = get_client("Results") results = results_client.get_results_ids("session-id", ["result_1"]) - + assert issubclass(w[-1].category, DeprecationWarning) assert rpc_called("Results", "CreateResultsMetaData", 2) assert results == {} diff --git a/packages/python/tests/test_sessions.py b/packages/python/tests/test_sessions.py index c4c0173a4..108971b0c 100644 --- a/packages/python/tests/test_sessions.py +++ b/packages/python/tests/test_sessions.py @@ -6,13 +6,10 @@ class TestArmoniKSessions: - def test_create_session(self): sessions_client: ArmoniKSessions = get_client("Sessions") default_task_options = TaskOptions( - max_duration=datetime.timedelta(seconds=1), - priority=1, - max_retries=1 + max_duration=datetime.timedelta(seconds=1), priority=1, max_retries=1 ) session_id = sessions_client.create_session(default_task_options) @@ -25,23 +22,27 @@ def test_get_session(self): assert rpc_called("Sessions", "GetSession") assert isinstance(session, Session) - assert session.session_id == 'session-id' + assert session.session_id == "session-id" assert session.status == SessionStatus.CANCELLED assert session.partition_ids == [] assert session.options == TaskOptions( max_duration=datetime.timedelta(0), priority=0, max_retries=0, - partition_id='', - application_name='', - application_version='', - application_namespace='', - application_service='', - engine_type='', - options={} + partition_id="", + application_name="", + application_version="", + application_namespace="", + application_service="", + engine_type="", + options={}, + ) + assert session.created_at == datetime.datetime( + 1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc + ) + assert session.cancelled_at == datetime.datetime( + 1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc ) - assert session.created_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) - assert session.cancelled_at == datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) assert session.duration == datetime.timedelta(0) def test_list_session_no_filter(self): @@ -55,7 +56,9 @@ def test_list_session_no_filter(self): def test_list_session_with_filter(self): sessions_client: ArmoniKSessions = get_client("Sessions") - num, sessions = sessions_client.list_sessions(SessionFieldFilter.STATUS == SessionStatus.RUNNING) + num, sessions = sessions_client.list_sessions( + SessionFieldFilter.STATUS == SessionStatus.RUNNING + ) assert rpc_called("Sessions", "ListSessions", 2) # TODO: Mock must be updated to return something and so that changes the following assertions diff --git a/packages/python/tests/test_submitter.py b/packages/python/tests/test_submitter.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/python/tests/test_taskhandler.py b/packages/python/tests/test_taskhandler.py index f5e8634eb..ce00d9add 100644 --- a/packages/python/tests/test_taskhandler.py +++ b/packages/python/tests/test_taskhandler.py @@ -5,7 +5,6 @@ from .conftest import all_rpc_called, rpc_called, get_client, data_folder from armonik.common import TaskDefinition, TaskOptions from armonik.worker import TaskHandler -from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub from armonik.protogen.common.worker_common_pb2 import ProcessRequest from armonik.protogen.common.objects_pb2 import Configuration @@ -15,8 +14,7 @@ class TestTaskHandler: - - request =ProcessRequest( + request = ProcessRequest( communication_token="token", session_id="session-id", task_id="task-id", @@ -26,10 +24,8 @@ class TestTaskHandler: data_folder=data_folder, configuration=Configuration(data_chunk_max_size=8000), task_options=TaskOptions( - max_duration=datetime.timedelta(seconds=1), - priority=1, - max_retries=1 - ).to_message() + max_duration=datetime.timedelta(seconds=1), priority=1, max_retries=1 + ).to_message(), ) def test_taskhandler_init(self): @@ -41,13 +37,13 @@ def test_taskhandler_init(self): max_duration=datetime.timedelta(seconds=1), priority=1, max_retries=1, - partition_id='', - application_name='', - application_version='', - application_namespace='', - application_service='', - engine_type='', - options={} + partition_id="", + application_name="", + application_version="", + application_namespace="", + application_service="", + engine_type="", + options={}, ) assert task_handler.token == "token" assert task_handler.expected_results == ["result-id"] @@ -63,11 +59,16 @@ def test_create_task(self): warnings.simplefilter("always") task_handler = TaskHandler(self.request, get_client("Agent")) - tasks, errors = task_handler.create_tasks([TaskDefinition( - payload=b"payload", - expected_output_ids=["result-id"], - data_dependencies=[])]) - + tasks, errors = task_handler.create_tasks( + [ + TaskDefinition( + payload=b"payload", + expected_output_ids=["result-id"], + data_dependencies=[], + ) + ] + ) + assert issubclass(w[-1].category, DeprecationWarning) assert rpc_called("Agent", "CreateTask") assert tasks == [] @@ -75,11 +76,16 @@ def test_create_task(self): def test_submit_tasks(self): task_handler = TaskHandler(self.request, get_client("Agent")) - tasks = task_handler.submit_tasks([TaskDefinition(payload_id="payload-id", - expected_output_ids=["result-id"], - data_dependencies=[])] - ) - + tasks = task_handler.submit_tasks( + [ + TaskDefinition( + payload_id="payload-id", + expected_output_ids=["result-id"], + data_dependencies=[], + ) + ] + ) + assert rpc_called("Agent", "SubmitTasks") assert tasks is None @@ -105,4 +111,6 @@ def test_create_results(self): assert results == {} def test_service_fully_implemented(self): - assert all_rpc_called("Agent", missings=["GetCommonData", "GetDirectData", "GetResourceData"]) + assert all_rpc_called( + "Agent", missings=["GetCommonData", "GetDirectData", "GetResourceData"] + ) diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py index 91e5f4dff..ec635e27e 100644 --- a/packages/python/tests/test_tasks.py +++ b/packages/python/tests/test_tasks.py @@ -7,37 +7,37 @@ class TestArmoniKTasks: mock_task = Task( - id='task-id', - session_id='session-id', - owner_pod_id='', + id="task-id", + session_id="session-id", + owner_pod_id="", parent_task_ids=[], data_dependencies=[], expected_output_ids=[], retry_of_ids=[], status=4, payload_id=None, - status_message='', + status_message="", options=TaskOptions( max_duration=datetime.timedelta(seconds=1), priority=1, max_retries=1, - partition_id='partition-id', - application_name='application-name', - application_version='application-version', - application_namespace='application-namespace', - application_service='application-service', - engine_type='engine-type', - options={} + partition_id="partition-id", + application_name="application-name", + application_version="application-version", + application_namespace="application-namespace", + application_service="application-service", + engine_type="engine-type", + options={}, ), created_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), submitted_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), started_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), ended_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), pod_ttl=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - output=Output(error=''), - pod_hostname='', + output=Output(error=""), + pod_hostname="", received_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - acquired_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) + acquired_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), ) def test_get_task(self): @@ -58,7 +58,9 @@ def test_list_tasks_detailed_no_filter(self): def test_list_tasks_detailed_with_filter(self): tasks_client: ArmoniKTasks = get_client("Tasks") - num, tasks = tasks_client.list_tasks(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) + num, tasks = tasks_client.list_tasks( + TaskFieldFilter.STATUS == TaskStatus.COMPLETED + ) assert rpc_called("Tasks", "ListTasksDetailed", 2) # TODO: Mock must be updated to return something and so that changes the following assertions assert num == 1 @@ -95,7 +97,9 @@ def test_count_tasks_by_status_no_filter(self): def test_count_tasks_by_status_with_filter(self): tasks_client: ArmoniKTasks = get_client("Tasks") - count = tasks_client.count_tasks_by_status(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) + count = tasks_client.count_tasks_by_status( + TaskFieldFilter.STATUS == TaskStatus.COMPLETED + ) assert rpc_called("Tasks", "CountTasksByStatus", 2) # TODO: Mock must be updated to return something and so that changes the following assertions assert count == {TaskStatus.COMPLETED: 2, TaskStatus.SUBMITTED: 5} @@ -104,21 +108,21 @@ def test_submit_tasks(self): tasks_client: ArmoniKTasks = get_client("Tasks") tasks = tasks_client.submit_tasks( "session-id", - [TaskDefinition(payload_id="payload-id", - expected_output_ids=["result-id"], - data_dependencies=[], - options=TaskOptions( - max_duration=datetime.timedelta(seconds=1), - priority=1, - max_retries=1 - ) + [ + TaskDefinition( + payload_id="payload-id", + expected_output_ids=["result-id"], + data_dependencies=[], + options=TaskOptions( + max_duration=datetime.timedelta(seconds=1), + priority=1, + max_retries=1, + ), ) ], default_task_options=TaskOptions( - max_duration=datetime.timedelta(seconds=1), - priority=1, - max_retries=1 - ) + max_duration=datetime.timedelta(seconds=1), priority=1, max_retries=1 + ), ) assert rpc_called("Tasks", "SubmitTasks") # TODO: Mock must be updated to return something and so that changes the following assertions diff --git a/packages/python/tests/test_versions.py b/packages/python/tests/test_versions.py index f29ab2e72..7cd204610 100644 --- a/packages/python/tests/test_versions.py +++ b/packages/python/tests/test_versions.py @@ -1,13 +1,10 @@ import json -import os -import pytest from .conftest import all_rpc_called, rpc_called, get_client from armonik.client import ArmoniKVersions class TestArmoniKVersions: - def test_list_versions(self): """ Test the list_versions method of ArmoniKVersions client. diff --git a/packages/python/tests/test_worker.py b/packages/python/tests/test_worker.py index 42198bcdf..2ed9092f6 100644 --- a/packages/python/tests/test_worker.py +++ b/packages/python/tests/test_worker.py @@ -2,7 +2,6 @@ import grpc import logging import os -import pytest from .conftest import data_folder, grpc_endpoint from armonik.worker import ArmoniKWorker, TaskHandler, ClefLogger @@ -29,7 +28,6 @@ def return_and_send(th: TaskHandler) -> Output: class TestWorker: - request = ProcessRequest( communication_token="token", session_id="session-id", @@ -40,41 +38,71 @@ class TestWorker: data_folder=data_folder, configuration=Configuration(data_chunk_max_size=8000), task_options=TaskOptions( - max_duration=datetime.timedelta(seconds=1), - priority=1, - max_retries=1 - ).to_message() + max_duration=datetime.timedelta(seconds=1), priority=1, max_retries=1 + ).to_message(), ) def test_do_nothing(self): with grpc.insecure_channel(grpc_endpoint) as agent_channel: - worker = ArmoniKWorker(agent_channel, do_nothing, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) + worker = ArmoniKWorker( + agent_channel, + do_nothing, + logger=ClefLogger("TestLogger", level=logging.CRITICAL), + ) reply = worker.Process(self.request, None) - assert Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None).success + assert Output( + reply.output.error.details + if reply.output.WhichOneof("type") == "error" + else None + ).success worker.HealthCheck(Empty(), None) def test_should_return_none(self): with grpc.insecure_channel(grpc_endpoint) as agent_channel: - worker = ArmoniKWorker(agent_channel, throw_error, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) + worker = ArmoniKWorker( + agent_channel, + throw_error, + logger=ClefLogger("TestLogger", level=logging.CRITICAL), + ) reply = worker.Process(self.request, None) assert reply is None def test_should_error(self): with grpc.insecure_channel(grpc_endpoint) as agent_channel: - worker = ArmoniKWorker(agent_channel, return_error, logger=ClefLogger("TestLogger", level=logging.CRITICAL)) + worker = ArmoniKWorker( + agent_channel, + return_error, + logger=ClefLogger("TestLogger", level=logging.CRITICAL), + ) reply = worker.Process(self.request, None) - output = Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None) + output = Output( + reply.output.error.details + if reply.output.WhichOneof("type") == "error" + else None + ) assert not output.success assert output.error == "TestError" def test_should_write_result(self): with grpc.insecure_channel(grpc_endpoint) as agent_channel: - worker = ArmoniKWorker(agent_channel, return_and_send, logger=ClefLogger("TestLogger", level=logging.DEBUG)) + worker = ArmoniKWorker( + agent_channel, + return_and_send, + logger=ClefLogger("TestLogger", level=logging.DEBUG), + ) reply = worker.Process(self.request, None) assert reply is not None - output = Output(reply.output.error.details if reply.output.WhichOneof("type") == "error" else None) + output = Output( + reply.output.error.details + if reply.output.WhichOneof("type") == "error" + else None + ) assert output.success - assert os.path.exists(os.path.join(data_folder, self.request.expected_output_keys[0])) - with open(os.path.join(data_folder, self.request.expected_output_keys[0]), "rb") as f: + assert os.path.exists( + os.path.join(data_folder, self.request.expected_output_keys[0]) + ) + with open( + os.path.join(data_folder, self.request.expected_output_keys[0]), "rb" + ) as f: value = f.read() assert len(value) > 0 From 58862358637677275dbeafc839456b1090740d8d Mon Sep 17 00:00:00 2001 From: qdelamea Date: Fri, 5 Jan 2024 13:02:41 +0100 Subject: [PATCH 146/344] Fix imports --- packages/python/ruff.toml | 2 +- packages/python/src/armonik/common/__init__.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/python/ruff.toml b/packages/python/ruff.toml index 1ed8e7f06..f58012f39 100644 --- a/packages/python/ruff.toml +++ b/packages/python/ruff.toml @@ -39,7 +39,7 @@ exclude = ["*.pyi"] fixable = ["ALL"] # Avoid automatically removing unused imports in `__init__.py` files. -ignore-init-module-imports = true +ignore-init-module-imports = false [format] # Like Black, indent with spaces, rather than tabs. diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index 81c7293a2..ce27be49e 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -8,6 +8,7 @@ TaskStatus, ) from .events import ( + Event, NewResultEvent, NewTaskEvent, ResultOwnerUpdateEvent, @@ -65,4 +66,5 @@ "ResultOwnerUpdateEvent", "ResultStatusUpdateEvent", "TaskStatusUpdateEvent", + "Event" ] From edfceeec6eabba1293a59d9e15d9ecacea9fb937 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Fri, 5 Jan 2024 13:12:23 +0100 Subject: [PATCH 147/344] Fix version --- packages/python/src/armonik/__init__.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/python/src/armonik/__init__.py b/packages/python/src/armonik/__init__.py index e69de29bb..ca33f1d37 100644 --- a/packages/python/src/armonik/__init__.py +++ b/packages/python/src/armonik/__init__.py @@ -0,0 +1,7 @@ +from ._version import __version__, __version_tuple__ + + +__all__ = [ + "__version__", + "__version_tuple__", +] From 358cd327654c9e30db105fd1cc81c1527bf1248a Mon Sep 17 00:00:00 2001 From: qdelamea Date: Wed, 10 Jan 2024 11:00:33 +0100 Subject: [PATCH 148/344] Modify line length for formatting --- packages/python/fix_imports.py | 8 +- packages/python/genversion.py | 4 +- packages/python/ruff.toml | 6 +- packages/python/src/armonik/client/events.py | 12 +- .../python/src/armonik/client/partitions.py | 4 +- packages/python/src/armonik/client/results.py | 37 ++--- .../python/src/armonik/client/sessions.py | 8 +- .../python/src/armonik/client/submitter.py | 27 +--- packages/python/src/armonik/client/tasks.py | 134 ++++-------------- .../python/src/armonik/common/__init__.py | 2 +- packages/python/src/armonik/common/filter.py | 36 ++--- packages/python/src/armonik/common/objects.py | 4 +- .../python/src/armonik/worker/taskhandler.py | 27 +--- packages/python/src/armonik/worker/worker.py | 4 +- packages/python/tests/test_events.py | 4 +- packages/python/tests/test_filters.py | 28 +--- packages/python/tests/test_helpers.py | 10 +- packages/python/tests/test_partitions.py | 4 +- packages/python/tests/test_results.py | 8 +- packages/python/tests/test_tasks.py | 8 +- packages/python/tests/test_worker.py | 20 +-- 21 files changed, 96 insertions(+), 299 deletions(-) diff --git a/packages/python/fix_imports.py b/packages/python/fix_imports.py index 216eb4830..ab307da91 100644 --- a/packages/python/fix_imports.py +++ b/packages/python/fix_imports.py @@ -93,9 +93,7 @@ def fix_protobuf_import_in_line( referenced_directory = root_dir / import_path if referenced_directory.exists(): - relative_path_to_root = os.path.relpath( - root_dir, referencing_info["dir"] - ) + relative_path_to_root = os.path.relpath(root_dir, referencing_info["dir"]) uppath_levels = relative_path_to_root.count("..") @@ -107,9 +105,7 @@ def fix_protobuf_import_in_line( new_line = line.replace("\n", "") - print( - f'{referencing_info["rel_path"]}: "{original_line}" -> "{new_line}"' - ) + print(f'{referencing_info["rel_path"]}: "{original_line}" -> "{new_line}"') return line diff --git a/packages/python/genversion.py b/packages/python/genversion.py index 77148690f..40fe4d2e8 100644 --- a/packages/python/genversion.py +++ b/packages/python/genversion.py @@ -19,9 +19,7 @@ def get_version(self, version: ScmVersion): + int(version.dirty and self.consider_dirty) ) if dev: - return version.format_next_version( - guess_next_version, "{guessed}" + f".dev{dev}" - ) + return version.format_next_version(guess_next_version, "{guessed}" + f".dev{dev}") return version.format_with("{tag}") diff --git a/packages/python/ruff.toml b/packages/python/ruff.toml index f58012f39..134c94968 100644 --- a/packages/python/ruff.toml +++ b/packages/python/ruff.toml @@ -26,7 +26,7 @@ target-version = "py310" src = ["src/armonik", "test"] # Allow lines to be as long as 110. -line-length = 88 +line-length = 100 # Use 4-long indents indent-width = 4 @@ -57,6 +57,6 @@ line-ending = "lf" # Enable auto-formatting of code examples in docstrings. docstring-code-format = true -# Allow lines to be as long as 110 for code snippets in +# Allow lines to be as long as 100 for code snippets in # docstrings. -docstring-code-line-length = 110 +docstring-code-line-length = 100 diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index 0ef34426f..19c46ede9 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -60,9 +60,7 @@ def get_events( result_filter: A filter on results. """ - request = EventSubscriptionRequest( - session_id=session_id, returned_events=event_types - ) + request = EventSubscriptionRequest(session_id=session_id, returned_events=event_types) if task_filter: request.tasks_filters = ( cast(rawTaskFilters, task_filter.to_disjunction().to_message()), @@ -102,15 +100,11 @@ def wait_for_result_availability(self, result_id: str, session_id: str) -> None: def handler(session_id, event_type, event): if not isinstance(event, ResultStatusUpdateEvent): - raise ValueError( - "Handler should receive event of type 'ResultStatusUpdateEvent'." - ) + raise ValueError("Handler should receive event of type 'ResultStatusUpdateEvent'.") if event.status == ResultStatus.COMPLETED: return False elif event.status == ResultStatus.ABORTED: - raise RuntimeError( - f"Result {result.name} with ID {result_id} is aborted." - ) + raise RuntimeError(f"Result {result.name} with ID {result_id} is aborted.") return True result = self._results_client.get_result(result_id) diff --git a/packages/python/src/armonik/client/partitions.py b/packages/python/src/armonik/client/partitions.py index 1aa0daf51..6da7d5d6f 100644 --- a/packages/python/src/armonik/client/partitions.py +++ b/packages/python/src/armonik/client/partitions.py @@ -30,9 +30,7 @@ class PartitionFieldFilter: PRIORITY = NumberFilter( PartitionField( - partition_raw_field=PartitionRawField( - field=PARTITION_RAW_ENUM_FIELD_PRIORITY - ) + partition_raw_field=PartitionRawField(field=PARTITION_RAW_ENUM_FIELD_PRIORITY) ), rawFilters, rawFiltersAnd, diff --git a/packages/python/src/armonik/client/results.py b/packages/python/src/armonik/client/results.py index a62cd1812..ad9b07a95 100644 --- a/packages/python/src/armonik/client/results.py +++ b/packages/python/src/armonik/client/results.py @@ -49,18 +49,14 @@ class ResultFieldFilter: STATUS = StatusFilter( - ResultField( - result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_STATUS) - ), + ResultField(result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus, ) RESULT_ID = StringFilter( - ResultField( - result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_RESULT_ID) - ), + ResultField(result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_RESULT_ID)), rawFilters, rawFilterAnd, rawFilterField, @@ -87,10 +83,7 @@ def get_results_ids(self, session_id: str, names: List[str]) -> Dict[str, str]: CreateResultsMetaDataResponse, self._client.CreateResultsMetaData( CreateResultsMetaDataRequest( - results=[ - CreateResultsMetaDataRequest.ResultCreate(name=n) - for n in names - ], + results=[CreateResultsMetaDataRequest.ResultCreate(name=n) for n in names], session_id=session_id, ) ), @@ -129,9 +122,7 @@ def list_results( ), ) list_response: ListResultsResponse = self._client.ListResults(request) - return list_response.total, [ - Result.from_message(r) for r in list_response.results - ] + return list_response.total, [Result.from_message(r) for r in list_response.results] def get_result(self, result_id: str) -> Result: """Get a result by id. @@ -161,9 +152,7 @@ def get_owner_task_id( """ results = {} for result_ids_batch in batched(result_ids, batch_size): - request = GetOwnerTaskIdRequest( - session_id=session_id, result_id=result_ids_batch - ) + request = GetOwnerTaskIdRequest(session_id=session_id, result_id=result_ids_batch) response: GetOwnerTaskIdResponse = self._client.GetOwnerTaskId(request) for result_task in response.result_task: results[result_task.result_id] = result_task.task_id @@ -192,9 +181,7 @@ def create_results_metadata( ], session_id=session_id, ) - response: CreateResultsMetaDataResponse = ( - self._client.CreateResultsMetaData(request) - ) + response: CreateResultsMetaDataResponse = self._client.CreateResultsMetaData(request) for result_message in response.results: results[result_message.name] = Result.from_message(result_message) return results @@ -216,9 +203,7 @@ def create_results( for results_names_batch in batched(results_data.keys(), batch_size): request = CreateResultsRequest( results=[ - CreateResultsRequest.ResultCreate( - name=name, data=results_data[name] - ) + CreateResultsRequest.ResultCreate(name=name, data=results_data[name]) for name in results_names_batch ], session_id=session_id, @@ -285,9 +270,7 @@ def delete_result_data( batch_size: Batch size for querying. """ for result_ids_batch in batched(result_ids, batch_size): - request = DeleteResultsDataRequest( - result_id=result_ids_batch, session_id=session_id - ) + request = DeleteResultsDataRequest(result_id=result_ids_batch, session_id=session_id) self._client.DeleteResultsData(request) def get_service_config(self) -> int: @@ -296,8 +279,8 @@ def get_service_config(self) -> int: Return: Maximum size supported by a data chunk for the result service. """ - response: ResultsServiceConfigurationResponse = ( - self._client.GetServiceConfiguration(Empty()) + response: ResultsServiceConfigurationResponse = self._client.GetServiceConfiguration( + Empty() ) return response.data_chunk_max_size diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 247f3bffb..b5fd67ab2 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -42,9 +42,7 @@ class SessionFieldFilter: """ STATUS = StatusFilter( - SessionField( - session_raw_field=SessionRawField(field=SESSION_RAW_ENUM_FIELD_STATUS) - ), + SessionField(session_raw_field=SessionRawField(field=SESSION_RAW_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, @@ -62,9 +60,7 @@ def task_options_key(option_key: str) -> StringFilter: Corresponding filter """ return StringFilter( - SessionField( - task_option_generic_field=TaskOptionGenericField(field=option_key) - ), + SessionField(task_option_generic_field=TaskOptionGenericField(field=option_key)), rawFilters, rawFilterAnd, rawFilterField, diff --git a/packages/python/src/armonik/client/submitter.py b/packages/python/src/armonik/client/submitter.py index 3484ecb87..92b519e59 100644 --- a/packages/python/src/armonik/client/submitter.py +++ b/packages/python/src/armonik/client/submitter.py @@ -33,9 +33,7 @@ from ..protogen.common.task_status_pb2 import TaskStatus -@deprecated( - deprecated_in="3.14.0", details="Use sessions, task and results client instead" -) +@deprecated(deprecated_in="3.14.0", details="Use sessions, task and results client instead") class ArmoniKSubmitter: """ Deprecated: @@ -77,9 +75,7 @@ def create_session( """ if partition_ids is None: partition_ids = [] - request = CreateSessionRequest( - default_task_option=default_task_options.to_message() - ) + request = CreateSessionRequest(default_task_option=default_task_options.to_message()) for partition in partition_ids: request.partition_ids.append(partition) return self._client.CreateSession(request).session_id @@ -130,23 +126,18 @@ def submit( ) ret = create_tasks_reply.WhichOneof("Response") if ret is None or ret == "error": - raise Exception( - f"Issue with server when submitting tasks : {create_tasks_reply.error}" - ) + raise Exception(f"Issue with server when submitting tasks : {create_tasks_reply.error}") elif ret == "creation_status_list": tasks_created = [] tasks_creation_failed = [] - for ( - creation_status - ) in create_tasks_reply.creation_status_list.creation_statuses: + for creation_status in create_tasks_reply.creation_status_list.creation_statuses: if creation_status.WhichOneof("Status") == "task_info": tasks_created.append( Task( id=creation_status.task_info.task_id, session_id=session_id, expected_output_ids=[ - k - for k in creation_status.task_info.expected_output_keys + k for k in creation_status.task_info.expected_output_keys ], data_dependencies=[ k for k in creation_status.task_info.data_dependencies @@ -186,9 +177,7 @@ def list_tasks( return [ t for t in self._client.ListTasks( - get_task_filter( - session_ids, task_ids, included_statuses, excluded_statuses - ) + get_task_filter(session_ids, task_ids, included_statuses, excluded_statuses) ).task_ids ] @@ -368,9 +357,7 @@ def _to_request_stream( CreateLargeTaskRequest from the list of task requests """ req = CreateLargeTaskRequest( - init_request=CreateLargeTaskRequest.InitRequest( - session_id=s_id, task_options=t_options - ) + init_request=CreateLargeTaskRequest.InitRequest(session_id=s_id, task_options=t_options) ) yield req if len(requests) == 0: diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 00657446e..0159e661e 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -80,86 +80,58 @@ class TaskFieldFilter: """ TASK_ID = StringFilter( - TaskField( - task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID)), rawFilters, rawFilterAnd, rawFilterField, ) SESSION_ID = StringFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID - ) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID)), rawFilters, rawFilterAnd, rawFilterField, ) OWNER_POD_ID = StringFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID - ) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID)), rawFilters, rawFilterAnd, rawFilterField, ) INITIAL_TASK_ID = StringFilter( TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID - ) + task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID) ), rawFilters, rawFilterAnd, rawFilterField, ) STATUS = StatusFilter( - TaskField( - task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STATUS) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STATUS)), rawFilters, rawFilterAnd, rawFilterField, rawFilterStatus, ) CREATED_AT = DateFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT - ) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT)), rawFilters, rawFilterAnd, rawFilterField, ) SUBMITTED_AT = DateFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT - ) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT)), rawFilters, rawFilterAnd, rawFilterField, ) STARTED_AT = DateFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT - ) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT)), rawFilters, rawFilterAnd, rawFilterField, ) ENDED_AT = DateFilter( - TaskField( - task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT)), rawFilters, rawFilterAnd, rawFilterField, @@ -185,99 +157,69 @@ class TaskFieldFilter: rawFilterField, ) POD_TTL = DateFilter( - TaskField( - task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL)), rawFilters, rawFilterAnd, rawFilterField, ) POD_HOSTNAME = StringFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME - ) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME)), rawFilters, rawFilterAnd, rawFilterField, ) RECEIVED_AT = DateFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT - ) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT)), rawFilters, rawFilterAnd, rawFilterField, ) ACQUIRED_AT = DateFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT - ) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT)), rawFilters, rawFilterAnd, rawFilterField, ) ERROR = StringFilter( - TaskField( - task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ERROR) - ), + TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ERROR)), rawFilters, rawFilterAnd, rawFilterField, ) MAX_DURATION = DurationFilter( - TaskField( - task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_DURATION) - ), + TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_DURATION)), rawFilters, rawFilterAnd, rawFilterField, ) MAX_RETRIES = NumberFilter( - TaskField( - task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_RETRIES) - ), + TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_RETRIES)), rawFilters, rawFilterAnd, rawFilterField, ) PRIORITY = NumberFilter( - TaskField( - task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PRIORITY) - ), + TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PRIORITY)), rawFilters, rawFilterAnd, rawFilterField, ) PARTITION_ID = StringFilter( - TaskField( - task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PARTITION_ID) - ), + TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PARTITION_ID)), rawFilters, rawFilterAnd, rawFilterField, ) APPLICATION_NAME = StringFilter( - TaskField( - task_option_field=TaskOptionField( - field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAME - ) - ), + TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAME)), rawFilters, rawFilterAnd, rawFilterField, ) APPLICATION_VERSION = StringFilter( TaskField( - task_option_field=TaskOptionField( - field=TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION - ) + task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION) ), rawFilters, rawFilterAnd, @@ -285,9 +227,7 @@ class TaskFieldFilter: ) APPLICATION_NAMESPACE = StringFilter( TaskField( - task_option_field=TaskOptionField( - field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE - ) + task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE) ), rawFilters, rawFilterAnd, @@ -295,18 +235,14 @@ class TaskFieldFilter: ) APPLICATION_SERVICE = StringFilter( TaskField( - task_option_field=TaskOptionField( - field=TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE - ) + task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE) ), rawFilters, rawFilterAnd, rawFilterField, ) ENGINE_TYPE = StringFilter( - TaskField( - task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE) - ), + TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE)), rawFilters, rawFilterAnd, rawFilterField, @@ -323,9 +259,7 @@ def task_options_key(option_key: str) -> StringFilter: Corresponding filter """ return StringFilter( - TaskField( - task_option_generic_field=TaskOptionGenericField(field=option_key) - ), + TaskField(task_option_generic_field=TaskOptionGenericField(field=option_key)), rawFilters, rawFilterAnd, rawFilterField, @@ -350,9 +284,7 @@ def get_task(self, task_id: str) -> Task: Returns: Task object with the information """ - task_response: GetTaskResponse = self._client.GetTask( - GetTaskRequest(task_id=task_id) - ) + task_response: GetTaskResponse = self._client.GetTask(GetTaskRequest(task_id=task_id)) return Task.from_message(task_response.task) def list_tasks( @@ -395,9 +327,7 @@ def list_tasks( with_errors=with_errors, ) if detailed: - response: ListTasksDetailedResponse = self._client.ListTasksDetailed( - request - ) + response: ListTasksDetailedResponse = self._client.ListTasksDetailed(request) return response.total, [Task.from_message(t) for t in response.tasks] response: ListTasksResponse = self._client.ListTasks(request) return response.total, [Task.from_message(t) for t in response.tasks] @@ -432,16 +362,12 @@ def get_result_ids( for task_ids_batch in batched(task_ids, chunk_size): request = GetResultIdsRequest(task_id=task_ids_batch) - result_ids_response: GetResultIdsResponse = self._client.GetResultIds( - request - ) + result_ids_response: GetResultIdsResponse = self._client.GetResultIds(request) for t in result_ids_response.task_results: tasks_result_ids[t.task_id] = list(t.result_ids) return tasks_result_ids - def count_tasks_by_status( - self, task_filter: Filter | None = None - ) -> Dict[TaskStatus, int]: + def count_tasks_by_status(self, task_filter: Filter | None = None) -> Dict[TaskStatus, int]: """Get number of tasks by status. Args: @@ -497,9 +423,7 @@ def submit_tasks( request = SubmitTasksRequest( session_id=session_id, task_creations=task_creations, - task_options=default_task_options.to_message() - if default_task_options - else None, + task_options=default_task_options.to_message() if default_task_options else None, ) self._client.SubmitTasks(request) diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index ce27be49e..c6397e806 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -66,5 +66,5 @@ "ResultOwnerUpdateEvent", "ResultStatusUpdateEvent", "TaskStatusUpdateEvent", - "Event" + "Event", ] diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 537190a60..56456a885 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -263,9 +263,7 @@ def _verify_value(self, value): Exception if value is not of the expected type """ - if self.__class__.value_type_ is None or isinstance( - value, self.__class__.value_type_ - ): + if self.__class__.value_type_ is None or isinstance(value, self.__class__.value_type_): return msg = f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead" raise Exception(msg) @@ -313,9 +311,7 @@ def to_conjunction_message(conj: List[Filter]) -> Message: if self.message_type == self.disjunction_type: raw = self.to_disjunction().disjunction_type() - getattr(raw, "or").extend( - [to_conjunction_message(conj) for conj in self._filters] - ) + getattr(raw, "or").extend([to_conjunction_message(conj) for conj in self._filters]) return raw if self.message_type == self.conjunction_type: return to_conjunction_message(self.to_disjunction()._filters[0]) @@ -364,9 +360,7 @@ def endswith(self, value: str) -> "StringFilter": def to_basic_message(self) -> Message: return self.message_type( field=self.field, - filter_string=self.inner_message_type( - value=self.value, operator=self.operator - ), + filter_string=self.inner_message_type(value=self.value, operator=self.operator), ) def __repr__(self) -> str: @@ -406,9 +400,7 @@ def __init__( def to_basic_message(self) -> Message: return self.message_type( field=self.field, - filter_status=self.inner_message_type( - value=self.value, operator=self.operator - ), + filter_status=self.inner_message_type(value=self.value, operator=self.operator), ) @@ -450,9 +442,7 @@ def __init__( def to_basic_message(self) -> Message: return self.message_type( field=self.field, - filter_date=self.inner_message_type( - value=self.value, operator=self.operator - ), + filter_date=self.inner_message_type(value=self.value, operator=self.operator), ) @@ -494,9 +484,7 @@ def __init__( def to_basic_message(self) -> Message: return self.message_type( field=self.field, - filter_number=self.inner_message_type( - value=self.value, operator=self.operator - ), + filter_number=self.inner_message_type(value=self.value, operator=self.operator), ) @@ -539,9 +527,7 @@ def __invert__(self) -> "BooleanFilter": def to_basic_message(self) -> Message: return self.message_type( field=self.field, - filter_boolean=self.inner_message_type( - value=self.value, operator=self.operator - ), + filter_boolean=self.inner_message_type(value=self.value, operator=self.operator), ) @@ -579,9 +565,7 @@ def __init__( def to_basic_message(self) -> Message: return self.message_type( field=self.field, - filter_array=self.inner_message_type( - value=self.value, operator=self.operator - ), + filter_array=self.inner_message_type(value=self.value, operator=self.operator), ) @@ -623,7 +607,5 @@ def __init__( def to_basic_message(self) -> Message: return self.message_type( field=self.field, - filter_duration=self.inner_message_type( - value=self.value, operator=self.operator - ), + filter_duration=self.inner_message_type(value=self.value, operator=self.operator), ) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 1e0465e33..e34596c82 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -162,9 +162,7 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": started_at=timestamp_to_datetime(task_raw.started_at), ended_at=timestamp_to_datetime(task_raw.ended_at), pod_ttl=timestamp_to_datetime(task_raw.pod_ttl), - output=Output( - error=(task_raw.output.error if not task_raw.output.success else None) - ), + output=Output(error=(task_raw.output.error if not task_raw.output.success else None)), pod_hostname=task_raw.pod_hostname, received_at=timestamp_to_datetime(task_raw.received_at), acquired_at=timestamp_to_datetime(task_raw.acquired_at), diff --git a/packages/python/src/armonik/worker/taskhandler.py b/packages/python/src/armonik/worker/taskhandler.py index da6ce3f77..fe8fa6ec5 100644 --- a/packages/python/src/armonik/worker/taskhandler.py +++ b/packages/python/src/armonik/worker/taskhandler.py @@ -83,23 +83,18 @@ def create_tasks( ) ret = create_tasks_reply.WhichOneof("Response") if ret is None or ret == "error": - raise Exception( - f"Issue with server when submitting tasks : {create_tasks_reply.error}" - ) + raise Exception(f"Issue with server when submitting tasks : {create_tasks_reply.error}") elif ret == "creation_status_list": tasks_created = [] tasks_creation_failed = [] - for ( - creation_status - ) in create_tasks_reply.creation_status_list.creation_statuses: + for creation_status in create_tasks_reply.creation_status_list.creation_statuses: if creation_status.WhichOneof("Status") == "task_info": tasks_created.append( Task( id=creation_status.task_info.task_id, session_id=self.session_id, expected_output_ids=[ - k - for k in creation_status.task_info.expected_output_keys + k for k in creation_status.task_info.expected_output_keys ], data_dependencies=[ k for k in creation_status.task_info.data_dependencies @@ -194,9 +189,7 @@ def create_results_metadata( session_id=self.session_id, communication_token=self.token, ) - response: CreateResultsMetaDataResponse = ( - self._client.CreateResultsMetaData(request) - ) + response: CreateResultsMetaDataResponse = self._client.CreateResultsMetaData(request) for result_message in response.results: results[result_message.name] = Result.from_message(result_message) return results @@ -217,9 +210,7 @@ def create_results( for results_ids_batch in batched(results_data.keys(), batch_size): request = CreateResultsRequest( results=[ - CreateResultsRequest.ResultCreate( - name=name, data=results_data[name] - ) + CreateResultsRequest.ResultCreate(name=name, data=results_data[name]) for name in results_ids_batch ], session_id=self.session_id, @@ -286,11 +277,7 @@ def _to_request_stream(requests, communication_token, t_options, chunk_max_size) if len(requests) == 0: return for r in requests[:-1]: - for req in _to_request_stream_internal( - r, communication_token, False, chunk_max_size - ): + for req in _to_request_stream_internal(r, communication_token, False, chunk_max_size): yield req - for req in _to_request_stream_internal( - requests[-1], communication_token, True, chunk_max_size - ): + for req in _to_request_stream_internal(requests[-1], communication_token, True, chunk_max_size): yield req diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index f213dd470..3596b80a6 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -65,9 +65,7 @@ def Process(self, request: ProcessRequest, context) -> Union[ProcessReply, None] try: self._logger.debug("Received task") task_handler = TaskHandler(request, self._client) - return ProcessReply( - output=self.processing_function(task_handler).to_message() - ) + return ProcessReply(output=self.processing_function(task_handler).to_message()) except Exception as e: self._logger.exception( f"Failed task {''.join(traceback.format_exception(type(e) ,e, e.__traceback__))}", diff --git a/packages/python/tests/test_events.py b/packages/python/tests/test_events.py index 2e8d3845f..86ca9e42b 100644 --- a/packages/python/tests/test_events.py +++ b/packages/python/tests/test_events.py @@ -14,9 +14,7 @@ def test_handler(session_id, event_type, event): assert event.status == ResultStatus.CREATED tasks_client: ArmoniKEvents = get_client("Events") - tasks_client.get_events( - "session-id", [EventTypes.TASK_STATUS_UPDATE], [test_handler] - ) + tasks_client.get_events("session-id", [EventTypes.TASK_STATUS_UPDATE], [test_handler]) assert rpc_called("Events", "GetEvents") diff --git a/packages/python/tests/test_filters.py b/packages/python/tests/test_filters.py index c046efe00..8a8ead89c 100644 --- a/packages/python/tests/test_filters.py +++ b/packages/python/tests/test_filters.py @@ -27,20 +27,12 @@ class Field(Message): "filt,inverted", [ ( - StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) - == "Test", - StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) - != "Test", + StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) == "Test", + StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) != "Test", ), ( - StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains( - "Test" - ), - ~( - StringFilter( - Field(), DummyMessage, DummyMessageAnd, DummyMessage - ).contains("Test") - ), + StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains("Test"), + ~(StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains("Test")), ), ( BooleanFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage), @@ -83,16 +75,8 @@ def test_inversion(filt: Filter, inverted: Filter): @pytest.mark.parametrize( "filt", [ - ( - StringFilter( - Field(), DummyMessage, DummyMessageAnd, DummyMessage - ).startswith("Test") - ), - ( - StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).endswith( - "Test" - ) - ), + (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).startswith("Test")), + (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).endswith("Test")), (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage)), # No op ], ) diff --git a/packages/python/tests/test_helpers.py b/packages/python/tests/test_helpers.py index 2573cfd49..98155cd69 100644 --- a/packages/python/tests/test_helpers.py +++ b/packages/python/tests/test_helpers.py @@ -46,10 +46,7 @@ def delta(self) -> timedelta: @pytest.mark.parametrize("case", test_cases) def test_datetime_to_timestamp(case: Case): ts = datetime_to_timestamp(case.date_time) - assert ( - ts.seconds == case.timestamp.seconds - and abs(ts.nanos - case.timestamp.nanos) < 1000 - ) + assert ts.seconds == case.timestamp.seconds and abs(ts.nanos - case.timestamp.nanos) < 1000 @pytest.mark.parametrize("case", test_cases) @@ -67,10 +64,7 @@ def test_duration_to_timedelta(case: Case): @pytest.mark.parametrize("case", test_cases) def test_timedelta_to_duration(case: Case): ts = timedelta_to_duration(case.delta) - assert ( - ts.seconds == case.duration.seconds - and abs(ts.nanos - case.duration.nanos) < 1000 - ) + assert ts.seconds == case.duration.seconds and abs(ts.nanos - case.duration.nanos) < 1000 @pytest.mark.parametrize( diff --git a/packages/python/tests/test_partitions.py b/packages/python/tests/test_partitions.py index b2f26d754..d1d25ed1c 100644 --- a/packages/python/tests/test_partitions.py +++ b/packages/python/tests/test_partitions.py @@ -29,9 +29,7 @@ def test_list_partitions_no_filter(self): def test_list_partitions_with_filter(self): partitions_client: ArmoniKPartitions = get_client("Partitions") - num, partitions = partitions_client.list_partitions( - PartitionFieldFilter.PRIORITY == 1 - ) + num, partitions = partitions_client.list_partitions(PartitionFieldFilter.PRIORITY == 1) assert rpc_called("Partitions", "ListPartitions", 2) # TODO: Mock must be updated to return something and so that changes the following assertions diff --git a/packages/python/tests/test_results.py b/packages/python/tests/test_results.py index dc65a49c9..6ea058103 100644 --- a/packages/python/tests/test_results.py +++ b/packages/python/tests/test_results.py @@ -65,9 +65,7 @@ def test_create_results_metadata(self): def test_create_results(self): results_client: ArmoniKResults = get_client("Results") - results = results_client.create_results( - {"result-name": b"test data"}, "session-id" - ) + results = results_client.create_results({"result-name": b"test data"}, "session-id") assert rpc_called("Results", "CreateResults") assert results == {} @@ -82,9 +80,7 @@ def test_get_service_config(self): def test_upload_result_data(self): results_client: ArmoniKResults = get_client("Results") - result = results_client.upload_result_data( - "result-name", "session-id", b"test data" - ) + result = results_client.upload_result_data("result-name", "session-id", b"test data") assert rpc_called("Results", "UploadResultData") assert result is None diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py index ec635e27e..6297b3625 100644 --- a/packages/python/tests/test_tasks.py +++ b/packages/python/tests/test_tasks.py @@ -58,9 +58,7 @@ def test_list_tasks_detailed_no_filter(self): def test_list_tasks_detailed_with_filter(self): tasks_client: ArmoniKTasks = get_client("Tasks") - num, tasks = tasks_client.list_tasks( - TaskFieldFilter.STATUS == TaskStatus.COMPLETED - ) + num, tasks = tasks_client.list_tasks(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) assert rpc_called("Tasks", "ListTasksDetailed", 2) # TODO: Mock must be updated to return something and so that changes the following assertions assert num == 1 @@ -97,9 +95,7 @@ def test_count_tasks_by_status_no_filter(self): def test_count_tasks_by_status_with_filter(self): tasks_client: ArmoniKTasks = get_client("Tasks") - count = tasks_client.count_tasks_by_status( - TaskFieldFilter.STATUS == TaskStatus.COMPLETED - ) + count = tasks_client.count_tasks_by_status(TaskFieldFilter.STATUS == TaskStatus.COMPLETED) assert rpc_called("Tasks", "CountTasksByStatus", 2) # TODO: Mock must be updated to return something and so that changes the following assertions assert count == {TaskStatus.COMPLETED: 2, TaskStatus.SUBMITTED: 5} diff --git a/packages/python/tests/test_worker.py b/packages/python/tests/test_worker.py index 2ed9092f6..ef20fb1cf 100644 --- a/packages/python/tests/test_worker.py +++ b/packages/python/tests/test_worker.py @@ -51,9 +51,7 @@ def test_do_nothing(self): ) reply = worker.Process(self.request, None) assert Output( - reply.output.error.details - if reply.output.WhichOneof("type") == "error" - else None + reply.output.error.details if reply.output.WhichOneof("type") == "error" else None ).success worker.HealthCheck(Empty(), None) @@ -76,9 +74,7 @@ def test_should_error(self): ) reply = worker.Process(self.request, None) output = Output( - reply.output.error.details - if reply.output.WhichOneof("type") == "error" - else None + reply.output.error.details if reply.output.WhichOneof("type") == "error" else None ) assert not output.success assert output.error == "TestError" @@ -93,16 +89,10 @@ def test_should_write_result(self): reply = worker.Process(self.request, None) assert reply is not None output = Output( - reply.output.error.details - if reply.output.WhichOneof("type") == "error" - else None + reply.output.error.details if reply.output.WhichOneof("type") == "error" else None ) assert output.success - assert os.path.exists( - os.path.join(data_folder, self.request.expected_output_keys[0]) - ) - with open( - os.path.join(data_folder, self.request.expected_output_keys[0]), "rb" - ) as f: + assert os.path.exists(os.path.join(data_folder, self.request.expected_output_keys[0])) + with open(os.path.join(data_folder, self.request.expected_output_keys[0]), "rb") as f: value = f.read() assert len(value) > 0 From abd9ee5ee51ef9fd24361dc4dd73cfbc77d94018 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 11 Jan 2024 02:55:00 +0100 Subject: [PATCH 149/344] fix: return rawFilters() instead of Nne for validator --- packages/python/src/armonik/client/partitions.py | 2 +- packages/python/src/armonik/client/results.py | 2 +- packages/python/src/armonik/client/sessions.py | 2 +- packages/python/src/armonik/client/tasks.py | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/python/src/armonik/client/partitions.py b/packages/python/src/armonik/client/partitions.py index 6da7d5d6f..222a92c51 100644 --- a/packages/python/src/armonik/client/partitions.py +++ b/packages/python/src/armonik/client/partitions.py @@ -74,7 +74,7 @@ def list_partitions( page_size=page_size, filters=cast(rawFilters, partition_filter.to_disjunction().to_message()) if partition_filter - else None, + else rawFilters(), sort=ListPartitionsRequest.Sort( field=cast(PartitionField, sort_field.field), direction=sort_direction ), diff --git a/packages/python/src/armonik/client/results.py b/packages/python/src/armonik/client/results.py index ad9b07a95..f462ad385 100644 --- a/packages/python/src/armonik/client/results.py +++ b/packages/python/src/armonik/client/results.py @@ -116,7 +116,7 @@ def list_results( page_size=page_size, filters=cast(rawFilters, result_filter.to_disjunction().to_message()) if result_filter - else None, + else rawFilters(), sort=ListResultsRequest.Sort( field=cast(ResultField, sort_field.field), direction=sort_direction ), diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index b5fd67ab2..02b5dcf7e 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -140,7 +140,7 @@ def list_sessions( page_size=page_size, filters=cast(rawFilters, session_filter.to_disjunction().to_message()) if session_filter - else None, + else rawFilters(), sort=ListSessionsRequest.Sort( field=cast(SessionField, sort_field.field), direction=sort_direction ), diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 0159e661e..ef69ccae2 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -320,7 +320,7 @@ def list_tasks( page_size=page_size, filters=cast(rawFilters, task_filter.to_disjunction().to_message()) if task_filter - else None, + else rawFilters(), sort=ListTasksRequest.Sort( field=cast(TaskField, sort_field.field), direction=sort_direction ), @@ -379,7 +379,7 @@ def count_tasks_by_status(self, task_filter: Filter | None = None) -> Dict[TaskS request = CountTasksByStatusRequest( filters=cast(rawFilters, task_filter.to_disjunction().to_message()) if task_filter - else None + else rawFilters() ) count_tasks_by_status_response: CountTasksByStatusResponse = ( self._client.CountTasksByStatus(request) From 028404b8ef4425e64ec2be703b54de54ad89535d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Thu, 11 Jan 2024 08:27:06 +0100 Subject: [PATCH 150/344] feat: session submission management --- Protos/V1/session_status.proto | 5 +-- Protos/V1/sessions_common.proto | 55 ++++++++++++++++++++++++++++++- Protos/V1/sessions_service.proto | 17 +++++++++- Protos/V1/submission_status.proto | 19 +++++++++++ 4 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 Protos/V1/submission_status.proto diff --git a/Protos/V1/session_status.proto b/Protos/V1/session_status.proto index 4f59479ca..88cfe1ca2 100644 --- a/Protos/V1/session_status.proto +++ b/Protos/V1/session_status.proto @@ -15,6 +15,7 @@ enum SessionStatus { SESSION_STATUS_RUNNING = 1; /** Session is open and accepting tasks for execution. */ SESSION_STATUS_CANCELLED = 2; /** Session is cancelled. No more tasks can be submitted and no more tasks will be executed. */ SESSION_STATUS_PAUSED = 3; /** Session is paused. Tasks can be submitted but no more new tasks will be executed. Already running tasks will continue until they finish. */ - SESSION_STATUS_CLOSED = 4; /** Session is closed. No more tasks can be submitted and executed. Results data will be deleted. */ - SESSION_STATUS_DELETED = 5; /** Session is deleted. Sessions, tasks and results metadata associated to the session will be deleted. */ + SESSION_STATUS_CLOSED = 4; /** Session is closed. No more tasks can be submitted and executed. */ + SESSION_STATUS_PURGED = 5; /** Session is purged. No more tasks can be submitted and executed. Results data will be deleted. */ + SESSION_STATUS_DELETED = 6; /** Session is deleted. No more tasks can be submitted and executed. Sessions, tasks and results metadata associated to the session will be deleted. */ } diff --git a/Protos/V1/sessions_common.proto b/Protos/V1/sessions_common.proto index 079a48972..d4fbd0a30 100644 --- a/Protos/V1/sessions_common.proto +++ b/Protos/V1/sessions_common.proto @@ -12,6 +12,7 @@ import "session_status.proto"; import "sessions_fields.proto"; import "sessions_filters.proto"; import "sort_direction.proto"; +import "submission_status.proto"; option csharp_namespace = "ArmoniK.Api.gRPC.V1.Sessions"; @@ -21,12 +22,16 @@ option csharp_namespace = "ArmoniK.Api.gRPC.V1.Sessions"; message SessionRaw { string session_id = 1; /** The session ID. */ session_status.SessionStatus status = 2; /** The session status. */ + submission_status.SubmissionStatus submission_status = 8; /** The submission status. */ repeated string partition_ids = 3; /** The partition IDs. */ TaskOptions options = 4; /** The task options. In fact, these are used as default value in child tasks. */ google.protobuf.Timestamp created_at = 5; /** The creation date. */ google.protobuf.Timestamp cancelled_at = 6; /** The cancellation date. Only set when status is 'cancelled'. */ - google.protobuf.Duration duration = 7; /** The duration. Only set when status is 'cancelled'. */ + google.protobuf.Timestamp closed_at = 9; /** The closing date. Only set when status is 'closed'. */ + google.protobuf.Timestamp purged_at = 10; /** The purge date. Only set when status is 'purged'. */ + google.protobuf.Timestamp deleted_at = 11; /** The deletion date. Only set when status is 'deleted'. */ + google.protobuf.Duration duration = 7; /** The duration. Only set when status is 'cancelled' and 'closed'. */ } /** @@ -171,6 +176,22 @@ message CloseSessionResponse { SessionRaw session = 1; /** The session. */ } +/** + * Request for purging a single session. + */ +message PurgeSessionRequest { + string session_id = 1; /** The session ID. */ +} + +/** + * Response for purging a single session. + * + * Return a raw session. + */ +message PurgeSessionResponse { + SessionRaw session = 1; /** The session. */ +} + /** * Request for deleting a single session. */ @@ -186,3 +207,35 @@ message DeleteSessionRequest { message DeleteSessionResponse { SessionRaw session = 1; /** The session. */ } + +/** + * Request for stopping new tasks submissions from clients in the given session. + */ +message StopClientSubmissionRequest { + string session_id = 1; /** The session ID. */ +} + +/** + * Response for stopping new tasks submissions from clients in the given session. + * + * Return a raw session. + */ +message StopClientSubmissionResponse { + SessionRaw session = 1; /** The session. */ +} + +/** + * Request for stopping new tasks submissions from workers in the given session. + */ +message StopWorkerSubmissionRequest { + string session_id = 1; /** The session ID. */ +} + +/** + * Response for stopping new tasks submissions from workers in the given session. + * + * Return a raw session. + */ +message StopWorkerSubmissionResponse { + SessionRaw session = 1; /** The session. */ +} diff --git a/Protos/V1/sessions_service.proto b/Protos/V1/sessions_service.proto index f3ad8ed78..006ce83d3 100644 --- a/Protos/V1/sessions_service.proto +++ b/Protos/V1/sessions_service.proto @@ -44,12 +44,27 @@ service Sessions { rpc ResumeSession(ResumeSessionRequest) returns (ResumeSessionResponse); /** - * Close a session by its id. Removes Results data. + * Close a session by its id. Also close submission in the session. */ rpc CloseSession(CloseSessionRequest) returns (CloseSessionResponse); + /** + * Purge a session by its id. Removes Results data. + */ + rpc PurgeSession(PurgeSessionRequest) returns (PurgeSessionResponse); + /** * Delete a session by its id. Removes metadata from Results, Sessions and Tasks associated to the session. */ rpc DeleteSession(DeleteSessionRequest) returns (DeleteSessionResponse); + + /** + * Stops clients from submitting new tasks in the given session. + */ + rpc StopClientSubmission(StopClientSubmissionRequest) returns (StopClientSubmissionResponse); + + /** + * Stops workers from submitting new tasks in the given session. + */ + rpc StopWorkerSubmission(StopWorkerSubmissionRequest) returns (StopWorkerSubmissionResponse); } diff --git a/Protos/V1/submission_status.proto b/Protos/V1/submission_status.proto new file mode 100644 index 000000000..c3973533b --- /dev/null +++ b/Protos/V1/submission_status.proto @@ -0,0 +1,19 @@ +/** + * Submission capabiltiy status. + */ +syntax = "proto3"; + +package armonik.api.grpc.v1.submission_status; + +option csharp_namespace = "ArmoniK.Api.gRPC.V1"; + +/** + * Submission status. + */ +enum SubmissionStatus { + SUBMISSION_STATUS_UNSPECIFIED = 0; /** Submission is in an unknown state. */ + SUBMISSION_STATUS_ALL = 1; /** Workers and clients can submit new tasks. */ + SUBMISSION_STATUS_CLIENT_ONLY = 2; /** Only clients can submit tasks. */ + SUBMISSION_STATUS_WORKER_ONLY = 3; /** Only workers can submit tasks. */ + SUBMISSION_STATUS_CLOSED = 4; /** Tasks cannot be submitted anymore. */ +} From e38b6aebc075f36e68f274584237d207d63f7a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Thu, 11 Jan 2024 09:09:40 +0100 Subject: [PATCH 151/344] feat: simplify session submission management --- Protos/V1/session_status.proto | 5 ++- Protos/V1/sessions_common.proto | 52 +++++++------------------------ Protos/V1/sessions_service.proto | 14 ++------- Protos/V1/submission_status.proto | 19 ----------- 4 files changed, 15 insertions(+), 75 deletions(-) delete mode 100644 Protos/V1/submission_status.proto diff --git a/Protos/V1/session_status.proto b/Protos/V1/session_status.proto index 88cfe1ca2..235d5c689 100644 --- a/Protos/V1/session_status.proto +++ b/Protos/V1/session_status.proto @@ -15,7 +15,6 @@ enum SessionStatus { SESSION_STATUS_RUNNING = 1; /** Session is open and accepting tasks for execution. */ SESSION_STATUS_CANCELLED = 2; /** Session is cancelled. No more tasks can be submitted and no more tasks will be executed. */ SESSION_STATUS_PAUSED = 3; /** Session is paused. Tasks can be submitted but no more new tasks will be executed. Already running tasks will continue until they finish. */ - SESSION_STATUS_CLOSED = 4; /** Session is closed. No more tasks can be submitted and executed. */ - SESSION_STATUS_PURGED = 5; /** Session is purged. No more tasks can be submitted and executed. Results data will be deleted. */ - SESSION_STATUS_DELETED = 6; /** Session is deleted. No more tasks can be submitted and executed. Sessions, tasks and results metadata associated to the session will be deleted. */ + SESSION_STATUS_PURGED = 4; /** Session is purged. No more tasks can be submitted and executed. Results data will be deleted. */ + SESSION_STATUS_DELETED = 5; /** Session is deleted. No more tasks can be submitted and executed. Sessions, tasks and results metadata associated to the session will be deleted. */ } diff --git a/Protos/V1/sessions_common.proto b/Protos/V1/sessions_common.proto index d4fbd0a30..18364f3c2 100644 --- a/Protos/V1/sessions_common.proto +++ b/Protos/V1/sessions_common.proto @@ -12,7 +12,6 @@ import "session_status.proto"; import "sessions_fields.proto"; import "sessions_filters.proto"; import "sort_direction.proto"; -import "submission_status.proto"; option csharp_namespace = "ArmoniK.Api.gRPC.V1.Sessions"; @@ -22,15 +21,16 @@ option csharp_namespace = "ArmoniK.Api.gRPC.V1.Sessions"; message SessionRaw { string session_id = 1; /** The session ID. */ session_status.SessionStatus status = 2; /** The session status. */ - submission_status.SubmissionStatus submission_status = 8; /** The submission status. */ + bool client_submission = 8; /** Whether clients can submit tasks in the session. */ + bool worker_submission = 9; /** Whether workers can submit tasks in the session. */ repeated string partition_ids = 3; /** The partition IDs. */ TaskOptions options = 4; /** The task options. In fact, these are used as default value in child tasks. */ google.protobuf.Timestamp created_at = 5; /** The creation date. */ google.protobuf.Timestamp cancelled_at = 6; /** The cancellation date. Only set when status is 'cancelled'. */ - google.protobuf.Timestamp closed_at = 9; /** The closing date. Only set when status is 'closed'. */ - google.protobuf.Timestamp purged_at = 10; /** The purge date. Only set when status is 'purged'. */ - google.protobuf.Timestamp deleted_at = 11; /** The deletion date. Only set when status is 'deleted'. */ + google.protobuf.Timestamp closed_at = 10; /** The closing date. Only set when status is 'closed'. */ + google.protobuf.Timestamp purged_at = 11; /** The purge date. Only set when status is 'purged'. */ + google.protobuf.Timestamp deleted_at = 12; /** The deletion date. Only set when status is 'deleted'. */ google.protobuf.Duration duration = 7; /** The duration. Only set when status is 'cancelled' and 'closed'. */ } @@ -160,22 +160,6 @@ message ResumeSessionResponse { SessionRaw session = 1; /** The session. */ } -/** - * Request for closing a single session. - */ -message CloseSessionRequest { - string session_id = 1; /** The session ID. */ -} - -/** - * Response for closing a single session. - * - * Return a raw session. - */ -message CloseSessionResponse { - SessionRaw session = 1; /** The session. */ -} - /** * Request for purging a single session. */ @@ -209,33 +193,19 @@ message DeleteSessionResponse { } /** - * Request for stopping new tasks submissions from clients in the given session. - */ -message StopClientSubmissionRequest { - string session_id = 1; /** The session ID. */ -} - -/** - * Response for stopping new tasks submissions from clients in the given session. - * - * Return a raw session. - */ -message StopClientSubmissionResponse { - SessionRaw session = 1; /** The session. */ -} - -/** - * Request for stopping new tasks submissions from workers in the given session. + * Request for stopping new tasks submissions from clients or workers in the given session. */ -message StopWorkerSubmissionRequest { +message StopSubmissionRequest { string session_id = 1; /** The session ID. */ + bool client = 2; /** Whether to stop client submission. */ + bool worker = 3; /** Whether to stop worker submission. */ } /** - * Response for stopping new tasks submissions from workers in the given session. + * Response for stopping new tasks submissions from clients or workers in the given session. * * Return a raw session. */ -message StopWorkerSubmissionResponse { +message StopSubmissionResponse { SessionRaw session = 1; /** The session. */ } diff --git a/Protos/V1/sessions_service.proto b/Protos/V1/sessions_service.proto index 006ce83d3..dcaa977f5 100644 --- a/Protos/V1/sessions_service.proto +++ b/Protos/V1/sessions_service.proto @@ -43,11 +43,6 @@ service Sessions { */ rpc ResumeSession(ResumeSessionRequest) returns (ResumeSessionResponse); - /** - * Close a session by its id. Also close submission in the session. - */ - rpc CloseSession(CloseSessionRequest) returns (CloseSessionResponse); - /** * Purge a session by its id. Removes Results data. */ @@ -59,12 +54,7 @@ service Sessions { rpc DeleteSession(DeleteSessionRequest) returns (DeleteSessionResponse); /** - * Stops clients from submitting new tasks in the given session. - */ - rpc StopClientSubmission(StopClientSubmissionRequest) returns (StopClientSubmissionResponse); - - /** - * Stops workers from submitting new tasks in the given session. + * Stops clients and/or workers from submitting new tasks in the given session. */ - rpc StopWorkerSubmission(StopWorkerSubmissionRequest) returns (StopWorkerSubmissionResponse); + rpc StopSubmission(StopSubmissionRequest) returns (StopSubmissionResponse); } diff --git a/Protos/V1/submission_status.proto b/Protos/V1/submission_status.proto deleted file mode 100644 index c3973533b..000000000 --- a/Protos/V1/submission_status.proto +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Submission capabiltiy status. - */ -syntax = "proto3"; - -package armonik.api.grpc.v1.submission_status; - -option csharp_namespace = "ArmoniK.Api.gRPC.V1"; - -/** - * Submission status. - */ -enum SubmissionStatus { - SUBMISSION_STATUS_UNSPECIFIED = 0; /** Submission is in an unknown state. */ - SUBMISSION_STATUS_ALL = 1; /** Workers and clients can submit new tasks. */ - SUBMISSION_STATUS_CLIENT_ONLY = 2; /** Only clients can submit tasks. */ - SUBMISSION_STATUS_WORKER_ONLY = 3; /** Only workers can submit tasks. */ - SUBMISSION_STATUS_CLOSED = 4; /** Tasks cannot be submitted anymore. */ -} From 0d6a8cefb37b1fa20f52b21a615212db6e8977e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Thu, 11 Jan 2024 09:29:21 +0100 Subject: [PATCH 152/344] remove unneeded timestamp --- Protos/V1/sessions_common.proto | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Protos/V1/sessions_common.proto b/Protos/V1/sessions_common.proto index 18364f3c2..a8141e5fb 100644 --- a/Protos/V1/sessions_common.proto +++ b/Protos/V1/sessions_common.proto @@ -28,9 +28,8 @@ message SessionRaw { google.protobuf.Timestamp created_at = 5; /** The creation date. */ google.protobuf.Timestamp cancelled_at = 6; /** The cancellation date. Only set when status is 'cancelled'. */ - google.protobuf.Timestamp closed_at = 10; /** The closing date. Only set when status is 'closed'. */ - google.protobuf.Timestamp purged_at = 11; /** The purge date. Only set when status is 'purged'. */ - google.protobuf.Timestamp deleted_at = 12; /** The deletion date. Only set when status is 'deleted'. */ + google.protobuf.Timestamp purged_at = 10; /** The purge date. Only set when status is 'purged'. */ + google.protobuf.Timestamp deleted_at = 11; /** The deletion date. Only set when status is 'deleted'. */ google.protobuf.Duration duration = 7; /** The duration. Only set when status is 'cancelled' and 'closed'. */ } From b1b1713a655f033287e6992a454988bfb51505ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Thu, 11 Jan 2024 10:42:17 +0100 Subject: [PATCH 153/344] update mock --- .../ArmoniK.Api.Mock/Services/Sessions.cs | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs index 5ee65b5e5..bf12c8865 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs @@ -70,15 +70,6 @@ public override Task ListSessions(ListSessionsRequest requ Total = 0, }); - /// - [Count] - public override Task CloseSession(CloseSessionRequest request, - ServerCallContext context) - => Task.FromResult(new CloseSessionResponse - { - Session = MockSession, - }); - /// [Count] public override Task DeleteSession(DeleteSessionRequest request, @@ -105,4 +96,22 @@ public override Task ResumeSession(ResumeSessionRequest r { Session = MockSession, }); + + /// + [Count] + public override Task PurgeSession(PurgeSessionRequest request, + ServerCallContext context) + => Task.FromResult(new PurgeSessionResponse + { + Session = MockSession, + }); + + /// + [Count] + public override Task StopSubmission(StopSubmissionRequest request, + ServerCallContext context) + => Task.FromResult(new StopSubmissionResponse + { + Session = MockSession, + }); } From b37342084b7c8e0795838ababe947cc0fccb203d Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 11 Jan 2024 15:33:15 +0100 Subject: [PATCH 154/344] fix: resolve gRPC communication issue with Armonik for gRPC 1.57+ --- examples/python/worker.py | 2 +- packages/python/proto2python.sh | 3 +-- packages/python/pyproject.toml | 5 ++--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/python/worker.py b/examples/python/worker.py index 28f593ec4..eeb40948b 100644 --- a/examples/python/worker.py +++ b/examples/python/worker.py @@ -76,7 +76,7 @@ def main(): # Start worker logger.info("Worker Started") - with grpc.insecure_channel(agent_endpoint) as agent_channel: + with grpc.insecure_channel(agent_endpoint, options=(('grpc.default_authority', 'localhost'),)) as agent_channel: worker = ArmoniKWorker(agent_channel, processor, logger=logger) logger.info("Worker Connected") worker.start(worker_endpoint) diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh index 44860be05..f6343a67c 100755 --- a/packages/python/proto2python.sh +++ b/packages/python/proto2python.sh @@ -32,8 +32,7 @@ mkdir -p $ARMONIK_WORKER $ARMONIK_CLIENT $ARMONIK_COMMON $PACKAGE_PATH python -m pip install --upgrade pip python -m venv $PYTHON_VENV source $PYTHON_VENV/bin/activate -# We need to fix grpc to 1.56 until this bug is solved : https://github.com/grpc/grpc/issues/34305 -python -m pip install build grpcio==1.56.2 grpcio-tools==1.56.2 setuptools_scm[toml] +python -m pip install build grpcio grpcio-tools setuptools_scm[toml] unset proto_files for proto in ${armonik_worker_files[@]}; do diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 42a8a65d8..12be0a0fc 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -15,11 +15,10 @@ classifiers = [ "Programming Language :: Python :: 3", ] dependencies = [ - "grpcio==1.56.2", - "grpcio-tools==1.56.2", + "grpcio", + "grpcio-tools", "deprecation" ] -# We need to set grpc to 1.56 until this bug is resolved : https://github.com/grpc/grpc/issues/34305 [project.urls] "Homepage" = "https://github.com/aneoconsulting/ArmoniK.Api" "Bug Tracker" = "https://github.com/aneoconsulting/ArmoniK/issues" From 4ce9033a631ec269a967f1fc67ee6cb26f288340 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 11 Jan 2024 17:06:55 +0100 Subject: [PATCH 155/344] docs: Add documentation for explicit default authority in gRPC channel creation --- examples/python/worker.py | 1 + packages/python/README.md | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/examples/python/worker.py b/examples/python/worker.py index eeb40948b..85dd54557 100644 --- a/examples/python/worker.py +++ b/examples/python/worker.py @@ -76,6 +76,7 @@ def main(): # Start worker logger.info("Worker Started") + # Use options to fix Unix socket connection on localhost (cf: ) with grpc.insecure_channel(agent_endpoint, options=(('grpc.default_authority', 'localhost'),)) as agent_channel: worker = ArmoniKWorker(agent_channel, processor, logger=logger) logger.info("Worker Connected") diff --git a/packages/python/README.md b/packages/python/README.md index 6c0ba0d19..b9bb09cf8 100644 --- a/packages/python/README.md +++ b/packages/python/README.md @@ -81,3 +81,9 @@ The test environment utilizes a mock endpoint to assert if the ArmoniK service h ```bash curl localhost:5000/calls.json | jq ``` + +## WARNING + +### Note for Users + +Starting from gRPC version 1.57 and onward, it is necessary to explicitly specify the default authority when creating the gRPC channel. [more details](https://github.com/grpc/grpc/issues/34305) From f94bb3c72c8231f1d03a3f860d61e90f51da9d13 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 11 Jan 2024 02:10:32 +0100 Subject: [PATCH 156/344] chore: Add pause_session() to python sdk --- packages/python/src/armonik/client/sessions.py | 11 ++++++++++- packages/python/tests/test_sessions.py | 6 ++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 02b5dcf7e..eb0702fa1 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -12,6 +12,7 @@ CreateSessionRequest, GetSessionRequest, GetSessionResponse, + PauseSessionRequest, ListSessionsRequest, ListSessionsResponse, ) @@ -152,6 +153,14 @@ def cancel_session(self, session_id: str) -> None: """Cancel a session Args: - session_id: Id of the session to b cancelled + session_id: Id of the session to be cancelled """ self._client.CancelSession(CancelSessionRequest(session_id=session_id)) + + def pause_session(self, session_id: str) -> None: + """Pause a session by its id. + + Args: + session_id: Id of the session to be paused. + """ + self._client.PauseSession(PauseSessionRequest(session_id=session_id)) diff --git a/packages/python/tests/test_sessions.py b/packages/python/tests/test_sessions.py index 108971b0c..322efb26d 100644 --- a/packages/python/tests/test_sessions.py +++ b/packages/python/tests/test_sessions.py @@ -71,5 +71,11 @@ def test_cancel_session(self): assert rpc_called("Sessions", "CancelSession") + def test_pause_session(self): + session_client: ArmoniKSessions = get_client("Sessions") + session_client.pause_session("session-id") + + assert rpc_called("Sessions", "PauseSession") + def test_service_fully_implemented(self): assert all_rpc_called("Sessions") From 7deed1e42c8d1bf2e10dd2ac9b0990539c152751 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 11 Jan 2024 02:35:23 +0100 Subject: [PATCH 157/344] chore: Add resume, purge, delete, stop_submission session to sdk --- .../python/src/armonik/client/sessions.py | 38 +++++++++++++++++++ packages/python/tests/test_sessions.py | 24 ++++++++++++ 2 files changed, 62 insertions(+) diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index eb0702fa1..b9bbe82b3 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -10,9 +10,13 @@ from ..protogen.common.sessions_common_pb2 import ( CancelSessionRequest, CreateSessionRequest, + DeleteSessionRequest, GetSessionRequest, GetSessionResponse, PauseSessionRequest, + PurgeSessionRequest, + ResumeSessionRequest, + StopSubmissionRequest, ListSessionsRequest, ListSessionsResponse, ) @@ -164,3 +168,37 @@ def pause_session(self, session_id: str) -> None: session_id: Id of the session to be paused. """ self._client.PauseSession(PauseSessionRequest(session_id=session_id)) + + def resume_session(self, session_id: str) -> None: + """Resume a session by its id. + + Args: + session_id: Id of the session to be resumed. + """ + self._client.ResumeSession(ResumeSessionRequest(session_id=session_id)) + + def purge_session(self, session_id: str) -> None: + """Purge a session by its id. + + Args: + session_id: Id of the session to be purged. + """ + self._client.PurgeSession(PurgeSessionRequest(session_id=session_id)) + + def delete_session(self, session_id: str) -> None: + """Delete a session by its id. + + Args: + session_id: Id of the session to be deleted. + """ + self._client.DeleteSession(DeleteSessionRequest(session_id=session_id)) + + def stop_submission_session(self, session_id: str, client: bool, worker:bool) -> None: + """Stops clients and/or workers from submitting new tasks in the given session. + + Args: + session_id: Id of the session. + client: Stops clients from submitting new tasks in the given session. + worker: Stops workers from submitting new tasks in the given session. + """ + self._client.StopSubmission(StopSubmissionRequest(session_id=session_id, client=client, worker=worker)) \ No newline at end of file diff --git a/packages/python/tests/test_sessions.py b/packages/python/tests/test_sessions.py index 322efb26d..fde5240e3 100644 --- a/packages/python/tests/test_sessions.py +++ b/packages/python/tests/test_sessions.py @@ -77,5 +77,29 @@ def test_pause_session(self): assert rpc_called("Sessions", "PauseSession") + def test_resume_session(self): + session_client: ArmoniKSessions = get_client("Sessions") + session_client.resume_session("session-id") + + assert rpc_called("Sessions", "ResumeSession") + + def test_purge_session(self): + session_client: ArmoniKSessions = get_client("Sessions") + session_client.purge_session("session-id") + + assert rpc_called("Sessions", "PurgeSession") + + def test_delete_session(self): + session_client: ArmoniKSessions = get_client("Sessions") + session_client.delete_session("session-id") + + assert rpc_called("Sessions", "DeleteSession") + + def test_stop_submission_session(self): + session_client: ArmoniKSessions = get_client("Sessions") + session_client.stop_submission_session("session-id", True, True) + + assert rpc_called("Sessions", "StopSubmission") + def test_service_fully_implemented(self): assert all_rpc_called("Sessions") From 289947253149c129edc3b4d85443c9e34e2b99b1 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Tue, 16 Jan 2024 14:20:42 +0100 Subject: [PATCH 158/344] fix: Add requests optional dependencie to pyproject.toml --- packages/python/pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 42a8a65d8..735a4ab33 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -41,6 +41,7 @@ tests = [ 'pytest', 'pytest-cov', 'pytest-benchmark[histogram]', + 'requests' ] [tool.pytest.ini_options] From a34f85f39373feed113486a0abfeaadaaea0df5b Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Wed, 17 Jan 2024 10:48:40 +0100 Subject: [PATCH 159/344] feat: return metadata for session services --- .../python/src/armonik/client/sessions.py | 57 +++++++++++++++---- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index b9bbe82b3..bfff9c66f 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -9,14 +9,20 @@ from ..protogen.client.sessions_service_pb2_grpc import SessionsStub from ..protogen.common.sessions_common_pb2 import ( CancelSessionRequest, + CancelSessionResponse, CreateSessionRequest, DeleteSessionRequest, + DeleteSessionResponse, GetSessionRequest, GetSessionResponse, PauseSessionRequest, + PauseSessionResponse, PurgeSessionRequest, + PurgeSessionResponse, ResumeSessionRequest, + ResumeSessionResponse, StopSubmissionRequest, + StopSubmissionResponse, ListSessionsRequest, ListSessionsResponse, ) @@ -153,52 +159,79 @@ def list_sessions( response: ListSessionsResponse = self._client.ListSessions(request) return response.total, [Session.from_message(s) for s in response.sessions] - def cancel_session(self, session_id: str) -> None: + def cancel_session(self, session_id: str) -> Session: """Cancel a session Args: session_id: Id of the session to be cancelled """ - self._client.CancelSession(CancelSessionRequest(session_id=session_id)) + request = CancelSessionRequest(session_id=session_id) + response: CancelSessionResponse = self._client.CancelSession(request) + return Session.from_message(response.session) - def pause_session(self, session_id: str) -> None: + def pause_session(self, session_id: str) -> Session: """Pause a session by its id. Args: session_id: Id of the session to be paused. + + Returns: + session metadata """ - self._client.PauseSession(PauseSessionRequest(session_id=session_id)) + request = PauseSessionRequest(session_id=session_id) + response: PauseSessionResponse = self._client.PauseSession(request) + return Session.from_message(response.session) - def resume_session(self, session_id: str) -> None: + def resume_session(self, session_id: str) -> Session: """Resume a session by its id. Args: session_id: Id of the session to be resumed. + + Returns: + session metadata """ - self._client.ResumeSession(ResumeSessionRequest(session_id=session_id)) + request = ResumeSessionRequest(session_id=session_id) + response: ResumeSessionResponse = self._client.ResumeSession(request) + return Session.from_message(response.session) - def purge_session(self, session_id: str) -> None: + def purge_session(self, session_id: str) -> Session: """Purge a session by its id. Args: session_id: Id of the session to be purged. + + Returns: + session metadata """ - self._client.PurgeSession(PurgeSessionRequest(session_id=session_id)) + request = PurgeSessionRequest(session_id=session_id) + response: PurgeSessionResponse = self._client.PurgeSession(request) + return Session.from_message(response.session) - def delete_session(self, session_id: str) -> None: + def delete_session(self, session_id: str) -> Session: """Delete a session by its id. Args: session_id: Id of the session to be deleted. + + Returns: + session metadata """ - self._client.DeleteSession(DeleteSessionRequest(session_id=session_id)) + request = DeleteSessionRequest(session_id=session_id) + response: DeleteSessionResponse = self._client.DeleteSession(request) + return Session.from_message(response.session) - def stop_submission_session(self, session_id: str, client: bool, worker:bool) -> None: + def stop_submission_session(self, session_id: str, client: bool, worker:bool) -> Session: """Stops clients and/or workers from submitting new tasks in the given session. Args: session_id: Id of the session. client: Stops clients from submitting new tasks in the given session. worker: Stops workers from submitting new tasks in the given session. + + Returns: + session metadata """ - self._client.StopSubmission(StopSubmissionRequest(session_id=session_id, client=client, worker=worker)) \ No newline at end of file + request = StopSubmissionRequest(session_id=session_id, client=client, worker=worker) + response: StopSubmissionResponse = self._client.StopSubmission(request) + return Session.from_message(response.session) \ No newline at end of file From 33d3248c4e7586624a476a2aa2b4a9ceaec89cf4 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Wed, 17 Jan 2024 10:50:33 +0100 Subject: [PATCH 160/344] feat: Add new fields to dataclass Session --- packages/python/src/armonik/common/objects.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index e34596c82..2e4452503 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -181,10 +181,14 @@ def is_available(self) -> bool: class Session: session_id: Optional[str] = None status: RawSessionStatus = SessionStatus.UNSPECIFIED + client_submission: Optional[bool] = None + worker_submission: Optional[bool] = None partition_ids: List[str] = field(default_factory=list) options: Optional[TaskOptions] = None created_at: Optional[datetime] = None cancelled_at: Optional[datetime] = None + purged_at: Optional[datetime] = None + deleted_at: Optional[datetime] = None duration: Optional[timedelta] = None @classmethod @@ -192,10 +196,14 @@ def from_message(cls, session_raw: SessionRaw) -> "Session": return cls( session_id=session_raw.session_id, status=session_raw.status, + client_submission=session_raw.client_submission, + worker_submission=session_raw.worker_submission, partition_ids=list(session_raw.partition_ids), options=TaskOptions.from_message(session_raw.options), created_at=timestamp_to_datetime(session_raw.created_at), cancelled_at=timestamp_to_datetime(session_raw.cancelled_at), + purged_at=timestamp_to_datetime(session_raw.purged_at), + deleted_at=timestamp_to_datetime(session_raw.deleted_at), duration=duration_to_timedelta(session_raw.duration), ) From 36328f4592cc3b1054fbc411a3c1d66ace485993 Mon Sep 17 00:00:00 2001 From: "Nicolas GRUEL (ANEO)" Date: Mon, 22 Jan 2024 15:10:07 +0100 Subject: [PATCH 161/344] chore: remove pre-version package to be published on Pypi website The pre-version should be available only on https://test.pypi.org --- .github/workflows/publish-edge.yml | 8 -------- .github/workflows/release.yml | 9 +++++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index 5bcafacd1..4b505ae85 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -225,14 +225,6 @@ jobs: packages-dir: packages/python/pkg/ repository-url: https://test.pypi.org/legacy/ - - name: Publish to PyPI - if: github.ref == 'refs/heads/main' - uses: pypa/gh-action-pypi-publish@release/v1 - with: - password: ${{ secrets.PYPI_API_TOKEN }} - print-hash: true - packages-dir: packages/python/pkg/ - release-cpp-package: needs: [version] strategy: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0a6735fba..ce64a8890 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -91,6 +91,15 @@ jobs: name: python-packages path: packages/python/pkg/ + - name: Publish to PyPITest + if: github.ref != 'refs/heads/main' + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.DEV_PYPI_API_TOKEN }} + print-hash: true + packages-dir: packages/python/pkg/ + repository-url: https://test.pypi.org/legacy/ + - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: From 1bf3009ff23ed365e922a0490df168146fa2f2ee Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Wed, 22 Nov 2023 10:00:20 +0100 Subject: [PATCH 162/344] docs: documentation and example for grpc secure channel with python --- .../use-armonik-grpc-securely-python.md | 75 +++++++++++++++++++ examples/python/secure_grpc_client.py | 59 +++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 .docs/content/2.usage/use-armonik-grpc-securely-python.md create mode 100644 examples/python/secure_grpc_client.py diff --git a/.docs/content/2.usage/use-armonik-grpc-securely-python.md b/.docs/content/2.usage/use-armonik-grpc-securely-python.md new file mode 100644 index 000000000..98d16a8cb --- /dev/null +++ b/.docs/content/2.usage/use-armonik-grpc-securely-python.md @@ -0,0 +1,75 @@ +# Connecting to ArmoniK Securely using gRPC in Python + +## Overview + +This guide provides steps to connect to ArmoniK securely using gRPC in Python. ArmoniK supports both TLS and mTLS (mutual TLS) for secure communication. + +### Prerequisites + +Before proceeding, make sure that ArmoniK is deployed with the necessary certificates. Follow the steps below: + +1. In the `parameters.tfvars` file of ArmoniK, set the following values in the Deploy Ingress section: + + For TLS only: + + ```hcl + tls = true + mtls = false + ``` + + For mTLS: + + ```hcl + tls = true + mtls = true + ``` + +2. Deploy ArmoniK. + +3. Certificates will be generated in `all-in-one/generated/certificates/ingress`: + - For TLS: `ca.crt` + - For mTLS: `ca.crt`, `client.submitter.crt`, `client.submitter.key` + +4. With these certificates, you will be able to create credentials for a secure channel. + +### Modify Hosts File + +Update your system's hosts file to associate the ArmoniK control plane address with the domain name "armonik.local". Use the following command to edit the hosts file: + +```bash +sudo nano /etc/hosts +``` + +### Use ArmoniK Endpoint in Python + +Use `armonik.local` as endpoint and don't forget to specify the port + +```bash +armonik.local:5001 +``` + +## Launching the Python Script + +Once you have configured ArmoniK and updated your hosts file, you can execute the example script from the root. Ensure that you have the Armonik Python dependencie installed. + +```bash +pip install armonik +``` + +1. **For Insecure Channel** + + ```bash + python examples/python/python_secure_grpc.py + ``` + +2. **For TLS Secure Channel** + + ```bash + python examples/python/python_secure_grpc.py --endpoint armonik.local:5001 --ca + ``` + +3. **For Mutual TLS Secure Channel** + + ```bash + python examples/python/python_secure_grpc.py --endpoint armonik.local:5001 --ca --key --cert + ``` diff --git a/examples/python/secure_grpc_client.py b/examples/python/secure_grpc_client.py new file mode 100644 index 000000000..7fbc3a22c --- /dev/null +++ b/examples/python/secure_grpc_client.py @@ -0,0 +1,59 @@ +import grpc +import argparse +from armonik.client.sessions import ArmoniKSessions, SessionFieldFilter +from armonik.common.enumwrapper import SESSION_STATUS_CANCELLED + +def parse_arguments(): + parser = argparse.ArgumentParser(description="ArmoniK Example for Client connection TLS or mutual TLS") + parser.add_argument("-v","--version", action="version", version="ArmoniK Admin CLI 0.0.1") + parser.add_argument("--endpoint", default="localhost:5001", help="ArmoniK control plane endpoint") + parser.add_argument("--ca", help="ca.crt path for TLS or mutual TLS") + parser.add_argument("--cert", help="client.submitter.crt for mutual TLS") + parser.add_argument("--key", help="client.submitter.key for mutual TLS") + return parser.parse_args() + +def create_channel(endpoint: str, ca: str = None, key: str = None, cert: str = None) -> grpc.Channel: + """ + Create a gRPC channel for communication with the ArmoniK control plane + + Args: + ca (str): CA file path for mutual TLS + cert (str): Certificate file path for mutual TLS + key (str): Private key file path for mutual TLS + endpoint (str): ArmoniK control plane endpoint + + Returns: + grpc.Channel: gRPC channel for communication + """ + if ca != None: + with open(ca, 'rb') as ca_file: + ca_data = ca_file.read() + if cert != None and key!= None : + with open(cert, 'rb') as cert_file, open(key, 'rb') as key_file: + key_data = key_file.read() + cert_data = cert_file.read() + credentials = grpc.ssl_channel_credentials(ca_data, key_data, cert_data) + print("Hello ArmoniK Python Example Using Mutual TLS !") + else: + credentials = grpc.ssl_channel_credentials(ca_data) + print("Hello ArmoniK Python Example Using TLS !") + return grpc.secure_channel(endpoint, credentials) + else: + print("Hello ArmoniK Python Example using Insecure Channel!") + return grpc.insecure_channel(endpoint) + + +def main(): + args = parse_arguments() + # Open a channel to the control plane + channel = create_channel(args.endpoint, args.ca, args.key, args.cert) + # Create the session client + client = ArmoniKSessions(channel) + # List numbers sessions with a cancelled status filter + sessions = client.list_sessions(SessionFieldFilter.STATUS == SESSION_STATUS_CANCELLED) + + print(f'\nNumber of sessions: {sessions[0]}\n') + + +if __name__ == "__main__": + main() \ No newline at end of file From 315ff949727a49864f972e0d432b92fd2adb52c8 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 23 Nov 2023 16:50:38 +0100 Subject: [PATCH 163/344] docs: edit docs to match with the example script --- .docs/content/2.usage/use-armonik-grpc-securely-python.md | 6 +++--- examples/python/secure_grpc_client.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.docs/content/2.usage/use-armonik-grpc-securely-python.md b/.docs/content/2.usage/use-armonik-grpc-securely-python.md index 98d16a8cb..ac1afb62c 100644 --- a/.docs/content/2.usage/use-armonik-grpc-securely-python.md +++ b/.docs/content/2.usage/use-armonik-grpc-securely-python.md @@ -59,17 +59,17 @@ pip install armonik 1. **For Insecure Channel** ```bash - python examples/python/python_secure_grpc.py + python examples/python/secure_grpc_client.py ``` 2. **For TLS Secure Channel** ```bash - python examples/python/python_secure_grpc.py --endpoint armonik.local:5001 --ca + python examples/python/secure_grpc_client.py --endpoint armonik.local:5001 --ca ``` 3. **For Mutual TLS Secure Channel** ```bash - python examples/python/python_secure_grpc.py --endpoint armonik.local:5001 --ca --key --cert + python examples/python/secure_grpc_client.py --endpoint armonik.local:5001 --ca --key --cert ``` diff --git a/examples/python/secure_grpc_client.py b/examples/python/secure_grpc_client.py index 7fbc3a22c..8a24606da 100644 --- a/examples/python/secure_grpc_client.py +++ b/examples/python/secure_grpc_client.py @@ -17,7 +17,7 @@ def create_channel(endpoint: str, ca: str = None, key: str = None, cert: str = Create a gRPC channel for communication with the ArmoniK control plane Args: - ca (str): CA file path for mutual TLS + ca (str): CA file path for TLS or mutual TLS cert (str): Certificate file path for mutual TLS key (str): Private key file path for mutual TLS endpoint (str): ArmoniK control plane endpoint From e74ba0c6ddbb1782152dae460f70c7cab4490c2d Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo <136341946+jeremyzyngeraneo@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:24:08 +0100 Subject: [PATCH 164/344] Update examples/python/secure_grpc_client.py Co-authored-by: Dylan Brasseur <103190315+dbrasseur-aneo@users.noreply.github.com> --- examples/python/secure_grpc_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/python/secure_grpc_client.py b/examples/python/secure_grpc_client.py index 8a24606da..993b2d9ff 100644 --- a/examples/python/secure_grpc_client.py +++ b/examples/python/secure_grpc_client.py @@ -28,7 +28,7 @@ def create_channel(endpoint: str, ca: str = None, key: str = None, cert: str = if ca != None: with open(ca, 'rb') as ca_file: ca_data = ca_file.read() - if cert != None and key!= None : + if cert is not None and key is not None : with open(cert, 'rb') as cert_file, open(key, 'rb') as key_file: key_data = key_file.read() cert_data = cert_file.read() From ff18c499722047ac7054236d91ad2c2d95608b71 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo <136341946+jeremyzyngeraneo@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:24:15 +0100 Subject: [PATCH 165/344] Update examples/python/secure_grpc_client.py Co-authored-by: Dylan Brasseur <103190315+dbrasseur-aneo@users.noreply.github.com> --- examples/python/secure_grpc_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/python/secure_grpc_client.py b/examples/python/secure_grpc_client.py index 993b2d9ff..f82f8ff3a 100644 --- a/examples/python/secure_grpc_client.py +++ b/examples/python/secure_grpc_client.py @@ -56,4 +56,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() From 4c183e32a4980acd44269ab2bebe18bfdf4ac1e8 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo <136341946+jeremyzyngeraneo@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:25:36 +0100 Subject: [PATCH 166/344] Update examples/python/secure_grpc_client.py Co-authored-by: Dylan Brasseur <103190315+dbrasseur-aneo@users.noreply.github.com> --- examples/python/secure_grpc_client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/python/secure_grpc_client.py b/examples/python/secure_grpc_client.py index f82f8ff3a..bd96279b8 100644 --- a/examples/python/secure_grpc_client.py +++ b/examples/python/secure_grpc_client.py @@ -8,8 +8,8 @@ def parse_arguments(): parser.add_argument("-v","--version", action="version", version="ArmoniK Admin CLI 0.0.1") parser.add_argument("--endpoint", default="localhost:5001", help="ArmoniK control plane endpoint") parser.add_argument("--ca", help="ca.crt path for TLS or mutual TLS") - parser.add_argument("--cert", help="client.submitter.crt for mutual TLS") - parser.add_argument("--key", help="client.submitter.key for mutual TLS") + parser.add_argument("--cert", help="client certificate path for mutual TLS") + parser.add_argument("--key", help="client key path for mutual TLS") return parser.parse_args() def create_channel(endpoint: str, ca: str = None, key: str = None, cert: str = None) -> grpc.Channel: From 800abc81e9f0ad6ce3a574dfcacb03444edc0cd3 Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Mon, 22 Jan 2024 14:15:55 +0100 Subject: [PATCH 167/344] doc: Edit documentation --- .../use-armonik-grpc-securely-python.md | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/.docs/content/2.usage/use-armonik-grpc-securely-python.md b/.docs/content/2.usage/use-armonik-grpc-securely-python.md index ac1afb62c..815f9083b 100644 --- a/.docs/content/2.usage/use-armonik-grpc-securely-python.md +++ b/.docs/content/2.usage/use-armonik-grpc-securely-python.md @@ -4,35 +4,33 @@ This guide provides steps to connect to ArmoniK securely using gRPC in Python. ArmoniK supports both TLS and mTLS (mutual TLS) for secure communication. -### Prerequisites +## Prerequisites Before proceeding, make sure that ArmoniK is deployed with the necessary certificates. Follow the steps below: -1. In the `parameters.tfvars` file of ArmoniK, set the following values in the Deploy Ingress section: +1. Ensure that ArmoniK is deployed with authentication. Refer to the [How to configure authentication in ArmoniK](https://aneoconsulting.github.io/ArmoniK/guide/how-to/how-to-configure-authentication#how-to-configure-authentication) guide for detailed instructions. - For TLS only: +2. Deploy ArmoniK. - ```hcl - tls = true - mtls = false - ``` +3. Certificates will be generated: - For mTLS: +### TLS - ```hcl - tls = true - mtls = true - ``` +- `ca.crt`: Certificate Authority root certificate -2. Deploy ArmoniK. +### mTLS -3. Certificates will be generated in `all-in-one/generated/certificates/ingress`: - - For TLS: `ca.crt` - - For mTLS: `ca.crt`, `client.submitter.crt`, `client.submitter.key` +- `ca.crt`: Certificate Authority root certificate +- `client.submitter.crt`: Client certificate for submission +- `client.submitter.key`: Private key corresponding to the client certificate -4. With these certificates, you will be able to create credentials for a secure channel. +## Create Credentials for a Secure Channel -### Modify Hosts File +### Use the provided certificates to establish secure channel credentials + +When interacting with ArmoniK using Python, use the Common name as the endpoint. Ensure that the certificate's Common Name (CN) matches the endpoint name. + +### If the given certificate common name doesn't match the endpoint name (Armonik default certificates for example) Update your system's hosts file to associate the ArmoniK control plane address with the domain name "armonik.local". Use the following command to edit the hosts file: @@ -40,8 +38,6 @@ Update your system's hosts file to associate the ArmoniK control plane address w sudo nano /etc/hosts ``` -### Use ArmoniK Endpoint in Python - Use `armonik.local` as endpoint and don't forget to specify the port ```bash From 16acb6781da0800c3a52919cc60fc5cb3cab44cb Mon Sep 17 00:00:00 2001 From: jeremyzyngeraneo Date: Thu, 25 Jan 2024 10:36:30 +0100 Subject: [PATCH 168/344] docs: Add flag for ssl to enable root certificate --- .../use-armonik-grpc-securely-python.md | 4 +-- examples/python/secure_grpc_client.py | 33 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/.docs/content/2.usage/use-armonik-grpc-securely-python.md b/.docs/content/2.usage/use-armonik-grpc-securely-python.md index 815f9083b..3d4885ebf 100644 --- a/.docs/content/2.usage/use-armonik-grpc-securely-python.md +++ b/.docs/content/2.usage/use-armonik-grpc-securely-python.md @@ -61,11 +61,11 @@ pip install armonik 2. **For TLS Secure Channel** ```bash - python examples/python/secure_grpc_client.py --endpoint armonik.local:5001 --ca + python examples/python/secure_grpc_client.py --endpoint armonik.local:5001 --ssl [--ca ] ``` 3. **For Mutual TLS Secure Channel** ```bash - python examples/python/secure_grpc_client.py --endpoint armonik.local:5001 --ca --key --cert + python examples/python/secure_grpc_client.py --endpoint armonik.local:5001 --ssl [--ca ] --key --cert ``` diff --git a/examples/python/secure_grpc_client.py b/examples/python/secure_grpc_client.py index bd96279b8..c843fba21 100644 --- a/examples/python/secure_grpc_client.py +++ b/examples/python/secure_grpc_client.py @@ -7,12 +7,17 @@ def parse_arguments(): parser = argparse.ArgumentParser(description="ArmoniK Example for Client connection TLS or mutual TLS") parser.add_argument("-v","--version", action="version", version="ArmoniK Admin CLI 0.0.1") parser.add_argument("--endpoint", default="localhost:5001", help="ArmoniK control plane endpoint") + parser.add_argument("--ssl", help="Use this option to enable TLS for a secure channel.", action="store_true") parser.add_argument("--ca", help="ca.crt path for TLS or mutual TLS") parser.add_argument("--cert", help="client certificate path for mutual TLS") parser.add_argument("--key", help="client key path for mutual TLS") return parser.parse_args() -def create_channel(endpoint: str, ca: str = None, key: str = None, cert: str = None) -> grpc.Channel: +def read_file(file_path: str) -> bytes: + with open(file_path, 'rb') as file: + return file.read() + +def create_channel(endpoint: str, ssl: bool, ca: str, key: str, cert: str) -> grpc.Channel: """ Create a gRPC channel for communication with the ArmoniK control plane @@ -25,19 +30,17 @@ def create_channel(endpoint: str, ca: str = None, key: str = None, cert: str = Returns: grpc.Channel: gRPC channel for communication """ - if ca != None: - with open(ca, 'rb') as ca_file: - ca_data = ca_file.read() - if cert is not None and key is not None : - with open(cert, 'rb') as cert_file, open(key, 'rb') as key_file: - key_data = key_file.read() - cert_data = cert_file.read() - credentials = grpc.ssl_channel_credentials(ca_data, key_data, cert_data) - print("Hello ArmoniK Python Example Using Mutual TLS !") - else: - credentials = grpc.ssl_channel_credentials(ca_data) - print("Hello ArmoniK Python Example Using TLS !") - return grpc.secure_channel(endpoint, credentials) + if ssl: + ca_data = read_file(ca) if ca else None + if cert and key: + cert_data = read_file(cert) if cert else None + key_data = read_file(key) if key else None + credentials = grpc.ssl_channel_credentials(root_certificates=ca_data, private_key=key_data, certificate_chain=cert_data) + print("Hello ArmoniK Python Example Using Mutual TLS !") + else: + credentials = grpc.ssl_channel_credentials(root_certificates=ca_data) + print("Hello ArmoniK Python Example Using TLS !") + return grpc.secure_channel(endpoint, credentials) else: print("Hello ArmoniK Python Example using Insecure Channel!") return grpc.insecure_channel(endpoint) @@ -46,7 +49,7 @@ def create_channel(endpoint: str, ca: str = None, key: str = None, cert: str = def main(): args = parse_arguments() # Open a channel to the control plane - channel = create_channel(args.endpoint, args.ca, args.key, args.cert) + channel = create_channel(args.endpoint, args.ssl, args.ca, args.key, args.cert) # Create the session client client = ArmoniKSessions(channel) # List numbers sessions with a cancelled status filter From 4dfac75f2da3669197f0bf709426f40c9e12fee2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 7 Feb 2024 09:09:08 +0000 Subject: [PATCH 169/344] chore(deps): update github actions --- .github/workflows/ci.yml | 36 +++++++++---------- .github/workflows/deploy-docs.yml | 16 ++++----- .github/workflows/publish-edge.yml | 24 ++++++------- .github/workflows/release.yml | 26 +++++++------- .../workflows/validate-docs-generation.yml | 12 +++---- 5 files changed, 57 insertions(+), 57 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19579998f..b79189895 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,14 +13,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18.x cache: pnpm @@ -37,14 +37,14 @@ jobs: timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.ref }} fetch-depth: 0 submodules: true - name: Install .NET Core - uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v3 + uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 with: dotnet-version: 6.x @@ -83,7 +83,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.ref }} fetch-depth: 0 @@ -114,7 +114,7 @@ jobs: if: ${{ failure() && steps.check-diff.conclusion == 'failure' }} run: | git diff > patch-cpp.diff - - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 + - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 if: ${{ failure() && steps.check-diff.conclusion == 'failure' }} with: name: patch-cpp @@ -126,7 +126,7 @@ jobs: timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.ref }} fetch-depth: 0 @@ -139,11 +139,11 @@ jobs: name: Lint JS runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 - run: corepack enable - - uses: actions/setup-node@v3 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 20 cache: pnpm @@ -159,14 +159,14 @@ jobs: run: working-directory: packages/web steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18.x cache: pnpm @@ -190,14 +190,14 @@ jobs: run: working-directory: packages/angular steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18.x cache: pnpm @@ -221,7 +221,7 @@ jobs: run: working-directory: packages/python steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 @@ -232,7 +232,7 @@ jobs: run: pip install "$(echo pkg/armonik*.whl)[tests]" - name: Install .NET Core - uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v3 + uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 with: dotnet-version: 6.x @@ -252,13 +252,13 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Archive code coverage results html - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 with: name: code-coverage-report-html path: packages/python/coverage_report - name: Archive code coverage results xml - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 with: name: code-coverage-report-xml path: packages/python/coverage.xml @@ -272,7 +272,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.ref }} diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 00205f9a8..d9fee907b 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -21,12 +21,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - run: npm i -g pnpm @antfu/ni - name: Setup Node - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: '18' cache: pnpm @@ -37,7 +37,7 @@ jobs: # This will be used to avoid the use of the docker image to generate the documentation if the proto files have not changed - name: Cache Generated Docs from Protos id: proto-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3 + uses: actions/cache@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4 with: path: .docs/content/api/*.md key: proto-v1-${{ hashFiles('Protos/V1/**.proto') }} @@ -65,12 +65,12 @@ jobs: needs: [generate-proto-docs] steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 # Restore API proto documentation - name: Cache Generated Docs from Protos id: proto-cache - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3 + uses: actions/cache@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4 with: path: .docs/content/api/*.md key: proto-v1-${{ hashFiles('Protos/V1/**.proto') }} @@ -78,7 +78,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - name: Setup Node - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: '18' cache: pnpm @@ -96,7 +96,7 @@ jobs: run: cd .docs && nr generate - name: Upload artifact - uses: actions/upload-pages-artifact@a753861a5debcf57bf8b404356158c8e1e33150c # v2 + uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3 with: path: .docs/.output/public @@ -110,4 +110,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@9dbe3824824f8a1377b8e298bafde1a50ede43e5 # v2 + uses: actions/deploy-pages@decdde0ac072f6dcbe43649d82d9c635fff5b4e4 # v4 diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index 4b505ae85..ebbcc9ec0 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -17,7 +17,7 @@ jobs: version: ${{ steps.genver.outputs.version }} steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 @@ -51,14 +51,14 @@ jobs: - packages/csharp/ArmoniK.Api.Tests steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 # Install the .NET Core workload - name: Install .NET Core - uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v3 + uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 with: dotnet-version: 6.x @@ -91,13 +91,13 @@ jobs: - packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 - name: Install .NET Core - uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v3 + uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 with: dotnet-version: 6.x @@ -119,14 +119,14 @@ jobs: name: Release Angular Package runs-on: ubuntu-latest steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 - run: npm i -g @antfu/ni pnpm - - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18 cache: pnpm @@ -158,14 +158,14 @@ jobs: name: Release Web Package runs-on: ubuntu-latest steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 - run: npm i -g @antfu/ni pnpm - - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18 cache: pnpm @@ -203,7 +203,7 @@ jobs: run: working-directory: packages/python steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 @@ -211,7 +211,7 @@ jobs: run: bash proto2python.sh ~/pyvenv - name: Upload as artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 with: name: python-packages path: packages/python/pkg/ @@ -235,7 +235,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.ref }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce64a8890..b41e31fb0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,14 +16,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18.x cache: pnpm @@ -49,12 +49,12 @@ jobs: - packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 - name: Install .NET Core - uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v3 + uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 with: dotnet-version: 6.x @@ -75,7 +75,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 @@ -86,7 +86,7 @@ jobs: bash proto2python.sh ~/pyvenv - name: Upload as artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 with: name: python-packages path: packages/python/pkg/ @@ -111,13 +111,13 @@ jobs: needs: [verify-versions] runs-on: ubuntu-latest steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18 cache: pnpm @@ -144,13 +144,13 @@ jobs: needs: [verify-versions] runs-on: ubuntu-latest steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18 cache: pnpm @@ -186,7 +186,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: ref: ${{ github.ref }} @@ -210,12 +210,12 @@ jobs: needs: [verify-versions] runs-on: ubuntu-latest steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 - name: Set node - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18 diff --git a/.github/workflows/validate-docs-generation.yml b/.github/workflows/validate-docs-generation.yml index cb132f8bd..da38ddb01 100644 --- a/.github/workflows/validate-docs-generation.yml +++ b/.github/workflows/validate-docs-generation.yml @@ -15,12 +15,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - run: npm i -g pnpm @antfu/ni - name: Setup Node - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18 cache: pnpm @@ -39,11 +39,11 @@ jobs: name: Lint Markdown runs-on: ubuntu-latest steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18 cache: pnpm @@ -57,11 +57,11 @@ jobs: name: Lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 18 cache: pnpm From 81593be6943f5ec7964c8ff5d61d74ec65a94910 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Thu, 8 Feb 2024 16:50:27 +0100 Subject: [PATCH 170/344] feat: add fetched field --- Protos/V1/tasks_common.proto | 4 +++- Protos/V1/tasks_fields.proto | 3 ++- packages/python/src/armonik/common/objects.py | 18 ++++++++++++------ packages/python/tests/test_tasks.py | 6 ++++-- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Protos/V1/tasks_common.proto b/Protos/V1/tasks_common.proto index 9bf5c1a97..7e64885eb 100644 --- a/Protos/V1/tasks_common.proto +++ b/Protos/V1/tasks_common.proto @@ -40,7 +40,8 @@ message TaskDetailed { google.protobuf.Timestamp submitted_at = 12; /** The task submission date. */ google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ - google.protobuf.Timestamp started_at = 13; /** The task start date. */ + google.protobuf.Timestamp fetched = 26; /** Task data retrevial end date. */ + google.protobuf.Timestamp started_at = 25; /** The task start date. */ google.protobuf.Timestamp processed_at = 24; /** The end of task processing date. */ google.protobuf.Timestamp ended_at = 14; /** The task end date. Also used when task failed. */ google.protobuf.Timestamp pod_ttl = 15; /** The pod TTL (Time To Live). */ @@ -88,6 +89,7 @@ message TaskSummary { google.protobuf.Timestamp submitted_at = 12; /** The task submission date. */ google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ + google.protobuf.Timestamp fetched = 25; /** Task data retrevial end date. */ google.protobuf.Timestamp started_at = 6; /** The task start date. */ google.protobuf.Timestamp processed_at = 23; /** The end of task processing date. */ google.protobuf.Timestamp ended_at = 7; /** The task end date. Also used when task failed. */ diff --git a/Protos/V1/tasks_fields.proto b/Protos/V1/tasks_fields.proto index 548686f13..efbc9017d 100644 --- a/Protos/V1/tasks_fields.proto +++ b/Protos/V1/tasks_fields.proto @@ -25,8 +25,9 @@ enum TaskSummaryEnumField { TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME = 13; /** The hostname of the container running the task. */ TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT = 14; /** When the task is received by the agent. */ TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT = 15; /** When the task is acquired by the agent. */ - TASK_SUMMARY_ENUM_FIELD_PROCESSED_AT = 17; /** When the task is processed by the agent. */ + TASK_SUMMARY_ENUM_FIELD_PROCESSED_AT = 19; /** When the task is processed by the agent. */ TASK_SUMMARY_ENUM_FIELD_ERROR = 8; /** The error message. Only set if task have failed. */ + TASK_SUMMARY_ENUM_FIELD_FETCHED_AT = 20; /** When task data are fetched by the agent. */ } /** diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 2e4452503..7b3fade48 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -109,13 +109,15 @@ class Task: options: Optional[TaskOptions] = None created_at: Optional[datetime] = None submitted_at: Optional[datetime] = None + received_at: Optional[datetime] = None + acquired_at: Optional[datetime] = None + fetched_at: Optional[datetime] = None started_at: Optional[datetime] = None + processed_at: Optional[datetime] = None ended_at: Optional[datetime] = None pod_ttl: Optional[datetime] = None output: Optional[Output] = None pod_hostname: Optional[str] = None - received_at: Optional[datetime] = None - acquired_at: Optional[datetime] = None def refresh(self, task_client) -> None: """Refresh the fields of this task object by using the given task client @@ -135,13 +137,15 @@ def refresh(self, task_client) -> None: self.options = result.options self.created_at = result.created_at self.submitted_at = result.submitted_at + self.received_at = result.received_at + self.acquired_at = result.acquired_at + self.fetched_at = result.fetched_at self.started_at = result.started_at + self.processed_at = result.processed_at self.ended_at = result.ended_at self.pod_ttl = result.pod_ttl self.output = result.output self.pod_hostname = result.pod_hostname - self.received_at = result.received_at - self.acquired_at = result.acquired_at self.is_init = True @classmethod @@ -159,13 +163,15 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": options=TaskOptions.from_message(task_raw.options), created_at=timestamp_to_datetime(task_raw.created_at), submitted_at=timestamp_to_datetime(task_raw.submitted_at), + received_at=timestamp_to_datetime(task_raw.received_at), + acquired_at=timestamp_to_datetime(task_raw.acquired_at), + fetched_at=timestamp_to_datetime(task_raw.fetched_at), started_at=timestamp_to_datetime(task_raw.started_at), + processed_at=timestamp_to_datetime(task_raw.processed_at), ended_at=timestamp_to_datetime(task_raw.ended_at), pod_ttl=timestamp_to_datetime(task_raw.pod_ttl), output=Output(error=(task_raw.output.error if not task_raw.output.success else None)), pod_hostname=task_raw.pod_hostname, - received_at=timestamp_to_datetime(task_raw.received_at), - acquired_at=timestamp_to_datetime(task_raw.acquired_at), ) diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py index 6297b3625..90d42c021 100644 --- a/packages/python/tests/test_tasks.py +++ b/packages/python/tests/test_tasks.py @@ -31,13 +31,15 @@ class TestArmoniKTasks: ), created_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), submitted_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + received_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + acquired_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + fetched_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), started_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + processed_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), ended_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), pod_ttl=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), output=Output(error=""), pod_hostname="", - received_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - acquired_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), ) def test_get_task(self): From 5f03e046e66e4cc818f0a6b565b5625b12efde88 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Fri, 9 Feb 2024 09:42:54 +0100 Subject: [PATCH 171/344] fix: naming in protos --- Protos/V1/tasks_common.proto | 6 +++--- Protos/V1/tasks_fields.proto | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Protos/V1/tasks_common.proto b/Protos/V1/tasks_common.proto index 7e64885eb..0caf684d1 100644 --- a/Protos/V1/tasks_common.proto +++ b/Protos/V1/tasks_common.proto @@ -40,8 +40,8 @@ message TaskDetailed { google.protobuf.Timestamp submitted_at = 12; /** The task submission date. */ google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ - google.protobuf.Timestamp fetched = 26; /** Task data retrevial end date. */ - google.protobuf.Timestamp started_at = 25; /** The task start date. */ + google.protobuf.Timestamp fetched_at = 25; /** Task data retrevial end date. */ + google.protobuf.Timestamp started_at = 13; /** The task start date. */ google.protobuf.Timestamp processed_at = 24; /** The end of task processing date. */ google.protobuf.Timestamp ended_at = 14; /** The task end date. Also used when task failed. */ google.protobuf.Timestamp pod_ttl = 15; /** The pod TTL (Time To Live). */ @@ -89,7 +89,7 @@ message TaskSummary { google.protobuf.Timestamp submitted_at = 12; /** The task submission date. */ google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ - google.protobuf.Timestamp fetched = 25; /** Task data retrevial end date. */ + google.protobuf.Timestamp fetched_at = 25; /** Task data retrevial end date. */ google.protobuf.Timestamp started_at = 6; /** The task start date. */ google.protobuf.Timestamp processed_at = 23; /** The end of task processing date. */ google.protobuf.Timestamp ended_at = 7; /** The task end date. Also used when task failed. */ diff --git a/Protos/V1/tasks_fields.proto b/Protos/V1/tasks_fields.proto index efbc9017d..300c14432 100644 --- a/Protos/V1/tasks_fields.proto +++ b/Protos/V1/tasks_fields.proto @@ -25,9 +25,9 @@ enum TaskSummaryEnumField { TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME = 13; /** The hostname of the container running the task. */ TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT = 14; /** When the task is received by the agent. */ TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT = 15; /** When the task is acquired by the agent. */ - TASK_SUMMARY_ENUM_FIELD_PROCESSED_AT = 19; /** When the task is processed by the agent. */ + TASK_SUMMARY_ENUM_FIELD_PROCESSED_AT = 17; /** When the task is processed by the agent. */ TASK_SUMMARY_ENUM_FIELD_ERROR = 8; /** The error message. Only set if task have failed. */ - TASK_SUMMARY_ENUM_FIELD_FETCHED_AT = 20; /** When task data are fetched by the agent. */ + TASK_SUMMARY_ENUM_FIELD_FETCHED_AT = 19; /** When task data are fetched by the agent. */ } /** From 6c8014cb361e8434a1ede4b2411c49b73097ae77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Fri, 9 Feb 2024 15:39:33 +0100 Subject: [PATCH 172/344] docs: add missing xml-doc --- .../ArmoniK.Api.Client/Options/GrpcClient.cs | 3 +++ .../Utils/GrpcChannelProvider.cs | 15 +++++++++++++++ .../ArmoniK.Api.Common/Options/GrpcChannel.cs | 7 +++++-- .../Utils/ApplicationLifeTimeManager.cs | 8 ++++++++ .../ArmoniK.Api.Worker/Utils/WorkerServer.cs | 2 +- .../ArmoniK.Api.Worker/Worker/TaskHandler.cs | 14 ++++++++++++++ .../Worker/WorkerStreamWrapper.cs | 18 +++++++++++++++++- 7 files changed, 63 insertions(+), 4 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs b/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs index 159f2938e..8b60ae5e6 100644 --- a/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs +++ b/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs @@ -36,6 +36,9 @@ namespace ArmoniK.Api.Client.Options [PublicAPI] public class GrpcClient { + /// + /// Path to the section containing the values in the configuration object + /// public const string SettingSection = nameof(GrpcClient); /// diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs b/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs index dd409d248..6d5a24653 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs +++ b/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs @@ -37,6 +37,9 @@ namespace ArmoniK.Api.Common.Channel.Utils; +/// +/// Provides a built gRPC Channel from given options +/// [UsedImplicitly] public sealed class GrpcChannelProvider : IAsyncDisposable { @@ -46,6 +49,12 @@ public sealed class GrpcChannelProvider : IAsyncDisposable private NetworkStream? networkStream_; private Socket? socket_; + /// + /// Instantiate a that creates a gRPC channel + /// + /// Options to configure the creation of the gRPC channel + /// Logger that will produce logs + /// when address is empty public GrpcChannelProvider(GrpcChannel options, ILogger logger) { @@ -56,6 +65,7 @@ public GrpcChannelProvider(GrpcChannel options, address_); } + /// public async ValueTask DisposeAsync() { socket_?.Close(); @@ -114,6 +124,11 @@ await socket_.ConnectAsync(udsEndPoint, }); } + /// + /// Access the created gRPC Channel + /// + /// The created gRPC Channel + /// when socket type is unknown public ChannelBase Get() { switch (options_.SocketType) diff --git a/packages/csharp/ArmoniK.Api.Common/Options/GrpcChannel.cs b/packages/csharp/ArmoniK.Api.Common/Options/GrpcChannel.cs index 7c16e7f23..5ba786101 100644 --- a/packages/csharp/ArmoniK.Api.Common/Options/GrpcChannel.cs +++ b/packages/csharp/ArmoniK.Api.Common/Options/GrpcChannel.cs @@ -25,16 +25,19 @@ namespace ArmoniK.Api.Common.Options; +/// +/// Options to configure a channel from gRPC +/// [PublicAPI] public class GrpcChannel { /// - /// Address or path of the resource used to communicate for this Grpc Channel + /// Address or path of the resource used to communicate for this gRPC Channel /// public string Address { get; set; } = "/tmp/armonik.sock"; /// - /// Type of Grpc Socket used + /// Type of gRPC Socket used /// public GrpcSocketType SocketType { get; set; } = GrpcSocketType.UnixDomainSocket; } diff --git a/packages/csharp/ArmoniK.Api.Worker/Utils/ApplicationLifeTimeManager.cs b/packages/csharp/ArmoniK.Api.Worker/Utils/ApplicationLifeTimeManager.cs index 87f94f1f7..f8a4d0307 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Utils/ApplicationLifeTimeManager.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Utils/ApplicationLifeTimeManager.cs @@ -26,11 +26,19 @@ namespace ArmoniK.Api.Worker.Utils; +/// +/// Wrapper to add nice logs during application lifetime +/// public class ApplicationLifeTimeManager { private readonly IHostApplicationLifetime lifetime_; private readonly ILogger logger_; + /// + /// Instantiate a wrapper to add nice logs during application lifetime + /// + /// Logger that will produce logs + /// Application lifetime to attach events public ApplicationLifeTimeManager(ILogger logger, IHostApplicationLifetime lifetime) { diff --git a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs index aaeaa7495..7ffd84fa3 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs @@ -113,7 +113,7 @@ public static WebApplication Create(Action(); - if (computePlanOptions.WorkerChannel == null) + if (computePlanOptions?.WorkerChannel == null) { throw new Exception($"{nameof(computePlanOptions.WorkerChannel)} options should not be null"); } diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs index c13820e6e..5973eb9f6 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs @@ -111,6 +111,9 @@ public IEnumerable Values => dataDependencies_.Select(key => this[key]); } +/// +/// Task handler that unifies task execution and calls to the Agent +/// public class TaskHandler : ITaskHandler { private readonly CancellationToken cancellationToken_; @@ -120,6 +123,14 @@ public class TaskHandler : ITaskHandler private readonly ILoggerFactory loggerFactory_; + /// + /// Instantiate task handler that unifies task execution and calls to the Agent + /// + /// Task execution request + /// Client to the agent + /// Logger factory used to create loggers + /// Token used to cancel the execution of the method + /// when payload is not found public TaskHandler(ProcessRequest processRequest, Agent.AgentClient client, ILoggerFactory loggerFactory, @@ -153,6 +164,9 @@ public TaskHandler(ProcessRequest processRequest, } } + /// + /// Communication token used to identify requests + /// public string Token { get; } /// diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs index efd4b17aa..4f7dda8b7 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs @@ -38,14 +38,22 @@ namespace ArmoniK.Api.Worker.Worker; +/// +/// Wrapper implementation that provide a simpler interface to use for tasks implementations in C# +/// [PublicAPI] public class WorkerStreamWrapper : gRPC.V1.Worker.Worker.WorkerBase, IAsyncDisposable { private readonly ChannelBase channel_; private readonly Agent.AgentClient client_; + private readonly ILogger logger_; private readonly ILoggerFactory loggerFactory_; - public ILogger logger_; + /// + /// Instantiate a simpler interface to use for tasks implementations + /// + /// LoggerFactory to create loggers + /// gRPC channel provider to create channels with the Agent public WorkerStreamWrapper(ILoggerFactory loggerFactory, GrpcChannelProvider provider) { @@ -87,6 +95,14 @@ public sealed override async Task Process(ProcessRequest reques }; } + /// + /// User defined computations + /// + /// Handler to access input data and task capabilities + /// + /// The output of the computational task + /// + /// when method is not overwritten public virtual Task Process(ITaskHandler taskHandler) => throw new RpcException(new Status(StatusCode.Unimplemented, "")); From f0e025bb697ac464fad18748c5635fc1715e06e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Fri, 9 Feb 2024 15:55:49 +0100 Subject: [PATCH 173/344] docs: typo --- .../ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs | 2 +- packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs b/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs index 6d5a24653..956389813 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs +++ b/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs @@ -125,7 +125,7 @@ await socket_.ConnectAsync(udsEndPoint, } /// - /// Access the created gRPC Channel + /// Access to the created gRPC Channel /// /// The created gRPC Channel /// when socket type is unknown diff --git a/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs b/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs index 77f842734..6b8f52698 100644 --- a/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs +++ b/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs @@ -31,6 +31,9 @@ namespace ArmoniK.Api.Common.Options; [PublicAPI] public class ComputePlane { + /// + /// Path to the section containing the values in the configuration object + /// public const string SettingSection = nameof(ComputePlane); /// From 33bb1a81ead9d2be6c61edb02026c987095e4a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Fri, 9 Feb 2024 17:07:36 +0100 Subject: [PATCH 174/344] fix: logger should stay public --- .../Worker/WorkerStreamWrapper.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs index 4f7dda8b7..0643b6462 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs @@ -44,10 +44,15 @@ namespace ArmoniK.Api.Worker.Worker; [PublicAPI] public class WorkerStreamWrapper : gRPC.V1.Worker.Worker.WorkerBase, IAsyncDisposable { - private readonly ChannelBase channel_; - private readonly Agent.AgentClient client_; - private readonly ILogger logger_; - private readonly ILoggerFactory loggerFactory_; + private readonly ChannelBase channel_; + private readonly Agent.AgentClient client_; + private readonly ILoggerFactory loggerFactory_; + + /// + /// Logger used for printing logs during task execution + /// + [PublicAPI] + public ILogger logger_; /// /// Instantiate a simpler interface to use for tasks implementations From 00b40a1bab8211f0faa0162eaa653dd2a67bdf67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Fri, 9 Feb 2024 17:13:52 +0100 Subject: [PATCH 175/344] refactor: TaskRequestExtensions should be internal --- .../ArmoniK.Api.Worker/Worker/TaskRequestExtensions.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskRequestExtensions.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskRequestExtensions.cs index dc17ed174..63006ecb8 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskRequestExtensions.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskRequestExtensions.cs @@ -29,12 +29,9 @@ using Google.Protobuf; -using JetBrains.Annotations; - namespace ArmoniK.Api.Worker.Worker; -[PublicAPI] -public static class TaskRequestExtensions +internal static class TaskRequestExtensions { public static IEnumerable ToRequestStream(this IEnumerable taskRequests, TaskOptions? taskOptions, From d31fa896f73cc533289087495052af4ff284d7d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Fri, 9 Feb 2024 17:21:17 +0100 Subject: [PATCH 176/344] docs: xml-doc for ServiceConfigExt --- .../Utils/ServiceConfigExt.cs | 42 ++++++++++++++++++- .../Worker/TaskRequestExtensions.cs | 4 +- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/Utils/ServiceConfigExt.cs b/packages/csharp/ArmoniK.Api.Client/Utils/ServiceConfigExt.cs index 62a68a424..2590975df 100644 --- a/packages/csharp/ArmoniK.Api.Client/Utils/ServiceConfigExt.cs +++ b/packages/csharp/ArmoniK.Api.Client/Utils/ServiceConfigExt.cs @@ -1,6 +1,6 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023. All rights reserved. +// Copyright (C) ANEO, 2021-2024. All rights reserved. // W. Kirschenmann // J. Gurhem // D. Dubuc @@ -33,6 +33,9 @@ namespace ArmoniK.Api.Client.Utils { + /// + /// Extensions for configuring services + /// public static class ServiceConfigExt { private const string MaxAttemptsPropertyName = "maxAttempts"; @@ -46,9 +49,23 @@ public static class ServiceConfigExt private const string MethodPropertyName = "method"; private const string RetryPolicyPropertyName = "retryPolicy"; + /// + /// Convert to JSON + /// + /// Input config + /// + /// A string containing the config in JSON format + /// public static string ToJson(this ServiceConfig config) => JsonConvert.SerializeObject(config.ToDict()); + /// + /// Convert to dictionary + /// + /// Input service config + /// + /// A dictionary containing the service config + /// public static Dictionary ToDict(this ServiceConfig config) => new() { @@ -56,6 +73,13 @@ public static Dictionary ToDict(this ServiceConfig config) .ToArray(), }; + /// + /// Convert to dictionary + /// + /// Input method config + /// + /// A dictionary containing the method config + /// public static Dictionary ToDict(this MethodConfig config) { var dict = new Dictionary @@ -71,6 +95,13 @@ public static Dictionary ToDict(this MethodConfig config) return dict; } + /// + /// Convert to dictionary + /// + /// Input method name + /// + /// A dictionary containing the method name + /// public static Dictionary ToDict(this MethodName methodName) { var dict = new Dictionary(); @@ -87,6 +118,13 @@ public static Dictionary ToDict(this MethodName methodName) return dict; } + /// + /// Convert to dictionary + /// + /// Input retry policy + /// + /// A dictionary containing the retry policy + /// public static Dictionary ToDict(this RetryPolicy retryPolicy) { var dict = new Dictionary(); @@ -122,7 +160,7 @@ public static Dictionary ToDict(this RetryPolicy retryPolicy) return dict; } - public static string ToSimpleString(this Duration duration) + private static string ToSimpleString(this Duration duration) => duration.Seconds + (duration.Nanos > 0 ? $".{duration.Nanos: D9}s" : "s"); diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskRequestExtensions.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskRequestExtensions.cs index 63006ecb8..df11abeeb 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskRequestExtensions.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskRequestExtensions.cs @@ -1,6 +1,6 @@ // This file is part of the ArmoniK project -// -// Copyright (C) ANEO, 2021-2022. All rights reserved. +// +// Copyright (C) ANEO, 2021-2024. All rights reserved. // W. Kirschenmann // J. Gurhem // D. Dubuc From 4202dd340a0d808409bf7db0211702879d9e256e Mon Sep 17 00:00:00 2001 From: lemaitre-aneo <91961298+lemaitre-aneo@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:01:46 +0100 Subject: [PATCH 177/344] is null --- packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs index 7ffd84fa3..d2b955aa5 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs @@ -113,7 +113,7 @@ public static WebApplication Create(Action(); - if (computePlanOptions?.WorkerChannel == null) + if (computePlanOptions?.WorkerChannel is null) { throw new Exception($"{nameof(computePlanOptions.WorkerChannel)} options should not be null"); } From 961fd1cc44e1cc3e493719394107b26b0159eee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Wed, 14 Feb 2024 09:50:35 +0100 Subject: [PATCH 178/344] refactor: improve events client extension to wait for result --- .../ArmoniK.Api.Client/EventsClientExt.cs | 101 ++++++++++-------- .../Exceptions/ResultAbortedException.cs | 42 ++++++++ 2 files changed, 99 insertions(+), 44 deletions(-) create mode 100644 packages/csharp/ArmoniK.Api.Common/Exceptions/ResultAbortedException.cs diff --git a/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs index e296a92da..367675bfa 100644 --- a/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs +++ b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs @@ -1,6 +1,6 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023. All rights reserved. +// Copyright (C) ANEO, 2021-2024. All rights reserved. // W. Kirschenmann // J. Gurhem // D. Dubuc @@ -28,10 +28,13 @@ using System.Threading; using System.Threading.Tasks; +using ArmoniK.Api.Common.Exceptions; using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Events; using ArmoniK.Api.gRPC.V1.Results; +using Grpc.Core; + using JetBrains.Annotations; namespace ArmoniK.Api.Client @@ -80,61 +83,71 @@ public static async Task WaitForResultsAsync(this Events.EventsClient client, CancellationToken cancellationToken) { var resultsNotFound = new HashSet(resultIds); - - using var streamingCall = client.GetEvents(new EventSubscriptionRequest - { - SessionId = sessionId, - ReturnedEvents = + while (resultsNotFound.Any()) + { + using var streamingCall = client.GetEvents(new EventSubscriptionRequest { - EventsEnum.ResultStatusUpdate, - EventsEnum.NewResult, - }, - ResultsFilters = new Filters - { - Or = + SessionId = sessionId, + ReturnedEvents = + { + EventsEnum.ResultStatusUpdate, + EventsEnum.NewResult, + }, + ResultsFilters = new Filters { - resultIds.Select(ResultsFilter), + Or = + { + resultsNotFound.Select(ResultsFilter), + }, }, - }, - }); - - while (await streamingCall.ResponseStream.MoveNext(cancellationToken)) - { - cancellationToken.ThrowIfCancellationRequested(); - var resp = streamingCall.ResponseStream.Current; - if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.ResultStatusUpdate && resultsNotFound.Contains(resp.ResultStatusUpdate.ResultId)) + }, + cancellationToken: cancellationToken); + try { - if (resp.ResultStatusUpdate.Status == ResultStatus.Completed) + while (await streamingCall.ResponseStream.MoveNext(cancellationToken)) { - resultsNotFound.Remove(resp.ResultStatusUpdate.ResultId); - if (!resultsNotFound.Any()) + var resp = streamingCall.ResponseStream.Current; + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.ResultStatusUpdate && resultsNotFound.Contains(resp.ResultStatusUpdate.ResultId)) { - break; - } - } + if (resp.ResultStatusUpdate.Status == ResultStatus.Completed) + { + resultsNotFound.Remove(resp.ResultStatusUpdate.ResultId); + if (!resultsNotFound.Any()) + { + break; + } + } - if (resp.ResultStatusUpdate.Status == ResultStatus.Aborted) - { - throw new Exception($"Result {resp.ResultStatusUpdate.ResultId} has been aborted"); - } - } + if (resp.ResultStatusUpdate.Status == ResultStatus.Aborted) + { + throw new ResultAbortedException($"Result {resp.ResultStatusUpdate.ResultId} has been aborted"); + } + } - if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.NewResult && resultsNotFound.Contains(resp.NewResult.ResultId)) - { - if (resp.NewResult.Status == ResultStatus.Completed) - { - resultsNotFound.Remove(resp.NewResult.ResultId); - if (!resultsNotFound.Any()) + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.NewResult && resultsNotFound.Contains(resp.NewResult.ResultId)) { - break; - } - } + if (resp.NewResult.Status == ResultStatus.Completed) + { + resultsNotFound.Remove(resp.NewResult.ResultId); + if (!resultsNotFound.Any()) + { + break; + } + } - if (resp.NewResult.Status == ResultStatus.Aborted) - { - throw new Exception($"Result {resp.NewResult.ResultId} has been aborted"); + if (resp.NewResult.Status == ResultStatus.Aborted) + { + throw new ResultAbortedException($"Result {resp.NewResult.ResultId} has been aborted"); + } + } } } + catch (OperationCanceledException) + { + } + catch (RpcException) + { + } } } } diff --git a/packages/csharp/ArmoniK.Api.Common/Exceptions/ResultAbortedException.cs b/packages/csharp/ArmoniK.Api.Common/Exceptions/ResultAbortedException.cs new file mode 100644 index 000000000..d5876143e --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Common/Exceptions/ResultAbortedException.cs @@ -0,0 +1,42 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2024. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System; + +namespace ArmoniK.Api.Common.Exceptions; + +/// +/// Exception raised when results are aborted +/// +public class ResultAbortedException : Exception +{ + /// + /// Initializes a new instance of the with the specified error message + /// + /// The error message + public ResultAbortedException(string message) + : base(message) + { + } +} From d6cd138630e98858f7cc3bb453ead8dffc7e8527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Wed, 14 Feb 2024 17:26:11 +0100 Subject: [PATCH 179/344] chore: release 3.16.0 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index e2af60671..1eb2842f5 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.15.1", + "version": "3.16.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 425c401d4..157eb3b28 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.15.1) +set(version 3.16.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 427ed78d0..d8d65398d 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.15.1 - 3.15.1 + 3.16.0 + 3.16.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 948eafc08..c68f2cede 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.15.1 - 3.15.1 + 3.16.0 + 3.16.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index 0d8806433..5b607494b 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.15.1 - 3.15.1 + 3.16.0 + 3.16.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 1390c95a1..4afaf6b97 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.15.1 - 3.15.1 + 3.16.0 + 3.16.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index b05c16790..3bf201cec 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.15.1 - 3.15.1 + 3.16.0 + 3.16.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 409638b37..4f235c2a1 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.15.1 - 3.15.1 + 3.16.0 + 3.16.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 5ea6436d0..eb027003d 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.15.1 - 3.15.1 + 3.16.0 + 3.16.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 4853387dc..c6ea5c812 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.15.1 - 3.15.1 + 3.16.0 + 3.16.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index 4ef210eee..7ad58b355 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.15.1", + "version": "3.16.0", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From 7e46b67619cbdcec46d65d4fd0becea10d419d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Thu, 15 Feb 2024 18:57:57 +0100 Subject: [PATCH 180/344] feat: add rpc method to close sessions --- Protos/V1/session_status.proto | 5 +++-- Protos/V1/sessions_common.proto | 17 +++++++++++++++++ Protos/V1/sessions_service.proto | 5 +++++ .../ArmoniK.Api.Mock/Services/Sessions.cs | 9 +++++++++ packages/python/src/armonik/client/sessions.py | 17 ++++++++++++++++- packages/python/src/armonik/common/objects.py | 2 ++ packages/python/tests/test_sessions.py | 6 ++++++ 7 files changed, 58 insertions(+), 3 deletions(-) diff --git a/Protos/V1/session_status.proto b/Protos/V1/session_status.proto index 235d5c689..88cfe1ca2 100644 --- a/Protos/V1/session_status.proto +++ b/Protos/V1/session_status.proto @@ -15,6 +15,7 @@ enum SessionStatus { SESSION_STATUS_RUNNING = 1; /** Session is open and accepting tasks for execution. */ SESSION_STATUS_CANCELLED = 2; /** Session is cancelled. No more tasks can be submitted and no more tasks will be executed. */ SESSION_STATUS_PAUSED = 3; /** Session is paused. Tasks can be submitted but no more new tasks will be executed. Already running tasks will continue until they finish. */ - SESSION_STATUS_PURGED = 4; /** Session is purged. No more tasks can be submitted and executed. Results data will be deleted. */ - SESSION_STATUS_DELETED = 5; /** Session is deleted. No more tasks can be submitted and executed. Sessions, tasks and results metadata associated to the session will be deleted. */ + SESSION_STATUS_CLOSED = 4; /** Session is closed. No more tasks can be submitted and executed. */ + SESSION_STATUS_PURGED = 5; /** Session is purged. No more tasks can be submitted and executed. Results data will be deleted. */ + SESSION_STATUS_DELETED = 6; /** Session is deleted. No more tasks can be submitted and executed. Sessions, tasks and results metadata associated to the session will be deleted. */ } diff --git a/Protos/V1/sessions_common.proto b/Protos/V1/sessions_common.proto index a8141e5fb..9df2e57c5 100644 --- a/Protos/V1/sessions_common.proto +++ b/Protos/V1/sessions_common.proto @@ -28,6 +28,7 @@ message SessionRaw { google.protobuf.Timestamp created_at = 5; /** The creation date. */ google.protobuf.Timestamp cancelled_at = 6; /** The cancellation date. Only set when status is 'cancelled'. */ + google.protobuf.Timestamp closed_at = 12; /** The closure date. Only set when status is 'closed'. */ google.protobuf.Timestamp purged_at = 10; /** The purge date. Only set when status is 'purged'. */ google.protobuf.Timestamp deleted_at = 11; /** The deletion date. Only set when status is 'deleted'. */ google.protobuf.Duration duration = 7; /** The duration. Only set when status is 'cancelled' and 'closed'. */ @@ -159,6 +160,22 @@ message ResumeSessionResponse { SessionRaw session = 1; /** The session. */ } +/** + * Request for closing a single session. + */ +message CloseSessionRequest { + string session_id = 1; /** The session ID. */ +} + +/** + * Response for closing a single session. + * + * Return a raw session. + */ +message CloseSessionResponse { + SessionRaw session = 1; /** The session. */ +} + /** * Request for purging a single session. */ diff --git a/Protos/V1/sessions_service.proto b/Protos/V1/sessions_service.proto index dcaa977f5..3871ba206 100644 --- a/Protos/V1/sessions_service.proto +++ b/Protos/V1/sessions_service.proto @@ -43,6 +43,11 @@ service Sessions { */ rpc ResumeSession(ResumeSessionRequest) returns (ResumeSessionResponse); + /** + * Close a session by its id.. + */ + rpc CloseSession(CloseSessionRequest) returns (CloseSessionResponse); + /** * Purge a session by its id. Removes Results data. */ diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs index bf12c8865..7006039d7 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Sessions.cs @@ -97,6 +97,15 @@ public override Task ResumeSession(ResumeSessionRequest r Session = MockSession, }); + /// + [Count] + public override Task CloseSession(CloseSessionRequest request, + ServerCallContext context) + => Task.FromResult(new CloseSessionResponse + { + Session = MockSession, + }); + /// [Count] public override Task PurgeSession(PurgeSessionRequest request, diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index bfff9c66f..748f60f3e 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -19,6 +19,8 @@ PauseSessionResponse, PurgeSessionRequest, PurgeSessionResponse, + CloseSessionRequest, + CloseSessionResponse, ResumeSessionRequest, ResumeSessionResponse, StopSubmissionRequest, @@ -195,6 +197,19 @@ def resume_session(self, session_id: str) -> Session: response: ResumeSessionResponse = self._client.ResumeSession(request) return Session.from_message(response.session) + def close_session(self, session_id: str) -> Session: + """Close a session by its id. + + Args: + session_id: Id of the session to be closed. + + Returns: + session metadata + """ + request = CloseSessionRequest(session_id=session_id) + response: CloseSessionResponse = self._client.CloseSession(request) + return Session.from_message(response.session) + def purge_session(self, session_id: str) -> Session: """Purge a session by its id. @@ -234,4 +249,4 @@ def stop_submission_session(self, session_id: str, client: bool, worker:bool) -> """ request = StopSubmissionRequest(session_id=session_id, client=client, worker=worker) response: StopSubmissionResponse = self._client.StopSubmission(request) - return Session.from_message(response.session) \ No newline at end of file + return Session.from_message(response.session) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 7b3fade48..e3948455f 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -193,6 +193,7 @@ class Session: options: Optional[TaskOptions] = None created_at: Optional[datetime] = None cancelled_at: Optional[datetime] = None + closed_at: Optional[datetime] = None purged_at: Optional[datetime] = None deleted_at: Optional[datetime] = None duration: Optional[timedelta] = None @@ -208,6 +209,7 @@ def from_message(cls, session_raw: SessionRaw) -> "Session": options=TaskOptions.from_message(session_raw.options), created_at=timestamp_to_datetime(session_raw.created_at), cancelled_at=timestamp_to_datetime(session_raw.cancelled_at), + closed_at=timestamp_to_datetime(session_raw.closed_at), purged_at=timestamp_to_datetime(session_raw.purged_at), deleted_at=timestamp_to_datetime(session_raw.deleted_at), duration=duration_to_timedelta(session_raw.duration), diff --git a/packages/python/tests/test_sessions.py b/packages/python/tests/test_sessions.py index fde5240e3..116380779 100644 --- a/packages/python/tests/test_sessions.py +++ b/packages/python/tests/test_sessions.py @@ -89,6 +89,12 @@ def test_purge_session(self): assert rpc_called("Sessions", "PurgeSession") + def test_close_session(self): + session_client: ArmoniKSessions = get_client("Sessions") + session_client.close_session("session-id") + + assert rpc_called("Sessions", "CloseSession") + def test_delete_session(self): session_client: ArmoniKSessions = get_client("Sessions") session_client.delete_session("session-id") From d23a5f8044e78a19deaf464941915d9117535e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Thu, 15 Feb 2024 20:02:35 +0100 Subject: [PATCH 181/344] fix: add missing session fields in enum --- Protos/V1/sessions_fields.proto | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Protos/V1/sessions_fields.proto b/Protos/V1/sessions_fields.proto index 96e76b688..e0fab5a48 100644 --- a/Protos/V1/sessions_fields.proto +++ b/Protos/V1/sessions_fields.proto @@ -15,6 +15,9 @@ enum SessionRawEnumField { SESSION_RAW_ENUM_FIELD_OPTIONS = 4; SESSION_RAW_ENUM_FIELD_CREATED_AT = 5; SESSION_RAW_ENUM_FIELD_CANCELLED_AT = 6; + SESSION_RAW_ENUM_FIELD_CLOSED_AT = 8; + SESSION_RAW_ENUM_FIELD_PURGED_AT = 9; + SESSION_RAW_ENUM_FIELD_DELETED_AT = 10; SESSION_RAW_ENUM_FIELD_DURATION = 7; } From 3cda734374e61cc0a1f71949fbe10db7e01ff605 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 14 Feb 2024 15:03:23 +0100 Subject: [PATCH 182/344] Add new methods to session service --- .../header/sessions/SessionsClient.h | 40 ++++++++++ .../source/sessions/SessionsClient.cpp | 74 ++++++++++++++++++- 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h index 349748160..d472af0db 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h @@ -57,6 +57,46 @@ class SessionsClient { int32_t page_size = 500, armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort sort = default_sort); + /** + * Pause a session + * + * @param session_id Session Id + * @return SessionRaw object containing information about the session + */ + armonik::api::grpc::v1::sessions::SessionRaw pause_session(std::string session_id); + + /** + * Resume a session + * + * @param session_id Session Id + * @return SessionRaw object containing information about the session + */ + armonik::api::grpc::v1::sessions::SessionRaw resume_session(std::string session_id); + + /** + * Purge a session + * + * @param session_id Session Id + * @return SessionRaw object containing information about the session + */ + armonik::api::grpc::v1::sessions::SessionRaw purge_session(std::string session_id); + + /** + * Delete a session + * + * @param session_id Session Id + * @return SessionRaw object containing information about the session + */ + armonik::api::grpc::v1::sessions::SessionRaw delete_session(std::string session_id); + + /** + * Stop a new tasks submission in a session + * + * @param session_id Session Id + * @return SessionRaw object containing information about the session + */ + armonik::api::grpc::v1::sessions::SessionRaw stop_submission_session(std::string session_id); + private: std::unique_ptr stub; static const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort default_sort; diff --git a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp index 7780b2f18..bae6aabb8 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp @@ -1,5 +1,6 @@ #include - +#include "sessions_common.pb.h" +#include "sessions_service.grpc.pb.h" #include "exceptions/ArmoniKApiException.h" #include "sessions/SessionsClient.h" @@ -106,3 +107,74 @@ armonik::api::client::SessionsClient::list_sessions(armonik::api::grpc::v1::sess return rawSessions; } } + +armonik::api::grpc::v1::sessions::SessionRaw +armonik::api::client::SessionsClient::pause_session(std::string session_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::sessions::PauseSessionRequest request; + armonik::api::grpc::v1::sessions::PauseSessionResponse response; + + request.set_session_id(std::move(session_id)); + auto status = stub->PauseSession(&context, request, &response); + if(!status.ok()){ + throw armonik::api::common::exceptions::ArmoniKApiException("Could not pause session : " + status.error_message()); + } + + return std::move(*response.mutable_session()); +} + +armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::resume_session(std::string session_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::sessions::ResumeSessionRequest request; + armonik::api::grpc::v1::sessions::ResumeSessionResponse response; + + request.set_session_id(std::move(session_id)); + auto status = stub->ResumeSession(&context, request, &response); + if(!status.ok()){ + throw armonik::api::common::exceptions::ArmoniKApiException("Could not resume session : " + status.error_message()); + } + + return std::move(*response.mutable_session()); +} + +armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::purge_session(std::string session_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::sessions::PurgeSessionRequest request; + armonik::api::grpc::v1::sessions::PurgeSessionResponse response; + + request.set_session_id(std::move(session_id)); + auto status = stub->PurgeSession(&context, request, &response); + if(!status.ok()){ + throw armonik::api::common::exceptions::ArmoniKApiException("Could not purge session : " + status.error_message()); + } + + return std::move(*response.mutable_session()); +} + +armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::delete_session(std::string session_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::sessions::DeleteSessionRequest request; + armonik::api::grpc::v1::sessions::DeleteSessionResponse response; + + request.set_session_id(std::move(session_id)); + auto status = stub->DeleteSession(&context, request, &response); + if(!status.ok()){ + throw armonik::api::common::exceptions::ArmoniKApiException("Could not delete session : " + status.error_message()); + } + + return std::move(*response.mutable_session()); +} + +armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::stop_submission_session(std::string session_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::sessions::StopSubmissionRequest request; + armonik::api::grpc::v1::sessions::StopSubmissionResponse response; + + request.set_session_id(std::move(session_id)); + auto status = stub->StopSubmission(&context, request, &response); + if(!status.ok()){ + throw armonik::api::common::exceptions::ArmoniKApiException("Could not stop submission session : " + status.error_message()); + } + + return std::move(*response.mutable_session()); +} \ No newline at end of file From a90a083d41ad16b81a0a0638d7014ef6498ddfa4 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 14 Feb 2024 15:15:33 +0100 Subject: [PATCH 183/344] Add tests for new methods --- .../source/SessionClientTest.cpp | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp index 39616eb33..9161ab595 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp @@ -101,3 +101,80 @@ TEST(Sessions, can_list_sessions_small_page) { ASSERT_GE(list.size(), expected_n_sessions); ASSERT_GE(total, expected_n_sessions); } + +TEST(Sessions, can_pause_session) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string session_id = client.create_session(task_options); + + armonik::api::grpc::v1::sessions::SessionRaw response; + ASSERT_NO_THROW(response = client.pause_session(session_id)); + ASSERT_EQ(response.session_id(), session_id); +} + +TEST(Sessions, can_resume_session) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string session_id = client.create_session(task_options); + + ASSERT_NO_THROW(client.pause_session(session_id)); + + armonik::api::grpc::v1::sessions::SessionRaw response; + ASSERT_NO_THROW(response = client.resume_session(session_id)); + ASSERT_EQ(response.session_id(), session_id); +} + +TEST(Sessions, can_purge_session) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string session_id = client.create_session(task_options); + + armonik::api::grpc::v1::sessions::SessionRaw response; + ASSERT_NO_THROW(response = client.purge_session(session_id)); + ASSERT_EQ(response.session_id(), session_id); +} + +TEST(Sessions, can_delete_session) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string session_id = client.create_session(task_options); + + armonik::api::grpc::v1::sessions::SessionRaw response; + ASSERT_NO_THROW(response = client.delete_session(session_id)); + ASSERT_EQ(response.session_id(), session_id); +} + +TEST(Sessions, can_stop_submission) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string session_id = client.create_session(task_options); + + armonik::api::grpc::v1::sessions::SessionRaw response; + ASSERT_NO_THROW(response = client.stop_submission_session(session_id)); + ASSERT_EQ(response.session_id(), session_id); +} From dfa2b881863dfdbc4ac59e7ccdc704b2ca29f58d Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 14 Feb 2024 15:18:02 +0100 Subject: [PATCH 184/344] Format --- .../header/sessions/SessionsClient.h | 18 +++++------ .../source/sessions/SessionsClient.cpp | 31 +++++++++++-------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h index d472af0db..ccc690076 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h @@ -59,7 +59,7 @@ class SessionsClient { /** * Pause a session - * + * * @param session_id Session Id * @return SessionRaw object containing information about the session */ @@ -67,7 +67,7 @@ class SessionsClient { /** * Resume a session - * + * * @param session_id Session Id * @return SessionRaw object containing information about the session */ @@ -75,25 +75,25 @@ class SessionsClient { /** * Purge a session - * + * * @param session_id Session Id - * @return SessionRaw object containing information about the session + * @return SessionRaw object containing information about the session */ armonik::api::grpc::v1::sessions::SessionRaw purge_session(std::string session_id); /** - * Delete a session - * + * Delete a session + * * @param session_id Session Id - * @return SessionRaw object containing information about the session + * @return SessionRaw object containing information about the session */ armonik::api::grpc::v1::sessions::SessionRaw delete_session(std::string session_id); /** * Stop a new tasks submission in a session - * + * * @param session_id Session Id - * @return SessionRaw object containing information about the session + * @return SessionRaw object containing information about the session */ armonik::api::grpc::v1::sessions::SessionRaw stop_submission_session(std::string session_id); diff --git a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp index bae6aabb8..9b6d8e7d7 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp @@ -1,8 +1,8 @@ -#include +#include "sessions/SessionsClient.h" +#include "exceptions/ArmoniKApiException.h" #include "sessions_common.pb.h" #include "sessions_service.grpc.pb.h" -#include "exceptions/ArmoniKApiException.h" -#include "sessions/SessionsClient.h" +#include static armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort get_default_sort() { armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort sort; @@ -116,64 +116,69 @@ armonik::api::client::SessionsClient::pause_session(std::string session_id) { request.set_session_id(std::move(session_id)); auto status = stub->PauseSession(&context, request, &response); - if(!status.ok()){ + if (!status.ok()) { throw armonik::api::common::exceptions::ArmoniKApiException("Could not pause session : " + status.error_message()); } return std::move(*response.mutable_session()); } -armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::resume_session(std::string session_id) { +armonik::api::grpc::v1::sessions::SessionRaw +armonik::api::client::SessionsClient::resume_session(std::string session_id) { ::grpc::ClientContext context; armonik::api::grpc::v1::sessions::ResumeSessionRequest request; armonik::api::grpc::v1::sessions::ResumeSessionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->ResumeSession(&context, request, &response); - if(!status.ok()){ + if (!status.ok()) { throw armonik::api::common::exceptions::ArmoniKApiException("Could not resume session : " + status.error_message()); } return std::move(*response.mutable_session()); } -armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::purge_session(std::string session_id) { +armonik::api::grpc::v1::sessions::SessionRaw +armonik::api::client::SessionsClient::purge_session(std::string session_id) { ::grpc::ClientContext context; armonik::api::grpc::v1::sessions::PurgeSessionRequest request; armonik::api::grpc::v1::sessions::PurgeSessionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->PurgeSession(&context, request, &response); - if(!status.ok()){ + if (!status.ok()) { throw armonik::api::common::exceptions::ArmoniKApiException("Could not purge session : " + status.error_message()); } return std::move(*response.mutable_session()); } -armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::delete_session(std::string session_id) { +armonik::api::grpc::v1::sessions::SessionRaw +armonik::api::client::SessionsClient::delete_session(std::string session_id) { ::grpc::ClientContext context; armonik::api::grpc::v1::sessions::DeleteSessionRequest request; armonik::api::grpc::v1::sessions::DeleteSessionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->DeleteSession(&context, request, &response); - if(!status.ok()){ + if (!status.ok()) { throw armonik::api::common::exceptions::ArmoniKApiException("Could not delete session : " + status.error_message()); } return std::move(*response.mutable_session()); } -armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::stop_submission_session(std::string session_id) { +armonik::api::grpc::v1::sessions::SessionRaw +armonik::api::client::SessionsClient::stop_submission_session(std::string session_id) { ::grpc::ClientContext context; armonik::api::grpc::v1::sessions::StopSubmissionRequest request; armonik::api::grpc::v1::sessions::StopSubmissionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->StopSubmission(&context, request, &response); - if(!status.ok()){ - throw armonik::api::common::exceptions::ArmoniKApiException("Could not stop submission session : " + status.error_message()); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Could not stop submission session : " + + status.error_message()); } return std::move(*response.mutable_session()); From 83786ce68915ef34ad34066b820198790e5e69d8 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 15 Feb 2024 14:13:41 +0100 Subject: [PATCH 185/344] Add versions service methods --- .../header/versions/VersionsClient.h | 29 +++++++++++++++++++ .../source/versions/VersionsClient.cpp | 28 ++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 packages/cpp/ArmoniK.Api.Client/header/versions/VersionsClient.h create mode 100644 packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp diff --git a/packages/cpp/ArmoniK.Api.Client/header/versions/VersionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/versions/VersionsClient.h new file mode 100644 index 000000000..35ffe94dd --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/header/versions/VersionsClient.h @@ -0,0 +1,29 @@ +#pragma once + +#include "versions_common.pb.h" +#include "versions_service.grpc.pb.h" + +namespace armonik { +namespace api { +namespace client { + +/** + * Versions Client wrapper + */ +class VersionsClient { +public: + explicit VersionsClient(std::unique_ptr stub) + : stub(std::move(stub)){}; + + /** + * Get versions of ArmoniK components + * @return Mapping between component names and their versions + */ + std::map list_versions(); + +private: + std::unique_ptr stub; +}; +} // namespace client +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp new file mode 100644 index 000000000..90a592adf --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp @@ -0,0 +1,28 @@ +#include "versions/VersionsClient.h" +#include "exceptions/ArmoniKApiException.h" + +namespace armonik { +namespace api { +namespace client { + +std::map VersionsClient::list_versions() { + ::grpc::ClientContext context; + armonik::api::grpc::v1::versions::ListVersionsRequest request; + armonik::api::grpc::v1::versions::ListVersionsResponse response; + + std::map mapping; + + auto status = stub->ListVersions(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Could not get list versions : " + + status.error_message()); + } + + mapping.insert({"api", response.api()}); + mapping.insert({"core", response.core()}); + + return mapping; +} +} // namespace client +} // namespace api +} // namespace armonik \ No newline at end of file From 00f08f2c548e30cc09ec94a4428824411cf3e29e Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 15 Feb 2024 14:14:45 +0100 Subject: [PATCH 186/344] Versions method tests --- .../source/VersionsClientTest.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp diff --git a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp new file mode 100644 index 000000000..0d5c02ecc --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp @@ -0,0 +1,28 @@ +#include + +#include "common.h" +#include "logger/formatter.h" +#include "logger/logger.h" +#include "logger/writer.h" + +#include "versions/VersionsClient.h" + +using Logger = armonik::api::common::logger::Logger; + +TEST(Versions, can_list_versions) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::VersionsClient client(armonik::api::grpc::v1::versions::Versions::NewStub(channel)); + + std::map versions; + ASSERT_NO_THROW(versions = client.list_versions()); + + std::cout << "API version: " << versions.at("api") << "\n" + << "Core version: " << versions.at("core") << std::endl; + + ASSERT_NE(versions.at("api"), "Unknown"); + ASSERT_NE(versions.at("core"), "Unknown"); +} \ No newline at end of file From ca4348ca2a9cc69a5bb432d5d4cca1fc64a6e19f Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 15 Feb 2024 15:35:27 +0100 Subject: [PATCH 187/344] Add partitions service methods --- .../header/partitions/PartitionsClient.h | 27 ++++++ .../source/partitions/PartitionsClient.cpp | 83 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 packages/cpp/ArmoniK.Api.Client/header/partitions/PartitionsClient.h create mode 100644 packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp diff --git a/packages/cpp/ArmoniK.Api.Client/header/partitions/PartitionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/partitions/PartitionsClient.h new file mode 100644 index 000000000..c640e1b14 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/header/partitions/PartitionsClient.h @@ -0,0 +1,27 @@ +#pragma once + +#include "partitions_common.pb.h" +#include "partitions_service.grpc.pb.h" + +namespace armonik { +namespace api { +namespace client { + +class PartitionsClient { +public: + explicit PartitionsClient(std::unique_ptr stub) + : stub(std::move(stub)){}; + std::vector + list_partitions(armonik::api::grpc::v1::partitions::Filters filters, int32_t &total, int32_t page = -1, + int32_t page_size = 500, + armonik::api::grpc::v1::partitions::ListPartitionsRequest::Sort sort = default_sort()); + + armonik::api::grpc::v1::partitions::PartitionRaw get_partition(std::string partition_id); + +private: + std::unique_ptr stub; + static armonik::api::grpc::v1::partitions::ListPartitionsRequest::Sort default_sort(); +}; +} // namespace client +} // namespace api +} // namespace armonik \ No newline at end of file diff --git a/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp new file mode 100644 index 000000000..a2759a1a3 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp @@ -0,0 +1,83 @@ +#include + +#include "exceptions/ArmoniKApiException.h" +#include "partitions/PartitionsClient.h" + +namespace armonik { +namespace api { +namespace client { + +std::vector +PartitionsClient::list_partitions(armonik::api::grpc::v1::partitions::Filters filters, int32_t &total, int32_t page, + int32_t page_size, + armonik::api::grpc::v1::partitions::ListPartitionsRequest::Sort sort) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::partitions::ListPartitionsRequest request; + armonik::api::grpc::v1::partitions::ListPartitionsResponse response; + + *request.mutable_filters() = std::move(filters); + *request.mutable_sort() = std::move(sort); + request.set_page_size(page_size); + + if (page >= 0) { + request.set_page(page); + ::grpc::ClientContext context; + auto status = stub->ListPartitions(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list partitions " + + status.error_message()); + } + total = response.total(); + return {response.partitions().begin(), response.partitions().end()}; + } else { + std::vector rawPartitions; + int current_page = 0; + do { + request.set_page(current_page); + ::grpc::ClientContext context; + auto status = stub->ListPartitions(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list partitions " + + status.error_message()); + } + rawPartitions.insert(rawPartitions.end(), + response.partitions().begin() + ((int32_t)rawPartitions.size() - current_page * page_size), + response.partitions().end()); + if (response.partitions_size() >= page_size) { + current_page++; + } + + response.clear_partitions(); + } while ((int32_t)rawPartitions.size() < response.total()); + + total = response.total(); + + return rawPartitions; + } +} + +armonik::api::grpc::v1::partitions::PartitionRaw PartitionsClient::get_partition(std::string partition_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::partitions::GetPartitionRequest request; + armonik::api::grpc::v1::partitions::GetPartitionResponse response; + + *request.mutable_id() = std::move(partition_id); + auto status = stub->GetPartition(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Could not get partition : " + status.error_message()); + } + + return response.partition(); +} + +armonik::api::grpc::v1::partitions::ListPartitionsRequest::Sort PartitionsClient::default_sort() { + armonik::api::grpc::v1::partitions::ListPartitionsRequest::Sort sort; + sort.set_direction(grpc::v1::sort_direction::SORT_DIRECTION_ASC); + sort.mutable_field()->mutable_partition_raw_field()->set_field( + grpc::v1::partitions::PARTITION_RAW_ENUM_FIELD_PRIORITY); + return sort; +} + +} // namespace client +} // namespace api +} // namespace armonik \ No newline at end of file From e305c33dfde7c6aabc75d02e043b61ddc648fcd6 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 15 Feb 2024 16:03:11 +0100 Subject: [PATCH 188/344] Tests for partitions service --- .../source/PartitionsClientTest.cpp | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp diff --git a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp new file mode 100644 index 000000000..8e117fb57 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp @@ -0,0 +1,56 @@ +#include + +#include "common.h" +#include "logger/formatter.h" +#include "logger/logger.h" +#include "logger/writer.h" + +#include "partitions/PartitionsClient.h" +#include "sessions/SessionsClient.h" + +using Logger = armonik::api::common::logger::Logger; + +TEST(Partitions, can_get_partition) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + task_options.set_partition_id("default"); + + armonik::api::client::PartitionsClient client(armonik::api::grpc::v1::partitions::Partitions::NewStub(channel)); + + armonik::api::grpc::v1::partitions::PartitionRaw partition; + ASSERT_NO_THROW(partition = client.get_partition(task_options.partition_id())); + ASSERT_EQ(partition.id(), task_options.partition_id()); + ASSERT_EQ(partition.pod_max(), 100); + ASSERT_EQ(partition.pod_reserved(), 1); + ASSERT_EQ(partition.priority(), 1); +} + +TEST(Partitions, can_list_partitions) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + task_options.set_partition_id("default"); + + armonik::api::client::PartitionsClient client(armonik::api::grpc::v1::partitions::Partitions::NewStub(channel)); + + armonik::api::grpc::v1::partitions::Filters filters; + armonik::api::grpc::v1::partitions::FilterField filter_field; + filter_field.mutable_field()->mutable_partition_raw_field()->set_field( + armonik::api::grpc::v1::partitions::PARTITION_RAW_ENUM_FIELD_ID); + filter_field.mutable_filter_string()->set_value(task_options.partition_id()); + filter_field.mutable_filter_string()->set_operator_(armonik::api::grpc::v1::FILTER_STRING_OPERATOR_EQUAL); + *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; + + int total; + + std::vector partitions = client.list_partitions(filters, total); + for (auto &&partition : partitions) { + std::cout << *partition.mutable_id() << std::endl; + } + ASSERT_TRUE(!partitions.empty()); + ASSERT_EQ(partitions.size(), 1); + ASSERT_EQ(partitions.size(), total); +} \ No newline at end of file From 8b7d3be742eb228a748f017643691299b2eb356e Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 15 Feb 2024 17:45:48 +0100 Subject: [PATCH 189/344] Apply format --- .../cpp/ArmoniK.Api.Client/header/partitions/PartitionsClient.h | 2 +- .../ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp | 2 +- .../cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp | 2 +- .../cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp | 2 +- packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp | 2 +- packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/partitions/PartitionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/partitions/PartitionsClient.h index c640e1b14..48c990879 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/partitions/PartitionsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/partitions/PartitionsClient.h @@ -24,4 +24,4 @@ class PartitionsClient { }; } // namespace client } // namespace api -} // namespace armonik \ No newline at end of file +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp index a2759a1a3..878e47099 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp @@ -80,4 +80,4 @@ armonik::api::grpc::v1::partitions::ListPartitionsRequest::Sort PartitionsClient } // namespace client } // namespace api -} // namespace armonik \ No newline at end of file +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp index 9b6d8e7d7..429500c2c 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp @@ -182,4 +182,4 @@ armonik::api::client::SessionsClient::stop_submission_session(std::string sessio } return std::move(*response.mutable_session()); -} \ No newline at end of file +} diff --git a/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp index 90a592adf..69f65f8a0 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp @@ -25,4 +25,4 @@ std::map VersionsClient::list_versions() { } } // namespace client } // namespace api -} // namespace armonik \ No newline at end of file +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp index 8e117fb57..f5ea9eca2 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp @@ -53,4 +53,4 @@ TEST(Partitions, can_list_partitions) { ASSERT_TRUE(!partitions.empty()); ASSERT_EQ(partitions.size(), 1); ASSERT_EQ(partitions.size(), total); -} \ No newline at end of file +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp index 0d5c02ecc..7750c8df2 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp @@ -25,4 +25,4 @@ TEST(Versions, can_list_versions) { ASSERT_NE(versions.at("api"), "Unknown"); ASSERT_NE(versions.at("core"), "Unknown"); -} \ No newline at end of file +} From 5920c1946713b2e202b4c8b71f388ccc5750152e Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Fri, 16 Feb 2024 11:46:24 +0100 Subject: [PATCH 190/344] Booleans for client and worker for stop submission methode --- .../cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h | 5 ++++- .../ArmoniK.Api.Client/source/sessions/SessionsClient.cpp | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h index ccc690076..528909ad4 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h @@ -93,9 +93,12 @@ class SessionsClient { * Stop a new tasks submission in a session * * @param session_id Session Id + * @param client boolean to stop client's task submission + * @param worker boolean to stop worker's task submissions * @return SessionRaw object containing information about the session */ - armonik::api::grpc::v1::sessions::SessionRaw stop_submission_session(std::string session_id); + armonik::api::grpc::v1::sessions::SessionRaw stop_submission_session(std::string session_id, bool client = true, + bool worker = true); private: std::unique_ptr stub; diff --git a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp index 429500c2c..db23e59d4 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp @@ -169,12 +169,14 @@ armonik::api::client::SessionsClient::delete_session(std::string session_id) { } armonik::api::grpc::v1::sessions::SessionRaw -armonik::api::client::SessionsClient::stop_submission_session(std::string session_id) { +armonik::api::client::SessionsClient::stop_submission_session(std::string session_id, bool client, bool worker) { ::grpc::ClientContext context; armonik::api::grpc::v1::sessions::StopSubmissionRequest request; armonik::api::grpc::v1::sessions::StopSubmissionResponse response; request.set_session_id(std::move(session_id)); + request.set_client(client); + request.set_worker(worker); auto status = stub->StopSubmission(&context, request, &response); if (!status.ok()) { throw armonik::api::common::exceptions::ArmoniKApiException("Could not stop submission session : " + From e35ebdf03621dca8ac186c1f59510f88e70806d5 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Fri, 16 Feb 2024 12:15:16 +0100 Subject: [PATCH 191/344] Add close session method cpp --- .../header/sessions/SessionsClient.h | 8 ++++++++ .../source/sessions/SessionsClient.cpp | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h index 528909ad4..24c3da906 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/sessions/SessionsClient.h @@ -100,6 +100,14 @@ class SessionsClient { armonik::api::grpc::v1::sessions::SessionRaw stop_submission_session(std::string session_id, bool client = true, bool worker = true); + /** + * Resume a session + * + * @param session_id Session Id + * @return SessionRaw object containing information about the session + */ + armonik::api::grpc::v1::sessions::SessionRaw close_session(std::string session_id); + private: std::unique_ptr stub; static const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort default_sort; diff --git a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp index db23e59d4..1b7573f18 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp @@ -185,3 +185,18 @@ armonik::api::client::SessionsClient::stop_submission_session(std::string sessio return std::move(*response.mutable_session()); } + +armonik::api::grpc::v1::sessions::SessionRaw +armonik::api::client::SessionsClient::close_session(std::string session_id) { + ::grpc::ClientContext context; + armonik::api::grpc::v1::sessions::CloseSessionRequest request; + armonik::api::grpc::v1::sessions::CloseSessionResponse response; + + request.set_session_id(std::move(session_id)); + auto status = stub->CloseSession(&context, request, &response); + if (!status.ok()) { + throw armonik::api::common::exceptions::ArmoniKApiException("Could not close session : " + status.error_message()); + } + + return std::move(*response.mutable_session()); +} From c4313779da26566c2ecf05208bfd06283b38ce9f Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Fri, 16 Feb 2024 12:15:38 +0100 Subject: [PATCH 192/344] Test close session method cpp --- .../source/SessionClientTest.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp index 9161ab595..a48ba9829 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp @@ -144,6 +144,8 @@ TEST(Sessions, can_purge_session) { std::string session_id = client.create_session(task_options); + ASSERT_NO_THROW(client.close_session(session_id)); + armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.purge_session(session_id)); ASSERT_EQ(response.session_id(), session_id); @@ -178,3 +180,18 @@ TEST(Sessions, can_stop_submission) { ASSERT_NO_THROW(response = client.stop_submission_session(session_id)); ASSERT_EQ(response.session_id(), session_id); } + +TEST(Sessions, can_close_session) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string session_id = client.create_session(task_options); + + armonik::api::grpc::v1::sessions::SessionRaw response; + ASSERT_NO_THROW(response = client.close_session(session_id)); + ASSERT_EQ(response.session_id(), session_id); +} From cb38078d33424866d068f780a93aba78f576808a Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Fri, 16 Feb 2024 16:07:40 +0100 Subject: [PATCH 193/344] Add result availability for events service cpp --- .../header/events/EventsClient.h | 21 +++++ .../source/events/EventsClient.cpp | 80 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 packages/cpp/ArmoniK.Api.Client/header/events/EventsClient.h create mode 100644 packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp diff --git a/packages/cpp/ArmoniK.Api.Client/header/events/EventsClient.h b/packages/cpp/ArmoniK.Api.Client/header/events/EventsClient.h new file mode 100644 index 000000000..adfcaf9a1 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/header/events/EventsClient.h @@ -0,0 +1,21 @@ +#pragma once + +#include "events_common.pb.h" +#include "events_service.grpc.pb.h" + +namespace armonik { +namespace api { +namespace client { +class EventsClient { +public: + explicit EventsClient(std::unique_ptr stub) + : stub(std::move(stub)) {} + + void wait_for_result_availability(std::string session_id, std::vector result_ids); + +private: + std::unique_ptr stub; +}; +} // namespace client +} // namespace api +} // namespace armonik diff --git a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp new file mode 100644 index 000000000..18c9c89c3 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp @@ -0,0 +1,80 @@ +#include "events/EventsClient.h" +#include "events_common.pb.h" +#include "events_service.grpc.pb.h" +#include "exceptions/ArmoniKApiException.h" +#include "objects.pb.h" +#include "results_service.grpc.pb.h" + +namespace armonik { +namespace api { +namespace client { + +void EventsClient::wait_for_result_availability(std::string session_id, std::vector result_ids) { + + ::grpc::ClientContext context; + armonik::api::grpc::v1::events::EventSubscriptionRequest request; + + armonik::api::grpc::v1::events::EventSubscriptionResponse response; + + armonik::api::grpc::v1::results::Filters filters; + armonik::api::grpc::v1::results::FilterField filter_field; + filter_field.mutable_field()->mutable_result_raw_field()->set_field( + armonik::api::grpc::v1::results::RESULT_RAW_ENUM_FIELD_RESULT_ID); + filter_field.mutable_filter_string()->set_operator_(grpc::v1::FILTER_STRING_OPERATOR_EQUAL); + for (auto &&result_id : result_ids) { + filter_field.mutable_filter_string()->set_value(result_id); + *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; + } + + *request.mutable_session_id() = std::move(session_id); + *request.mutable_results_filters() = filters; + request.add_returned_events(static_cast( + armonik::api::grpc::v1::events::EventSubscriptionResponse::UpdateCase::kResultStatusUpdate)); + request.add_returned_events(static_cast( + armonik::api::grpc::v1::events::EventSubscriptionResponse::UpdateCase::kNewResult)); + + auto stream = stub->GetEvents(&context, request); + if (!stream) { + throw armonik::api::common::exceptions::ArmoniKApiException("Result has been aborted"); + } + + while (stream->Read(&response)) { + if (response.update_case() == + armonik::api::grpc::v1::events::EventSubscriptionResponse::UpdateCase::kResultStatusUpdate) { + if (response.mutable_result_status_update()->status() == + armonik::api::grpc::v1::result_status::ResultStatus::RESULT_STATUS_COMPLETED) { + result_ids.erase( + std::remove(result_ids.begin(), result_ids.end(), response.mutable_result_status_update()->result_id()), + result_ids.end()); + if (result_ids.empty()) { + break; + } + } + + if (response.mutable_result_status_update()->status() == + armonik::api::grpc::v1::result_status::ResultStatus::RESULT_STATUS_ABORTED) { + throw armonik::api::common::exceptions::ArmoniKApiException("Result has been aborted"); + } + } + + if (response.update_case() == armonik::api::grpc::v1::events::EventSubscriptionResponse::UpdateCase::kNewResult) { + if (response.mutable_new_result()->status() == + armonik::api::grpc::v1::result_status::ResultStatus::RESULT_STATUS_COMPLETED) { + result_ids.erase(std::remove(result_ids.begin(), result_ids.end(), response.mutable_new_result()->result_id()), + result_ids.end()); + if (result_ids.empty()) { + break; + } + } + + if (response.mutable_new_result()->status() == + armonik::api::grpc::v1::result_status::ResultStatus::RESULT_STATUS_ABORTED) { + throw armonik::api::common::exceptions::ArmoniKApiException("Result has been aborted"); + } + } + } +} + +} // namespace client +} // namespace api +} // namespace armonik From 70f7630409aa765ab72ebc62218594858d08223c Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Fri, 16 Feb 2024 16:18:16 +0100 Subject: [PATCH 194/344] Test wait for results --- .../source/EventsClientTest.cpp | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp diff --git a/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp new file mode 100644 index 000000000..6a998f49a --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp @@ -0,0 +1,34 @@ +#include + +#include "common.h" +#include "logger/formatter.h" +#include "logger/logger.h" +#include "logger/writer.h" + +#include "events/EventsClient.h" +#include "results/ResultsClient.h" +#include "results_service.grpc.pb.h" +#include "sessions/SessionsClient.h" + +using Logger = armonik::api::common::logger::Logger; + +TEST(Events, getEvents) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + init(channel, task_options, log); + + armonik::api::client::EventsClient client(armonik::api::grpc::v1::events::Events::NewStub(channel)); + + auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) + .create_session(task_options); + + auto result_client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); + auto payload_id = result_client.create_results( + session_id, std::vector>{{"name", "payload"}})["name"]; + auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; + + ASSERT_NO_THROW(result_client.upload_result_data(session_id, result_id, "name")); + ASSERT_NO_THROW(client.wait_for_result_availability(session_id, {result_id, payload_id})); + ASSERT_EQ(result_client.download_result_data(session_id, result_id), "name"); +} From d534f2595746ba4d8dd639b752fdf2cd99e42c9b Mon Sep 17 00:00:00 2001 From: Faust1 Date: Mon, 19 Feb 2024 10:10:04 +0100 Subject: [PATCH 195/344] fix: missing web and angular index --- .../armonik.api.angular/src/lib/index.ts | 25 ++- packages/web/src/index.ts | 176 ++++++++++++++++++ 2 files changed, 196 insertions(+), 5 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts index c52b074ef..56b3c5b20 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts @@ -22,6 +22,7 @@ export { AuthenticationClient } from './generated/auth-service.pbsc' export { EventSubscriptionRequest, EventSubscriptionResponse, + EventsEnum, } from './generated/events-common.pb' export { EventsClient } from './generated/events-service.pbsc' export { @@ -58,6 +59,13 @@ export { PartitionsClient } from './generated/partitions-service.pbsc' export { ResultStatus } from './generated/result-status.pb' export { GetOwnerTaskIdRequest, + CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, + CreateResultsRequest, CreateResultsResponse, + DeleteResultsDataRequest, DeleteResultsDataResponse, + DownloadResultDataRequest, DownloadResultDataResponse, + ResultsServiceConfigurationResponse, UploadResultDataRequest, + UploadResultDataResponse, WatchResultRequest, + WatchResultResponse, GetOwnerTaskIdResponse, GetResultRequest, GetResultResponse, ListResultsRequest, ListResultsResponse, ResultRaw, @@ -75,11 +83,17 @@ export { export { ResultsClient } from './generated/results-service.pbsc' export { SessionStatus } from './generated/session-status.pb' export { - CancelSessionRequest, - CancelSessionResponse, GetSessionRequest, - GetSessionResponse, - ListSessionsRequest, - ListSessionsResponse, SessionRaw, + CancelSessionRequest, CancelSessionResponse, + GetSessionRequest, GetSessionResponse, + ListSessionsRequest, ListSessionsResponse, + PauseSessionRequest, PauseSessionResponse, + ResumeSessionRequest, ResumeSessionResponse, + CloseSessionRequest, CloseSessionResponse, + CreateSessionReply, CreateSessionRequest, + DeleteSessionRequest, DeleteSessionResponse, + PurgeSessionRequest, PurgeSessionResponse, + StopSubmissionRequest, StopSubmissionResponse, + SessionRaw, } from './generated/sessions-common.pb' export { SessionField, SessionRawEnumField, @@ -107,6 +121,7 @@ export { ListTasksRequest, ListTasksResponse, TaskDetailed, TaskSummary, + ListTasksDetailedResponse, SubmitTasksRequest, SubmitTasksResponse } from './generated/tasks-common.pb' export { TaskField, diff --git a/packages/web/src/index.ts b/packages/web/src/index.ts index 129a84d1f..38e0ea32d 100644 --- a/packages/web/src/index.ts +++ b/packages/web/src/index.ts @@ -1 +1,177 @@ export default 'ArmoniK.Api' + +export { + ApplicationRaw, ListApplicationsRequest, + ListApplicationsResponse, + ListApplicationsRequest_Sort, +} from './generated/applications_common' +export { + ApplicationField, + ApplicationRawEnumField, + ApplicationRawField, + applicationRawEnumFieldFromJSON, applicationRawEnumFieldToJSON +} from './generated/applications_fields' +export { + FilterField as ApplicationFilterField, + Filters as ApplicationFilters, + FiltersAnd as ApplicationFiltersAnd, +} from './generated/applications_filters' +export { ApplicationsClientImpl as ApplicationsClient, ApplicationsServiceName, } from './generated/applications_service' +export { + GetCurrentUserRequest, + GetCurrentUserResponse, + User, +} from './generated/auth_common' +export { AuthenticationClientImpl as AuthenticationClient, AuthenticationServiceName, } from './generated/auth_service' +export { + EventSubscriptionRequest, + EventSubscriptionResponse, + EventsEnum, + EventSubscriptionResponse_NewResult, + EventSubscriptionResponse_NewTask, + EventSubscriptionResponse_ResultOwnerUpdate, + EventSubscriptionResponse_ResultStatusUpdate, + EventSubscriptionResponse_TaskStatusUpdate, +} from './generated/events_common' +export { EventsClientImpl as EventsClient, EventsServiceName } from './generated/events_service' +export { + FilterArrayOperator, + FilterDateOperator, + FilterNumberOperator, FilterStatusOperator, FilterStringOperator, + FilterArray, + FilterBoolean, + FilterDate, + FilterNumber, + FilterString, + FilterBooleanOperator, + FilterDuration, + FilterDurationOperator, + filterArrayOperatorFromJSON, filterArrayOperatorToJSON, + filterBooleanOperatorFromJSON, filterBooleanOperatorToJSON, + filterDateOperatorFromJSON, filterDateOperatorToJSON, + filterDurationOperatorFromJSON, filterDurationOperatorToJSON, + filterNumberOperatorFromJSON, filterNumberOperatorToJSON, + filterStatusOperatorFromJSON, filterStatusOperatorToJSON, + filterStringOperatorFromJSON, filterStringOperatorToJSON +} from './generated/filters_common' +export { StatusCount, TaskOptions } from './generated/objects' +export { + GetPartitionRequest, + GetPartitionResponse, + ListPartitionsRequest, + ListPartitionsResponse, + ListPartitionsRequest_Sort, + PartitionRaw, + PartitionRaw_PodConfigurationEntry, +} from './generated/partitions_common' +export { + PartitionField, PartitionRawEnumField, + PartitionRawField, + partitionRawEnumFieldFromJSON, partitionRawEnumFieldToJSON +} from './generated/partitions_fields' +export { + FilterField as PartitionFilterField, + Filters as PartitionFilters, + FiltersAnd as PartitionFiltersAnd, +} from './generated/partitions_filters' +export { PartitionsClientImpl as PartitionsClient, PartitionsServiceName } from './generated/partitions_service' +export { ResultStatus, resultStatusFromJSON, resultStatusToJSON } from './generated/result_status' +export { + GetOwnerTaskIdRequest, + CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, + CreateResultsRequest, CreateResultsResponse, + DeleteResultsDataRequest, DeleteResultsDataResponse, + DownloadResultDataRequest, DownloadResultDataResponse, + ResultsServiceConfigurationResponse, UploadResultDataRequest, + UploadResultDataResponse, WatchResultRequest, + WatchResultResponse, + GetOwnerTaskIdResponse, GetResultRequest, + GetResultResponse, ListResultsRequest, + ListResultsResponse, ResultRaw, + CreateResultsMetaDataRequest_ResultCreate, CreateResultsRequest_ResultCreate, + GetOwnerTaskIdResponse_MapResultTask, ListResultsRequest_Sort, + UploadResultDataRequest_ResultIdentifier, +} from './generated/results_common' +export { + ResultField, ResultRawEnumField, + ResultRawField, + resultRawEnumFieldFromJSON, resultRawEnumFieldToJSON +} from './generated/results_fields' +export { + FilterField as ResultFilterField, + Filters as ResultFilters, + FiltersAnd as ResultFiltersAnd, + FilterStatus as ResultFilterStatus, +} from './generated/results_filters' +export { ResultsClientImpl as ResultsClient, ResultsServiceName } from './generated/results_service' +export { SessionStatus, sessionStatusFromJSON, sessionStatusToJSON } from './generated/session_status' +export { + CancelSessionRequest, CancelSessionResponse, + GetSessionRequest, GetSessionResponse, + ListSessionsRequest, ListSessionsResponse, + PauseSessionRequest, PauseSessionResponse, + ResumeSessionRequest, ResumeSessionResponse, + CloseSessionRequest, CloseSessionResponse, + CreateSessionReply, CreateSessionRequest, + DeleteSessionRequest, DeleteSessionResponse, + PurgeSessionRequest, PurgeSessionResponse, + StopSubmissionRequest, StopSubmissionResponse, + ListSessionsRequest_Sort, + SessionRaw, +} from './generated/sessions_common' +export { + SessionField, SessionRawEnumField, + SessionRawField, + TaskOptionEnumField as SessionTaskOptionEnumField, + TaskOptionField as SessionTaskOptionField, + TaskOptionGenericField as SessionTaskOptionGenericField, + sessionRawEnumFieldFromJSON, sessionRawEnumFieldToJSON, + taskOptionEnumFieldFromJSON, taskOptionEnumFieldToJSON +} from './generated/sessions_fields' +export { + FilterField as SessionFilterField, + Filters as SessionFilters, + FiltersAnd as SessionFiltersAnd, + FilterStatus as SessionFilterStatus, +} from './generated/sessions_filters' +export { SessionsClientImpl as SessionsClient, SessionsServiceName } from './generated/sessions_service' +export { SortDirection, sortDirectionFromJSON, sortDirectionToJSON } from './generated/sort_direction' +export { TaskStatus, taskStatusFromJSON, taskStatusToJSON } from './generated/task_status' +export { + CancelTasksRequest, + CancelTasksResponse, CountTasksByStatusRequest, + CountTasksByStatusResponse, GetResultIdsRequest, + GetResultIdsResponse, + GetTaskRequest, + GetTaskResponse, + ListTasksRequest, + ListTasksResponse, TaskDetailed, + TaskSummary, + ListTasksDetailedResponse, SubmitTasksRequest, SubmitTasksResponse, + GetResultIdsResponse_MapTaskResult, ListTasksRequest_Sort, + SubmitTasksRequest_TaskCreation, SubmitTasksResponse_TaskInfo, + TaskDetailed_Output, +} from './generated/tasks_common' +export { + TaskField, + TaskOptionEnumField, TaskOptionField, + TaskOptionGenericField, TaskSummaryEnumField, + TaskSummaryField, + taskSummaryEnumFieldFromJSON, taskSummaryEnumFieldToJSON +} from './generated/tasks_fields' +export { + FilterField as TaskFilterField, + Filters as TaskFilters, + FiltersAnd as TaskFiltersAnd, + FilterStatus as TaskFilterStatus, +} from './generated/tasks_filters' +export { TasksClientImpl as TasksClient, TasksServiceName } from './generated/tasks_service' +export { ListVersionsRequest, ListVersionsResponse } from './generated/versions_common' +export { VersionsClientImpl as VersionsClient, VersionsServiceName } from './generated/versions_service' +export { + CheckHealthRequest, + CheckHealthResponse, + HealthStatusEnum, + healthStatusEnumFromJSON, healthStatusEnumToJSON +} from './generated/health_checks_common' +export { HealthChecksServiceClientImpl as HealthChecksServiceClient, HealthChecksServiceServiceName } from './generated/health_checks_service' From f7fffb1d5e20314923ff604df8a43961c9cbb042 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Mon, 19 Feb 2024 10:14:45 +0100 Subject: [PATCH 196/344] fixed lint --- .../armonik.api.angular/src/lib/index.ts | 4 ++-- packages/web/src/index.ts | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts index 56b3c5b20..efed04c99 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/src/lib/index.ts @@ -83,7 +83,7 @@ export { export { ResultsClient } from './generated/results-service.pbsc' export { SessionStatus } from './generated/session-status.pb' export { - CancelSessionRequest, CancelSessionResponse, + CancelSessionRequest, CancelSessionResponse, GetSessionRequest, GetSessionResponse, ListSessionsRequest, ListSessionsResponse, PauseSessionRequest, PauseSessionResponse, @@ -121,7 +121,7 @@ export { ListTasksRequest, ListTasksResponse, TaskDetailed, TaskSummary, - ListTasksDetailedResponse, SubmitTasksRequest, SubmitTasksResponse + ListTasksDetailedResponse, SubmitTasksRequest, SubmitTasksResponse, } from './generated/tasks-common.pb' export { TaskField, diff --git a/packages/web/src/index.ts b/packages/web/src/index.ts index 38e0ea32d..22f4b90aa 100644 --- a/packages/web/src/index.ts +++ b/packages/web/src/index.ts @@ -9,20 +9,20 @@ export { ApplicationField, ApplicationRawEnumField, ApplicationRawField, - applicationRawEnumFieldFromJSON, applicationRawEnumFieldToJSON + applicationRawEnumFieldFromJSON, applicationRawEnumFieldToJSON, } from './generated/applications_fields' export { FilterField as ApplicationFilterField, Filters as ApplicationFilters, FiltersAnd as ApplicationFiltersAnd, } from './generated/applications_filters' -export { ApplicationsClientImpl as ApplicationsClient, ApplicationsServiceName, } from './generated/applications_service' +export { ApplicationsClientImpl as ApplicationsClient, ApplicationsServiceName } from './generated/applications_service' export { GetCurrentUserRequest, GetCurrentUserResponse, User, } from './generated/auth_common' -export { AuthenticationClientImpl as AuthenticationClient, AuthenticationServiceName, } from './generated/auth_service' +export { AuthenticationClientImpl as AuthenticationClient, AuthenticationServiceName } from './generated/auth_service' export { EventSubscriptionRequest, EventSubscriptionResponse, @@ -52,7 +52,7 @@ export { filterDurationOperatorFromJSON, filterDurationOperatorToJSON, filterNumberOperatorFromJSON, filterNumberOperatorToJSON, filterStatusOperatorFromJSON, filterStatusOperatorToJSON, - filterStringOperatorFromJSON, filterStringOperatorToJSON + filterStringOperatorFromJSON, filterStringOperatorToJSON, } from './generated/filters_common' export { StatusCount, TaskOptions } from './generated/objects' export { @@ -67,7 +67,7 @@ export { export { PartitionField, PartitionRawEnumField, PartitionRawField, - partitionRawEnumFieldFromJSON, partitionRawEnumFieldToJSON + partitionRawEnumFieldFromJSON, partitionRawEnumFieldToJSON, } from './generated/partitions_fields' export { FilterField as PartitionFilterField, @@ -95,7 +95,7 @@ export { export { ResultField, ResultRawEnumField, ResultRawField, - resultRawEnumFieldFromJSON, resultRawEnumFieldToJSON + resultRawEnumFieldFromJSON, resultRawEnumFieldToJSON, } from './generated/results_fields' export { FilterField as ResultFilterField, @@ -106,7 +106,7 @@ export { export { ResultsClientImpl as ResultsClient, ResultsServiceName } from './generated/results_service' export { SessionStatus, sessionStatusFromJSON, sessionStatusToJSON } from './generated/session_status' export { - CancelSessionRequest, CancelSessionResponse, + CancelSessionRequest, CancelSessionResponse, GetSessionRequest, GetSessionResponse, ListSessionsRequest, ListSessionsResponse, PauseSessionRequest, PauseSessionResponse, @@ -126,7 +126,7 @@ export { TaskOptionField as SessionTaskOptionField, TaskOptionGenericField as SessionTaskOptionGenericField, sessionRawEnumFieldFromJSON, sessionRawEnumFieldToJSON, - taskOptionEnumFieldFromJSON, taskOptionEnumFieldToJSON + taskOptionEnumFieldFromJSON, taskOptionEnumFieldToJSON, } from './generated/sessions_fields' export { FilterField as SessionFilterField, @@ -157,7 +157,7 @@ export { TaskOptionEnumField, TaskOptionField, TaskOptionGenericField, TaskSummaryEnumField, TaskSummaryField, - taskSummaryEnumFieldFromJSON, taskSummaryEnumFieldToJSON + taskSummaryEnumFieldFromJSON, taskSummaryEnumFieldToJSON, } from './generated/tasks_fields' export { FilterField as TaskFilterField, @@ -172,6 +172,6 @@ export { CheckHealthRequest, CheckHealthResponse, HealthStatusEnum, - healthStatusEnumFromJSON, healthStatusEnumToJSON + healthStatusEnumFromJSON, healthStatusEnumToJSON, } from './generated/health_checks_common' export { HealthChecksServiceClientImpl as HealthChecksServiceClient, HealthChecksServiceServiceName } from './generated/health_checks_service' From 2e45747b839d903aa695903e91f41b93736ec814 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 19 Feb 2024 11:12:05 +0100 Subject: [PATCH 197/344] PR comments --- .../header/versions/VersionsClient.h | 12 +++- .../source/events/EventsClient.cpp | 70 +++++++++---------- .../source/versions/VersionsClient.cpp | 7 +- .../source/VersionsClientTest.cpp | 10 +-- 4 files changed, 53 insertions(+), 46 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/versions/VersionsClient.h b/packages/cpp/ArmoniK.Api.Client/header/versions/VersionsClient.h index 35ffe94dd..8e771cb3c 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/versions/VersionsClient.h +++ b/packages/cpp/ArmoniK.Api.Client/header/versions/VersionsClient.h @@ -7,6 +7,16 @@ namespace armonik { namespace api { namespace client { +/** + * @brief Data structure for components version + * @param api ArmoniK API version + * @param core ArmoniK CORE version + */ +struct versions_info { + std::string api; + std::string core; +}; + /** * Versions Client wrapper */ @@ -19,7 +29,7 @@ class VersionsClient { * Get versions of ArmoniK components * @return Mapping between component names and their versions */ - std::map list_versions(); + versions_info list_versions(); private: std::unique_ptr stub; diff --git a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp index 18c9c89c3..0d3f01fda 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp @@ -3,7 +3,11 @@ #include "events_service.grpc.pb.h" #include "exceptions/ArmoniKApiException.h" #include "objects.pb.h" -#include "results_service.grpc.pb.h" + +using armonik::api::grpc::v1::events::EventSubscriptionRequest; +using armonik::api::grpc::v1::events::EventSubscriptionResponse; +using armonik::api::grpc::v1::result_status::ResultStatus; +using namespace armonik::api::grpc::v1::events; namespace armonik { namespace api { @@ -12,9 +16,9 @@ namespace client { void EventsClient::wait_for_result_availability(std::string session_id, std::vector result_ids) { ::grpc::ClientContext context; - armonik::api::grpc::v1::events::EventSubscriptionRequest request; + EventSubscriptionRequest request; - armonik::api::grpc::v1::events::EventSubscriptionResponse response; + EventSubscriptionResponse response; armonik::api::grpc::v1::results::Filters filters; armonik::api::grpc::v1::results::FilterField filter_field; @@ -28,10 +32,8 @@ void EventsClient::wait_for_result_availability(std::string session_id, std::vec *request.mutable_session_id() = std::move(session_id); *request.mutable_results_filters() = filters; - request.add_returned_events(static_cast( - armonik::api::grpc::v1::events::EventSubscriptionResponse::UpdateCase::kResultStatusUpdate)); - request.add_returned_events(static_cast( - armonik::api::grpc::v1::events::EventSubscriptionResponse::UpdateCase::kNewResult)); + request.add_returned_events(static_cast(EventSubscriptionResponse::UpdateCase::kResultStatusUpdate)); + request.add_returned_events(static_cast(EventSubscriptionResponse::UpdateCase::kNewResult)); auto stream = stub->GetEvents(&context, request); if (!stream) { @@ -39,38 +41,36 @@ void EventsClient::wait_for_result_availability(std::string session_id, std::vec } while (stream->Read(&response)) { - if (response.update_case() == - armonik::api::grpc::v1::events::EventSubscriptionResponse::UpdateCase::kResultStatusUpdate) { - if (response.mutable_result_status_update()->status() == - armonik::api::grpc::v1::result_status::ResultStatus::RESULT_STATUS_COMPLETED) { - result_ids.erase( - std::remove(result_ids.begin(), result_ids.end(), response.mutable_result_status_update()->result_id()), - result_ids.end()); - if (result_ids.empty()) { - break; - } - } - - if (response.mutable_result_status_update()->status() == - armonik::api::grpc::v1::result_status::ResultStatus::RESULT_STATUS_ABORTED) { + std::string update_or_new; + switch (response.update_case()) { + case EventSubscriptionResponse::UpdateCase::kResultStatusUpdate: + switch (response.mutable_result_status_update()->status()) { + case ResultStatus::RESULT_STATUS_COMPLETED: + update_or_new = response.mutable_result_status_update()->result_id(); + break; + case ResultStatus::RESULT_STATUS_ABORTED: throw armonik::api::common::exceptions::ArmoniKApiException("Result has been aborted"); + default: + break; } - } - - if (response.update_case() == armonik::api::grpc::v1::events::EventSubscriptionResponse::UpdateCase::kNewResult) { - if (response.mutable_new_result()->status() == - armonik::api::grpc::v1::result_status::ResultStatus::RESULT_STATUS_COMPLETED) { - result_ids.erase(std::remove(result_ids.begin(), result_ids.end(), response.mutable_new_result()->result_id()), - result_ids.end()); - if (result_ids.empty()) { - break; - } - } - - if (response.mutable_new_result()->status() == - armonik::api::grpc::v1::result_status::ResultStatus::RESULT_STATUS_ABORTED) { + break; + case EventSubscriptionResponse::UpdateCase::kNewResult: + switch (response.mutable_new_result()->status()) { + case ResultStatus::RESULT_STATUS_COMPLETED: + update_or_new = response.mutable_new_result()->result_id(); + break; + case ResultStatus::RESULT_STATUS_ABORTED: throw armonik::api::common::exceptions::ArmoniKApiException("Result has been aborted"); + default: + break; } + break; + default: + break; + } + result_ids.erase(std::remove(result_ids.begin(), result_ids.end(), update_or_new), result_ids.end()); + if (result_ids.empty()) { + break; } } } diff --git a/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp index 69f65f8a0..f59b1b420 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp @@ -5,21 +5,18 @@ namespace armonik { namespace api { namespace client { -std::map VersionsClient::list_versions() { +versions_info VersionsClient::list_versions() { ::grpc::ClientContext context; armonik::api::grpc::v1::versions::ListVersionsRequest request; armonik::api::grpc::v1::versions::ListVersionsResponse response; - std::map mapping; - auto status = stub->ListVersions(&context, request, &response); if (!status.ok()) { throw armonik::api::common::exceptions::ArmoniKApiException("Could not get list versions : " + status.error_message()); } - mapping.insert({"api", response.api()}); - mapping.insert({"core", response.core()}); + versions_info mapping = {response.api(), response.core()}; return mapping; } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp index 7750c8df2..5d98832cc 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp @@ -17,12 +17,12 @@ TEST(Versions, can_list_versions) { armonik::api::client::VersionsClient client(armonik::api::grpc::v1::versions::Versions::NewStub(channel)); - std::map versions; + armonik::api::client::versions_info versions; ASSERT_NO_THROW(versions = client.list_versions()); - std::cout << "API version: " << versions.at("api") << "\n" - << "Core version: " << versions.at("core") << std::endl; + std::cout << "API version: " << versions.api << "\n" + << "Core version: " << versions.core << std::endl; - ASSERT_NE(versions.at("api"), "Unknown"); - ASSERT_NE(versions.at("core"), "Unknown"); + ASSERT_NE(versions.api, "Unknown"); + ASSERT_NE(versions.core, "Unknown"); } From f9b8d527c9c6a15fbee57a4963d5799a4cd0c465 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 19 Feb 2024 15:20:32 +0100 Subject: [PATCH 198/344] More PR comments --- .../source/events/EventsClient.cpp | 8 ++- .../source/partitions/PartitionsClient.cpp | 34 ++++----- .../source/sessions/SessionsClient.cpp | 72 +++++++++---------- .../source/versions/VersionsClient.cpp | 8 ++- 4 files changed, 62 insertions(+), 60 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp index 0d3f01fda..84ffe4e81 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp @@ -68,9 +68,11 @@ void EventsClient::wait_for_result_availability(std::string session_id, std::vec default: break; } - result_ids.erase(std::remove(result_ids.begin(), result_ids.end(), update_or_new), result_ids.end()); - if (result_ids.empty()) { - break; + if (!update_or_new.empty()) { + result_ids.erase(std::remove(result_ids.begin(), result_ids.end(), update_or_new), result_ids.end()); + if (result_ids.empty()) { + break; + } } } } diff --git a/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp index 878e47099..3c8e05609 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/partitions/PartitionsClient.cpp @@ -3,17 +3,17 @@ #include "exceptions/ArmoniKApiException.h" #include "partitions/PartitionsClient.h" +using namespace armonik::api::grpc::v1::partitions; + namespace armonik { namespace api { namespace client { -std::vector -PartitionsClient::list_partitions(armonik::api::grpc::v1::partitions::Filters filters, int32_t &total, int32_t page, - int32_t page_size, - armonik::api::grpc::v1::partitions::ListPartitionsRequest::Sort sort) { +std::vector PartitionsClient::list_partitions(Filters filters, int32_t &total, int32_t page, + int32_t page_size, ListPartitionsRequest::Sort sort) { ::grpc::ClientContext context; - armonik::api::grpc::v1::partitions::ListPartitionsRequest request; - armonik::api::grpc::v1::partitions::ListPartitionsResponse response; + ListPartitionsRequest request; + ListPartitionsResponse response; *request.mutable_filters() = std::move(filters); *request.mutable_sort() = std::move(sort); @@ -28,9 +28,10 @@ PartitionsClient::list_partitions(armonik::api::grpc::v1::partitions::Filters fi status.error_message()); } total = response.total(); - return {response.partitions().begin(), response.partitions().end()}; + return {std::make_move_iterator(response.partitions().begin()), + std::make_move_iterator(response.partitions().end())}; } else { - std::vector rawPartitions; + std::vector rawPartitions; int current_page = 0; do { request.set_page(current_page); @@ -40,9 +41,8 @@ PartitionsClient::list_partitions(armonik::api::grpc::v1::partitions::Filters fi throw armonik::api::common::exceptions::ArmoniKApiException("Unable to list partitions " + status.error_message()); } - rawPartitions.insert(rawPartitions.end(), - response.partitions().begin() + ((int32_t)rawPartitions.size() - current_page * page_size), - response.partitions().end()); + rawPartitions.insert(rawPartitions.end(), std::make_move_iterator(response.partitions().begin()), + std::make_move_iterator(response.partitions().end())); if (response.partitions_size() >= page_size) { current_page++; } @@ -56,10 +56,10 @@ PartitionsClient::list_partitions(armonik::api::grpc::v1::partitions::Filters fi } } -armonik::api::grpc::v1::partitions::PartitionRaw PartitionsClient::get_partition(std::string partition_id) { +PartitionRaw PartitionsClient::get_partition(std::string partition_id) { ::grpc::ClientContext context; - armonik::api::grpc::v1::partitions::GetPartitionRequest request; - armonik::api::grpc::v1::partitions::GetPartitionResponse response; + GetPartitionRequest request; + GetPartitionResponse response; *request.mutable_id() = std::move(partition_id); auto status = stub->GetPartition(&context, request, &response); @@ -67,11 +67,11 @@ armonik::api::grpc::v1::partitions::PartitionRaw PartitionsClient::get_partition throw armonik::api::common::exceptions::ArmoniKApiException("Could not get partition : " + status.error_message()); } - return response.partition(); + return std::move(*response.mutable_partition()); } -armonik::api::grpc::v1::partitions::ListPartitionsRequest::Sort PartitionsClient::default_sort() { - armonik::api::grpc::v1::partitions::ListPartitionsRequest::Sort sort; +ListPartitionsRequest::Sort PartitionsClient::default_sort() { + ListPartitionsRequest::Sort sort; sort.set_direction(grpc::v1::sort_direction::SORT_DIRECTION_ASC); sort.mutable_field()->mutable_partition_raw_field()->set_field( grpc::v1::partitions::PARTITION_RAW_ENUM_FIELD_PRIORITY); diff --git a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp index 1b7573f18..31cce4d07 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/sessions/SessionsClient.cpp @@ -4,22 +4,23 @@ #include "sessions_service.grpc.pb.h" #include -static armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort get_default_sort() { - armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort sort; +using namespace armonik::api::grpc::v1::sessions; + +static ListSessionsRequest::Sort get_default_sort() { + ListSessionsRequest::Sort sort; sort.mutable_field()->mutable_session_raw_field()->set_field( armonik::api::grpc::v1::sessions::SESSION_RAW_ENUM_FIELD_CREATED_AT); sort.set_direction(armonik::api::grpc::v1::sort_direction::SORT_DIRECTION_ASC); return sort; } -const armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort armonik::api::client::SessionsClient::default_sort = - get_default_sort(); +const ListSessionsRequest::Sort armonik::api::client::SessionsClient::default_sort = get_default_sort(); std::string armonik::api::client::SessionsClient::create_session(armonik::api::grpc::v1::TaskOptions default_task_options, const std::vector &partitions) { ::grpc::ClientContext context; - armonik::api::grpc::v1::sessions::CreateSessionRequest request; - armonik::api::grpc::v1::sessions::CreateSessionReply response; + CreateSessionRequest request; + CreateSessionReply response; *request.mutable_default_task_option() = std::move(default_task_options); request.mutable_partition_ids()->Add(partitions.begin(), partitions.end()); @@ -31,10 +32,10 @@ armonik::api::client::SessionsClient::create_session(armonik::api::grpc::v1::Tas return std::move(*response.mutable_session_id()); } -armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::get_session(std::string session_id) { +SessionRaw armonik::api::client::SessionsClient::get_session(std::string session_id) { ::grpc::ClientContext context; - armonik::api::grpc::v1::sessions::GetSessionRequest request; - armonik::api::grpc::v1::sessions::GetSessionResponse response; + GetSessionRequest request; + GetSessionResponse response; request.set_session_id(std::move(session_id)); @@ -45,11 +46,10 @@ armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClien return std::move(*response.mutable_session()); } -armonik::api::grpc::v1::sessions::SessionRaw -armonik::api::client::SessionsClient::cancel_session(std::string session_id) { +SessionRaw armonik::api::client::SessionsClient::cancel_session(std::string session_id) { ::grpc::ClientContext context; - armonik::api::grpc::v1::sessions::CancelSessionRequest request; - armonik::api::grpc::v1::sessions::CancelSessionResponse response; + CancelSessionRequest request; + CancelSessionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->CancelSession(&context, request, &response); @@ -63,8 +63,8 @@ std::vector armonik::api::client::SessionsClient::list_sessions(armonik::api::grpc::v1::sessions::Filters filters, int32_t &total, int32_t page, int32_t page_size, armonik::api::grpc::v1::sessions::ListSessionsRequest::Sort sort) { - armonik::api::grpc::v1::sessions::ListSessionsRequest request; - armonik::api::grpc::v1::sessions::ListSessionsResponse response; + ListSessionsRequest request; + ListSessionsResponse response; *request.mutable_filters() = std::move(filters); *request.mutable_sort() = std::move(sort); @@ -81,7 +81,7 @@ armonik::api::client::SessionsClient::list_sessions(armonik::api::grpc::v1::sess total = response.total(); return {response.sessions().begin(), response.sessions().end()}; } else { - std::vector rawSessions; + std::vector rawSessions; int current_page = 0; do { request.set_page(current_page); @@ -108,11 +108,10 @@ armonik::api::client::SessionsClient::list_sessions(armonik::api::grpc::v1::sess } } -armonik::api::grpc::v1::sessions::SessionRaw -armonik::api::client::SessionsClient::pause_session(std::string session_id) { +SessionRaw armonik::api::client::SessionsClient::pause_session(std::string session_id) { ::grpc::ClientContext context; - armonik::api::grpc::v1::sessions::PauseSessionRequest request; - armonik::api::grpc::v1::sessions::PauseSessionResponse response; + PauseSessionRequest request; + PauseSessionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->PauseSession(&context, request, &response); @@ -126,8 +125,8 @@ armonik::api::client::SessionsClient::pause_session(std::string session_id) { armonik::api::grpc::v1::sessions::SessionRaw armonik::api::client::SessionsClient::resume_session(std::string session_id) { ::grpc::ClientContext context; - armonik::api::grpc::v1::sessions::ResumeSessionRequest request; - armonik::api::grpc::v1::sessions::ResumeSessionResponse response; + ResumeSessionRequest request; + ResumeSessionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->ResumeSession(&context, request, &response); @@ -138,11 +137,10 @@ armonik::api::client::SessionsClient::resume_session(std::string session_id) { return std::move(*response.mutable_session()); } -armonik::api::grpc::v1::sessions::SessionRaw -armonik::api::client::SessionsClient::purge_session(std::string session_id) { +SessionRaw armonik::api::client::SessionsClient::purge_session(std::string session_id) { ::grpc::ClientContext context; - armonik::api::grpc::v1::sessions::PurgeSessionRequest request; - armonik::api::grpc::v1::sessions::PurgeSessionResponse response; + PurgeSessionRequest request; + PurgeSessionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->PurgeSession(&context, request, &response); @@ -153,11 +151,10 @@ armonik::api::client::SessionsClient::purge_session(std::string session_id) { return std::move(*response.mutable_session()); } -armonik::api::grpc::v1::sessions::SessionRaw -armonik::api::client::SessionsClient::delete_session(std::string session_id) { +SessionRaw armonik::api::client::SessionsClient::delete_session(std::string session_id) { ::grpc::ClientContext context; - armonik::api::grpc::v1::sessions::DeleteSessionRequest request; - armonik::api::grpc::v1::sessions::DeleteSessionResponse response; + DeleteSessionRequest request; + DeleteSessionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->DeleteSession(&context, request, &response); @@ -168,11 +165,11 @@ armonik::api::client::SessionsClient::delete_session(std::string session_id) { return std::move(*response.mutable_session()); } -armonik::api::grpc::v1::sessions::SessionRaw -armonik::api::client::SessionsClient::stop_submission_session(std::string session_id, bool client, bool worker) { +SessionRaw armonik::api::client::SessionsClient::stop_submission_session(std::string session_id, bool client, + bool worker) { ::grpc::ClientContext context; - armonik::api::grpc::v1::sessions::StopSubmissionRequest request; - armonik::api::grpc::v1::sessions::StopSubmissionResponse response; + StopSubmissionRequest request; + StopSubmissionResponse response; request.set_session_id(std::move(session_id)); request.set_client(client); @@ -186,11 +183,10 @@ armonik::api::client::SessionsClient::stop_submission_session(std::string sessio return std::move(*response.mutable_session()); } -armonik::api::grpc::v1::sessions::SessionRaw -armonik::api::client::SessionsClient::close_session(std::string session_id) { +SessionRaw armonik::api::client::SessionsClient::close_session(std::string session_id) { ::grpc::ClientContext context; - armonik::api::grpc::v1::sessions::CloseSessionRequest request; - armonik::api::grpc::v1::sessions::CloseSessionResponse response; + CloseSessionRequest request; + CloseSessionResponse response; request.set_session_id(std::move(session_id)); auto status = stub->CloseSession(&context, request, &response); diff --git a/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp index f59b1b420..088c67e5a 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/versions/VersionsClient.cpp @@ -1,14 +1,18 @@ #include "versions/VersionsClient.h" #include "exceptions/ArmoniKApiException.h" +using armonik::api::grpc::v1::versions::ListVersionsRequest; +using armonik::api::grpc::v1::versions::ListVersionsResponse; +using namespace armonik::api::grpc::v1::versions; + namespace armonik { namespace api { namespace client { versions_info VersionsClient::list_versions() { ::grpc::ClientContext context; - armonik::api::grpc::v1::versions::ListVersionsRequest request; - armonik::api::grpc::v1::versions::ListVersionsResponse response; + ListVersionsRequest request; + ListVersionsResponse response; auto status = stub->ListVersions(&context, request, &response); if (!status.ok()) { From c652301a47d9172619c0d7f2b7ef99d493f583c3 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Fri, 16 Feb 2024 19:17:12 +0100 Subject: [PATCH 199/344] fix: handle empty timestamps in RPC messages for Python API --- packages/python/src/armonik/common/helpers.py | 10 +++++++--- packages/python/tests/test_helpers.py | 6 ++++-- packages/python/tests/test_results.py | 9 ++------- packages/python/tests/test_sessions.py | 8 ++------ packages/python/tests/test_tasks.py | 18 +++++++++--------- 5 files changed, 24 insertions(+), 27 deletions(-) diff --git a/packages/python/src/armonik/common/helpers.py b/packages/python/src/armonik/common/helpers.py index 6de6dcce0..81cb6f943 100644 --- a/packages/python/src/armonik/common/helpers.py +++ b/packages/python/src/armonik/common/helpers.py @@ -52,7 +52,7 @@ def get_task_filter( return task_filter -def datetime_to_timestamp(time_stamp: datetime) -> timestamp.Timestamp: +def datetime_to_timestamp(time_stamp: datetime | None) -> timestamp.Timestamp: """Helper function to convert a Python Datetime to a gRPC Timestamp Args: @@ -62,11 +62,13 @@ def datetime_to_timestamp(time_stamp: datetime) -> timestamp.Timestamp: Equivalent gRPC Timestamp """ t = timestamp.Timestamp() - t.FromDatetime(dt=time_stamp) + t.FromDatetime( + dt=time_stamp if time_stamp is not None else datetime(1970, 1, 1, 0, 0, tzinfo=timezone.utc) + ) return t -def timestamp_to_datetime(time_stamp: timestamp.Timestamp) -> datetime: +def timestamp_to_datetime(time_stamp: timestamp.Timestamp) -> datetime | None: """Helper function to convert a gRPC Timestamp to a Python Datetime Note that datetime has microseconds accuracy instead of nanosecond accuracy for gRPC Timestamp Therefore, the conversion may not be lossless. @@ -76,6 +78,8 @@ def timestamp_to_datetime(time_stamp: timestamp.Timestamp) -> datetime: Returns: Equivalent Python Datetime """ + if time_stamp.seconds == 0 and time_stamp.nanos == 0: + return return time_stamp.ToDatetime(tzinfo=timezone.utc) diff --git a/packages/python/tests/test_helpers.py b/packages/python/tests/test_helpers.py index 98155cd69..d5ef2a51c 100644 --- a/packages/python/tests/test_helpers.py +++ b/packages/python/tests/test_helpers.py @@ -27,6 +27,8 @@ def timestamp(self) -> Timestamp: @property def date_time(self) -> datetime: + if self.seconds == 0 and self.nanos == 0: + return return datetime.utcfromtimestamp(self.seconds + self.nanos * 1e-9).replace( tzinfo=timezone.utc ) @@ -51,8 +53,8 @@ def test_datetime_to_timestamp(case: Case): @pytest.mark.parametrize("case", test_cases) def test_timestamp_to_datetime(case: Case): - ts = timestamp_to_datetime(case.timestamp) - assert ts.timestamp() == case.date_time.timestamp() + dt = timestamp_to_datetime(case.timestamp) + assert dt == case.date_time @pytest.mark.parametrize("case", test_cases) diff --git a/packages/python/tests/test_results.py b/packages/python/tests/test_results.py index 6ea058103..95d5f03fc 100644 --- a/packages/python/tests/test_results.py +++ b/packages/python/tests/test_results.py @@ -1,4 +1,3 @@ -import datetime import pytest import warnings @@ -18,12 +17,8 @@ def test_get_result(self): assert result.name == "result-name" assert result.owner_task_id == "owner-task-id" assert result.status == 2 - assert result.created_at == datetime.datetime( - 1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc - ) - assert result.completed_at == datetime.datetime( - 1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc - ) + assert result.created_at is None + assert result.completed_at is None assert result.result_id == "result-id" assert result.size == 0 diff --git a/packages/python/tests/test_sessions.py b/packages/python/tests/test_sessions.py index 116380779..2f3e6f208 100644 --- a/packages/python/tests/test_sessions.py +++ b/packages/python/tests/test_sessions.py @@ -37,12 +37,8 @@ def test_get_session(self): engine_type="", options={}, ) - assert session.created_at == datetime.datetime( - 1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc - ) - assert session.cancelled_at == datetime.datetime( - 1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc - ) + assert session.created_at is None + assert session.cancelled_at is None assert session.duration == datetime.timedelta(0) def test_list_session_no_filter(self): diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py index 90d42c021..6c5eb4593 100644 --- a/packages/python/tests/test_tasks.py +++ b/packages/python/tests/test_tasks.py @@ -29,15 +29,15 @@ class TestArmoniKTasks: engine_type="engine-type", options={}, ), - created_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - submitted_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - received_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - acquired_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - fetched_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - started_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - processed_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - ended_at=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), - pod_ttl=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc), + created_at=None, + submitted_at=None, + received_at=None, + acquired_at=None, + fetched_at=None, + started_at=None, + processed_at=None, + ended_at=None, + pod_ttl=None, output=Output(error=""), pod_hostname="", ) From 313f4c6ba73072af3f3d0d97c27516af7d15d101 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Mon, 4 Mar 2024 14:54:12 +0100 Subject: [PATCH 200/344] ci: add Python formatting, linting and type checking --- .github/workflows/ci.yml | 40 ++++++++++++++++++++++++++++++++++ packages/python/pyproject.toml | 6 ++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b79189895..4f21005c4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,6 +76,46 @@ jobs: exit 1 fi + format-python: + name: Check linting, formatting and typing + runs-on: ubuntu-latest + defaults: + run: + working-directory: packages/python + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + fetch-depth: 0 + + - name: pip update and add build package + run: bash proto2python.sh ~/pyvenv + + - name: Install dependencies + run: pip install "$(echo pkg/armonik*.whl)[dev]" + + - name: Lint + run: python -m ruff . + + - name: Check typing + run: python -m mypy --exclude src/armonik/protogen/ src/ + + - name: Check format + run: python -m ruff format . + + - name: Check Diff + run: | + DIFF="$(git diff --name-only)" + + if [ -z "$DIFF" ]; then + echo "OK: Format is clean" + else + echo "Error: Format was not clean" + echo "List of files:" + echo "$DIFF" + git diff + exit 1 + fi + format-cpp: name: Format C++ runs-on: ubuntu-latest diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 7269bf9bc..254c24b6f 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -40,7 +40,11 @@ tests = [ 'pytest', 'pytest-cov', 'pytest-benchmark[histogram]', - 'requests' + 'requests', +] +dev = [ + 'mypy', + 'ruff', ] [tool.pytest.ini_options] From e06ee227a06f05dbbd55c058e6c02366497eba85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Wed, 6 Mar 2024 09:54:50 +0100 Subject: [PATCH 201/344] chore: release 3.16.1 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 1eb2842f5..487a5a48e 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.16.0", + "version": "3.16.1", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 157eb3b28..f001a5458 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.16.0) +set(version 3.16.1) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index d8d65398d..f781b126c 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.16.0 - 3.16.0 + 3.16.1 + 3.16.1 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index c68f2cede..02d714c37 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.16.0 - 3.16.0 + 3.16.1 + 3.16.1 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index 5b607494b..f506269ae 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.16.0 - 3.16.0 + 3.16.1 + 3.16.1 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 4afaf6b97..1050820db 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.16.0 - 3.16.0 + 3.16.1 + 3.16.1 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index 3bf201cec..a8a997dd5 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.16.0 - 3.16.0 + 3.16.1 + 3.16.1 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 4f235c2a1..ae63ca027 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.16.0 - 3.16.0 + 3.16.1 + 3.16.1 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index eb027003d..2b5a3f5d0 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.16.0 - 3.16.0 + 3.16.1 + 3.16.1 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index c6ea5c812..7ddc23309 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.16.0 - 3.16.0 + 3.16.1 + 3.16.1 True True diff --git a/packages/web/package.json b/packages/web/package.json index 7ad58b355..5385e3dcd 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.16.0", + "version": "3.16.1", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From 45f74897b60afb57672d1a9124d7afabde438305 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Mon, 11 Mar 2024 11:10:43 +0100 Subject: [PATCH 202/344] fix: missing session fields --- Protos/V1/sessions_fields.proto | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Protos/V1/sessions_fields.proto b/Protos/V1/sessions_fields.proto index e0fab5a48..31bf8bc40 100644 --- a/Protos/V1/sessions_fields.proto +++ b/Protos/V1/sessions_fields.proto @@ -19,6 +19,8 @@ enum SessionRawEnumField { SESSION_RAW_ENUM_FIELD_PURGED_AT = 9; SESSION_RAW_ENUM_FIELD_DELETED_AT = 10; SESSION_RAW_ENUM_FIELD_DURATION = 7; + SESSION_RAW_ENUM_WORKER_SUBMISSION = 11; + SESSION_RAW_ENUM_CLIENT_SUBMISSION = 12; } message SessionRawField { From d6bc66d18eb92b78584e4f7e4349a5efc6fcc630 Mon Sep 17 00:00:00 2001 From: Faust1 <117363666+Faust1-2was-Aneo@users.noreply.github.com> Date: Mon, 11 Mar 2024 15:31:00 +0100 Subject: [PATCH 203/344] update added enums --- Protos/V1/sessions_fields.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Protos/V1/sessions_fields.proto b/Protos/V1/sessions_fields.proto index 31bf8bc40..ba12950bc 100644 --- a/Protos/V1/sessions_fields.proto +++ b/Protos/V1/sessions_fields.proto @@ -19,8 +19,8 @@ enum SessionRawEnumField { SESSION_RAW_ENUM_FIELD_PURGED_AT = 9; SESSION_RAW_ENUM_FIELD_DELETED_AT = 10; SESSION_RAW_ENUM_FIELD_DURATION = 7; - SESSION_RAW_ENUM_WORKER_SUBMISSION = 11; - SESSION_RAW_ENUM_CLIENT_SUBMISSION = 12; + SESSION_RAW_ENUM_FIELD_WORKER_SUBMISSION = 11; + SESSION_RAW_ENUM_FIELD_CLIENT_SUBMISSION = 12; } message SessionRawField { From 9bd1704c2f699e3de5328ecc00fbec58dcee5cad Mon Sep 17 00:00:00 2001 From: "Nicolas GRUEL (ANEO)" Date: Mon, 18 Mar 2024 19:07:26 +0100 Subject: [PATCH 204/344] chore(release): release 3.16.2 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 487a5a48e..ba330fdf9 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.16.1", + "version": "3.16.2", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index f001a5458..abd0816c5 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.16.1) +set(version 3.16.2) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index f781b126c..076c7cd87 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.16.1 - 3.16.1 + 3.16.2 + 3.16.2 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 02d714c37..b7dcbdd1f 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.16.1 - 3.16.1 + 3.16.2 + 3.16.2 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index f506269ae..50b2b5834 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.16.1 - 3.16.1 + 3.16.2 + 3.16.2 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 1050820db..5bc260500 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.16.1 - 3.16.1 + 3.16.2 + 3.16.2 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index a8a997dd5..a299b3ed0 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.16.1 - 3.16.1 + 3.16.2 + 3.16.2 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index ae63ca027..f5da179cb 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.16.1 - 3.16.1 + 3.16.2 + 3.16.2 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 2b5a3f5d0..1330da881 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.16.1 - 3.16.1 + 3.16.2 + 3.16.2 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 7ddc23309..f60865415 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.16.1 - 3.16.1 + 3.16.2 + 3.16.2 True True diff --git a/packages/web/package.json b/packages/web/package.json index 5385e3dcd..038ed5be0 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.16.1", + "version": "3.16.2", "packageManager": "pnpm@8.6.12", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From 390074a9996e511e543d779c590142f4a6acc586 Mon Sep 17 00:00:00 2001 From: "Nicolas GRUEL (ANEO)" Date: Mon, 15 Apr 2024 10:52:13 +0200 Subject: [PATCH 205/344] fix: adapt code to be python 3.8 compatible for the typing --- packages/python/src/armonik/client/events.py | 6 +++--- packages/python/src/armonik/client/partitions.py | 4 ++-- packages/python/src/armonik/client/results.py | 6 +++--- packages/python/src/armonik/client/sessions.py | 2 +- packages/python/src/armonik/client/tasks.py | 6 +++--- packages/python/src/armonik/common/helpers.py | 4 ++-- packages/python/src/armonik/worker/taskhandler.py | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index 19c46ede9..ac2442090 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -1,4 +1,4 @@ -from typing import Callable, cast, List +from typing import Callable, cast, List, Optional from grpc import Channel @@ -44,8 +44,8 @@ def get_events( session_id: str, event_types: List[EventTypes], event_handlers: List[Callable[[str, EventTypes, Event], bool]], - task_filter: Filter | None = None, - result_filter: Filter | None = None, + task_filter: Optional[Filter] = None, + result_filter: Optional[Filter] = None, ) -> None: """Get events that represents updates of result and tasks data. diff --git a/packages/python/src/armonik/client/partitions.py b/packages/python/src/armonik/client/partitions.py index 222a92c51..a80d65eb5 100644 --- a/packages/python/src/armonik/client/partitions.py +++ b/packages/python/src/armonik/client/partitions.py @@ -1,4 +1,4 @@ -from typing import List, Tuple, cast +from typing import List, Tuple, cast, Optional from grpc import Channel @@ -49,7 +49,7 @@ def __init__(self, grpc_channel: Channel): def list_partitions( self, - partition_filter: Filter | None = None, + partition_filter: Optional[Filter] = None, page: int = 0, page_size: int = 1000, sort_field: Filter = PartitionFieldFilter.PRIORITY, diff --git a/packages/python/src/armonik/client/results.py b/packages/python/src/armonik/client/results.py index f462ad385..a2da2526d 100644 --- a/packages/python/src/armonik/client/results.py +++ b/packages/python/src/armonik/client/results.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Dict, List, Tuple, cast +from typing import Dict, List, Tuple, cast, Optional, Union from deprecation import deprecated from grpc import Channel @@ -92,7 +92,7 @@ def get_results_ids(self, session_id: str, names: List[str]) -> Dict[str, str]: def list_results( self, - result_filter: Filter | None = None, + result_filter: Optional[Filter] = None, page: int = 0, page_size: int = 1000, sort_field: Filter = ResultFieldFilter.STATUS, @@ -214,7 +214,7 @@ def create_results( return results def upload_result_data( - self, result_id: str, session_id: str, result_data: bytes | bytearray + self, result_id: str, session_id: str, result_data: Union[bytes, bytearray] ) -> None: """Upload data for an empty result already created. diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 748f60f3e..2fa6b3da9 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -127,7 +127,7 @@ def get_session(self, session_id: str): def list_sessions( self, - session_filter: Filter | None = None, + session_filter: Optional[Filter] = None, page: int = 0, page_size: int = 1000, sort_field: Filter = SessionFieldFilter.STATUS, diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index ef69ccae2..e945d8f38 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -289,7 +289,7 @@ def get_task(self, task_id: str) -> Task: def list_tasks( self, - task_filter: Filter | None = None, + task_filter: Optional[Filter] = None, with_errors: bool = False, page: int = 0, page_size: int = 1000, @@ -367,7 +367,7 @@ def get_result_ids( tasks_result_ids[t.task_id] = list(t.result_ids) return tasks_result_ids - def count_tasks_by_status(self, task_filter: Filter | None = None) -> Dict[TaskStatus, int]: + def count_tasks_by_status(self, task_filter: Optional[Filter] = None) -> Dict[TaskStatus, int]: """Get number of tasks by status. Args: @@ -393,7 +393,7 @@ def submit_tasks( self, session_id: str, tasks: List[TaskDefinition], - default_task_options: Optional[TaskOptions | None] = None, + default_task_options: Optional[TaskOptions] = None, chunk_size: Optional[int] = 100, ) -> List[Task]: """Submit tasks to ArmoniK. diff --git a/packages/python/src/armonik/common/helpers.py b/packages/python/src/armonik/common/helpers.py index 81cb6f943..c7abc9d80 100644 --- a/packages/python/src/armonik/common/helpers.py +++ b/packages/python/src/armonik/common/helpers.py @@ -52,7 +52,7 @@ def get_task_filter( return task_filter -def datetime_to_timestamp(time_stamp: datetime | None) -> timestamp.Timestamp: +def datetime_to_timestamp(time_stamp: Optional[datetime]) -> timestamp.Timestamp: """Helper function to convert a Python Datetime to a gRPC Timestamp Args: @@ -68,7 +68,7 @@ def datetime_to_timestamp(time_stamp: datetime | None) -> timestamp.Timestamp: return t -def timestamp_to_datetime(time_stamp: timestamp.Timestamp) -> datetime | None: +def timestamp_to_datetime(time_stamp: timestamp.Timestamp) -> Optional[datetime]: """Helper function to convert a gRPC Timestamp to a Python Datetime Note that datetime has microseconds accuracy instead of nanosecond accuracy for gRPC Timestamp Therefore, the conversion may not be lossless. diff --git a/packages/python/src/armonik/worker/taskhandler.py b/packages/python/src/armonik/worker/taskhandler.py index fe8fa6ec5..508150670 100644 --- a/packages/python/src/armonik/worker/taskhandler.py +++ b/packages/python/src/armonik/worker/taskhandler.py @@ -1,7 +1,7 @@ from __future__ import annotations import os from deprecation import deprecated -from typing import Optional, Dict, List, Tuple +from typing import Optional, Dict, List, Tuple, Union from ..common import TaskOptions, TaskDefinition, Task, Result from ..protogen.common.agent_common_pb2 import ( @@ -144,7 +144,7 @@ def submit_tasks( self._client.SubmitTasks(request) - def send_results(self, results_data: Dict[str, bytes | bytearray]) -> None: + def send_results(self, results_data: Dict[str, Union[bytes, bytearray]]) -> None: """Send results. Args: From 880ae46119ac365f717d3a7732458352267257d3 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Mon, 15 Apr 2024 14:08:13 +0200 Subject: [PATCH 206/344] fix: typing errors --- packages/python/src/armonik/client/events.py | 14 +++++--------- packages/python/src/armonik/common/events.py | 3 +-- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index ac2442090..73407f953 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -1,4 +1,4 @@ -from typing import Callable, cast, List, Optional +from typing import Callable, cast, Iterable, List, Optional from grpc import Channel @@ -16,7 +16,7 @@ ) from .results import ResultFieldFilter from ..protogen.client.events_service_pb2_grpc import EventsStub -from ..protogen.common.events_common_pb2 import EventSubscriptionRequest +from ..protogen.common.events_common_pb2 import EventsEnum, EventSubscriptionRequest from ..protogen.common.results_filters_pb2 import Filters as rawResultFilters from ..protogen.common.tasks_filters_pb2 import Filters as rawTaskFilters @@ -42,7 +42,7 @@ def __init__(self, grpc_channel: Channel): def get_events( self, session_id: str, - event_types: List[EventTypes], + event_types: Iterable[EventsEnum], # TODO: make EventTypes an enum when Python 3.8 support will be not supported event_handlers: List[Callable[[str, EventTypes, Event], bool]], task_filter: Optional[Filter] = None, result_filter: Optional[Filter] = None, @@ -62,13 +62,9 @@ def get_events( """ request = EventSubscriptionRequest(session_id=session_id, returned_events=event_types) if task_filter: - request.tasks_filters = ( - cast(rawTaskFilters, task_filter.to_disjunction().to_message()), - ) + request.tasks_filters = cast(rawTaskFilters, task_filter.to_disjunction().to_message()) if result_filter: - request.results_filters = ( - cast(rawResultFilters, result_filter.to_disjunction().to_message()), - ) + request.results_filters = cast(rawResultFilters, result_filter.to_disjunction().to_message()) streaming_call = self._client.GetEvents(request) for message in streaming_call: diff --git a/packages/python/src/armonik/common/events.py b/packages/python/src/armonik/common/events.py index f5f66c6a4..b8d0d07b3 100644 --- a/packages/python/src/armonik/common/events.py +++ b/packages/python/src/armonik/common/events.py @@ -1,4 +1,3 @@ -from abc import ABC from typing import List from dataclasses import dataclass @@ -6,7 +5,7 @@ from .enumwrapper import TaskStatus, ResultStatus -class Event(ABC): +class Event: @classmethod def from_raw_event(cls, raw_event): values = {} From 2f1010faf3f6e99f6cd06dcaddaf21d24b7665f6 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Fri, 12 Apr 2024 17:03:05 +0200 Subject: [PATCH 207/344] Expose cancellation token in TaskHandler --- .../Worker/WorkerStreamWrapper.cs | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs index 0643b6462..4bd04a85f 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs @@ -22,6 +22,7 @@ // limitations under the License. using System; +using System.Threading; using System.Threading.Tasks; using ArmoniK.Api.Common.Channel.Utils; @@ -91,7 +92,8 @@ public sealed override async Task Process(ProcessRequest reques ("taskId", taskHandler.TaskId), ("sessionId", taskHandler.SessionId)); logger_.LogDebug("Execute Process"); - output = await Process(taskHandler) + output = await ProcessAsync(taskHandler, + context.CancellationToken) .ConfigureAwait(false); } return new ProcessReply @@ -112,6 +114,22 @@ public virtual Task Process(ITaskHandler taskHandler) => throw new RpcException(new Status(StatusCode.Unimplemented, "")); + /// + /// User defined computations + /// Calls if not overriden. + /// + /// Handler to access input data and task capabilities + /// Token used to cancel the execution of the method + /// + /// The output of the computational task + /// + public virtual Task ProcessAsync(ITaskHandler taskHandler, + CancellationToken cancellationToken) + { + _ = cancellationToken; + return Process(taskHandler); + } + /// public override Task HealthCheck(Empty request, ServerCallContext context) From 33a44de50be099d217fceecb04af67c1c039e29e Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Fri, 12 Apr 2024 18:22:32 +0200 Subject: [PATCH 208/344] Abort if task has not stopped --- .../Options/ComputePlane.cs | 7 ++ .../ArmoniK.Api.Tests/WorkerServerTest.cs | 2 + .../Worker/WorkerStreamWrapper.cs | 83 +++++++++++++++---- 3 files changed, 77 insertions(+), 15 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs b/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs index 6b8f52698..ea3516dca 100644 --- a/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs +++ b/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs @@ -21,6 +21,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System; + using JetBrains.Annotations; namespace ArmoniK.Api.Common.Options; @@ -50,4 +52,9 @@ public class ComputePlane /// Number of messages retrieved from the queue by the Agent /// public int MessageBatchSize { get; set; } = 1; + + /// + /// Time to wait upon cancellation before aborting the worker + /// + public TimeSpan AbortAfter { get; set; } = TimeSpan.FromSeconds(1); } diff --git a/packages/csharp/ArmoniK.Api.Tests/WorkerServerTest.cs b/packages/csharp/ArmoniK.Api.Tests/WorkerServerTest.cs index 0b0128522..3f84156b3 100644 --- a/packages/csharp/ArmoniK.Api.Tests/WorkerServerTest.cs +++ b/packages/csharp/ArmoniK.Api.Tests/WorkerServerTest.cs @@ -128,8 +128,10 @@ public Task BuildServerAddService() public class TestService : WorkerStreamWrapper { public TestService([NotNull] ILoggerFactory loggerFactory, + [NotNull] ComputePlane computePlane, [NotNull] GrpcChannelProvider provider) : base(loggerFactory, + computePlane, provider) { } diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs index 4bd04a85f..f3d9f37e3 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs @@ -26,10 +26,12 @@ using System.Threading.Tasks; using ArmoniK.Api.Common.Channel.Utils; +using ArmoniK.Api.Common.Options; using ArmoniK.Api.Common.Utils; using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Agent; using ArmoniK.Api.gRPC.V1.Worker; +using ArmoniK.Utils; using Grpc.Core; @@ -45,8 +47,10 @@ namespace ArmoniK.Api.Worker.Worker; [PublicAPI] public class WorkerStreamWrapper : gRPC.V1.Worker.Worker.WorkerBase, IAsyncDisposable { + private const int AbortReturnCode = 1; private readonly ChannelBase channel_; private readonly Agent.AgentClient client_; + private readonly ComputePlane computePlaneOptions_; private readonly ILoggerFactory loggerFactory_; /// @@ -59,18 +63,35 @@ public class WorkerStreamWrapper : gRPC.V1.Worker.Worker.WorkerBase, IAsyncDispo /// Instantiate a simpler interface to use for tasks implementations /// /// LoggerFactory to create loggers + /// Options for the ComputePlane /// gRPC channel provider to create channels with the Agent public WorkerStreamWrapper(ILoggerFactory loggerFactory, + ComputePlane computePlaneOptions, GrpcChannelProvider provider) { - logger_ = loggerFactory.CreateLogger(); - loggerFactory_ = loggerFactory; + logger_ = loggerFactory.CreateLogger(); + loggerFactory_ = loggerFactory; + computePlaneOptions_ = computePlaneOptions; channel_ = provider.Get(); client_ = new Agent.AgentClient(channel_); } + /// + /// Instantiate a simpler interface to use for tasks implementations + /// + /// LoggerFactory to create loggers + /// gRPC channel provider to create channels with the Agent + [Obsolete("Superseded by WorkerStreamWrapper(ILoggerFactory, Options::ComputePlane, GrpcChannelProvider)")] + public WorkerStreamWrapper(ILoggerFactory loggerFactory, + GrpcChannelProvider provider) + : this(loggerFactory, + new ComputePlane(), + provider) + { + } + /// public async ValueTask DisposeAsync() => await channel_.ShutdownAsync() @@ -81,21 +102,53 @@ public async ValueTask DisposeAsync() public sealed override async Task Process(ProcessRequest request, ServerCallContext context) { - Output output; + var output = new Output(); + + await using var taskHandler = new TaskHandler(request, + client_, + loggerFactory_, + context.CancellationToken); + + using var _ = logger_.BeginNamedScope("Execute task", + ("taskId", taskHandler.TaskId), + ("sessionId", taskHandler.SessionId)); + logger_.LogDebug("Execute Process"); + var process = ProcessAsync(taskHandler, + context.CancellationToken); + + // Wait for process or cancellationToken + var task = await Task.WhenAny(process, + context.CancellationToken.AsTask()) + .ConfigureAwait(false); + + // Check normal completion + if (ReferenceEquals(task, + process)) { - await using var taskHandler = new TaskHandler(request, - client_, - loggerFactory_, - context.CancellationToken); - - using var _ = logger_.BeginNamedScope("Execute task", - ("taskId", taskHandler.TaskId), - ("sessionId", taskHandler.SessionId)); - logger_.LogDebug("Execute Process"); - output = await ProcessAsync(taskHandler, - context.CancellationToken) - .ConfigureAwait(false); + output = await process.ConfigureAwait(false); } + else + { + // Request has been cancelled + // Wait for process to be properly cancelled, or small delay + task = await Task.WhenAny(process, + Task.Delay(computePlaneOptions_.AbortAfter)) + .ConfigureAwait(false); + + // Check cancelled completion of process + if (ReferenceEquals(task, + process)) + { + output = await process.ConfigureAwait(false); + } + else + { + // Task did not finish upon cancellation + // Abort the whole worker to ensure the task does not continue running + Environment.Exit(AbortReturnCode); + } + } + return new ProcessReply { Output = output, From ceea81a8b00bfd8de8bf405c8357490ebc2d4595 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 15 Apr 2024 16:14:46 +0200 Subject: [PATCH 209/344] Abort log --- .../csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs index f3d9f37e3..b5b49a4df 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs @@ -129,6 +129,8 @@ public sealed override async Task Process(ProcessRequest reques } else { + logger_.LogInformation("RPC request was aborted"); + // Request has been cancelled // Wait for process to be properly cancelled, or small delay task = await Task.WhenAny(process, @@ -143,6 +145,8 @@ public sealed override async Task Process(ProcessRequest reques } else { + logger_.LogError("Stopping the worker as processing has not stopped"); + // Task did not finish upon cancellation // Abort the whole worker to ensure the task does not continue running Environment.Exit(AbortReturnCode); From cbf0e912411691ae79ae594c836f1bc535ceb3f8 Mon Sep 17 00:00:00 2001 From: "Nicolas GRUEL (ANEO)" Date: Mon, 15 Apr 2024 14:36:58 +0200 Subject: [PATCH 210/344] fix: typing errors --- packages/python/pyproject.toml | 1 + packages/python/src/armonik/client/events.py | 4 ++-- packages/python/src/armonik/worker/seqlogger.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 254c24b6f..437dde4b0 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -45,6 +45,7 @@ tests = [ dev = [ 'mypy', 'ruff', + 'types-protobuf', ] [tool.pytest.ini_options] diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index 73407f953..e0639fda4 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -16,7 +16,7 @@ ) from .results import ResultFieldFilter from ..protogen.client.events_service_pb2_grpc import EventsStub -from ..protogen.common.events_common_pb2 import EventsEnum, EventSubscriptionRequest +from ..protogen.common.events_common_pb2 import EventSubscriptionRequest from ..protogen.common.results_filters_pb2 import Filters as rawResultFilters from ..protogen.common.tasks_filters_pb2 import Filters as rawTaskFilters @@ -42,7 +42,7 @@ def __init__(self, grpc_channel: Channel): def get_events( self, session_id: str, - event_types: Iterable[EventsEnum], # TODO: make EventTypes an enum when Python 3.8 support will be not supported + event_types: Iterable[EventTypes], # TODO: make EventTypes an enum when Python 3.8 support will be not supported event_handlers: List[Callable[[str, EventTypes, Event], bool]], task_filter: Optional[Filter] = None, result_filter: Optional[Filter] = None, diff --git a/packages/python/src/armonik/worker/seqlogger.py b/packages/python/src/armonik/worker/seqlogger.py index b08a13d54..11685d4dd 100644 --- a/packages/python/src/armonik/worker/seqlogger.py +++ b/packages/python/src/armonik/worker/seqlogger.py @@ -145,7 +145,7 @@ def log( elif isinstance(exc_info, BaseException): exc_info = (type(exc_info), exc_info, exc_info.__traceback__) payload["@x"] = "\n".join(traceback.format_exception(*exc_info)) - for k, v in kwargs: + for k, v in kwargs.items(): if k.startswith("@"): k = "@" + k payload[k] = str(v) From d425feaa81f9d4aab513de39cab3e356c6630a10 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 15 Apr 2024 17:13:36 +0200 Subject: [PATCH 211/344] Expose cancellation token for agent methods --- .../ArmoniK.Api.Worker/Worker/ITaskHandler.cs | 59 ++++++++++++++++--- .../ArmoniK.Api.Worker/Worker/TaskHandler.cs | 41 ++++++++----- 2 files changed, 77 insertions(+), 23 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/ITaskHandler.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/ITaskHandler.cs index 8d0ff3e89..2f5504218 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/ITaskHandler.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/ITaskHandler.cs @@ -23,6 +23,7 @@ using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; using ArmoniK.Api.gRPC.V1; @@ -78,69 +79,109 @@ public interface ITaskHandler : IAsyncDisposable /// /// Lists the tasks to submit /// The task options. If no value is provided, will use the default session options + /// + /// Token used to cancel the execution of the method. + /// If null, the cancellation token of the task handler is used + /// /// Task CreateTasksAsync(IEnumerable tasks, - TaskOptions? taskOptions = null); + TaskOptions? taskOptions = null, + CancellationToken? cancellationToken = null); /// /// NOT IMPLEMENTED /// This method is used to retrieve data available system-wide. /// /// The data key identifier + /// + /// Token used to cancel the execution of the method. + /// If null, the cancellation token of the task handler is used + /// /// - Task RequestResource(string key); + Task RequestResource(string key, + CancellationToken? cancellationToken = null); /// /// NOT IMPLEMENTED /// This method is used to retrieve data provided when creating the session. /// /// The da ta key identifier + /// + /// Token used to cancel the execution of the method. + /// If null, the cancellation token of the task handler is used + /// /// - Task RequestCommonData(string key); + Task RequestCommonData(string key, + CancellationToken? cancellationToken = null); /// /// NOT IMPLEMENTED /// This method is used to retrieve data directly from the submission client. /// /// + /// + /// Token used to cancel the execution of the method. + /// If null, the cancellation token of the task handler is used + /// /// - Task RequestDirectData(string key); + Task RequestDirectData(string key, + CancellationToken? cancellationToken = null); /// /// Send the results computed by the task /// /// The key identifier of the result. /// The data corresponding to the result + /// + /// Token used to cancel the execution of the method. + /// If null, the cancellation token of the task handler is used + /// /// - Task SendResult(string key, - byte[] data); + Task SendResult(string key, + byte[] data, + CancellationToken? cancellationToken = null); /// /// Create results metadata /// /// The collection of results to be created + /// + /// Token used to cancel the execution of the method. + /// If null, the cancellation token of the task handler is used + /// /// /// The result creation response /// - Task CreateResultsMetaDataAsync(IEnumerable results); + Task CreateResultsMetaDataAsync(IEnumerable results, + CancellationToken? cancellationToken = null); /// /// Submit tasks with existing payloads (results) /// /// The requests to create tasks /// optional tasks for the whole submission + /// + /// Token used to cancel the execution of the method. + /// If null, the cancellation token of the task handler is used + /// /// /// The task submission response /// Task SubmitTasksAsync(IEnumerable taskCreations, - TaskOptions? submissionTaskOptions); + TaskOptions? submissionTaskOptions, + CancellationToken? cancellationToken = null); /// /// Create results from metadata and data in an unique request /// /// The results to create + /// + /// Token used to cancel the execution of the method. + /// If null, the cancellation token of the task handler is used + /// /// /// The task submission response /// - Task CreateResultsAsync(IEnumerable results); + Task CreateResultsAsync(IEnumerable results, + CancellationToken? cancellationToken = null); } diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs index 5973eb9f6..1b6b4b0bd 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/TaskHandler.cs @@ -192,7 +192,8 @@ public TaskHandler(ProcessRequest processRequest, /// public async Task CreateTasksAsync(IEnumerable tasks, - TaskOptions? taskOptions = null) + TaskOptions? taskOptions = null, + CancellationToken? cancellationToken = null) { using var stream = client_.CreateTask(); @@ -200,7 +201,8 @@ public async Task CreateTasksAsync(IEnumerable tas Token, Configuration!.DataChunkMaxSize)) { - await stream.RequestStream.WriteAsync(createLargeTaskRequest) + await stream.RequestStream.WriteAsync(createLargeTaskRequest, + cancellationToken ?? cancellationToken_) .ConfigureAwait(false); } @@ -211,19 +213,23 @@ await stream.RequestStream.CompleteAsync() } /// - public Task RequestResource(string key) + public Task RequestResource(string key, + CancellationToken? cancellationToken = null) => throw new NotImplementedException(); /// - public Task RequestCommonData(string key) + public Task RequestCommonData(string key, + CancellationToken? cancellationToken = null) => throw new NotImplementedException(); /// - public Task RequestDirectData(string key) + public Task RequestDirectData(string key, + CancellationToken? cancellationToken = null) => throw new NotImplementedException(); /// - public async Task CreateResultsMetaDataAsync(IEnumerable results) + public async Task CreateResultsMetaDataAsync(IEnumerable results, + CancellationToken? cancellationToken = null) => await client_.CreateResultsMetaDataAsync(new CreateResultsMetaDataRequest { CommunicationToken = Token, @@ -232,13 +238,15 @@ public async Task CreateResultsMetaDataAsync(IEnu results, }, SessionId = SessionId, - }) + }, + cancellationToken: cancellationToken ?? cancellationToken_) .ConfigureAwait(false); /// - public async Task SendResult(string key, - byte[] data) + public async Task SendResult(string key, + byte[] data, + CancellationToken? cancellationToken = null) { await using (var fs = new FileStream(Path.Combine(folder_, key), @@ -259,7 +267,8 @@ await client_.NotifyResultDataAsync(new NotifyResultDataRequest ResultId = key, }, }, - }) + }, + cancellationToken: cancellationToken ?? cancellationToken_) .ConfigureAwait(false); } @@ -269,7 +278,8 @@ public ValueTask DisposeAsync() /// public async Task SubmitTasksAsync(IEnumerable taskCreations, - TaskOptions? submissionTaskOptions) + TaskOptions? submissionTaskOptions, + CancellationToken? cancellationToken = null) => await client_.SubmitTasksAsync(new SubmitTasksRequest { CommunicationToken = Token, @@ -279,11 +289,13 @@ public async Task SubmitTasksAsync(IEnumerable - public async Task CreateResultsAsync(IEnumerable results) + public async Task CreateResultsAsync(IEnumerable results, + CancellationToken? cancellationToken = null) => await client_.CreateResultsAsync(new CreateResultsRequest { CommunicationToken = Token, @@ -292,6 +304,7 @@ public async Task CreateResultsAsync(IEnumerable Date: Thu, 18 Apr 2024 00:19:52 +0000 Subject: [PATCH 212/344] chore(deps): update npm packages --- package.json | 14 +- pnpm-lock.yaml | 4621 +++++++++++++++++++++++++++++------------------- 2 files changed, 2798 insertions(+), 1837 deletions(-) diff --git a/package.json b/package.json index 04593a733..80f502fc1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "armonik.api", - "packageManager": "pnpm@8.6.12", + "packageManager": "pnpm@9.0.2", "scripts": { "ci:publish": "zx scripts/publish.mjs", "ci:publish-edge": "zx scripts/publish-edge.mjs", @@ -10,19 +10,19 @@ "lint:fix": "eslint --fix ." }, "devDependencies": { - "@antfu/eslint-config": "^0.41.0", - "@typescript-eslint/eslint-plugin": "^6.4.1", + "@antfu/eslint-config": "^2.15.0", + "@typescript-eslint/eslint-plugin": "^7.7.0", "consola": "^3.2.3", - "eslint": "^8.47.0", - "eslint-config-standard-with-typescript": "^38.0.0", + "eslint": "^9.0.0", + "eslint-config-standard-with-typescript": "^43.0.1", "eslint-plugin-import": "^2.28.1", - "eslint-plugin-n": "^16.0.2", + "eslint-plugin-n": "^17.2.1", "eslint-plugin-promise": "^6.1.1", "glob": "^10.3.3", "jiti": "^1.19.3", "pathe": "^1.1.1", "tslib": "^2.6.2", "typescript": "^5.2.2", - "zx": "^7.2.3" + "zx": "^8.0.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fbad354b1..639969092 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,196 +1,1947 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -devDependencies: - '@antfu/eslint-config': - specifier: ^0.41.0 - version: 0.41.0(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': - specifier: ^6.4.1 - version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - consola: - specifier: ^3.2.3 - version: 3.2.3 - eslint: - specifier: ^8.47.0 - version: 8.47.0 - eslint-config-standard-with-typescript: - specifier: ^38.0.0 - version: 38.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.0.2)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@5.2.2) - eslint-plugin-import: - specifier: ^2.28.1 - version: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) - eslint-plugin-n: - specifier: ^16.0.2 - version: 16.0.2(eslint@8.47.0) - eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.1.1(eslint@8.47.0) - glob: - specifier: ^10.3.3 - version: 10.3.3 - jiti: - specifier: ^1.19.3 - version: 1.19.3 - pathe: - specifier: ^1.1.1 - version: 1.1.1 - tslib: - specifier: ^2.6.2 - version: 2.6.2 - typescript: - specifier: ^5.2.2 - version: 5.2.2 - zx: - specifier: ^7.2.3 - version: 7.2.3 +importers: + + .: + devDependencies: + '@antfu/eslint-config': + specifier: ^2.15.0 + version: 2.15.0(@vue/compiler-sfc@3.4.23)(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': + specifier: ^7.7.0 + version: 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + consola: + specifier: ^3.2.3 + version: 3.2.3 + eslint: + specifier: ^9.0.0 + version: 9.0.0 + eslint-config-standard-with-typescript: + specifier: ^43.0.1 + version: 43.0.1(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0)(typescript@5.2.2) + eslint-plugin-import: + specifier: ^2.28.1 + version: 2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) + eslint-plugin-n: + specifier: ^17.2.1 + version: 17.2.1(eslint@9.0.0) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.1.1(eslint@9.0.0) + glob: + specifier: ^10.3.3 + version: 10.3.3 + jiti: + specifier: ^1.19.3 + version: 1.19.3 + pathe: + specifier: ^1.1.1 + version: 1.1.1 + tslib: + specifier: ^2.6.2 + version: 2.6.2 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + zx: + specifier: ^8.0.1 + version: 8.0.1 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@antfu/eslint-config@2.15.0': + resolution: {integrity: sha512-qoqw+0N8bqz0vBIigGJamaIf1LdzXcmCDuleygJAF3EtACLieKyIMvpOdc2TU9AnuPbMBFCkN40340UWRChELw==} + hasBin: true + peerDependencies: + '@eslint-react/eslint-plugin': ^1.5.8 + '@unocss/eslint-plugin': '>=0.50.0' + astro-eslint-parser: ^0.16.3 + eslint: '>=8.40.0' + eslint-plugin-astro: ^0.31.4 + eslint-plugin-format: '>=0.1.0' + eslint-plugin-react-hooks: ^4.6.0 + eslint-plugin-react-refresh: ^0.4.4 + eslint-plugin-solid: ^0.13.2 + eslint-plugin-svelte: '>=2.35.1' + prettier-plugin-astro: ^0.13.0 + prettier-plugin-slidev: ^1.0.5 + svelte-eslint-parser: ^0.33.1 + peerDependenciesMeta: + '@eslint-react/eslint-plugin': + optional: true + '@unocss/eslint-plugin': + optional: true + astro-eslint-parser: + optional: true + eslint-plugin-astro: + optional: true + eslint-plugin-format: + optional: true + eslint-plugin-react-hooks: + optional: true + eslint-plugin-react-refresh: + optional: true + eslint-plugin-solid: + optional: true + eslint-plugin-svelte: + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-slidev: + optional: true + svelte-eslint-parser: + optional: true + + '@antfu/install-pkg@0.3.2': + resolution: {integrity: sha512-FFYqME8+UHlPnRlX/vn+8cTD4Wo/nG/lzRxpABs3XANBmdJdNImVz3QvjNAE/W3PSCNbG387FOz8o5WelnWOlg==} + + '@babel/code-frame@7.22.10': + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.22.10': + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.4': + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@clack/core@0.3.4': + resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} + + '@clack/prompts@0.7.0': + resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} + bundledDependencies: + - is-unicode-supported + + '@es-joy/jsdoccomment@0.42.0': + resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} + engines: {node: '>=16'} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint-community/regexpp@4.6.2': + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/eslintrc@3.0.2': + resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.0.0': + resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanwhocodes/config-array@0.12.3': + resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@stylistic/eslint-plugin-js@1.7.2': + resolution: {integrity: sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin-jsx@1.7.2': + resolution: {integrity: sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin-plus@1.7.2': + resolution: {integrity: sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==} + peerDependencies: + eslint: '*' + + '@stylistic/eslint-plugin-ts@1.7.2': + resolution: {integrity: sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin@1.7.2': + resolution: {integrity: sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@types/eslint@8.56.9': + resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/json-schema@7.0.12': + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/jsonfile@6.1.1': + resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} + + '@types/mdast@3.0.12': + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + + '@types/node@20.12.7': + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + + '@types/normalize-package-data@2.4.1': + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + + '@types/semver@7.5.0': + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/unist@2.0.7': + resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} + + '@typescript-eslint/eslint-plugin@7.7.0': + resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.4.1': + resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.7.0': + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@6.4.1': + resolution: {integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@7.7.0': + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.7.0': + resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@6.4.1': + resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@7.7.0': + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@6.4.1': + resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.7.0': + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.7.0': + resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@6.4.1': + resolution: {integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@7.7.0': + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@vue/compiler-core@3.4.23': + resolution: {integrity: sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==} + + '@vue/compiler-dom@3.4.23': + resolution: {integrity: sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==} + + '@vue/compiler-sfc@3.4.23': + resolution: {integrity: sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==} + + '@vue/compiler-ssr@3.4.23': + resolution: {integrity: sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==} + + '@vue/shared@3.4.23': + resolution: {integrity: sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.9.0: + resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + + array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlastindex@1.2.2: + resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001610: + resolution: {integrity: sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + core-js-compat@3.37.0: + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.4.739: + resolution: {integrity: sha512-koRkawXOuN9w/ymhTNxGfB8ta4MRKVW0nzifU17G1UwTWlBg0vv7xnz4nxDnRFSBe9nXMGRgICcAzqXc0PmLeA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-compat-utils@0.5.0: + resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-flat-gitignore@0.1.5: + resolution: {integrity: sha512-hEZLwuZjDBGDERA49c2q7vxc8sCGv8EdBp6PQYzGOMcHIgrfG9YOM6s/4jx24zhD+wnK9AI8mgN5RxSss5nClQ==} + + eslint-config-standard-with-typescript@43.0.1: + resolution: {integrity: sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==} + deprecated: Please use eslint-config-love, instead. + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.4.0 + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' + eslint-plugin-promise: ^6.0.0 + typescript: '*' + + eslint-config-standard@17.1.0: + resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' + eslint-plugin-promise: ^6.0.0 + + eslint-flat-config-utils@0.2.3: + resolution: {integrity: sha512-tfrMNXZfuN4q7sFi1Cr//BN3qdI7c8fLJhbshlp8l9PZIqZ7eVeeyd2Regtu/P9kjOlv18lRlBALzsZaF7ByUg==} + + eslint-import-resolver-node@0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-merge-processors@0.1.0: + resolution: {integrity: sha512-IvRXXtEajLeyssvW4wJcZ2etxkR9mUf4zpNwgI+m/Uac9RfXHskuJefkHUcawVzePnd6xp24enp5jfgdHzjRdQ==} + peerDependencies: + eslint: '*' + + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-antfu@2.1.2: + resolution: {integrity: sha512-s7ZTOM3uq0iqpp6gF0UEotnvup7f2PHBUftCytLZX0+6C9j9KadKZQh6bVVngAyFgsmeD9+gcBopOYLClb2oDg==} + peerDependencies: + eslint: '*' + + eslint-plugin-es-x@7.6.0: + resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-eslint-comments@3.2.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import-x@0.5.0: + resolution: {integrity: sha512-C7R8Z4IzxmsoOPMtSzwuOBW5FH6iRlxHR6iTks+MzVlrk3r3TUxokkWTx3ypdj9nGOEP+CG/5e6ebZzHbxgbbQ==} + engines: {node: '>=16'} + peerDependencies: + eslint: ^8.56.0 || ^9.0.0-0 + + eslint-plugin-import@2.28.1: + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsdoc@48.2.3: + resolution: {integrity: sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-jsonc@2.15.1: + resolution: {integrity: sha512-PVFrqIJa8BbM/e828RSn0SwB/Z5ye+2LDuy2XqG6AymNgPsfApRRcznsbxP7VrjdLEU4Nb+g9n/d6opyp0jp9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + eslint-plugin-markdown@4.0.1: + resolution: {integrity: sha512-5/MnGvYU0i8MbHH5cg8S+Vl3DL+bqRNYshk1xUO86DilNBaxtTkhH+5FD0/yO03AmlI6+lfNFdk2yOw72EPzpA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-n@17.2.1: + resolution: {integrity: sha512-uW1+df2bo06kR7ix6nB614RUlvjRPrYxlaX832O6e1MCJp4V7YozEdvMgCYuvn4ltnjPu1FVYhQ2KRrmTNoJfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + + eslint-plugin-no-only-tests@3.1.0: + resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + engines: {node: '>=5.0.0'} + + eslint-plugin-perfectionist@2.9.0: + resolution: {integrity: sha512-ipFtDrqtF99qVVo+FE1fo6aHyLLp7hg6PNGfzY5KxQjcl0XCbyEFvjtR1NfkHDTN9rdFeEDxg59LLOv3VOAHAw==} + peerDependencies: + astro-eslint-parser: ^0.16.0 + eslint: '>=8.0.0' + svelte: '>=3.0.0' + svelte-eslint-parser: ^0.33.0 + vue-eslint-parser: '>=9.0.0' + peerDependenciesMeta: + astro-eslint-parser: + optional: true + svelte: + optional: true + svelte-eslint-parser: + optional: true + vue-eslint-parser: + optional: true + + eslint-plugin-promise@6.1.1: + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + eslint-plugin-toml@0.11.0: + resolution: {integrity: sha512-sau+YvPU4fWTjB+qtBt3n8WS87aoDCs+BVbSUAemGaIsRNbvR9uEk+Tt892iLHTGvp/DPWYoCX4/8DoyAbB+sQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + eslint-plugin-unicorn@52.0.0: + resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-plugin-unused-imports@3.1.0: + resolution: {integrity: sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': 6 - 7 + eslint: '8' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + + eslint-plugin-vitest@0.5.3: + resolution: {integrity: sha512-D0iu6ppP6FmNSZP4cdhEXqyI+fuW6JwwWdECRrNymd1jiVgUmDgSvtryytonNxHQQWhGNmZM3V/qvpXttH1rRQ==} + engines: {node: ^18.0.0 || >= 20.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': '*' + eslint: ^8.57.0 || ^9.0.0 + vitest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + vitest: + optional: true + + eslint-plugin-vue@9.25.0: + resolution: {integrity: sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-yml@1.14.0: + resolution: {integrity: sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + eslint-processor-vue-blocks@0.1.2: + resolution: {integrity: sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==} + peerDependencies: + '@vue/compiler-sfc': ^3.3.0 + eslint: ^8.50.0 || ^9.0.0 + + eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.0.1: + resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.0.0: + resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + + espree@10.0.1: + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + + get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.0: + resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + + get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.0.0: + resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} + engines: {node: '>=18'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@2.3.0: + resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} + engines: {node: '>=14'} + + jiti@1.19.3: + resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdoc-type-pratt-parser@4.0.0: + resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} + engines: {node: '>=12.0.0'} + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonc-eslint-parser@2.4.0: + resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.0.1: + resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + engines: {node: 14 || >=16.14} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.0.3: + resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.0: + resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + + object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + + string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.6.2: + resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} + engines: {node: '>=12.20'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toml-eslint-parser@0.9.3: + resolution: {integrity: sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + ts-api-utils@1.0.2: + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + + typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vue-eslint-parser@9.4.2: + resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - /@antfu/eslint-config-basic@0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-zcwFv+nEV/NroeeVWriNdnIGd9soOLRG8wIiVz4VVJ0BjONrqQR56HLG/gDxH/1GUYBnQCEcVxGUmegce08cnw==} - peerDependencies: - eslint: '>=7.4.0' - dependencies: - eslint: 8.47.0 - eslint-plugin-antfu: 0.41.0(eslint@8.47.0)(typescript@5.2.2) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.47.0) - eslint-plugin-html: 7.1.0 - eslint-plugin-import: /eslint-plugin-i@2.28.0-2(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) - eslint-plugin-jsonc: 2.9.0(eslint@8.47.0) - eslint-plugin-markdown: 3.0.1(eslint@8.47.0) - eslint-plugin-n: 16.0.2(eslint@8.47.0) - eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-promise: 6.1.1(eslint@8.47.0) - eslint-plugin-unicorn: 48.0.1(eslint@8.47.0) - eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0) - eslint-plugin-yml: 1.8.0(eslint@8.47.0) - jsonc-eslint-parser: 2.3.0 - yaml-eslint-parser: 1.2.2 - transitivePeerDependencies: - - '@typescript-eslint/eslint-plugin' - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - typescript - dev: true + which-typed-array@1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} - /@antfu/eslint-config-ts@0.41.0(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-ng3GYpJGZgrxGwBVda/MgUpveH3LbEqdPCFi1+S5e62W4kf8rmEVbhc0I8w7/aKN0uNqir5SInYg8gob2maDAQ==} - peerDependencies: - eslint: '>=7.4.0' - typescript: '>=3.9' - dependencies: - '@antfu/eslint-config-basic': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) - eslint: 8.47.0 - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - dev: true + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true - /@antfu/eslint-config-vue@0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-iJiEGRUgRmT3mQCmGl0hTMwq/ShXRjRPjpgsDcphKJyEF06ZIR/4gxHn+utQRLT2hD39DQN8gk0ZbpV3gWtf/g==} - peerDependencies: - eslint: '>=7.4.0' - dependencies: - '@antfu/eslint-config-basic': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - '@antfu/eslint-config-ts': 0.41.0(eslint@8.47.0)(typescript@5.2.2) - eslint: 8.47.0 - eslint-plugin-vue: 9.17.0(eslint@8.47.0) - local-pkg: 0.4.3 - transitivePeerDependencies: - - '@typescript-eslint/eslint-plugin' - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - - typescript - dev: true + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} - /@antfu/eslint-config@0.41.0(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-510DginDPdzf45O6HOah3cK6NHXxobBc43IdBQCQmUGb+av9LIJjrd1idThFoyFh6m05iZ4YX/mhnhhJFqLiNw==} - peerDependencies: - eslint: '>=7.4.0' - dependencies: - '@antfu/eslint-config-vue': 0.41.0(@typescript-eslint/eslint-plugin@6.4.1)(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) - eslint: 8.47.0 - eslint-plugin-eslint-comments: 3.2.0(eslint@8.47.0) - eslint-plugin-html: 7.1.0 - eslint-plugin-import: /eslint-plugin-i@2.28.0-2(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) - eslint-plugin-jsonc: 2.9.0(eslint@8.47.0) - eslint-plugin-n: 16.0.2(eslint@8.47.0) - eslint-plugin-promise: 6.1.1(eslint@8.47.0) - eslint-plugin-unicorn: 48.0.1(eslint@8.47.0) - eslint-plugin-vue: 9.17.0(eslint@8.47.0) - eslint-plugin-yml: 1.8.0(eslint@8.47.0) - jsonc-eslint-parser: 2.3.0 + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml-eslint-parser@1.2.2: + resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} + engines: {node: ^14.17.0 || >=16.0.0} + + yaml@2.2.2: + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + engines: {node: '>= 14'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zx@8.0.1: + resolution: {integrity: sha512-Y+ITW1GQjADk7qgrbhnukMgoNsJmlyx53cUQ6/6NXU+BMBdCbTc6flTOHUctmzKvPjTmdwaddzJY/dbLie9sQg==} + engines: {node: '>= 16.0.0'} + hasBin: true + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@antfu/eslint-config@2.15.0(@vue/compiler-sfc@3.4.23)(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@antfu/install-pkg': 0.3.2 + '@clack/prompts': 0.7.0 + '@stylistic/eslint-plugin': 1.7.2(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + eslint-config-flat-gitignore: 0.1.5 + eslint-flat-config-utils: 0.2.3 + eslint-merge-processors: 0.1.0(eslint@9.0.0) + eslint-plugin-antfu: 2.1.2(eslint@9.0.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@9.0.0) + eslint-plugin-import-x: 0.5.0(eslint@9.0.0)(typescript@5.2.2) + eslint-plugin-jsdoc: 48.2.3(eslint@9.0.0) + eslint-plugin-jsonc: 2.15.1(eslint@9.0.0) + eslint-plugin-markdown: 4.0.1(eslint@9.0.0) + eslint-plugin-n: 17.2.1(eslint@9.0.0) + eslint-plugin-no-only-tests: 3.1.0 + eslint-plugin-perfectionist: 2.9.0(eslint@9.0.0)(typescript@5.2.2)(vue-eslint-parser@9.4.2(eslint@9.0.0)) + eslint-plugin-toml: 0.11.0(eslint@9.0.0) + eslint-plugin-unicorn: 52.0.0(eslint@9.0.0) + eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) + eslint-plugin-vitest: 0.5.3(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + eslint-plugin-vue: 9.25.0(eslint@9.0.0) + eslint-plugin-yml: 1.14.0(eslint@9.0.0) + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.0.0) + globals: 15.0.0 + jsonc-eslint-parser: 2.4.0 + local-pkg: 0.5.0 + parse-gitignore: 2.0.0 + picocolors: 1.0.0 + toml-eslint-parser: 0.9.3 + vue-eslint-parser: 9.4.2(eslint@9.0.0) yaml-eslint-parser: 1.2.2 + yargs: 17.7.2 transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest + - '@vue/compiler-sfc' - supports-color + - svelte - typescript - dev: true + - vitest - /@babel/code-frame@7.22.10: - resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} - engines: {node: '>=6.9.0'} + '@antfu/install-pkg@0.3.2': + dependencies: + execa: 8.0.1 + + '@babel/code-frame@7.22.10': dependencies: '@babel/highlight': 7.22.10 chalk: 2.4.2 - dev: true - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/helper-string-parser@7.24.1': {} - /@babel/highlight@7.22.10: - resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/highlight@7.22.10': dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@babel/parser@7.24.4': + dependencies: + '@babel/types': 7.24.0 + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@clack/core@0.3.4': + dependencies: + picocolors: 1.0.0 + sisteransi: 1.0.5 + + '@clack/prompts@0.7.0': dependencies: - eslint: 8.47.0 + '@clack/core': 0.3.4 + picocolors: 1.0.0 + sisteransi: 1.0.5 + + '@es-joy/jsdoccomment@0.42.0': + dependencies: + comment-parser: 1.4.1 + esquery: 1.5.0 + jsdoc-type-pratt-parser: 4.0.0 + + '@eslint-community/eslint-utils@4.4.0(eslint@9.0.0)': + dependencies: + eslint: 9.0.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.6.2: - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint-community/regexpp@4.6.2': {} + + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -203,253 +1954,245 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.47.0: - resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@eslint/eslintrc@3.0.2': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 10.0.1 + globals: 14.0.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} - engines: {node: '>=10.10.0'} + '@eslint/js@9.0.0': {} + + '@humanwhocodes/config-array@0.12.3': dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true + '@humanwhocodes/object-schema@2.0.3': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - dev: true - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true + '@pkgjs/parseargs@0.11.0': optional: true - /@types/fs-extra@11.0.1: - resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} + '@stylistic/eslint-plugin-js@1.7.2(eslint@9.0.0)': dependencies: - '@types/jsonfile': 6.1.1 - '@types/node': 18.16.7 - dev: true + '@types/eslint': 8.56.9 + acorn: 8.11.3 + escape-string-regexp: 4.0.0 + eslint: 9.0.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true + '@stylistic/eslint-plugin-jsx@1.7.2(eslint@9.0.0)': + dependencies: + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@types/eslint': 8.56.9 + eslint: 9.0.0 + estraverse: 5.3.0 + picomatch: 4.0.2 - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + '@stylistic/eslint-plugin-plus@1.7.2(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@types/eslint': 8.56.9 + '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript - /@types/jsonfile@6.1.1: - resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} + '@stylistic/eslint-plugin-ts@1.7.2(eslint@9.0.0)(typescript@5.2.2)': dependencies: - '@types/node': 18.16.7 - dev: true + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@types/eslint': 8.56.9 + '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript - /@types/mdast@3.0.12: - resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + '@stylistic/eslint-plugin@1.7.2(eslint@9.0.0)(typescript@5.2.2)': dependencies: - '@types/unist': 2.0.7 - dev: true + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@stylistic/eslint-plugin-jsx': 1.7.2(eslint@9.0.0) + '@stylistic/eslint-plugin-plus': 1.7.2(eslint@9.0.0)(typescript@5.2.2) + '@stylistic/eslint-plugin-ts': 1.7.2(eslint@9.0.0)(typescript@5.2.2) + '@types/eslint': 8.56.9 + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true + '@types/eslint@8.56.9': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.12 - /@types/node@18.16.7: - resolution: {integrity: sha512-MFg7ua/bRtnA1hYE3pVyWxGd/r7aMqjNOdHvlSsXV3n8iaeGKkOaPzpJh6/ovf4bEXWcojkeMJpTsq3mzXW4IQ==} - dev: true + '@types/estree@1.0.5': {} - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.1 + '@types/node': 20.12.7 + optional: true - /@types/ps-tree@1.1.2: - resolution: {integrity: sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw==} - dev: true + '@types/json-schema@7.0.12': {} - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/unist@2.0.7: - resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} - dev: true + '@types/json5@0.0.29': {} - /@types/which@3.0.0: - resolution: {integrity: sha512-ASCxdbsrwNfSMXALlC3Decif9rwDMu+80KGp5zI2RLRotfMsTv7fHL8W8VDp24wymzDyIFudhUeSCugrgRFfHQ==} - dev: true + '@types/jsonfile@6.1.1': + dependencies: + '@types/node': 20.12.7 + optional: true - /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@types/mdast@3.0.12': dependencies: - '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.4.1 - '@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.4.1 + '@types/unist': 2.0.7 + + '@types/node@20.12.7': + dependencies: + undici-types: 5.26.5 + optional: true + + '@types/normalize-package-data@2.4.1': {} + + '@types/semver@7.5.0': {} + + '@types/semver@7.5.8': {} + + '@types/unist@2.0.7': {} + + '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/type-utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 - eslint: 8.47.0 + eslint: 9.0.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.2.2) + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@6.4.1(eslint@9.0.0)(typescript@5.2.2)': dependencies: '@typescript-eslint/scope-manager': 6.4.1 '@typescript-eslint/types': 6.4.1 '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.4.1 debug: 4.3.4 - eslint: 8.47.0 + eslint: 9.0.0 + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 9.0.0 + optionalDependencies: + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 - /@typescript-eslint/scope-manager@6.4.1: - resolution: {integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@6.4.1': dependencies: '@typescript-eslint/types': 6.4.1 '@typescript-eslint/visitor-keys': 6.4.1 - dev: true - /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/scope-manager@7.7.0': dependencies: - '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) - '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2) + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + + '@typescript-eslint/type-utils@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.47.0 - ts-api-utils: 1.0.2(typescript@5.2.2) + eslint: 9.0.0 + ts-api-utils: 1.3.0(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@typescript-eslint/types@6.21.0': {} - /@typescript-eslint/types@6.4.1: - resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@typescript-eslint/types@6.4.1': {} - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/types@7.7.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.2.2)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 + minimatch: 9.0.3 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) + ts-api-utils: 1.0.2(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/typescript-estree@6.4.1(typescript@5.2.2): - resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.4.1(typescript@5.2.2)': dependencies: '@typescript-eslint/types': 6.4.1 '@typescript-eslint/visitor-keys': 6.4.1 @@ -458,441 +2201,318 @@ packages: is-glob: 4.0.3 semver: 7.5.4 ts-api-utils: 1.0.2(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/typescript-estree@7.7.0(typescript@5.2.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.2.2) + optionalDependencies: + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.47.0 - eslint-scope: 5.1.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) + eslint: 9.0.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@7.7.0(eslint@9.0.0)(typescript@5.2.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.4.1 - '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) - eslint: 8.47.0 - semver: 7.5.4 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) + eslint: 9.0.0 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@6.4.1': + dependencies: + '@typescript-eslint/types': 6.4.1 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.7.0': + dependencies: + '@typescript-eslint/types': 7.7.0 + eslint-visitor-keys: 3.4.3 + + '@vue/compiler-core@3.4.23': + dependencies: + '@babel/parser': 7.24.4 + '@vue/shared': 3.4.23 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.23': + dependencies: + '@vue/compiler-core': 3.4.23 + '@vue/shared': 3.4.23 + + '@vue/compiler-sfc@3.4.23': dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: true + '@babel/parser': 7.24.4 + '@vue/compiler-core': 3.4.23 + '@vue/compiler-dom': 3.4.23 + '@vue/compiler-ssr': 3.4.23 + '@vue/shared': 3.4.23 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 - /@typescript-eslint/visitor-keys@6.4.1: - resolution: {integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@vue/compiler-ssr@3.4.23': dependencies: - '@typescript-eslint/types': 6.4.1 - eslint-visitor-keys: 3.4.3 - dev: true + '@vue/compiler-dom': 3.4.23 + '@vue/shared': 3.4.23 - /acorn-jsx@5.3.2(acorn@8.9.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@vue/shared@3.4.23': {} + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn-jsx@5.3.2(acorn@8.9.0): dependencies: acorn: 8.9.0 - dev: true - /acorn@8.9.0: - resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.11.3: {} - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + acorn@8.9.0: {} + + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + are-docs-informative@0.0.2: {} - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 - dev: true - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} + array-includes@3.1.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 get-intrinsic: 1.2.0 is-string: 1.0.7 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.findlastindex@1.2.2: - resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.2: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.0 - dev: true - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.1: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 - dev: true - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.1: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 - dev: true - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true + available-typed-arrays@1.0.5: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true + boolbase@1.0.0: {} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - dev: true - - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + browserslist@4.23.0: dependencies: - semver: 7.5.4 - dev: true + caniuse-lite: 1.0.30001610 + electron-to-chromium: 1.4.739 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + builtin-modules@3.3.0: {} + + call-bind@1.0.2: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 - dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + caniuse-lite@1.0.30001610: {} + + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: true + character-entities-legacy@1.1.4: {} - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: true + character-entities@1.2.4: {} - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: true + character-reference-invalid@1.1.4: {} - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} - dev: true + ci-info@4.0.0: {} - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + color-name@1.1.4: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + comment-parser@1.4.1: {} - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} - dev: true + concat-map@0.0.1: {} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + consola@3.2.3: {} + + core-js-compat@3.37.0: + dependencies: + browserslist: 4.23.0 + + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: true + cssesc@3.0.0: {} - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - dev: true - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} + define-properties@1.2.0: dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - dev: true - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: true - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: true + eastasianwidth@0.2.0: {} - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true + electron-to-chromium@1.4.739: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@9.2.2: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + enhanced-resolve@5.16.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} - engines: {node: '>= 0.4'} + es-abstract@1.21.2: dependencies: array-buffer-byte-length: 1.0.0 available-typed-arrays: 1.0.5 @@ -928,199 +2548,137 @@ packages: typed-array-length: 1.0.4 unbox-primitive: 1.0.2 which-typed-array: 1.1.9 - dev: true - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.1: dependencies: get-intrinsic: 1.2.0 has: 1.0.3 has-tostringtag: 1.0.0 - dev: true - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + es-shim-unscopables@1.0.0: dependencies: has: 1.0.3 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + escalade@3.1.2: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@1.0.5: {} - /eslint-config-standard-with-typescript@38.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.0.2)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-G7JR6I8tmWEQjzbESo/9gVq4AQctbVO4J8PINQj8l2lgbJF/W9KCJ4uDLiKmLMjWszW/F5SsucoA/5VpHvfwOQ==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.1.0 - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: '^15.0.0 || ^16.0.0 ' - eslint-plugin-promise: ^6.0.0 - typescript: '*' + escape-string-regexp@4.0.0: {} + + eslint-compat-utils@0.5.0(eslint@9.0.0): + dependencies: + eslint: 9.0.0 + semver: 7.5.4 + + eslint-config-flat-gitignore@0.1.5: + dependencies: + find-up: 7.0.0 + parse-gitignore: 2.0.0 + + eslint-config-standard-with-typescript@43.0.1(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0)(typescript@5.2.2): dependencies: - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) - eslint: 8.47.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.0.2)(eslint-plugin-promise@6.1.1)(eslint@8.47.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) - eslint-plugin-n: 16.0.2(eslint@8.47.0) - eslint-plugin-promise: 6.1.1(eslint@8.47.0) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.4.1(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) + eslint-plugin-n: 17.2.1(eslint@9.0.0) + eslint-plugin-promise: 6.1.1(eslint@9.0.0) typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /eslint-config-standard@17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.0.2)(eslint-plugin-promise@6.1.1)(eslint@8.47.0): - resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: '^15.0.0 || ^16.0.0 ' - eslint-plugin-promise: ^6.0.0 + eslint-config-standard@17.1.0(eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0): dependencies: - eslint: 8.47.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) - eslint-plugin-n: 16.0.2(eslint@8.47.0) - eslint-plugin-promise: 6.1.1(eslint@8.47.0) - dev: true + eslint: 9.0.0 + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) + eslint-plugin-n: 17.2.1(eslint@9.0.0) + eslint-plugin-promise: 6.1.1(eslint@9.0.0) - /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + eslint-flat-config-utils@0.2.3: + dependencies: + '@types/eslint': 8.56.9 + pathe: 1.1.2 + + eslint-import-resolver-node@0.3.7: dependencies: debug: 3.2.7 is-core-module: 2.13.0 resolve: 1.22.4 transitivePeerDependencies: - supports-color - dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-import-resolver-node@0.3.9: dependencies: - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.47.0 - eslint-import-resolver-node: 0.3.7 + is-core-module: 2.13.0 + resolve: 1.22.4 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-antfu@0.41.0(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-JeEeDZgz7oqYPYWYNQHdXrKaW2nhJz/70jeMZUkaNjVp72cpsJPH3idiEhIhGu3wjFdsOMCoEkboT/DQXlCaqA==} + eslint-merge-processors@0.1.0(eslint@9.0.0): + dependencies: + eslint: 9.0.0 + + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.7)(eslint@9.0.0): dependencies: - '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.2.2) + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.7 transitivePeerDependencies: - - eslint - supports-color - - typescript - dev: true - /eslint-plugin-es-x@7.2.0(eslint@8.47.0): - resolution: {integrity: sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' + eslint-plugin-antfu@2.1.2(eslint@9.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + eslint: 9.0.0 + + eslint-plugin-es-x@7.6.0(eslint@9.0.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@eslint-community/regexpp': 4.6.2 - eslint: 8.47.0 - dev: true + eslint: 9.0.0 + eslint-compat-utils: 0.5.0(eslint@9.0.0) - /eslint-plugin-eslint-comments@3.2.0(eslint@8.47.0): - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' + eslint-plugin-eslint-comments@3.2.0(eslint@9.0.0): dependencies: escape-string-regexp: 1.0.5 - eslint: 8.47.0 + eslint: 9.0.0 ignore: 5.2.4 - dev: true - - /eslint-plugin-html@7.1.0: - resolution: {integrity: sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==} - dependencies: - htmlparser2: 8.0.2 - dev: true - /eslint-plugin-i@2.28.0-2(@typescript-eslint/parser@6.4.1)(eslint@8.47.0): - resolution: {integrity: sha512-z48kG4qmE4TmiLcxbmvxMT5ycwvPkXaWW0XpU1L768uZaTbiDbxsHMEdV24JHlOR1xDsPpKW39BfP/pRdYIwFA==} - engines: {node: '>=12'} - peerDependencies: - eslint: ^7.2.0 || ^8 + eslint-plugin-import-x@0.5.0(eslint@9.0.0)(typescript@5.2.2): dependencies: - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.47.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0) - get-tsconfig: 4.7.0 + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + debug: 4.3.4 + doctrine: 3.0.0 + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.7.3 is-glob: 4.0.3 - minimatch: 3.1.2 - resolve: 1.22.4 - semver: 7.5.4 + minimatch: 9.0.3 + semver: 7.6.0 transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - dev: true + - typescript - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0): - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0): dependencies: - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.47.0 + eslint: 9.0.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.7)(eslint@9.0.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -1130,220 +2688,199 @@ packages: object.values: 1.1.6 semver: 6.3.1 tsconfig-paths: 3.14.2 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true + eslint-plugin-jsdoc@48.2.3(eslint@9.0.0): dependencies: - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.2.2) - eslint: 8.47.0 + '@es-joy/jsdoccomment': 0.42.0 + are-docs-informative: 0.0.2 + comment-parser: 1.4.1 + debug: 4.3.4 + escape-string-regexp: 4.0.0 + eslint: 9.0.0 + esquery: 1.5.0 + is-builtin-module: 3.2.1 + semver: 7.6.0 + spdx-expression-parse: 4.0.0 transitivePeerDependencies: - supports-color - - typescript - dev: true - /eslint-plugin-jsonc@2.9.0(eslint@8.47.0): - resolution: {integrity: sha512-RK+LeONVukbLwT2+t7/OY54NJRccTXh/QbnXzPuTLpFMVZhPuq1C9E07+qWenGx7rrQl0kAalAWl7EmB+RjpGA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' + eslint-plugin-jsonc@2.15.1(eslint@9.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - eslint: 8.47.0 - jsonc-eslint-parser: 2.3.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + eslint: 9.0.0 + eslint-compat-utils: 0.5.0(eslint@9.0.0) + espree: 9.6.1 + graphemer: 1.4.0 + jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 - dev: true + synckit: 0.6.2 - /eslint-plugin-markdown@3.0.1(eslint@8.47.0): - resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-markdown@4.0.1(eslint@9.0.0): dependencies: - eslint: 8.47.0 + eslint: 9.0.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-n@16.0.2(eslint@8.47.0): - resolution: {integrity: sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==} - engines: {node: '>=16.0.0'} - peerDependencies: - eslint: '>=7.0.0' + eslint-plugin-n@17.2.1(eslint@9.0.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + enhanced-resolve: 5.16.0 + eslint: 9.0.0 + eslint-plugin-es-x: 7.6.0(eslint@9.0.0) + get-tsconfig: 4.7.0 + globals: 14.0.0 + ignore: 5.2.4 + minimatch: 9.0.3 + semver: 7.5.4 + + eslint-plugin-no-only-tests@3.1.0: {} + + eslint-plugin-perfectionist@2.9.0(eslint@9.0.0)(typescript@5.2.2)(vue-eslint-parser@9.4.2(eslint@9.0.0)): + dependencies: + '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + minimatch: 9.0.3 + natural-compare-lite: 1.4.0 + optionalDependencies: + vue-eslint-parser: 9.4.2(eslint@9.0.0) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-promise@6.1.1(eslint@9.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - builtins: 5.0.1 - eslint: 8.47.0 - eslint-plugin-es-x: 7.2.0(eslint@8.47.0) - ignore: 5.2.4 - is-core-module: 2.13.0 - minimatch: 3.1.2 - resolve: 1.22.4 - semver: 7.5.4 - dev: true - - /eslint-plugin-no-only-tests@3.1.0: - resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} - engines: {node: '>=5.0.0'} - dev: true + eslint: 9.0.0 - /eslint-plugin-promise@6.1.1(eslint@8.47.0): - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint-plugin-toml@0.11.0(eslint@9.0.0): dependencies: - eslint: 8.47.0 - dev: true + debug: 4.3.4 + eslint: 9.0.0 + eslint-compat-utils: 0.5.0(eslint@9.0.0) + lodash: 4.17.21 + toml-eslint-parser: 0.9.3 + transitivePeerDependencies: + - supports-color - /eslint-plugin-unicorn@48.0.1(eslint@8.47.0): - resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.44.0' + eslint-plugin-unicorn@52.0.0(eslint@9.0.0): dependencies: - '@babel/helper-validator-identifier': 7.22.5 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - ci-info: 3.8.0 + '@babel/helper-validator-identifier': 7.22.20 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@eslint/eslintrc': 2.1.4 + ci-info: 4.0.0 clean-regexp: 1.0.0 - eslint: 8.47.0 + core-js-compat: 3.37.0 + eslint: 9.0.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 jsesc: 3.0.2 - lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 semver: 7.5.4 strip-indent: 3.0.0 - dev: true + transitivePeerDependencies: + - supports-color - /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0): - resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.0.0 - eslint: ^8.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true + eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0): dependencies: - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.2.2) - eslint: 8.47.0 + eslint: 9.0.0 eslint-rule-composer: 0.3.0 - dev: true + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - /eslint-plugin-vue@9.17.0(eslint@8.47.0): - resolution: {integrity: sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-vitest@0.5.3(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2): + dependencies: + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-vue@9.25.0(eslint@9.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - eslint: 8.47.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + eslint: 9.0.0 + globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.0.13 - semver: 7.5.4 - vue-eslint-parser: 9.3.1(eslint@8.47.0) + postcss-selector-parser: 6.0.16 + semver: 7.6.0 + vue-eslint-parser: 9.4.2(eslint@9.0.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-yml@1.8.0(eslint@8.47.0): - resolution: {integrity: sha512-fgBiJvXD0P2IN7SARDJ2J7mx8t0bLdG6Zcig4ufOqW5hOvSiFxeUyc2g5I1uIm8AExbo26NNYCcTGZT0MXTsyg==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' + eslint-plugin-yml@1.14.0(eslint@9.0.0): dependencies: debug: 4.3.4 - eslint: 8.47.0 + eslint: 9.0.0 + eslint-compat-utils: 0.5.0(eslint@9.0.0) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - supports-color - dev: true - /eslint-rule-composer@0.3.0: - resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} - engines: {node: '>=4.0.0'} - dev: true + eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.0.0): + dependencies: + '@vue/compiler-sfc': 3.4.23 + eslint: 9.0.0 - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-rule-composer@0.3.0: {} + + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true + estraverse: 5.3.0 - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.0.1: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.47.0: - resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint-visitor-keys@4.0.0: {} + + eslint@9.0.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.47.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint/eslintrc': 3.0.2 + '@eslint/js': 9.0.0 + '@humanwhocodes/config-array': 0.12.3 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.0.1 + eslint-visitor-keys: 4.0.0 + espree: 10.0.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -1354,705 +2891,415 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.0.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 4.0.0 + + espree@9.6.1: dependencies: acorn: 8.9.0 acorn-jsx: 5.3.2(acorn@8.9.0) eslint-visitor-keys: 3.4.3 - dev: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estree-walker@2.0.2: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /event-stream@3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + execa@8.0.1: dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - dev: true + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} + fast-glob@3.2.12: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.15.0: dependencies: reusify: 1.0.4 - dev: true - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + file-entry-cache@8.0.0: dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: true + flat-cache: 4.0.1 - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + find-up@7.0.0: dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: true + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + flatted@3.3.1: {} + + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: true - - /from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - dev: true - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true + function-bind@1.1.1: {} - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.5: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /fx@28.0.0: - resolution: {integrity: sha512-vKQDA9g868cZiW8ulgs2uN1yx1i7/nsS33jTMOxekk0Z03BJLffVcdW6AVD32fWb3E6RtmWWuBXBZOk8cLXFNQ==} - hasBin: true - dev: true + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + get-intrinsic@1.2.0: dependencies: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 - dev: true - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + get-intrinsic@1.2.1: dependencies: function-bind: 1.1.1 has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 - dev: true - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + get-stream@8.0.1: {} + + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 - dev: true - /get-tsconfig@4.7.0: - resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + get-tsconfig@4.7.0: dependencies: resolve-pkg-maps: 1.0.0 - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + get-tsconfig@4.7.3: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.3: - resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.3: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.0 minimatch: 9.0.3 minipass: 7.0.3 path-scurry: 1.10.1 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + globals@13.20.0: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true + type-fest: 0.20.2 - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globals@14.0.0: {} + + globals@15.0.0: {} + + globalthis@1.0.3: dependencies: define-properties: 1.2.0 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.2.12 - ignore: 5.2.4 + ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.0 - dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@4.0.0: {} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + has-property-descriptors@1.0.0: dependencies: get-intrinsic: 1.2.0 - dev: true - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - dev: true - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + has@1.0.3: dependencies: function-bind: 1.1.1 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: true + human-signals@5.0.0: {} - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true + ignore@5.2.4: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + ignore@5.3.1: {} + + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true + imurmurhash@0.1.4: {} - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + indent-string@4.0.0: {} - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} + internal-slot@1.0.5: dependencies: get-intrinsic: 1.2.0 has: 1.0.3 side-channel: 1.0.4 - dev: true - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: true + is-alphabetical@1.0.4: {} - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + is-alphanumerical@1.0.4: dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - dev: true - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 is-typed-array: 1.1.10 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + is-core-module@2.13.0: dependencies: has: 1.0.3 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: true + is-decimal@1.0.4: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: true + is-hexadecimal@1.0.4: {} - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.2: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-number@7.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.2 - dev: true - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-stream@3.0.0: {} + + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.10: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: true - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.2 - dev: true - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /jackspeak@2.3.0: - resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} - engines: {node: '>=14'} + jackspeak@2.3.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /jiti@1.19.3: - resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} - hasBin: true - dev: true + jiti@1.19.3: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + js-tokens@4.0.0: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true + jsdoc-type-pratt-parser@4.0.0: {} - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true + jsesc@0.5.0: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + jsesc@3.0.2: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-buffer@3.0.1: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /jsonc-eslint-parser@2.3.0: - resolution: {integrity: sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + jsonc-eslint-parser@2.4.0: dependencies: acorn: 8.9.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 semver: 7.5.4 - dev: true - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonc-parser@3.2.1: {} + + keyv@4.5.4: dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true + json-buffer: 3.0.1 - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true + local-pkg@0.5.0: + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true + lodash.merge@4.6.2: {} - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - dev: true + lodash@4.17.21: {} - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@10.0.1: {} + + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - dev: true + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 - /mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + mdast-util-from-markdown@0.8.5: dependencies: '@types/mdast': 3.0.12 mdast-util-to-string: 2.0.0 @@ -2061,157 +3308,114 @@ packages: unist-util-stringify-position: 2.0.3 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - dev: true + mdast-util-to-string@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge-stream@2.0.0: {} - /micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + merge2@1.4.1: {} + + micromark@2.11.4: dependencies: debug: 4.3.4 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + mimic-fn@4.0.0: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + min-indent@1.0.1: {} + + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 - /minipass@7.0.3: - resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minimist@1.2.8: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + minipass@7.0.3: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + mlly@1.6.1: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.5.3 - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + ms@2.1.2: {} - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: true + ms@2.1.3: {} - /node-fetch@3.3.1: - resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: true + nanoid@3.3.7: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.14: {} + + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.4 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: true - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true + object-inspect@1.12.3: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.4: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 - dev: true - /object.groupby@1.0.0: - resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + object.groupby@1.0.0: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 get-intrinsic: 1.2.1 - dev: true - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} + object.values@1.1.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 - dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@6.0.0: dependencies: - wrappy: 1.0.2 - dev: true + mimic-fn: 4.0.0 - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -2219,50 +3423,38 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-limit@4.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + p-try@2.2.0: {} + + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-entities@2.0.0: dependencies: character-entities: 1.2.4 character-entities-legacy: 1.1.4 @@ -2270,496 +3462,318 @@ packages: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-gitignore@2.0.0: {} + + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.22.10 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-exists@5.0.0: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-key@4.0.0: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-parse@1.0.7: {} + + path-scurry@1.10.1: dependencies: lru-cache: 10.0.1 minipass: 7.0.3 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true + pathe@1.1.1: {} - /pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - dependencies: - through: 2.3.8 - dev: true + pathe@1.1.2: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picocolors@1.0.0: {} - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true + picomatch@2.3.1: {} - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} + picomatch@4.0.2: {} + + pkg-types@1.0.3: + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.1 + + pluralize@8.0.0: {} + + postcss-selector-parser@6.0.16: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - /ps-tree@1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - hasBin: true + postcss@8.4.38: dependencies: - event-stream: 3.3.4 - dev: true + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true + prelude-ls@1.2.1: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + punycode@2.3.0: {} - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + queue-microtask@1.2.3: {} + + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.1 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true + regexp-tree@0.1.27: {} - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.4.3: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 functions-have-names: 1.2.3 - dev: true - /regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true + regjsparser@0.10.0: dependencies: jsesc: 0.5.0 - dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + require-directory@2.1.1: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true + resolve-from@4.0.0: {} - /resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} - hasBin: true + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.4: dependencies: is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true + reusify@1.0.4: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-regex-test@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 is-regex: 1.1.4 - dev: true - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 + + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.4: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 object-inspect: 1.12.3 - dev: true - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + sisteransi@1.0.5: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true + slash@3.0.0: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + source-map-js@1.2.0: {} + + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 - dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 - dev: true - - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - dev: true - /split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + spdx-expression-parse@4.0.0: dependencies: - through: 2.3.8 - dev: true + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 - /stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - dependencies: - duplexer: 0.1.2 - dev: true + spdx-license-ids@3.0.13: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 - dev: true - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + string.prototype.trimend@1.0.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 - dev: true - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + string.prototype.trimstart@1.0.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-final-newline@3.0.0: {} + + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + synckit@0.6.2: + dependencies: + tslib: 2.6.2 - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + tapable@2.2.1: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + text-table@0.2.0: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /ts-api-utils@1.0.2(typescript@5.2.2): - resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' + toml-eslint-parser@0.9.3: + dependencies: + eslint-visitor-keys: 3.4.3 + + ts-api-utils@1.0.2(typescript@5.2.2): dependencies: typescript: 5.2.2 - dev: true - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + ts-api-utils@1.3.0(typescript@5.2.2): + dependencies: + typescript: 5.2.2 + + tsconfig-paths@3.14.2: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true - - /tsutils@3.21.0(typescript@5.2.2): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.2.2 - dev: true + tslib@2.6.2: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.4: dependencies: call-bind: 1.0.2 for-each: 0.3.3 is-typed-array: 1.1.10 - dev: true - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.2.2: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + ufo@1.5.3: {} + + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.2 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + undici-types@5.26.5: + optional: true + + unicorn-magic@0.1.0: {} + + unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.7 - dev: true - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.0 - dev: true - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + util-deprecate@1.0.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /vue-eslint-parser@9.3.1(eslint@8.47.0): - resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' + vue-eslint-parser@9.4.2(eslint@9.0.0): dependencies: debug: 4.3.4 - eslint: 8.47.0 + eslint: 9.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -2768,31 +3782,16 @@ packages: semver: 7.5.4 transitivePeerDependencies: - supports-color - dev: true - - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} - dev: true - - /webpod@0.0.2: - resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} - hasBin: true - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.9: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -2800,92 +3799,54 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 is-typed-array: 1.1.10 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + xml-name-validator@4.0.0: {} - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true + y18n@5.0.8: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml-eslint-parser@1.2.2: - resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} - engines: {node: ^14.17.0 || >=16.0.0} + yaml-eslint-parser@1.2.2: dependencies: eslint-visitor-keys: 3.4.3 lodash: 4.17.21 yaml: 2.2.2 - dev: true - /yaml@2.2.2: - resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} - engines: {node: '>= 14'} - dev: true + yaml@2.2.2: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yargs-parser@21.1.1: {} - /zx@7.2.3: - resolution: {integrity: sha512-QODu38nLlYXg/B/Gw7ZKiZrvPkEsjPN3LQ5JFXM7h0JvwhEdPNNl+4Ao1y4+o3CLNiDUNcwzQYZ4/Ko7kKzCMA==} - engines: {node: '>= 16.0.0'} - hasBin: true + yargs@17.7.2: dependencies: - '@types/fs-extra': 11.0.1 - '@types/minimist': 1.2.2 - '@types/node': 18.16.7 - '@types/ps-tree': 1.1.2 - '@types/which': 3.0.0 - chalk: 5.2.0 - fs-extra: 11.1.1 - fx: 28.0.0 - globby: 13.1.4 - minimist: 1.2.8 - node-fetch: 3.3.1 - ps-tree: 1.2.0 - webpod: 0.0.2 - which: 3.0.1 - yaml: 2.2.2 - dev: true + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yocto-queue@1.0.0: {} + + zx@8.0.1: + optionalDependencies: + '@types/fs-extra': 11.0.4 + '@types/node': 20.12.7 From 02cb1fa8beac8f7a6303b998e7cf48bcae5aa8eb Mon Sep 17 00:00:00 2001 From: Faust1 Date: Thu, 18 Apr 2024 10:14:12 +0200 Subject: [PATCH 213/344] feat: add deleted status for results --- Protos/V1/result_status.proto | 1 + packages/python/src/armonik/common/enumwrapper.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Protos/V1/result_status.proto b/Protos/V1/result_status.proto index d041a6294..210319285 100644 --- a/Protos/V1/result_status.proto +++ b/Protos/V1/result_status.proto @@ -9,6 +9,7 @@ enum ResultStatus { RESULT_STATUS_CREATED = 1; /** Result is created and task is created, submitted or dispatched. */ RESULT_STATUS_COMPLETED = 2; /** Result is completed with a completed task. */ RESULT_STATUS_ABORTED = 3; /** Result is aborted. */ + RESULT_STATUS_DELETED = 4; /** NOTFOUND is encoded as 127 to make it small while still leaving enough room for future status extensions * diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 38cd65472..43d7a1825 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -37,6 +37,7 @@ RESULT_STATUS_CREATED, RESULT_STATUS_COMPLETED, RESULT_STATUS_ABORTED, + RESULT_STATUS_DELETED, RESULT_STATUS_NOTFOUND, ) from ..protogen.common.health_checks_common_pb2 import ( @@ -96,6 +97,7 @@ def name_from_value(status: RawResultStatus) -> str: CREATED = RESULT_STATUS_CREATED COMPLETED = RESULT_STATUS_COMPLETED ABORTED = RESULT_STATUS_ABORTED + DELETED = RESULT_STATUS_DELETED NOTFOUND = RESULT_STATUS_NOTFOUND From 40127d25b984a3396f99f01cd70a13d6c928fd23 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Thu, 18 Apr 2024 11:44:54 +0200 Subject: [PATCH 214/344] update eslint configuration --- .../use-armonik-api-in-an-angular-app.md | 10 ++-- .docs/nuxt.config.ts | 2 + .docs/package.json | 2 +- .eslintrc | 9 --- eslint.config.mjs | 16 +++++ examples/angular/tsconfig.app.json | 4 +- examples/angular/tsconfig.json | 28 ++++----- examples/angular/tsconfig.spec.json | 4 +- packages/angular/package.json | 2 +- .../armonik.api.angular/README.md | 2 +- .../armonik.api.angular/tsconfig.lib.json | 4 +- .../armonik.api.angular/tsconfig.spec.json | 4 +- packages/angular/tsconfig.json | 30 +++++----- packages/python/README.md | 5 +- packages/python/pyproject.toml | 59 ++++++++++--------- packages/python/ruff.toml | 9 ++- packages/web/package.json | 2 +- packages/web/tsconfig.json | 6 +- scripts/publish-edge.mjs | 2 +- scripts/publish.mjs | 2 +- scripts/remove-useless-md.mjs | 12 ++-- 21 files changed, 116 insertions(+), 98 deletions(-) delete mode 100644 .eslintrc create mode 100644 eslint.config.mjs diff --git a/.docs/content/2.usage/use-armonik-api-in-an-angular-app.md b/.docs/content/2.usage/use-armonik-api-in-an-angular-app.md index 800410bf7..b5b2e9873 100644 --- a/.docs/content/2.usage/use-armonik-api-in-an-angular-app.md +++ b/.docs/content/2.usage/use-armonik-api-in-an-angular-app.md @@ -441,11 +441,11 @@ If you look at the console, you will see another error: ```json { - "statusCode": 3, - "statusMessage": "Property PageSize failed validation.\nProperty Filter failed validation.\nProperty Filter failed validation.\nProperty Sort.Field failed validation.\nProperty Sort.Field failed validation.", - "metadata": { - "map": {} - } + "statusCode": 3, + "statusMessage": "Property PageSize failed validation.\nProperty Filter failed validation.\nProperty Filter failed validation.\nProperty Sort.Field failed validation.\nProperty Sort.Field failed validation.", + "metadata": { + "map": {} + } } ``` diff --git a/.docs/nuxt.config.ts b/.docs/nuxt.config.ts index 34e216716..f9c18ff2e 100644 --- a/.docs/nuxt.config.ts +++ b/.docs/nuxt.config.ts @@ -1,3 +1,5 @@ +import process from 'node:process'; + const baseURL = process.env.NODE_ENV === 'production' ? '/ArmoniK.Api/' : '/' export default defineNuxtConfig({ diff --git a/.docs/package.json b/.docs/package.json index 1909290d7..5bb26da17 100644 --- a/.docs/package.json +++ b/.docs/package.json @@ -2,7 +2,7 @@ "name": "armonik-api-docs", "version": "0.1.0", "private": true, - "packageManager": "pnpm@8.6.12", + "packageManager": "pnpm@9.0.2", "scripts": { "prepare": "nuxi prepare", "dev": "nuxi dev", diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 29e44415f..000000000 --- a/.eslintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "@antfu", - "rules": { - "yml/no-empty-mapping-value": "off" - }, - "ignorePatterns": [ - "generated" - ] -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000..33ad71ae2 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,16 @@ +import antfu from '@antfu/eslint-config' + +export default antfu({ + rules: { + 'yml/no-empty-mapping-value': 'off', + 'antfu/consistent-list-newline': 'off', + 'style/comma-dangle': 'off', + 'curly': 'off', + 'eslint-comments/no-unlimited-disable': 'off', + 'style/semi': 'off', + 'ts/ban-ts-comment': 'off', + }, + ignores: [ + 'generated', + ] +}) diff --git a/examples/angular/tsconfig.app.json b/examples/angular/tsconfig.app.json index 374cc9d29..9e06c8ea7 100644 --- a/examples/angular/tsconfig.app.json +++ b/examples/angular/tsconfig.app.json @@ -2,8 +2,8 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] + "types": [], + "outDir": "./out-tsc/app" }, "files": [ "src/main.ts" diff --git a/examples/angular/tsconfig.json b/examples/angular/tsconfig.json index ed966d43a..26f1b96f6 100644 --- a/examples/angular/tsconfig.json +++ b/examples/angular/tsconfig.json @@ -2,27 +2,27 @@ { "compileOnSave": false, "compilerOptions": { + "target": "ES2022", + "lib": [ + "ES2022", + "dom" + ], + "useDefineForClassFields": false, + "experimentalDecorators": true, "baseUrl": "./", - "outDir": "./dist/out-tsc", - "forceConsistentCasingInFileNames": true, + "module": "ES2022", + "moduleResolution": "node", "strict": true, + "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "sourceMap": true, + "noPropertyAccessFromIndexSignature": true, "declaration": false, "downlevelIteration": true, - "experimentalDecorators": true, - "moduleResolution": "node", "importHelpers": true, - "target": "ES2022", - "module": "ES2022", - "useDefineForClassFields": false, - "lib": [ - "ES2022", - "dom" - ] + "outDir": "./dist/out-tsc", + "sourceMap": true, + "forceConsistentCasingInFileNames": true }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, diff --git a/examples/angular/tsconfig.spec.json b/examples/angular/tsconfig.spec.json index be7e9da76..f7ab59035 100644 --- a/examples/angular/tsconfig.spec.json +++ b/examples/angular/tsconfig.spec.json @@ -2,10 +2,10 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "./out-tsc/spec", "types": [ "jasmine" - ] + ], + "outDir": "./out-tsc/spec" }, "include": [ "src/**/*.spec.ts", diff --git a/packages/angular/package.json b/packages/angular/package.json index 5d7bae2ed..90530fded 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,7 +1,7 @@ { "name": "armonik.api.angular", "private": true, - "packageManager": "pnpm@8.6.12", + "packageManager": "pnpm@9.0.2", "scripts": { "ng": "ng", "start": "ng serve", diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/README.md b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/README.md index 49b70bafa..7951b3e56 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/README.md +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/README.md @@ -5,7 +5,7 @@ This library was generated with [Angular CLI](https://github.com/angular/angular ## Code scaffolding Run `ng generate component component-name --project armonik.api.angular` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project armonik.api.angular`. -> Note: Don't forget to add `--project armonik.api.angular` or else it will be added to the default project in your `angular.json` file. +> Note: Don't forget to add `--project armonik.api.angular` or else it will be added to the default project in your `angular.json` file. ## Build diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/tsconfig.lib.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/tsconfig.lib.json index 879250df4..de51891ba 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/tsconfig.lib.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/tsconfig.lib.json @@ -2,11 +2,11 @@ { "extends": "../../../tsconfig.json", "compilerOptions": { - "outDir": "../../../out-tsc/lib", + "types": [], "declaration": true, "declarationMap": true, "inlineSources": true, - "types": [] + "outDir": "../../../out-tsc/lib" }, "exclude": [ "**/*.spec.ts" diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/tsconfig.spec.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/tsconfig.spec.json index 80f875ef2..ba0935f94 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/tsconfig.spec.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/tsconfig.spec.json @@ -2,10 +2,10 @@ { "extends": "../../../tsconfig.json", "compilerOptions": { - "outDir": "../../../out-tsc/spec", "types": [ "jasmine" - ] + ], + "outDir": "../../../out-tsc/spec" }, "include": [ "**/*.spec.ts", diff --git a/packages/angular/tsconfig.json b/packages/angular/tsconfig.json index d6c65bf00..7883718b5 100644 --- a/packages/angular/tsconfig.json +++ b/packages/angular/tsconfig.json @@ -2,6 +2,16 @@ { "compileOnSave": false, "compilerOptions": { + "target": "ES2022", + "lib": [ + "ES2022", + "dom" + ], + "useDefineForClassFields": false, + "experimentalDecorators": true, + "baseUrl": "./", + "module": "ES2022", + "moduleResolution": "node", "paths": { "@aneoconsultingfr/armonik.api.angular": [ "dist/aneoconsultingfr/armonik.api.angular" @@ -10,27 +20,17 @@ "dist/aneoconsutingfr/armonik.api.angular" ] }, - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "forceConsistentCasingInFileNames": true, "strict": true, + "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "sourceMap": true, + "noPropertyAccessFromIndexSignature": true, "declaration": false, "downlevelIteration": true, - "experimentalDecorators": true, - "moduleResolution": "node", "importHelpers": true, - "target": "ES2022", - "module": "ES2022", - "useDefineForClassFields": false, - "lib": [ - "ES2022", - "dom" - ] + "outDir": "./dist/out-tsc", + "sourceMap": true, + "forceConsistentCasingInFileNames": true }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, diff --git a/packages/python/README.md b/packages/python/README.md index b9bb09cf8..2627607b0 100644 --- a/packages/python/README.md +++ b/packages/python/README.md @@ -32,13 +32,13 @@ To generate the package from sources, run the [proto2python.sh](proto2python.sh) Instead of running the script you can install the armonik package in "editable" mode, allowing you to make changes to the source code, and the changes will be reflected immediately without reinstalling the package. - ```bash + ```bash pip install -e ./packages/python ``` ### **How to install the generated package** From this directory, use the following command: -```code +```code pip install pkg/armonik*.whl ``` The generated package will be installed to your current python environment @@ -58,7 +58,6 @@ Before running tests, ensure the following setup steps are completed: sudo apt install dotnet-sdk-6.0 jq ``` - 2. Launch the Mock Server: Verify that port 5000 is available (Armonik and the mock server communicate on the same port, uninstall armonik if necessary): diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 254c24b6f..16b8855e9 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -1,39 +1,35 @@ [build-system] -requires = ["setuptools", - "wheel"] +requires = [ + "setuptools", + "wheel" +] build-backend = "setuptools.build_meta" [project] name = "armonik" description = "GRPC python binding for the ArmoniK orchestrator API" readme = "README.md" -dynamic = ["version"] +dynamic = [ "version" ] requires-python = ">=3.7" -keywords = ["cloud", "HTC", "gRPC", "ArmoniK", "Aneo"] -license = {text = "Apache v2.0 LICENSE"} -classifiers = [ - "Programming Language :: Python :: 3", +keywords = [ + "cloud", + "HTC", + "gRPC", + "ArmoniK", + "Aneo" ] +license = { text = "Apache v2.0 LICENSE" } +classifiers = [ "Programming Language :: Python :: 3", ] dependencies = [ - "grpcio", - "grpcio-tools", - "deprecation" + "grpcio", + "grpcio-tools", + "deprecation" ] + [project.urls] -"Homepage" = "https://github.com/aneoconsulting/ArmoniK.Api" +Homepage = "https://github.com/aneoconsulting/ArmoniK.Api" "Bug Tracker" = "https://github.com/aneoconsulting/ArmoniK/issues" -[tool.setuptools] -include-package-data = true -dynamic = {version = {attr = "armonik.__version__"}} - -[tool.setuptools.packages.find] -where= ["src"] -exclude=['tests'] - -[tool.setuptools.package-data] -"*" = ["*.pyi"] - [project.optional-dependencies] tests = [ 'coverage', @@ -43,11 +39,20 @@ tests = [ 'requests', ] dev = [ - 'mypy', - 'ruff', + 'mypy', + 'ruff', ] +[tool.setuptools] +include-package-data = true +dynamic = { version = { attr = "armonik.__version__" } } + +[tool.setuptools.packages.find] +where = [ "src" ] +exclude = [ 'tests' ] + +[tool.setuptools.package-data] +"*" = [ "*.pyi" ] + [tool.pytest.ini_options] -addopts = [ - "--import-mode=importlib", -] \ No newline at end of file +addopts = [ "--import-mode=importlib", ] diff --git a/packages/python/ruff.toml b/packages/python/ruff.toml index 134c94968..ee767d010 100644 --- a/packages/python/ruff.toml +++ b/packages/python/ruff.toml @@ -23,7 +23,10 @@ preview = false target-version = "py310" # Allow imports relative to the "src/armonik" and "test" directories. -src = ["src/armonik", "test"] +src = [ + "src/armonik", + "test" +] # Allow lines to be as long as 110. line-length = 100 @@ -33,10 +36,10 @@ indent-width = 4 [lint] # A list of file patterns to exclude from formatting and linting. -exclude = ["*.pyi"] +exclude = [ "*.pyi" ] # By default all rules are considered fixable. -fixable = ["ALL"] +fixable = [ "ALL" ] # Avoid automatically removing unused imports in `__init__.py` files. ignore-init-module-imports = false diff --git a/packages/web/package.json b/packages/web/package.json index 038ed5be0..f75e39c2d 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,7 +1,7 @@ { "name": "@aneoconsultingfr/armonik.api", "version": "3.16.2", - "packageManager": "pnpm@8.6.12", + "packageManager": "pnpm@9.0.2", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index 5a8d3341b..cfb17f202 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -1,10 +1,10 @@ { "compilerOptions": { "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "module": "commonjs", /* Specify what module code is generated. */ + "module": "commonjs", /* Ensure that casing is correct in imports. */ + "strict": true, /* Specify what module code is generated. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - "strict": true, /* Enable all strict type-checking options. */ + "forceConsistentCasingInFileNames": true, /* Enable all strict type-checking options. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ } } diff --git a/scripts/publish-edge.mjs b/scripts/publish-edge.mjs index 6773e3358..d95b0a606 100644 --- a/scripts/publish-edge.mjs +++ b/scripts/publish-edge.mjs @@ -1,5 +1,5 @@ // @ts-nocheck - +import process from 'node:process' import { $ } from 'zx' import consola from 'consola' diff --git a/scripts/publish.mjs b/scripts/publish.mjs index f8bbbfe3a..2e0fa9a55 100644 --- a/scripts/publish.mjs +++ b/scripts/publish.mjs @@ -1,5 +1,5 @@ // @ts-nocheck - +import process from 'node:process' import { $ } from 'zx' import consola from 'consola' diff --git a/scripts/remove-useless-md.mjs b/scripts/remove-useless-md.mjs index a87de0adc..a62851ff5 100644 --- a/scripts/remove-useless-md.mjs +++ b/scripts/remove-useless-md.mjs @@ -1,6 +1,7 @@ -import consola from 'consola' import fs from 'node:fs' import readline from 'node:readline' +import process from 'node:process' +import consola from 'consola' const [, , ...args] = process.argv @@ -24,7 +25,7 @@ if (!dstFile) { consola.info(`Read file ${srcFile}`) const file = readline.createInterface({ input: fs.createReadStream(srcFile), - crlfDelay: Infinity + crlfDelay: Number.POSITIVE_INFINITY }) // Write to file @@ -49,9 +50,10 @@ file.on('line', (line) => { isInToc = true } - if (isInToc) return + if (isInToc) + return - if (useLessLines.some((useLessLine) => line.includes(useLessLine))) { + if (useLessLines.some(useLessLine => line.includes(useLessLine))) { return } @@ -60,7 +62,7 @@ file.on('line', (line) => { line = line.replace(/name="(.*)"/, 'id="$1"') } - writeStream.write(line + '\r') + writeStream.write(`${line}\r`) }) file.on('close', () => { From e3a26314f467987caf971ab7483336fa5c8ee4dd Mon Sep 17 00:00:00 2001 From: Faustin Dewas <117363666+fdewas-aneo@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:49:25 +0200 Subject: [PATCH 215/344] Update Protos/V1/result_status.proto Co-authored-by: lemaitre-aneo <91961298+lemaitre-aneo@users.noreply.github.com> --- Protos/V1/result_status.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Protos/V1/result_status.proto b/Protos/V1/result_status.proto index 210319285..798a58d77 100644 --- a/Protos/V1/result_status.proto +++ b/Protos/V1/result_status.proto @@ -9,7 +9,7 @@ enum ResultStatus { RESULT_STATUS_CREATED = 1; /** Result is created and task is created, submitted or dispatched. */ RESULT_STATUS_COMPLETED = 2; /** Result is completed with a completed task. */ RESULT_STATUS_ABORTED = 3; /** Result is aborted. */ - RESULT_STATUS_DELETED = 4; + RESULT_STATUS_DELETED = 4; /** Result is completed, but data has been deleted from object storage. */ /** NOTFOUND is encoded as 127 to make it small while still leaving enough room for future status extensions * From df0946b427bf1d2dd4d4c7347d6de083f70f89e3 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Thu, 18 Apr 2024 14:23:57 +0200 Subject: [PATCH 216/344] update linting rules --- .docs/nuxt.config.ts | 2 +- eslint.config.mjs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.docs/nuxt.config.ts b/.docs/nuxt.config.ts index f9c18ff2e..b08e8d8bd 100644 --- a/.docs/nuxt.config.ts +++ b/.docs/nuxt.config.ts @@ -1,4 +1,4 @@ -import process from 'node:process'; +import process from 'node:process' const baseURL = process.env.NODE_ENV === 'production' ? '/ArmoniK.Api/' : '/' diff --git a/eslint.config.mjs b/eslint.config.mjs index 33ad71ae2..92c202203 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,7 +10,5 @@ export default antfu({ 'style/semi': 'off', 'ts/ban-ts-comment': 'off', }, - ignores: [ - 'generated', - ] + gitignore: true, }) From 6a5128a9638a13f8485864ef537b60dbe67324e3 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Thu, 18 Apr 2024 14:31:05 +0200 Subject: [PATCH 217/344] Abort immediately upon cancellation --- .../ArmoniK.Api.Common/Options/ComputePlane.cs | 2 +- .../Worker/WorkerStreamWrapper.cs | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs b/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs index ea3516dca..7af50c4a1 100644 --- a/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs +++ b/packages/csharp/ArmoniK.Api.Common/Options/ComputePlane.cs @@ -56,5 +56,5 @@ public class ComputePlane /// /// Time to wait upon cancellation before aborting the worker /// - public TimeSpan AbortAfter { get; set; } = TimeSpan.FromSeconds(1); + public TimeSpan AbortAfter { get; set; } = TimeSpan.Zero; } diff --git a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs index b5b49a4df..56928afc3 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Worker/WorkerStreamWrapper.cs @@ -131,11 +131,14 @@ public sealed override async Task Process(ProcessRequest reques { logger_.LogInformation("RPC request was aborted"); - // Request has been cancelled - // Wait for process to be properly cancelled, or small delay - task = await Task.WhenAny(process, - Task.Delay(computePlaneOptions_.AbortAfter)) - .ConfigureAwait(false); + if (computePlaneOptions_.AbortAfter > TimeSpan.Zero) + { + // Request has been cancelled + // Wait for process to be properly cancelled, or small delay + task = await Task.WhenAny(process, + Task.Delay(computePlaneOptions_.AbortAfter)) + .ConfigureAwait(false); + } // Check cancelled completion of process if (ReferenceEquals(task, From f9eb881da1bc93be6cff50df0ffe0c331e96e7c5 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Thu, 18 Apr 2024 15:36:41 +0200 Subject: [PATCH 218/344] revert eslint changes --- .eslintrc | 9 + .vscode/settings.json | 3 - eslint.config.mjs | 14 - package.json | 12 +- packages/python/pyproject.toml | 59 +- packages/python/ruff.toml | 9 +- pnpm-lock.yaml | 2581 +++++++++++++++----------------- 7 files changed, 1217 insertions(+), 1470 deletions(-) create mode 100644 .eslintrc delete mode 100644 eslint.config.mjs diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..fbc696051 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,9 @@ +{ + "extends": "@antfu", + "rules": { + "yml/no-empty-mapping-value": "off" + }, + "ignorePatterns": [ + "generated" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 1c5085c36..bdbe81553 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,9 +6,6 @@ "--csharp_out=${workspaceRoot}/packages/csharp/generated/" ] }, - "editor.codeActionsOnSave": { - "source.fixAll": "explicit" - }, "cSpell.words": [ "Armoni" ] diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 92c202203..000000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,14 +0,0 @@ -import antfu from '@antfu/eslint-config' - -export default antfu({ - rules: { - 'yml/no-empty-mapping-value': 'off', - 'antfu/consistent-list-newline': 'off', - 'style/comma-dangle': 'off', - 'curly': 'off', - 'eslint-comments/no-unlimited-disable': 'off', - 'style/semi': 'off', - 'ts/ban-ts-comment': 'off', - }, - gitignore: true, -}) diff --git a/package.json b/package.json index 80f502fc1..245d404d1 100644 --- a/package.json +++ b/package.json @@ -10,19 +10,19 @@ "lint:fix": "eslint --fix ." }, "devDependencies": { - "@antfu/eslint-config": "^2.15.0", - "@typescript-eslint/eslint-plugin": "^7.7.0", + "@antfu/eslint-config": "^0.41.0", + "@typescript-eslint/eslint-plugin": "^6.4.1", "consola": "^3.2.3", - "eslint": "^9.0.0", - "eslint-config-standard-with-typescript": "^43.0.1", + "eslint": "^8.47.0", + "eslint-config-standard-with-typescript": "^38.0.0", "eslint-plugin-import": "^2.28.1", - "eslint-plugin-n": "^17.2.1", + "eslint-plugin-n": "^16.0.2", "eslint-plugin-promise": "^6.1.1", "glob": "^10.3.3", "jiti": "^1.19.3", "pathe": "^1.1.1", "tslib": "^2.6.2", "typescript": "^5.2.2", - "zx": "^8.0.1" + "zx": "^7.2.3" } } diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index f6e1213cb..75db0a8ba 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -1,49 +1,28 @@ [build-system] -requires = [ - "setuptools", - "wheel" -] +requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta" [project] name = "armonik" description = "GRPC python binding for the ArmoniK orchestrator API" readme = "README.md" -dynamic = [ "version" ] +dynamic = ["version"] requires-python = ">=3.7" -keywords = [ - "cloud", - "HTC", - "gRPC", - "ArmoniK", - "Aneo" +keywords = ["cloud", "HTC", "gRPC", "ArmoniK", "Aneo"] +license = {text = "Apache v2.0 LICENSE"} +classifiers = [ + "Programming Language :: Python :: 3", ] -license = { text = "Apache v2.0 LICENSE" } -classifiers = [ "Programming Language :: Python :: 3", ] dependencies = [ - "grpcio", - "grpcio-tools", - "deprecation" + "grpcio", + "grpcio-tools", + "deprecation" ] [project.urls] -Homepage = "https://github.com/aneoconsulting/ArmoniK.Api" +"Homepage" = "https://github.com/aneoconsulting/ArmoniK.Api" "Bug Tracker" = "https://github.com/aneoconsulting/ArmoniK/issues" -[project.optional-dependencies] -tests = [ - 'coverage', - 'pytest', - 'pytest-cov', - 'pytest-benchmark[histogram]', - 'requests', -] -dev = [ - 'mypy', - 'ruff', - 'types-protobuf', -] - [tool.setuptools] include-package-data = true dynamic = { version = { attr = "armonik.__version__" } } @@ -55,5 +34,21 @@ exclude = [ 'tests' ] [tool.setuptools.package-data] "*" = [ "*.pyi" ] +[project.optional-dependencies] +tests = [ + 'coverage', + 'pytest', + 'pytest-cov', + 'pytest-benchmark[histogram]', + 'requests', +] +dev = [ + 'mypy', + 'ruff', + 'types-protobuf', +] + [tool.pytest.ini_options] -addopts = [ "--import-mode=importlib", ] +addopts = [ + "--import-mode=importlib", +] diff --git a/packages/python/ruff.toml b/packages/python/ruff.toml index ee767d010..134c94968 100644 --- a/packages/python/ruff.toml +++ b/packages/python/ruff.toml @@ -23,10 +23,7 @@ preview = false target-version = "py310" # Allow imports relative to the "src/armonik" and "test" directories. -src = [ - "src/armonik", - "test" -] +src = ["src/armonik", "test"] # Allow lines to be as long as 110. line-length = 100 @@ -36,10 +33,10 @@ indent-width = 4 [lint] # A list of file patterns to exclude from formatting and linting. -exclude = [ "*.pyi" ] +exclude = ["*.pyi"] # By default all rules are considered fixable. -fixable = [ "ALL" ] +fixable = ["ALL"] # Avoid automatically removing unused imports in `__init__.py` files. ignore-init-module-imports = false diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 639969092..0f22d80dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,29 +9,29 @@ importers: .: devDependencies: '@antfu/eslint-config': - specifier: ^2.15.0 - version: 2.15.0(@vue/compiler-sfc@3.4.23)(eslint@9.0.0)(typescript@5.2.2) + specifier: ^0.41.0 + version: 0.41.4(eslint@8.57.0)(typescript@5.2.2) '@typescript-eslint/eslint-plugin': - specifier: ^7.7.0 - version: 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + specifier: ^6.4.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) consola: specifier: ^3.2.3 version: 3.2.3 eslint: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^8.47.0 + version: 8.57.0 eslint-config-standard-with-typescript: - specifier: ^43.0.1 - version: 43.0.1(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0)(typescript@5.2.2) + specifier: ^38.0.0 + version: 38.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0)(typescript@5.2.2) eslint-plugin-import: specifier: ^2.28.1 - version: 2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) + version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) eslint-plugin-n: - specifier: ^17.2.1 - version: 17.2.1(eslint@9.0.0) + specifier: ^16.0.2 + version: 16.6.2(eslint@8.57.0) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@9.0.0) + version: 6.1.1(eslint@8.57.0) glob: specifier: ^10.3.3 version: 10.3.3 @@ -48,8 +48,8 @@ importers: specifier: ^5.2.2 version: 5.2.2 zx: - specifier: ^8.0.1 - version: 8.0.1 + specifier: ^7.2.3 + version: 7.2.3 packages: @@ -57,60 +57,31 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - '@antfu/eslint-config@2.15.0': - resolution: {integrity: sha512-qoqw+0N8bqz0vBIigGJamaIf1LdzXcmCDuleygJAF3EtACLieKyIMvpOdc2TU9AnuPbMBFCkN40340UWRChELw==} - hasBin: true + '@antfu/eslint-config-basic@0.41.4': + resolution: {integrity: sha512-bdBC8tyJzTa4a883m50efVLRjiVX8lMAhvmFxvpue6ScBnPLqW+J3sJupolefp/Xc00VU8ThD3iOBCE8Ja9qfg==} peerDependencies: - '@eslint-react/eslint-plugin': ^1.5.8 - '@unocss/eslint-plugin': '>=0.50.0' - astro-eslint-parser: ^0.16.3 - eslint: '>=8.40.0' - eslint-plugin-astro: ^0.31.4 - eslint-plugin-format: '>=0.1.0' - eslint-plugin-react-hooks: ^4.6.0 - eslint-plugin-react-refresh: ^0.4.4 - eslint-plugin-solid: ^0.13.2 - eslint-plugin-svelte: '>=2.35.1' - prettier-plugin-astro: ^0.13.0 - prettier-plugin-slidev: ^1.0.5 - svelte-eslint-parser: ^0.33.1 - peerDependenciesMeta: - '@eslint-react/eslint-plugin': - optional: true - '@unocss/eslint-plugin': - optional: true - astro-eslint-parser: - optional: true - eslint-plugin-astro: - optional: true - eslint-plugin-format: - optional: true - eslint-plugin-react-hooks: - optional: true - eslint-plugin-react-refresh: - optional: true - eslint-plugin-solid: - optional: true - eslint-plugin-svelte: - optional: true - prettier-plugin-astro: - optional: true - prettier-plugin-slidev: - optional: true - svelte-eslint-parser: - optional: true + eslint: '>=7.4.0' + + '@antfu/eslint-config-ts@0.41.4': + resolution: {integrity: sha512-YikIdwZwFPKEAL08GELjC0tzSaEKceINg8R4cwpvVlkXIaut9Tiyhgw69OBlfWdf3oMhpJ4ksy2WFfWh2qmjaw==} + peerDependencies: + eslint: '>=7.4.0' + typescript: '>=3.9' - '@antfu/install-pkg@0.3.2': - resolution: {integrity: sha512-FFYqME8+UHlPnRlX/vn+8cTD4Wo/nG/lzRxpABs3XANBmdJdNImVz3QvjNAE/W3PSCNbG387FOz8o5WelnWOlg==} + '@antfu/eslint-config-vue@0.41.4': + resolution: {integrity: sha512-tOZ4ria8wahZ4bn5Sglarcw+IPVn+QXNincjzB0tmwBzQP2XTM8fXYlvqO1VBA1/Jgr2BVGgZVXBHy1StDBTnA==} + peerDependencies: + eslint: '>=7.4.0' + + '@antfu/eslint-config@0.41.4': + resolution: {integrity: sha512-1bPnXjrv3DqF4FsRgorJvCjGM5oB1fOYeAXAER/TLS7WXO1oD/9s/G39mBy9K7HxLLyFuLuZAw0h/Uz0GR1k9w==} + peerDependencies: + eslint: '>=7.4.0' '@babel/code-frame@7.22.10': resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} @@ -119,25 +90,8 @@ packages: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.4': - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/types@7.24.0': - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} - engines: {node: '>=6.9.0'} - - '@clack/core@0.3.4': - resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} - - '@clack/prompts@0.7.0': - resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} - bundledDependencies: - - is-unicode-supported - - '@es-joy/jsdoccomment@0.42.0': - resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} + '@es-joy/jsdoccomment@0.41.0': + resolution: {integrity: sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==} engines: {node: '>=16'} '@eslint-community/eslint-utils@4.4.0': @@ -150,24 +104,16 @@ packages: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-community/regexpp@4.6.2': - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/eslintrc@3.0.2': - resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.0.0': - resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@humanwhocodes/config-array@0.12.3': - resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} '@humanwhocodes/module-importer@1.0.1': @@ -181,9 +127,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -200,47 +143,9 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@stylistic/eslint-plugin-js@1.7.2': - resolution: {integrity: sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin-jsx@1.7.2': - resolution: {integrity: sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin-plus@1.7.2': - resolution: {integrity: sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==} - peerDependencies: - eslint: '*' - - '@stylistic/eslint-plugin-ts@1.7.2': - resolution: {integrity: sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin@1.7.2': - resolution: {integrity: sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' - - '@types/eslint@8.56.9': - resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} - '@types/json-schema@7.0.12': - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -253,14 +158,20 @@ packages: '@types/mdast@3.0.12': resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@18.19.31': + resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} + '@types/node@20.12.7': resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - '@types/semver@7.5.0': - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + '@types/ps-tree@1.1.6': + resolution: {integrity: sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -268,82 +179,67 @@ packages: '@types/unist@2.0.7': resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} - '@typescript-eslint/eslint-plugin@7.7.0': - resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@types/which@3.0.3': + resolution: {integrity: sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==} - '@typescript-eslint/parser@6.4.1': - resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==} + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.7.0': - resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@6.21.0': resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/scope-manager@6.4.1': - resolution: {integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==} + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@7.7.0': - resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@7.7.0': - resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} - engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@6.21.0': resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/types@6.4.1': - resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@7.7.0': - resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/typescript-estree@6.4.1': - resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -351,14 +247,11 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.7.0': - resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 '@typescript-eslint/utils@6.21.0': resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} @@ -366,38 +259,16 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@7.7.0': - resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@typescript-eslint/visitor-keys@6.21.0': resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/visitor-keys@6.4.1': - resolution: {integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/visitor-keys@7.7.0': - resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@vue/compiler-core@3.4.23': - resolution: {integrity: sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==} - - '@vue/compiler-dom@3.4.23': - resolution: {integrity: sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==} - - '@vue/compiler-sfc@3.4.23': - resolution: {integrity: sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==} - - '@vue/compiler-ssr@3.4.23': - resolution: {integrity: sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==} - - '@vue/shared@3.4.23': - resolution: {integrity: sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==} + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -409,11 +280,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.9.0: - resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} - engines: {node: '>=0.4.0'} - hasBin: true - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -444,31 +310,36 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} - array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlastindex@1.2.2: - resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} - available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} balanced-match@1.0.2: @@ -487,25 +358,21 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001610: - resolution: {integrity: sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==} - chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -514,6 +381,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -523,18 +394,14 @@ packages: character-reference-invalid@1.1.4: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -559,9 +426,6 @@ packages: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} - core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} - cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -571,6 +435,22 @@ packages: engines: {node: '>=4'} hasBin: true + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -591,8 +471,12 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dir-glob@3.0.1: @@ -607,22 +491,31 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.739: - resolution: {integrity: sha512-koRkawXOuN9w/ymhTNxGfB8ta4MRKVW0nzifU17G1UwTWlBg0vv7xnz4nxDnRFSBe9nXMGRgICcAzqXc0PmLeA==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} - engines: {node: '>=10.13.0'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -630,25 +523,33 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -663,14 +564,11 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-flat-gitignore@0.1.5: - resolution: {integrity: sha512-hEZLwuZjDBGDERA49c2q7vxc8sCGv8EdBp6PQYzGOMcHIgrfG9YOM6s/4jx24zhD+wnK9AI8mgN5RxSss5nClQ==} - - eslint-config-standard-with-typescript@43.0.1: - resolution: {integrity: sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==} + eslint-config-standard-with-typescript@38.1.0: + resolution: {integrity: sha512-sdgN8Gf7BMVhVKlY7/mB426yO/MozU1zV7TKnh0z1wIoPq4lD0CHQ+b/UkgqKfiZ4Io0j3xIY1j+lHhVXQck0g==} deprecated: Please use eslint-config-love, instead. peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.4.0 + '@typescript-eslint/eslint-plugin': ^6.1.0 eslint: ^8.0.1 eslint-plugin-import: ^2.25.2 eslint-plugin-n: '^15.0.0 || ^16.0.0 ' @@ -686,22 +584,11 @@ packages: eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 - eslint-flat-config-utils@0.2.3: - resolution: {integrity: sha512-tfrMNXZfuN4q7sFi1Cr//BN3qdI7c8fLJhbshlp8l9PZIqZ7eVeeyd2Regtu/P9kjOlv18lRlBALzsZaF7ByUg==} - - eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} - eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-merge-processors@0.1.0: - resolution: {integrity: sha512-IvRXXtEajLeyssvW4wJcZ2etxkR9mUf4zpNwgI+m/Uac9RfXHskuJefkHUcawVzePnd6xp24enp5jfgdHzjRdQ==} - peerDependencies: - eslint: '*' - - eslint-module-utils@2.8.0: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -721,10 +608,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-antfu@2.1.2: - resolution: {integrity: sha512-s7ZTOM3uq0iqpp6gF0UEotnvup7f2PHBUftCytLZX0+6C9j9KadKZQh6bVVngAyFgsmeD9+gcBopOYLClb2oDg==} - peerDependencies: - eslint: '*' + eslint-plugin-antfu@0.41.4: + resolution: {integrity: sha512-naDIFqCW/7vFIz/TZNuapLEjGd8XoWFot0h8SStbqUIcdXFKc0MgDXCKtHQIyJp6plkKiucOW3gZJ0jjYrc3Qg==} eslint-plugin-es-x@7.6.0: resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} @@ -738,14 +623,17 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import-x@0.5.0: - resolution: {integrity: sha512-C7R8Z4IzxmsoOPMtSzwuOBW5FH6iRlxHR6iTks+MzVlrk3r3TUxokkWTx3ypdj9nGOEP+CG/5e6ebZzHbxgbbQ==} - engines: {node: '>=16'} + eslint-plugin-html@7.1.0: + resolution: {integrity: sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==} + + eslint-plugin-i@2.28.1: + resolution: {integrity: sha512-a4oVt0j3ixNhGhvV4XF6NS7OWRFK2rrJ0Q5C4S2dSRb8FxZi31J0uUd5WJLL58wnVJ/OiQ1BxiXnFA4dWQO1Cg==} + engines: {node: '>=12'} peerDependencies: - eslint: ^8.56.0 || ^9.0.0-0 + eslint: ^7.2.0 || ^8 - eslint-plugin-import@2.28.1: - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -754,9 +642,22 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsdoc@48.2.3: - resolution: {integrity: sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==} - engines: {node: '>=18'} + eslint-plugin-jest@27.9.0: + resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-jsdoc@46.10.1: + resolution: {integrity: sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==} + engines: {node: '>=16'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -766,57 +667,33 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-plugin-markdown@4.0.1: - resolution: {integrity: sha512-5/MnGvYU0i8MbHH5cg8S+Vl3DL+bqRNYshk1xUO86DilNBaxtTkhH+5FD0/yO03AmlI6+lfNFdk2yOw72EPzpA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-plugin-markdown@3.0.1: + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: '>=8' + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - eslint-plugin-n@17.2.1: - resolution: {integrity: sha512-uW1+df2bo06kR7ix6nB614RUlvjRPrYxlaX832O6e1MCJp4V7YozEdvMgCYuvn4ltnjPu1FVYhQ2KRrmTNoJfg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-plugin-n@16.6.2: + resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} + engines: {node: '>=16.0.0'} peerDependencies: - eslint: '>=8.23.0' + eslint: '>=7.0.0' eslint-plugin-no-only-tests@3.1.0: resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} engines: {node: '>=5.0.0'} - eslint-plugin-perfectionist@2.9.0: - resolution: {integrity: sha512-ipFtDrqtF99qVVo+FE1fo6aHyLLp7hg6PNGfzY5KxQjcl0XCbyEFvjtR1NfkHDTN9rdFeEDxg59LLOv3VOAHAw==} - peerDependencies: - astro-eslint-parser: ^0.16.0 - eslint: '>=8.0.0' - svelte: '>=3.0.0' - svelte-eslint-parser: ^0.33.0 - vue-eslint-parser: '>=9.0.0' - peerDependenciesMeta: - astro-eslint-parser: - optional: true - svelte: - optional: true - svelte-eslint-parser: - optional: true - vue-eslint-parser: - optional: true - eslint-plugin-promise@6.1.1: resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 - eslint-plugin-toml@0.11.0: - resolution: {integrity: sha512-sau+YvPU4fWTjB+qtBt3n8WS87aoDCs+BVbSUAemGaIsRNbvR9uEk+Tt892iLHTGvp/DPWYoCX4/8DoyAbB+sQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - - eslint-plugin-unicorn@52.0.0: - resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} + eslint-plugin-unicorn@48.0.1: + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} engines: {node: '>=16'} peerDependencies: - eslint: '>=8.56.0' + eslint: '>=8.44.0' eslint-plugin-unused-imports@3.1.0: resolution: {integrity: sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==} @@ -828,19 +705,6 @@ packages: '@typescript-eslint/eslint-plugin': optional: true - eslint-plugin-vitest@0.5.3: - resolution: {integrity: sha512-D0iu6ppP6FmNSZP4cdhEXqyI+fuW6JwwWdECRrNymd1jiVgUmDgSvtryytonNxHQQWhGNmZM3V/qvpXttH1rRQ==} - engines: {node: ^18.0.0 || >= 20.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': '*' - eslint: ^8.57.0 || ^9.0.0 - vitest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - vitest: - optional: true - eslint-plugin-vue@9.25.0: resolution: {integrity: sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==} engines: {node: ^14.17.0 || >=16.0.0} @@ -853,41 +717,27 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-processor-vue-blocks@0.1.2: - resolution: {integrity: sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==} - peerDependencies: - '@vue/compiler-sfc': ^3.3.0 - eslint: ^8.50.0 || ^9.0.0 - eslint-rule-composer@0.3.0: resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} engines: {node: '>=4.0.0'} + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@9.0.0: - resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true - espree@10.0.1: - resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -900,20 +750,20 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + event-stream@3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -922,6 +772,10 @@ packages: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -931,9 +785,13 @@ packages: fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -947,13 +805,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -965,36 +819,44 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} - - get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + fx@34.0.0: + resolution: {integrity: sha512-/fZih3/WLsrtlaj2mahjWxAmyuikmcl3D5kKPqLtFmEilLsy9wp0+/vEmfvYXXhwJc+ajtCFDCf+yttXmPMHSQ==} + hasBin: true - get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.0: - resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} get-tsconfig@4.7.3: resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} @@ -1012,22 +874,13 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - globals@15.0.0: - resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} - engines: {node: '>=18'} - globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -1036,6 +889,10 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -1056,35 +913,34 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - - ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} @@ -1102,8 +958,14 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} is-alphabetical@1.0.4: @@ -1112,8 +974,9 @@ packages: is-alphanumerical@1.0.4: resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -1136,6 +999,13 @@ packages: is-core-module@2.13.0: resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -1158,8 +1028,8 @@ packages: is-hexadecimal@1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} is-number-object@1.0.7: @@ -1178,12 +1048,9 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -1193,13 +1060,16 @@ packages: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} - is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1251,8 +1121,8 @@ packages: resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1264,8 +1134,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} locate-path@5.0.0: @@ -1276,10 +1146,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -1294,8 +1160,8 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} mdast-util-from-markdown@0.8.5: resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} @@ -1303,9 +1169,6 @@ packages: mdast-util-to-string@2.0.0: resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1317,10 +1180,6 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -1332,10 +1191,6 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -1343,64 +1198,54 @@ packages: resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} - ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.groupby@1.0.0: - resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} - object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} @@ -1414,10 +1259,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -1426,10 +1267,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -1441,10 +1278,6 @@ packages: parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - parse-gitignore@2.0.0: - resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} - engines: {node: '>=14'} - parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -1453,18 +1286,14 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -1479,39 +1308,34 @@ packages: pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + postcss-selector-parser@6.0.16: resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -1531,18 +1355,14 @@ packages: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true - regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} regjsparser@0.10.0: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1558,11 +1378,20 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} @@ -1572,16 +1401,19 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} hasBin: true + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1590,23 +1422,21 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -1623,6 +1453,12 @@ packages: spdx-license-ids@3.0.13: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + + stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1631,15 +1467,16 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -1653,10 +1490,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -1681,43 +1514,37 @@ packages: resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} engines: {node: '>=12.20'} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toml-eslint-parser@0.9.3: - resolution: {integrity: sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - ts-api-utils@1.0.2: - resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' - tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1734,35 +1561,39 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1779,11 +1610,19 @@ packages: peerDependencies: eslint: '>=6.0.0' + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webpod@0.0.2: + resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} + hasBin: true + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} which@2.0.2: @@ -1791,6 +1630,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1799,14 +1643,13 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -1818,24 +1661,12 @@ packages: resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} engines: {node: '>= 14'} - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - - zx@8.0.1: - resolution: {integrity: sha512-Y+ITW1GQjADk7qgrbhnukMgoNsJmlyx53cUQ6/6NXU+BMBdCbTc6flTOHUctmzKvPjTmdwaddzJY/dbLie9sQg==} + zx@7.2.3: + resolution: {integrity: sha512-QODu38nLlYXg/B/Gw7ZKiZrvPkEsjPN3LQ5JFXM7h0JvwhEdPNNl+4Ao1y4+o3CLNiDUNcwzQYZ4/Ko7kKzCMA==} engines: {node: '>= 16.0.0'} hasBin: true @@ -1843,60 +1674,91 @@ snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} - '@antfu/eslint-config@2.15.0(@vue/compiler-sfc@3.4.23)(eslint@9.0.0)(typescript@5.2.2)': - dependencies: - '@antfu/install-pkg': 0.3.2 - '@clack/prompts': 0.7.0 - '@stylistic/eslint-plugin': 1.7.2(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - eslint-config-flat-gitignore: 0.1.5 - eslint-flat-config-utils: 0.2.3 - eslint-merge-processors: 0.1.0(eslint@9.0.0) - eslint-plugin-antfu: 2.1.2(eslint@9.0.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@9.0.0) - eslint-plugin-import-x: 0.5.0(eslint@9.0.0)(typescript@5.2.2) - eslint-plugin-jsdoc: 48.2.3(eslint@9.0.0) - eslint-plugin-jsonc: 2.15.1(eslint@9.0.0) - eslint-plugin-markdown: 4.0.1(eslint@9.0.0) - eslint-plugin-n: 17.2.1(eslint@9.0.0) + '@antfu/eslint-config-basic@0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2)': + dependencies: + eslint: 8.57.0 + eslint-plugin-antfu: 0.41.4(eslint@8.57.0)(typescript@5.2.2) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) + eslint-plugin-html: 7.1.0 + eslint-plugin-import: eslint-plugin-i@2.28.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) + eslint-plugin-jsdoc: 46.10.1(eslint@8.57.0) + eslint-plugin-jsonc: 2.15.1(eslint@8.57.0) + eslint-plugin-markdown: 3.0.1(eslint@8.57.0) + eslint-plugin-n: 16.6.2(eslint@8.57.0) eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-perfectionist: 2.9.0(eslint@9.0.0)(typescript@5.2.2)(vue-eslint-parser@9.4.2(eslint@9.0.0)) - eslint-plugin-toml: 0.11.0(eslint@9.0.0) - eslint-plugin-unicorn: 52.0.0(eslint@9.0.0) - eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) - eslint-plugin-vitest: 0.5.3(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - eslint-plugin-vue: 9.25.0(eslint@9.0.0) - eslint-plugin-yml: 1.14.0(eslint@9.0.0) - eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.0.0) - globals: 15.0.0 + eslint-plugin-promise: 6.1.1(eslint@8.57.0) + eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) + eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) + eslint-plugin-yml: 1.14.0(eslint@8.57.0) jsonc-eslint-parser: 2.4.0 - local-pkg: 0.5.0 - parse-gitignore: 2.0.0 - picocolors: 1.0.0 - toml-eslint-parser: 0.9.3 - vue-eslint-parser: 9.4.2(eslint@9.0.0) yaml-eslint-parser: 1.2.2 - yargs: 17.7.2 transitivePeerDependencies: - - '@vue/compiler-sfc' + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack - supports-color - - svelte - typescript - - vitest - '@antfu/install-pkg@0.3.2': + '@antfu/eslint-config-ts@0.41.4(eslint@8.57.0)(typescript@5.2.2)': + dependencies: + '@antfu/eslint-config-basic': 0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + eslint: 8.57.0 + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + + '@antfu/eslint-config-vue@0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2)': dependencies: - execa: 8.0.1 + '@antfu/eslint-config-basic': 0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + '@antfu/eslint-config-ts': 0.41.4(eslint@8.57.0)(typescript@5.2.2) + eslint: 8.57.0 + eslint-plugin-vue: 9.25.0(eslint@8.57.0) + local-pkg: 0.4.3 + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript + + '@antfu/eslint-config@0.41.4(eslint@8.57.0)(typescript@5.2.2)': + dependencies: + '@antfu/eslint-config-vue': 0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + eslint: 8.57.0 + eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) + eslint-plugin-html: 7.1.0 + eslint-plugin-import: eslint-plugin-i@2.28.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) + eslint-plugin-jsonc: 2.15.1(eslint@8.57.0) + eslint-plugin-n: 16.6.2(eslint@8.57.0) + eslint-plugin-promise: 6.1.1(eslint@8.57.0) + eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) + eslint-plugin-vue: 9.25.0(eslint@8.57.0) + eslint-plugin-yml: 1.14.0(eslint@8.57.0) + jsonc-eslint-parser: 2.4.0 + yaml-eslint-parser: 1.2.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - typescript '@babel/code-frame@7.22.10': dependencies: '@babel/highlight': 7.22.10 chalk: 2.4.2 - '@babel/helper-string-parser@7.24.1': {} - '@babel/helper-validator-identifier@7.22.20': {} '@babel/highlight@7.22.10': @@ -1905,63 +1767,26 @@ snapshots: chalk: 2.4.2 js-tokens: 4.0.0 - '@babel/parser@7.24.4': - dependencies: - '@babel/types': 7.24.0 - - '@babel/types@7.24.0': - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - - '@clack/core@0.3.4': - dependencies: - picocolors: 1.0.0 - sisteransi: 1.0.5 - - '@clack/prompts@0.7.0': - dependencies: - '@clack/core': 0.3.4 - picocolors: 1.0.0 - sisteransi: 1.0.5 - - '@es-joy/jsdoccomment@0.42.0': + '@es-joy/jsdoccomment@0.41.0': dependencies: comment-parser: 1.4.1 esquery: 1.5.0 jsdoc-type-pratt-parser: 4.0.0 - '@eslint-community/eslint-utils@4.4.0(eslint@9.0.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: - eslint: 9.0.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.0': {} - '@eslint-community/regexpp@4.6.2': {} - '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/eslintrc@3.0.2': - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 10.0.1 - globals: 14.0.0 - ignore: 5.2.4 + globals: 13.24.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -1969,9 +1794,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.0.0': {} + '@eslint/js@8.57.0': {} - '@humanwhocodes/config-array@0.12.3': + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 @@ -1992,8 +1817,6 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/sourcemap-codec@1.4.15': {} - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2009,68 +1832,10 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@stylistic/eslint-plugin-js@1.7.2(eslint@9.0.0)': - dependencies: - '@types/eslint': 8.56.9 - acorn: 8.11.3 - escape-string-regexp: 4.0.0 - eslint: 9.0.0 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - - '@stylistic/eslint-plugin-jsx@1.7.2(eslint@9.0.0)': - dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) - '@types/eslint': 8.56.9 - eslint: 9.0.0 - estraverse: 5.3.0 - picomatch: 4.0.2 - - '@stylistic/eslint-plugin-plus@1.7.2(eslint@9.0.0)(typescript@5.2.2)': - dependencies: - '@types/eslint': 8.56.9 - '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@stylistic/eslint-plugin-ts@1.7.2(eslint@9.0.0)(typescript@5.2.2)': - dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) - '@types/eslint': 8.56.9 - '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@stylistic/eslint-plugin@1.7.2(eslint@9.0.0)(typescript@5.2.2)': - dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) - '@stylistic/eslint-plugin-jsx': 1.7.2(eslint@9.0.0) - '@stylistic/eslint-plugin-plus': 1.7.2(eslint@9.0.0)(typescript@5.2.2) - '@stylistic/eslint-plugin-ts': 1.7.2(eslint@9.0.0)(typescript@5.2.2) - '@types/eslint': 8.56.9 - eslint: 9.0.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@types/eslint@8.56.9': - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.12 - - '@types/estree@1.0.5': {} - '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.1 '@types/node': 20.12.7 - optional: true - - '@types/json-schema@7.0.12': {} '@types/json-schema@7.0.15': {} @@ -2079,35 +1844,41 @@ snapshots: '@types/jsonfile@6.1.1': dependencies: '@types/node': 20.12.7 - optional: true '@types/mdast@3.0.12': dependencies: '@types/unist': 2.0.7 + '@types/minimist@1.2.5': {} + + '@types/node@18.19.31': + dependencies: + undici-types: 5.26.5 + '@types/node@20.12.7': dependencies: undici-types: 5.26.5 - optional: true '@types/normalize-package-data@2.4.1': {} - '@types/semver@7.5.0': {} + '@types/ps-tree@1.1.6': {} '@types/semver@7.5.8': {} '@types/unist@2.0.7': {} - '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2)': + '@types/which@3.0.3': {} + + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/type-utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 7.7.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 - eslint: 9.0.0 + eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -2118,102 +1889,67 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.4.1(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2)': dependencies: - '@typescript-eslint/scope-manager': 6.4.1 - '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.4.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 - eslint: 9.0.0 + eslint: 8.57.0 optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/scope-manager@5.62.0': dependencies: - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4 - eslint: 9.0.0 - optionalDependencies: - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/scope-manager@6.4.1': - dependencies: - '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/visitor-keys': 6.4.1 - - '@typescript-eslint/scope-manager@7.7.0': - dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 - - '@typescript-eslint/type-utils@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.2.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 9.0.0 + eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.2.2) optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/types@6.4.1': {} + '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@7.7.0': {} - - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.2.2)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.2.2) - optionalDependencies: - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@6.4.1(typescript@5.2.2)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2)': dependencies: - '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/visitor-keys': 6.4.1 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.2.2) + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.2.2) optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.7.0(typescript@5.2.2)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.2.2)': dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 + minimatch: 9.0.3 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.2.2) optionalDependencies: @@ -2221,93 +1957,53 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.2.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) - eslint: 9.0.0 - semver: 7.5.4 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.2.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) - eslint: 9.0.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) + eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@6.21.0': + '@typescript-eslint/visitor-keys@5.62.0': dependencies: - '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@6.4.1': + '@typescript-eslint/visitor-keys@6.21.0': dependencies: - '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.7.0': - dependencies: - '@typescript-eslint/types': 7.7.0 - eslint-visitor-keys: 3.4.3 - - '@vue/compiler-core@3.4.23': - dependencies: - '@babel/parser': 7.24.4 - '@vue/shared': 3.4.23 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.0 - - '@vue/compiler-dom@3.4.23': - dependencies: - '@vue/compiler-core': 3.4.23 - '@vue/shared': 3.4.23 - - '@vue/compiler-sfc@3.4.23': - dependencies: - '@babel/parser': 7.24.4 - '@vue/compiler-core': 3.4.23 - '@vue/compiler-dom': 3.4.23 - '@vue/compiler-ssr': 3.4.23 - '@vue/shared': 3.4.23 - estree-walker: 2.0.2 - magic-string: 0.30.10 - postcss: 8.4.38 - source-map-js: 1.2.0 - - '@vue/compiler-ssr@3.4.23': - dependencies: - '@vue/compiler-dom': 3.4.23 - '@vue/shared': 3.4.23 - - '@vue/shared@3.4.23': {} + '@ungap/structured-clone@1.2.0': {} acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - acorn-jsx@5.3.2(acorn@8.9.0): - dependencies: - acorn: 8.9.0 - acorn@8.11.3: {} - acorn@8.9.0: {} - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -2333,44 +2029,59 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.0: + array-buffer-byte-length@1.0.1: dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 + call-bind: 1.0.7 + is-array-buffer: 3.0.4 - array-includes@3.1.6: + array-includes@3.1.8: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 is-string: 1.0.7 array-union@2.1.0: {} - array.prototype.findlastindex@1.2.2: + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.0 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.1: + array.prototype.flatmap@1.3.2: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.1: + arraybuffer.prototype.slice@1.0.3: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 - available-typed-arrays@1.0.5: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 balanced-match@1.0.2: {} @@ -2389,23 +2100,21 @@ snapshots: dependencies: fill-range: 7.0.1 - browserslist@4.23.0: - dependencies: - caniuse-lite: 1.0.30001610 - electron-to-chromium: 1.4.739 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) - builtin-modules@3.3.0: {} - call-bind@1.0.2: + builtins@5.1.0: dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.0 + semver: 7.6.0 - callsites@3.1.0: {} + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 - caniuse-lite@1.0.30001610: {} + callsites@3.1.0: {} chalk@2.4.2: dependencies: @@ -2418,24 +2127,20 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.3.0: {} + character-entities-legacy@1.1.4: {} character-entities@1.2.4: {} character-reference-invalid@1.1.4: {} - ci-info@4.0.0: {} + ci-info@3.9.0: {} clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -2454,10 +2159,6 @@ snapshots: consola@3.2.3: {} - core-js-compat@3.37.0: - dependencies: - browserslist: 4.23.0 - cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -2466,6 +2167,26 @@ snapshots: cssesc@3.0.0: {} + data-uri-to-buffer@4.0.1: {} + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + debug@3.2.7: dependencies: ms: 2.1.3 @@ -2476,9 +2197,16 @@ snapshots: deep-is@0.1.4: {} - define-properties@1.2.0: + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: dependencies: - has-property-descriptors: 1.0.0 + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 dir-glob@3.0.1: @@ -2493,71 +2221,106 @@ snapshots: dependencies: esutils: 2.0.3 - eastasianwidth@0.2.0: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 - electron-to-chromium@1.4.739: {} + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - enhanced-resolve@5.16.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - entities@4.5.0: {} error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.21.2: - dependencies: - array-buffer-byte-length: 1.0.0 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 - get-symbol-description: 1.0.0 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 globalthis: 1.0.3 gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 is-callable: 1.2.7 - is-negative-zero: 2.0.2 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 is-string: 1.0.7 - is-typed-array: 1.1.10 + is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.12.3 + object-inspect: 1.13.1 object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 + which-typed-array: 1.1.15 - es-set-tostringtag@2.0.1: + es-define-property@1.0.0: dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - has-tostringtag: 1.0.0 + get-intrinsic: 1.2.4 - es-shim-unscopables@1.0.0: + es-errors@1.3.0: {} + + es-object-atoms@1.0.0: dependencies: - has: 1.0.3 + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 es-to-primitive@1.2.1: dependencies: @@ -2565,144 +2328,141 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - escalade@3.1.2: {} - escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.0(eslint@9.0.0): - dependencies: - eslint: 9.0.0 - semver: 7.5.4 - - eslint-config-flat-gitignore@0.1.5: + eslint-compat-utils@0.5.0(eslint@8.57.0): dependencies: - find-up: 7.0.0 - parse-gitignore: 2.0.0 + eslint: 8.57.0 + semver: 7.6.0 - eslint-config-standard-with-typescript@43.0.1(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0)(typescript@5.2.2): + eslint-config-standard-with-typescript@38.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0)(typescript@5.2.2): dependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.4.1(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) - eslint-plugin-n: 17.2.1(eslint@9.0.0) - eslint-plugin-promise: 6.1.1(eslint@9.0.0) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + eslint: 8.57.0 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) + eslint-plugin-n: 16.6.2(eslint@8.57.0) + eslint-plugin-promise: 6.1.1(eslint@8.57.0) typescript: 5.2.2 transitivePeerDependencies: - supports-color - eslint-config-standard@17.1.0(eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0): - dependencies: - eslint: 9.0.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) - eslint-plugin-n: 17.2.1(eslint@9.0.0) - eslint-plugin-promise: 6.1.1(eslint@9.0.0) - - eslint-flat-config-utils@0.2.3: + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@types/eslint': 8.56.9 - pathe: 1.1.2 + eslint: 8.57.0 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) + eslint-plugin-n: 16.6.2(eslint@8.57.0) + eslint-plugin-promise: 6.1.1(eslint@8.57.0) - eslint-import-resolver-node@0.3.7: + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.0 + is-core-module: 2.13.1 resolve: 1.22.4 transitivePeerDependencies: - supports-color - eslint-import-resolver-node@0.3.9: + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: debug: 3.2.7 - is-core-module: 2.13.0 - resolve: 1.22.4 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-merge-processors@0.1.0(eslint@9.0.0): - dependencies: - eslint: 9.0.0 - - eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.7)(eslint@9.0.0): + eslint-plugin-antfu@0.41.4(eslint@8.57.0)(typescript@5.2.2): dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - eslint-import-resolver-node: 0.3.7 + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2) transitivePeerDependencies: + - eslint - supports-color + - typescript - eslint-plugin-antfu@2.1.2(eslint@9.0.0): + eslint-plugin-es-x@7.6.0(eslint@8.57.0): dependencies: - eslint: 9.0.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + eslint: 8.57.0 + eslint-compat-utils: 0.5.0(eslint@8.57.0) - eslint-plugin-es-x@7.6.0(eslint@9.0.0): + eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@eslint-community/regexpp': 4.6.2 - eslint: 9.0.0 - eslint-compat-utils: 0.5.0(eslint@9.0.0) + escape-string-regexp: 1.0.5 + eslint: 8.57.0 + ignore: 5.3.1 - eslint-plugin-eslint-comments@3.2.0(eslint@9.0.0): + eslint-plugin-html@7.1.0: dependencies: - escape-string-regexp: 1.0.5 - eslint: 9.0.0 - ignore: 5.2.4 + htmlparser2: 8.0.2 - eslint-plugin-import-x@0.5.0(eslint@9.0.0)(typescript@5.2.2): + eslint-plugin-i@2.28.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0): dependencies: - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - debug: 4.3.4 - doctrine: 3.0.0 - eslint: 9.0.0 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) get-tsconfig: 4.7.3 is-glob: 4.0.3 - minimatch: 9.0.3 + minimatch: 3.1.2 + resolve: 1.22.4 semver: 7.6.0 transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack - supports-color - - typescript - eslint-plugin-import@2.28.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0): dependencies: - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.0.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.7)(eslint@9.0.0) - has: 1.0.3 - is-core-module: 2.13.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@48.2.3(eslint@9.0.0): + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2): dependencies: - '@es-joy/jsdoccomment': 0.42.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.2.2) + eslint: 8.57.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jsdoc@46.10.1(eslint@8.57.0): + dependencies: + '@es-joy/jsdoccomment': 0.41.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.3.4 escape-string-regexp: 4.0.0 - eslint: 9.0.0 + eslint: 8.57.0 esquery: 1.5.0 is-builtin-module: 3.2.1 semver: 7.6.0 @@ -2710,177 +2470,142 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.15.1(eslint@9.0.0): + eslint-plugin-jsonc@2.15.1(eslint@8.57.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - eslint: 9.0.0 - eslint-compat-utils: 0.5.0(eslint@9.0.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + eslint: 8.57.0 + eslint-compat-utils: 0.5.0(eslint@8.57.0) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 synckit: 0.6.2 - eslint-plugin-markdown@4.0.1(eslint@9.0.0): + eslint-plugin-markdown@3.0.1(eslint@8.57.0): dependencies: - eslint: 9.0.0 + eslint: 8.57.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - eslint-plugin-n@17.2.1(eslint@9.0.0): + eslint-plugin-n@16.6.2(eslint@8.57.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - enhanced-resolve: 5.16.0 - eslint: 9.0.0 - eslint-plugin-es-x: 7.6.0(eslint@9.0.0) - get-tsconfig: 4.7.0 - globals: 14.0.0 - ignore: 5.2.4 - minimatch: 9.0.3 - semver: 7.5.4 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + builtins: 5.1.0 + eslint: 8.57.0 + eslint-plugin-es-x: 7.6.0(eslint@8.57.0) + get-tsconfig: 4.7.3 + globals: 13.24.0 + ignore: 5.3.1 + is-builtin-module: 3.2.1 + is-core-module: 2.13.0 + minimatch: 3.1.2 + resolve: 1.22.4 + semver: 7.6.0 eslint-plugin-no-only-tests@3.1.0: {} - eslint-plugin-perfectionist@2.9.0(eslint@9.0.0)(typescript@5.2.2)(vue-eslint-parser@9.4.2(eslint@9.0.0)): - dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - minimatch: 9.0.3 - natural-compare-lite: 1.4.0 - optionalDependencies: - vue-eslint-parser: 9.4.2(eslint@9.0.0) - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-promise@6.1.1(eslint@9.0.0): - dependencies: - eslint: 9.0.0 - - eslint-plugin-toml@0.11.0(eslint@9.0.0): + eslint-plugin-promise@6.1.1(eslint@8.57.0): dependencies: - debug: 4.3.4 - eslint: 9.0.0 - eslint-compat-utils: 0.5.0(eslint@9.0.0) - lodash: 4.17.21 - toml-eslint-parser: 0.9.3 - transitivePeerDependencies: - - supports-color + eslint: 8.57.0 - eslint-plugin-unicorn@52.0.0(eslint@9.0.0): + eslint-plugin-unicorn@48.0.1(eslint@8.57.0): dependencies: '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@eslint/eslintrc': 2.1.4 - ci-info: 4.0.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + ci-info: 3.9.0 clean-regexp: 1.0.0 - core-js-compat: 3.37.0 - eslint: 9.0.0 + eslint: 8.57.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 jsesc: 3.0.2 + lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.5.4 + semver: 7.6.0 strip-indent: 3.0.0 - transitivePeerDependencies: - - supports-color - eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0): + eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0): dependencies: - eslint: 9.0.0 + eslint: 8.57.0 eslint-rule-composer: 0.3.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - - eslint-plugin-vitest@0.5.3(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2): - dependencies: - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - transitivePeerDependencies: - - supports-color - - typescript + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) - eslint-plugin-vue@9.25.0(eslint@9.0.0): + eslint-plugin-vue@9.25.0(eslint@8.57.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - eslint: 9.0.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + eslint: 8.57.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.16 semver: 7.6.0 - vue-eslint-parser: 9.4.2(eslint@9.0.0) + vue-eslint-parser: 9.4.2(eslint@8.57.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-yml@1.14.0(eslint@9.0.0): + eslint-plugin-yml@1.14.0(eslint@8.57.0): dependencies: debug: 4.3.4 - eslint: 9.0.0 - eslint-compat-utils: 0.5.0(eslint@9.0.0) + eslint: 8.57.0 + eslint-compat-utils: 0.5.0(eslint@8.57.0) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.0.0): - dependencies: - '@vue/compiler-sfc': 3.4.23 - eslint: 9.0.0 - eslint-rule-composer@0.3.0: {} - eslint-scope@7.2.2: + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 - estraverse: 5.3.0 + estraverse: 4.3.0 - eslint-scope@8.0.1: + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} - - eslint@9.0.0: + eslint@8.57.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 3.0.2 - '@eslint/js': 9.0.0 - '@humanwhocodes/config-array': 0.12.3 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 + doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 - eslint-visitor-keys: 4.0.0 - espree: 10.0.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 + file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 + globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 + js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -2892,16 +2617,10 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.0.1: + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 4.0.0 - - espree@9.6.1: - dependencies: - acorn: 8.9.0 - acorn-jsx: 5.3.2(acorn@8.9.0) eslint-visitor-keys: 3.4.3 esquery@1.5.0: @@ -2912,23 +2631,21 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@5.3.0: {} + estraverse@4.3.0: {} - estree-walker@2.0.2: {} + estraverse@5.3.0: {} esutils@2.0.3: {} - execa@8.0.1: + event-stream@3.3.4: dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 fast-deep-equal@3.1.3: {} @@ -2940,6 +2657,14 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.5 + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -2948,9 +2673,14 @@ snapshots: dependencies: reusify: 1.0.4 - file-entry-cache@8.0.0: + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-entry-cache@6.0.1: dependencies: - flat-cache: 4.0.1 + flat-cache: 3.2.0 fill-range@7.0.1: dependencies: @@ -2966,16 +2696,11 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@7.0.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - unicorn-magic: 0.1.0 - - flat-cache@4.0.1: + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 + rimraf: 3.0.2 flatted@3.3.1: {} @@ -2988,42 +2713,48 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - function-bind@1.1.1: {} + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + from@0.1.7: {} - function.prototype.name@1.1.5: + fs-extra@11.2.0: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - functions-have-names: 1.2.3 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 - functions-have-names@1.2.3: {} + fs.realpath@1.0.0: {} - get-caller-file@2.0.5: {} + function-bind@1.1.1: {} - get-intrinsic@1.2.0: - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 + function-bind@1.1.2: {} - get-intrinsic@1.2.1: + function.prototype.name@1.1.6: dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 - get-stream@8.0.1: {} + functions-have-names@1.2.3: {} + + fx@34.0.0: {} - get-symbol-description@1.0.0: + get-intrinsic@1.2.4: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 - get-tsconfig@4.7.0: + get-symbol-description@1.0.2: dependencies: - resolve-pkg-maps: 1.0.0 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 get-tsconfig@4.7.3: dependencies: @@ -3045,21 +2776,22 @@ snapshots: minipass: 7.0.3 path-scurry: 1.10.1 - globals@13.20.0: + glob@7.2.3: dependencies: - type-fest: 0.20.2 + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 globals@13.24.0: dependencies: type-fest: 0.20.2 - globals@14.0.0: {} - - globals@15.0.0: {} - globalthis@1.0.3: dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 globby@11.1.0: dependencies: @@ -3070,9 +2802,17 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 4.0.0 + gopd@1.0.1: dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.4 graceful-fs@4.2.11: {} @@ -3084,15 +2824,15 @@ snapshots: has-flag@4.0.0: {} - has-property-descriptors@1.0.0: + has-property-descriptors@1.0.2: dependencies: - get-intrinsic: 1.2.0 + es-define-property: 1.0.0 - has-proto@1.0.1: {} + has-proto@1.0.3: {} has-symbols@1.0.3: {} - has-tostringtag@1.0.0: + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -3100,11 +2840,18 @@ snapshots: dependencies: function-bind: 1.1.1 - hosted-git-info@2.8.9: {} + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 - human-signals@5.0.0: {} + hosted-git-info@2.8.9: {} - ignore@5.2.4: {} + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 ignore@5.3.1: {} @@ -3117,11 +2864,18 @@ snapshots: indent-string@4.0.0: {} - internal-slot@1.0.5: + inflight@1.0.6: dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - side-channel: 1.0.4 + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 is-alphabetical@1.0.4: {} @@ -3130,11 +2884,10 @@ snapshots: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - is-array-buffer@3.0.2: + is-array-buffer@3.0.4: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-typed-array: 1.1.10 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-arrayish@0.2.1: {} @@ -3144,8 +2897,8 @@ snapshots: is-boolean-object@1.1.2: dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 is-builtin-module@3.2.1: dependencies: @@ -3157,9 +2910,17 @@ snapshots: dependencies: has: 1.0.3 + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + is-date-object@1.0.5: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-decimal@1.0.4: {} @@ -3173,11 +2934,11 @@ snapshots: is-hexadecimal@1.0.4: {} - is-negative-zero@2.0.2: {} + is-negative-zero@2.0.3: {} is-number-object@1.0.7: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -3185,34 +2946,30 @@ snapshots: is-regex@1.1.4: dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 - is-shared-array-buffer@1.0.2: + is-shared-array-buffer@1.0.3: dependencies: - call-bind: 1.0.2 - - is-stream@3.0.0: {} + call-bind: 1.0.7 is-string@1.0.7: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - is-typed-array@1.1.10: + is-typed-array@1.1.13: dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 + which-typed-array: 1.1.15 is-weakref@1.0.2: dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 + + isarray@2.0.5: {} isexe@2.0.0: {} @@ -3250,12 +3007,16 @@ snapshots: jsonc-eslint-parser@2.4.0: dependencies: - acorn: 8.9.0 + acorn: 8.11.3 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.5.4 + semver: 7.6.0 - jsonc-parser@3.2.1: {} + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 keyv@4.5.4: dependencies: @@ -3268,10 +3029,7 @@ snapshots: lines-and-columns@1.2.4: {} - local-pkg@0.5.0: - dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 + local-pkg@0.4.3: {} locate-path@5.0.0: dependencies: @@ -3281,10 +3039,6 @@ snapshots: dependencies: p-locate: 5.0.0 - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - lodash.merge@4.6.2: {} lodash@4.17.21: {} @@ -3295,9 +3049,7 @@ snapshots: dependencies: yallist: 4.0.0 - magic-string@0.30.10: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + map-stream@0.1.0: {} mdast-util-from-markdown@0.8.5: dependencies: @@ -3311,8 +3063,6 @@ snapshots: mdast-util-to-string@2.0.0: {} - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromark@2.11.4: @@ -3327,8 +3077,6 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 - mimic-fn@4.0.0: {} - min-indent@1.0.1: {} minimatch@3.1.2: @@ -3339,32 +3087,23 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: - dependencies: - brace-expansion: 2.0.1 - minimist@1.2.8: {} minipass@7.0.3: {} - mlly@1.6.1: - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.5.3 - ms@2.1.2: {} ms@2.1.3: {} - nanoid@3.3.7: {} - - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} - node-releases@2.0.14: {} + node-domexception@1.0.0: {} + + node-fetch@3.3.1: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 normalize-package-data@2.5.0: dependencies: @@ -3373,47 +3112,43 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 - object-inspect@1.12.3: {} + object-inspect@1.13.1: {} object-keys@1.1.1: {} - object.assign@4.1.4: + object.assign@4.1.5: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.7 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - object.fromentries@2.0.6: + object.fromentries@2.0.8: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - object.groupby@1.0.0: + object.groupby@1.0.3: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 - object.values@1.1.6: + object.values@1.2.0: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 - onetime@6.0.0: + once@1.4.0: dependencies: - mimic-fn: 4.0.0 + wrappy: 1.0.2 optionator@0.9.3: dependencies: @@ -3432,10 +3167,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.0.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -3444,10 +3175,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - p-try@2.2.0: {} parent-module@1.0.1: @@ -3463,8 +3190,6 @@ snapshots: is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - parse-gitignore@2.0.0: {} - parse-json@5.2.0: dependencies: '@babel/code-frame': 7.22.10 @@ -3474,12 +3199,10 @@ snapshots: path-exists@4.0.0: {} - path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-scurry@1.10.1: @@ -3491,35 +3214,27 @@ snapshots: pathe@1.1.1: {} - pathe@1.1.2: {} - - picocolors@1.0.0: {} + pause-stream@0.0.11: + dependencies: + through: 2.3.8 picomatch@2.3.1: {} - picomatch@4.0.2: {} - - pkg-types@1.0.3: - dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 - pathe: 1.1.1 - pluralize@8.0.0: {} + possible-typed-array-names@1.0.0: {} + postcss-selector-parser@6.0.16: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.38: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - prelude-ls@1.2.1: {} + ps-tree@1.2.0: + dependencies: + event-stream: 3.3.4 + punycode@2.3.0: {} queue-microtask@1.2.3: {} @@ -3539,18 +3254,17 @@ snapshots: regexp-tree@0.1.27: {} - regexp.prototype.flags@1.4.3: + regexp.prototype.flags@1.5.2: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 regjsparser@0.10.0: dependencies: jsesc: 0.5.0 - require-directory@2.1.1: {} - resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -3563,27 +3277,50 @@ snapshots: reusify@1.0.4: {} + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-regex-test@1.0.0: + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-regex-test@1.0.3: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 + call-bind: 1.0.7 + es-errors: 1.3.0 is-regex: 1.1.4 semver@5.7.2: {} semver@6.3.1: {} - semver@7.5.4: + semver@7.6.0: dependencies: lru-cache: 6.0.0 - semver@7.6.0: + set-function-length@1.2.2: dependencies: - lru-cache: 6.0.0 + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 shebang-command@2.0.0: dependencies: @@ -3591,19 +3328,18 @@ snapshots: shebang-regex@3.0.0: {} - side-channel@1.0.4: + side-channel@1.0.6: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 signal-exit@4.1.0: {} - sisteransi@1.0.5: {} - slash@3.0.0: {} - source-map-js@1.2.0: {} + slash@4.0.0: {} spdx-correct@3.2.0: dependencies: @@ -3624,6 +3360,14 @@ snapshots: spdx-license-ids@3.0.13: {} + split@0.3.3: + dependencies: + through: 2.3.8 + + stream-combiner@0.0.4: + dependencies: + duplexer: 0.1.2 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3636,23 +3380,24 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.trim@1.2.7: + string.prototype.trim@1.2.9: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - string.prototype.trimend@1.0.6: + string.prototype.trimend@1.0.8: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 - string.prototype.trimstart@1.0.6: + string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 strip-ansi@6.0.1: dependencies: @@ -3664,8 +3409,6 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@3.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -3686,37 +3429,34 @@ snapshots: dependencies: tslib: 2.6.2 - tapable@2.2.1: {} - text-table@0.2.0: {} - to-fast-properties@2.0.0: {} + through@2.3.8: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toml-eslint-parser@0.9.3: - dependencies: - eslint-visitor-keys: 3.4.3 - - ts-api-utils@1.0.2(typescript@5.2.2): - dependencies: - typescript: 5.2.2 - ts-api-utils@1.3.0(typescript@5.2.2): dependencies: typescript: 5.2.2 - tsconfig-paths@3.14.2: + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 + tslib@1.14.1: {} + tslib@2.6.2: {} + tsutils@3.21.0(typescript@5.2.2): + dependencies: + tslib: 1.14.1 + typescript: 5.2.2 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -3727,37 +3467,54 @@ snapshots: type-fest@0.8.1: {} - typed-array-length@1.0.4: + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 for-each: 0.3.3 - is-typed-array: 1.1.10 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 - typescript@5.2.2: {} + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 - ufo@1.5.3: {} + typescript@5.2.2: {} unbox-primitive@1.0.2: dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@5.26.5: - optional: true - - unicorn-magic@0.1.0: {} + undici-types@5.26.5: {} unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.7 - update-browserslist-db@1.0.13(browserslist@4.23.0): - dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 + universalify@2.0.1: {} uri-js@4.4.1: dependencies: @@ -3770,19 +3527,23 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vue-eslint-parser@9.4.2(eslint@9.0.0): + vue-eslint-parser@9.4.2(eslint@8.57.0): dependencies: debug: 4.3.4 - eslint: 9.0.0 + eslint: 8.57.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 lodash: 4.17.21 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color + web-streams-polyfill@3.3.3: {} + + webpod@0.0.2: {} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -3791,19 +3552,22 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 - which-typed-array@1.1.9: + which-typed-array@1.1.15: dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 + has-tostringtag: 1.0.2 which@2.0.2: dependencies: isexe: 2.0.0 + which@3.0.1: + dependencies: + isexe: 2.0.0 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -3816,9 +3580,9 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - xml-name-validator@4.0.0: {} + wrappy@1.0.2: {} - y18n@5.0.8: {} + xml-name-validator@4.0.0: {} yallist@4.0.0: {} @@ -3830,23 +3594,22 @@ snapshots: yaml@2.2.2: {} - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} - - zx@8.0.1: - optionalDependencies: + zx@7.2.3: + dependencies: '@types/fs-extra': 11.0.4 - '@types/node': 20.12.7 + '@types/minimist': 1.2.5 + '@types/node': 18.19.31 + '@types/ps-tree': 1.1.6 + '@types/which': 3.0.3 + chalk: 5.3.0 + fs-extra: 11.2.0 + fx: 34.0.0 + globby: 13.2.2 + minimist: 1.2.8 + node-fetch: 3.3.1 + ps-tree: 1.2.0 + webpod: 0.0.2 + which: 3.0.1 + yaml: 2.2.2 From bc40111fb503fe0a622388149b7f4d5a7a17c4dc Mon Sep 17 00:00:00 2001 From: Faust1 Date: Thu, 18 Apr 2024 15:38:19 +0200 Subject: [PATCH 219/344] update script --- scripts/remove-useless-md.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/remove-useless-md.mjs b/scripts/remove-useless-md.mjs index a62851ff5..8ee35b199 100644 --- a/scripts/remove-useless-md.mjs +++ b/scripts/remove-useless-md.mjs @@ -50,8 +50,9 @@ file.on('line', (line) => { isInToc = true } - if (isInToc) + if (isInToc) { return + } if (useLessLines.some(useLessLine => line.includes(useLessLine))) { return From 697ddc1479f8ee01908aea20338fb2f186b28a0e Mon Sep 17 00:00:00 2001 From: Faust1 Date: Thu, 18 Apr 2024 16:23:29 +0200 Subject: [PATCH 220/344] revert changes on pyproject.toml --- packages/python/pyproject.toml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 75db0a8ba..437dde4b0 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -1,5 +1,6 @@ [build-system] -requires = ["setuptools", "wheel"] +requires = ["setuptools", + "wheel"] build-backend = "setuptools.build_meta" [project] @@ -11,28 +12,27 @@ requires-python = ">=3.7" keywords = ["cloud", "HTC", "gRPC", "ArmoniK", "Aneo"] license = {text = "Apache v2.0 LICENSE"} classifiers = [ - "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3", ] dependencies = [ "grpcio", "grpcio-tools", "deprecation" ] - [project.urls] "Homepage" = "https://github.com/aneoconsulting/ArmoniK.Api" "Bug Tracker" = "https://github.com/aneoconsulting/ArmoniK/issues" [tool.setuptools] include-package-data = true -dynamic = { version = { attr = "armonik.__version__" } } +dynamic = {version = {attr = "armonik.__version__"}} [tool.setuptools.packages.find] -where = [ "src" ] -exclude = [ 'tests' ] +where= ["src"] +exclude=['tests'] [tool.setuptools.package-data] -"*" = [ "*.pyi" ] +"*" = ["*.pyi"] [project.optional-dependencies] tests = [ @@ -51,4 +51,4 @@ dev = [ [tool.pytest.ini_options] addopts = [ "--import-mode=importlib", -] +] \ No newline at end of file From dd3e143c95e5a7bbea9d60579ea1978dc6f819e3 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Fri, 19 Apr 2024 09:13:17 +0200 Subject: [PATCH 221/344] chore: update pnpm package --- .docs/package.json | 1 - package.json | 1 - packages/angular/package.json | 1 - packages/web/package.json | 3 +-- 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.docs/package.json b/.docs/package.json index 5bb26da17..9553ca6d2 100644 --- a/.docs/package.json +++ b/.docs/package.json @@ -2,7 +2,6 @@ "name": "armonik-api-docs", "version": "0.1.0", "private": true, - "packageManager": "pnpm@9.0.2", "scripts": { "prepare": "nuxi prepare", "dev": "nuxi dev", diff --git a/package.json b/package.json index 245d404d1..99472f9ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,5 @@ { "name": "armonik.api", - "packageManager": "pnpm@9.0.2", "scripts": { "ci:publish": "zx scripts/publish.mjs", "ci:publish-edge": "zx scripts/publish-edge.mjs", diff --git a/packages/angular/package.json b/packages/angular/package.json index 90530fded..ea0ce626f 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,7 +1,6 @@ { "name": "armonik.api.angular", "private": true, - "packageManager": "pnpm@9.0.2", "scripts": { "ng": "ng", "start": "ng serve", diff --git a/packages/web/package.json b/packages/web/package.json index f75e39c2d..7048b83ba 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,7 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.16.2", - "packageManager": "pnpm@9.0.2", + "version": "3.16.3", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", From 5bd34e7769f583ced9e579c98b858a83775d9cb4 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Thu, 18 Apr 2024 20:43:58 +0200 Subject: [PATCH 222/344] chore: update to version 3.17.0 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index ba330fdf9..9bdf7e010 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.16.2", + "version": "3.17.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index abd0816c5..ccf9ca500 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.16.2) +set(version 3.17.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 076c7cd87..b3d16eebf 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.16.2 - 3.16.2 + 3.17.0 + 3.17.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index b7dcbdd1f..ee8a9d8b4 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.16.2 - 3.16.2 + 3.17.0 + 3.17.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index 50b2b5834..d7705d526 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.16.2 - 3.16.2 + 3.17.0 + 3.17.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 5bc260500..6ea6856f3 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.16.2 - 3.16.2 + 3.17.0 + 3.17.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index a299b3ed0..dab31714c 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.16.2 - 3.16.2 + 3.17.0 + 3.17.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index f5da179cb..91471e0fe 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.16.2 - 3.16.2 + 3.17.0 + 3.17.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 1330da881..e729b0738 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.16.2 - 3.16.2 + 3.17.0 + 3.17.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index f60865415..52dd565ad 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.16.2 - 3.16.2 + 3.17.0 + 3.17.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index 7048b83ba..6d73913f3 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.16.3", + "version": "3.17.0", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", From 7d14e6c9316585993cd96ecf5240f076bad70c7c Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Fri, 19 Apr 2024 10:00:25 +0200 Subject: [PATCH 223/344] chore: remove mypy (bad support with gRPC) --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4f21005c4..7f5e6a391 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,8 +96,8 @@ jobs: - name: Lint run: python -m ruff . - - name: Check typing - run: python -m mypy --exclude src/armonik/protogen/ src/ + # - name: Check typing + # run: python -m mypy --exclude src/armonik/protogen/ src/ - name: Check format run: python -m ruff format . From 599ece403300a4e18d2ccce0eacec2b1b86f8dba Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Fri, 19 Apr 2024 10:23:19 +0200 Subject: [PATCH 224/344] chore: small python linting --- .github/workflows/ci.yml | 2 +- packages/python/ruff.toml | 5 +---- packages/python/src/armonik/client/events.py | 8 ++++++-- packages/python/src/armonik/client/sessions.py | 6 +++--- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f5e6a391..95e225889 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -94,7 +94,7 @@ jobs: run: pip install "$(echo pkg/armonik*.whl)[dev]" - name: Lint - run: python -m ruff . + run: python -m ruff check . # - name: Check typing # run: python -m mypy --exclude src/armonik/protogen/ src/ diff --git a/packages/python/ruff.toml b/packages/python/ruff.toml index 134c94968..e887df321 100644 --- a/packages/python/ruff.toml +++ b/packages/python/ruff.toml @@ -10,9 +10,6 @@ fix = false # Enable application of unsafe fixes. unsafe-fixes = false -# Whether to show source code snippets when reporting lint violation. -show-source = false - # Enumerate all fixed violations. show-fixes = true @@ -20,7 +17,7 @@ show-fixes = true preview = false # The minimum Python version targetted is Python 3.10. -target-version = "py310" +target-version = "py38" # Allow imports relative to the "src/armonik" and "test" directories. src = ["src/armonik", "test"] diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index e0639fda4..5cc8c6ba7 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -42,7 +42,9 @@ def __init__(self, grpc_channel: Channel): def get_events( self, session_id: str, - event_types: Iterable[EventTypes], # TODO: make EventTypes an enum when Python 3.8 support will be not supported + event_types: Iterable[ + EventTypes + ], # TODO: make EventTypes an enum when Python 3.8 support will be not supported event_handlers: List[Callable[[str, EventTypes, Event], bool]], task_filter: Optional[Filter] = None, result_filter: Optional[Filter] = None, @@ -64,7 +66,9 @@ def get_events( if task_filter: request.tasks_filters = cast(rawTaskFilters, task_filter.to_disjunction().to_message()) if result_filter: - request.results_filters = cast(rawResultFilters, result_filter.to_disjunction().to_message()) + request.results_filters = cast( + rawResultFilters, result_filter.to_disjunction().to_message() + ) streaming_call = self._client.GetEvents(request) for message in streaming_call: diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 2fa6b3da9..8d170717a 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -170,7 +170,7 @@ def cancel_session(self, session_id: str) -> Session: request = CancelSessionRequest(session_id=session_id) response: CancelSessionResponse = self._client.CancelSession(request) return Session.from_message(response.session) - + def pause_session(self, session_id: str) -> Session: """Pause a session by its id. @@ -215,7 +215,7 @@ def purge_session(self, session_id: str) -> Session: Args: session_id: Id of the session to be purged. - + Returns: session metadata """ @@ -236,7 +236,7 @@ def delete_session(self, session_id: str) -> Session: response: DeleteSessionResponse = self._client.DeleteSession(request) return Session.from_message(response.session) - def stop_submission_session(self, session_id: str, client: bool, worker:bool) -> Session: + def stop_submission_session(self, session_id: str, client: bool, worker: bool) -> Session: """Stops clients and/or workers from submitting new tasks in the given session. Args: From 7862f92b0ce36892eb30b57d659fe82d7bce7c17 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Fri, 19 Apr 2024 10:28:48 +0200 Subject: [PATCH 225/344] new eslint config --- .docs/.eslintignore | 4 - .docs/.eslintrc | 19 - .docs/eslint.config.mjs | 19 + .docs/package.json | 6 +- .docs/pnpm-lock.yaml | 13451 ++++++++++++++++++-------------- .eslintrc | 9 - eslint.config.mjs | 15 + package.json | 12 +- pnpm-lock.yaml | 1725 ++-- scripts/remove-useless-md.mjs | 2 +- 10 files changed, 8487 insertions(+), 6775 deletions(-) delete mode 100644 .docs/.eslintignore delete mode 100644 .docs/.eslintrc create mode 100644 .docs/eslint.config.mjs delete mode 100644 .eslintrc create mode 100644 eslint.config.mjs diff --git a/.docs/.eslintignore b/.docs/.eslintignore deleted file mode 100644 index 81705cc5d..000000000 --- a/.docs/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -dist -node_modules -.output -.nuxt diff --git a/.docs/.eslintrc b/.docs/.eslintrc deleted file mode 100644 index 42c5d3eb0..000000000 --- a/.docs/.eslintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "root": true, - "extends": "@nuxtjs/eslint-config-typescript", - "rules": { - "vue/multi-word-component-names": [ - 0 - ], - "vue/no-multiple-template-root": [ - 0 - ], - "vue/no-restricted-syntax": [ - "error", - { - "selector": "VElement[name='a']", - "message": "Use NuxtLink instead." - } - ] - } -} diff --git a/.docs/eslint.config.mjs b/.docs/eslint.config.mjs new file mode 100644 index 000000000..f9fcf3753 --- /dev/null +++ b/.docs/eslint.config.mjs @@ -0,0 +1,19 @@ +import { createConfigForNuxt } from '@nuxt/eslint-config/flat' + +export default createConfigForNuxt({ + features: { + typescript: true + } +}).prepend({ + rules: { + 'vue/max-attributes-per-line': 'off', + 'vue/no-multiple-template-root': 'off', + 'vue/no-restricted-syntax': 'error' + }, + ignores: [ + 'dist', + 'node_modules', + '.output', + '.nuxt' + ] +}) diff --git a/.docs/package.json b/.docs/package.json index 9553ca6d2..a8e2fe0c6 100644 --- a/.docs/package.json +++ b/.docs/package.json @@ -18,9 +18,9 @@ "nuxt": "^3.6.5" }, "devDependencies": { - "@nuxtjs/eslint-config-typescript": "^12.0.0", + "@nuxt/eslint-config": "^0.3.8", "case-police": "^0.6.1", - "eslint": "^8.47.0", - "markdownlint-cli": "^0.35.0" + "eslint": "^9.0.0", + "markdownlint-cli": "^0.34.0" } } diff --git a/.docs/pnpm-lock.yaml b/.docs/pnpm-lock.yaml index 5e55d0eab..7efb25405 100644 --- a/.docs/pnpm-lock.yaml +++ b/.docs/pnpm-lock.yaml @@ -1,900 +1,6031 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@aneoconsultingfr/armonik-docs-theme': - specifier: ^0.6.13 - version: 0.6.13(@types/node@18.15.3)(@unhead/vue@1.1.28)(eslint@8.47.0)(postcss@8.4.24)(rollup@3.25.1)(typescript@5.0.4)(vite@4.3.9)(vue@3.3.4) - nuxt: - specifier: ^3.6.5 - version: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) - -devDependencies: - '@nuxtjs/eslint-config-typescript': - specifier: ^12.0.0 - version: 12.0.0(eslint@8.47.0)(typescript@5.0.4) - case-police: - specifier: ^0.6.1 - version: 0.6.1 - eslint: - specifier: ^8.47.0 - version: 8.47.0 - markdownlint-cli: - specifier: ^0.35.0 - version: 0.35.0 +importers: + + .: + dependencies: + '@aneoconsultingfr/armonik-docs-theme': + specifier: ^0.6.13 + version: 0.6.13(@types/node@18.15.3)(@unhead/vue@1.2.2(vue@3.3.4))(axios@0.27.2)(change-case@4.1.2)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(postcss@8.4.24)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7))(vue@3.3.4) + nuxt: + specifier: ^3.6.5 + version: 3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4) + devDependencies: + '@nuxt/eslint-config': + specifier: ^0.3.8 + version: 0.3.8(eslint@9.0.0)(typescript@5.0.4) + case-police: + specifier: ^0.6.1 + version: 0.6.1 + eslint: + specifier: ^9.0.0 + version: 9.0.0 + markdownlint-cli: + specifier: ^0.34.0 + version: 0.34.0 packages: - /@aashutoshrathi/word-wrap@1.2.6: + '@aashutoshrathi/word-wrap@1.2.6': resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - /@ampproject/remapping@2.2.0: + '@ampproject/remapping@2.2.0': resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.17 - dev: false - /@aneoconsultingfr/armonik-docs-theme@0.6.13(@types/node@18.15.3)(@unhead/vue@1.1.28)(eslint@8.47.0)(postcss@8.4.24)(rollup@3.25.1)(typescript@5.0.4)(vite@4.3.9)(vue@3.3.4): + '@aneoconsultingfr/armonik-docs-theme@0.6.13': resolution: {integrity: sha512-jXLDJFFC7zeDi8zvRnus5Qe35gS3kRzt5JrSLA6enAgnt8waTg7Yo5vLRpSQwPdX8Yn5ZlbtG7qSBNDzRE19zA==} - dependencies: - '@nuxt-themes/docus': 1.14.6(nuxt@3.6.5)(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) - '@nuxt/devtools': 0.7.6(nuxt@3.6.5)(rollup@3.25.1)(vite@4.3.9) - mermaid: 10.3.1 - nuxt: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) - nuxt-seo-kit: 1.3.9(@unhead/vue@1.1.28)(rollup@3.25.1)(vue@3.3.4) - playwright: 1.37.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@parcel/watcher' - - '@planetscale/database' - - '@types/node' - - '@unhead/vue' - - '@upstash/redis' - - '@vercel/kv' - - '@vue/composition-api' - - async-validator - - axios - - bluebird - - bufferutil - - change-case - - debug - - drauu - - encoding - - eslint - - idb-keyval - - jwt-decode - - less - - meow - - nprogress - - optionator - - postcss - - qrcode - - rollup - - sass - - sortablejs - - stylelint - - stylus - - sugarss - - supports-color - - terser - - typescript - - universal-cookie - - utf-8-validate - - vite - - vls - - vti - - vue - - vue-tsc - dev: false - /@antfu/utils@0.7.4: + '@antfu/utils@0.7.4': resolution: {integrity: sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==} - dev: false - /@antfu/utils@0.7.5: + '@antfu/utils@0.7.5': resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==} - dev: false - /@babel/code-frame@7.18.6: + '@babel/code-frame@7.18.6': resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 - /@babel/compat-data@7.21.0: + '@babel/compat-data@7.21.0': resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} engines: {node: '>=6.9.0'} - dev: false - /@babel/core@7.21.3: + '@babel/core@7.21.3': resolution: {integrity: sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.3 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) - '@babel/helper-module-transforms': 7.21.2 - '@babel/helpers': 7.21.0 - '@babel/parser': 7.22.5 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/generator@7.21.3: + '@babel/generator@7.21.3': resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 - dev: false - /@babel/helper-annotate-as-pure@7.18.6: + '@babel/helper-annotate-as-pure@7.18.6': resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.3): + '@babel/helper-compilation-targets@7.20.7': resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.21.3 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.0 - dev: false - /@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.21.3): + '@babel/helper-create-class-features-plugin@7.21.0': resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-member-expression-to-functions': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-environment-visitor@7.18.9: + '@babel/helper-environment-visitor@7.18.9': resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-function-name@7.21.0: + '@babel/helper-function-name@7.21.0': resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.22.5 - dev: false - /@babel/helper-hoist-variables@7.18.6: + '@babel/helper-hoist-variables@7.18.6': resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/helper-member-expression-to-functions@7.21.0: + '@babel/helper-member-expression-to-functions@7.21.0': resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/helper-module-imports@7.18.6: + '@babel/helper-module-imports@7.18.6': resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/helper-module-transforms@7.21.2: + '@babel/helper-module-transforms@7.21.2': resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} - 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.22.5 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-optimise-call-expression@7.18.6: + '@babel/helper-optimise-call-expression@7.18.6': resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/helper-plugin-utils@7.20.2: + '@babel/helper-plugin-utils@7.20.2': resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-replace-supers@7.20.7: + '@babel/helper-replace-supers@7.20.7': resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-simple-access@7.20.2: + '@babel/helper-simple-access@7.20.2': resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + '@babel/helper-skip-transparent-expression-wrappers@7.20.0': resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/helper-split-export-declaration@7.18.6: + '@babel/helper-split-export-declaration@7.18.6': resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/helper-string-parser@7.22.5: + '@babel/helper-string-parser@7.22.5': resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-validator-identifier@7.22.5: + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.5': resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.21.0: + '@babel/helper-validator-option@7.21.0': resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helpers@7.21.0: + '@babel/helpers@7.21.0': resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/highlight@7.18.6: + '@babel/highlight@7.18.6': resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - /@babel/parser@7.22.10: + '@babel/parser@7.22.10': resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/parser@7.22.5: + '@babel/parser@7.22.5': resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: false - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.3): + '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 - dev: false - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.3): + '@babel/plugin-syntax-jsx@7.18.6': resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 - dev: false - /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.21.3): + '@babel/plugin-syntax-typescript@7.20.0': resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 - dev: false - /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.3): + '@babel/plugin-transform-typescript@7.21.3': resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.3) - transitivePeerDependencies: - - supports-color - dev: false - /@babel/standalone@7.21.3: + '@babel/standalone@7.21.3': resolution: {integrity: sha512-c8feJERTAHlBEvihQUWrnUMLg2GzrwSnE76WDyN3fRJWju10pHeRy8r3wniIq0q7zPLhHd71PQtFVsn1H+Qscw==} engines: {node: '>=6.9.0'} - dev: false - /@babel/template@7.20.7: + '@babel/template@7.20.7': resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - dev: false - /@babel/traverse@7.21.3: + '@babel/traverse@7.21.3': resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.3 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/types@7.22.5: + '@babel/types@7.22.5': resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: false - /@braintree/sanitize-url@6.0.2: + '@braintree/sanitize-url@6.0.2': resolution: {integrity: sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==} - dev: false - /@cloudflare/kv-asset-handler@0.3.0: + '@cloudflare/kv-asset-handler@0.3.0': resolution: {integrity: sha512-9CB/MKf/wdvbfkUdfrj+OkEwZ5b7rws0eogJ4293h+7b6KX5toPwym+VQKmILafNB9YiehqY0DlNrDcDhdWHSQ==} - dependencies: - mime: 3.0.0 - dev: false - /@csstools/cascade-layer-name-parser@1.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0): + '@csstools/cascade-layer-name-parser@1.0.1': resolution: {integrity: sha512-SAAi5DpgJJWkfTvWSaqkgyIsTawa83hMwKrktkj6ra2h+q6ZN57vOGZ6ySHq6RSo+CbP64fA3aPChPBRDDUgtw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: '@csstools/css-parser-algorithms': ^2.0.0 '@csstools/css-tokenizer': ^2.0.0 - dependencies: - '@csstools/css-parser-algorithms': 2.0.1(@csstools/css-tokenizer@2.1.0) - '@csstools/css-tokenizer': 2.1.0 - dev: false - /@csstools/css-parser-algorithms@2.0.1(@csstools/css-tokenizer@2.1.0): + '@csstools/css-parser-algorithms@2.0.1': resolution: {integrity: sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: '@csstools/css-tokenizer': ^2.0.0 - dependencies: - '@csstools/css-tokenizer': 2.1.0 - dev: false - /@csstools/css-tokenizer@2.1.0: + '@csstools/css-tokenizer@2.1.0': resolution: {integrity: sha512-dtqFyoJBHUxGi9zPZdpCKP1xk8tq6KPHJ/NY4qWXiYo6IcSGwzk3L8x2XzZbbyOyBs9xQARoGveU2AsgLj6D2A==} engines: {node: ^14 || ^16 || >=18} - dev: false - /@esbuild-kit/cjs-loader@2.4.2: + '@es-joy/jsdoccomment@0.42.0': + resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} + engines: {node: '>=16'} + + '@esbuild-kit/cjs-loader@2.4.2': resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} - dependencies: - '@esbuild-kit/core-utils': 3.1.0 - get-tsconfig: 4.5.0 - dev: false - /@esbuild-kit/core-utils@3.1.0: + '@esbuild-kit/core-utils@3.1.0': resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} - dependencies: - esbuild: 0.17.19 - source-map-support: 0.5.21 - dev: false - /@esbuild-kit/esm-loader@2.5.5: + '@esbuild-kit/esm-loader@2.5.5': resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} - dependencies: - '@esbuild-kit/core-utils': 3.1.0 - get-tsconfig: 4.5.0 - dev: false - /@esbuild/android-arm64@0.17.19: + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: false - optional: true - /@esbuild/android-arm64@0.18.20: + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: false - optional: true - /@esbuild/android-arm@0.17.19: + '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: false - optional: true - /@esbuild/android-arm@0.18.20: + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: false - optional: true - /@esbuild/android-x64@0.17.19: + '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: false - optional: true - /@esbuild/android-x64@0.18.20: + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: false - optional: true - /@esbuild/darwin-arm64@0.17.19: + '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@esbuild/darwin-arm64@0.18.20: + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@esbuild/darwin-x64@0.17.19: + '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@esbuild/darwin-x64@0.18.20: + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@esbuild/freebsd-arm64@0.17.19: + '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/freebsd-arm64@0.18.20: + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/freebsd-x64@0.17.19: + '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/freebsd-x64@0.18.20: + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-arm64@0.17.19: + '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-arm64@0.18.20: + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-arm@0.17.19: + '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-arm@0.18.20: + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-ia32@0.17.19: + '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-ia32@0.18.20: + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-loong64@0.17.19: + '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-loong64@0.18.20: + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-mips64el@0.17.19: + '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-mips64el@0.18.20: + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-ppc64@0.17.19: + '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-ppc64@0.18.20: + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-riscv64@0.17.19: + '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-riscv64@0.18.20: + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-s390x@0.17.19: + '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-s390x@0.18.20: + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-x64@0.17.19: + '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-x64@0.18.20: + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/netbsd-x64@0.17.19: + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/netbsd-x64@0.18.20: + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/openbsd-x64@0.17.19: + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/openbsd-x64@0.18.20: + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/sunos-x64@0.17.19: + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: false - optional: true - /@esbuild/sunos-x64@0.18.20: + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: false - optional: true - /@esbuild/win32-arm64@0.17.19: + '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@esbuild/win32-arm64@0.18.20: + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@esbuild/win32-ia32@0.17.19: + '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: false - optional: true - /@esbuild/win32-ia32@0.18.20: + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: false - optional: true - /@esbuild/win32-x64@0.17.19: + '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@esbuild/win32-x64@0.18.20: + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.47.0 - eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.5.1: - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - /@eslint-community/regexpp@4.6.2: + '@eslint-community/regexpp@4.6.2': resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/eslintrc@3.0.2': + resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.0.0': + resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@humanwhocodes/config-array@0.12.3': + resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/vue@4.1.0': + resolution: {integrity: sha512-rBQVxNoSDooqgWkQg2MqkIHkH/huNuvXGqui5wijc1zLnU7TKzbBHW9VGmbnV4asNTmIHmqV4Nvt0M2rZ/9nHA==} + peerDependencies: + vue: '>=3' + + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.1.1': + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + + '@jridgewell/gen-mapping@0.3.2': + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.0': + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.3': + resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + + '@jridgewell/sourcemap-codec@1.4.14': + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.17': + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + + '@mapbox/node-pre-gyp@1.0.10': + resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + hasBin: true + + '@netlify/functions@1.6.0': + resolution: {integrity: sha512-6G92AlcpFrQG72XU8YH8pg94eDnq7+Q0YJhb8x4qNpdGsvuzvrfHWBmqFGp/Yshmv4wex9lpsTRZOocdrA2erQ==} + engines: {node: '>=14.0.0'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/fs@2.1.2': + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + '@npmcli/fs@3.1.0': + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/git@4.0.4': + resolution: {integrity: sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/installed-package-contents@2.0.2': + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + '@npmcli/move-file@2.0.1': + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + + '@npmcli/node-gyp@3.0.0': + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/promise-spawn@6.0.2': + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/run-script@6.0.2': + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@nuxt-themes/docus@1.14.6': + resolution: {integrity: sha512-tkSG7j0jhVo53wEpK9V48hIvaK0XEzVU64hXhFfnIMv6LJu99cKOC//boebPbN9qLbJmkBdo4IAIJ0tN5MD0qw==} + + '@nuxt-themes/elements@0.9.4': + resolution: {integrity: sha512-d7XgHc/gjMpre26+N76APL1vlnQHiZTOk61GC4I/ZYQuioSfoKuoIP+Ixrr0QgM22j4MRBtAaBnDAg1wRJrDCQ==} + + '@nuxt-themes/tokens@1.9.1': + resolution: {integrity: sha512-5C28kfRvKnTX8Tux+xwyaf+2pxKgQ53dC9l6C33sZwRRyfUJulGDZCFjKbuNq4iqVwdGvkFSQBYBYjFAv6t75g==} + + '@nuxt-themes/typography@0.11.0': + resolution: {integrity: sha512-TqyvD7sDWnqGmL00VtuI7JdmNTPL5/g957HCAWNzcNp+S20uJjW/FXSdkM76d4JSVDHvBqw7Wer3RsqVhqvA4w==} + + '@nuxt/content@2.7.2': + resolution: {integrity: sha512-fP0nrnyjtFbluKltKUtC7jSMFc1xAH+bwweZyLwXb3gkIap2EHlVL+e9ptGt39+4HIkRkLgME7TNr/fUO+CHug==} + + '@nuxt/devalue@2.0.2': + resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} + + '@nuxt/devtools-kit@0.7.6': + resolution: {integrity: sha512-2jSQ1rgStZifRHtfsdqmmvq/O5NskLCwg34JPchBRAx9Kv5IadABlBIWz1jLuaGarI/jsEEAmA5EpfxI5z/PJQ==} + peerDependencies: + nuxt: ^3.6.5 + vite: '*' + + '@nuxt/devtools-wizard@0.7.6': + resolution: {integrity: sha512-XCznlUTk66ApYJygGc+6FVborAp2F4PAIvY4b6dVSUf1f47Hs3CPe6eEdatarmEqiTmFMInaX4y8z1hDXrFF0Q==} + hasBin: true + + '@nuxt/devtools@0.7.6': + resolution: {integrity: sha512-2x/eS0KbzTCK4+OozSZTcbjndM2ySy84MltF/suwLP7Wp/ehY8vzRp+yMTksxLjsf0sbiAa4K8WJCzKd8wLXxA==} + hasBin: true + peerDependencies: + nuxt: ^3.6.5 + vite: '*' + + '@nuxt/eslint-config@0.3.8': + resolution: {integrity: sha512-c65jwXbiRnJIQQqbtASmOIbtKoci7njizZ++n5p00r0065ICUME0h9NsO/s0WRJp3PTxuREzX1Ey/LNaZJoE1w==} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@nuxt/eslint-plugin@0.3.8': + resolution: {integrity: sha512-j8k8Yu8O4W++SWsyxf60Dv9dWUoTJBP2iJfNblOvJwbzMOrEEY3Oigj9io+54J5TxAAXuyzJ82XZE0D38CXrSg==} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@nuxt/kit@3.4.1': + resolution: {integrity: sha512-VeH26umZW6Rf4F1QX9nTIuTBp6HeL/MgmKY3+FgQiLD07afgFTLUJZohVE5xU7hb66zCnYvwKxa3JpjXFJZrhQ==} + engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} + + '@nuxt/kit@3.4.2': + resolution: {integrity: sha512-bFUpkyG2ZF6RYqiW+tXnWssccHQQqMF4kZJJLP/0eKXf+Fkt/Is0R7IY768jy8ylnyqeMBbmpg4Zv5gSZjfZQw==} + engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} + + '@nuxt/kit@3.6.1': + resolution: {integrity: sha512-7AoiKV0zAtyT3ZvjMfGislMcB+JMbBZxYw68/oWtkEPXCfGQMYuiMI9Ue246/0JT2Yp2KZclEgrJEJ6NLkqFcw==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@nuxt/kit@3.6.5': + resolution: {integrity: sha512-uBI5I2Zx6sk+vRHU+nBmifwxg/nyXCGZ1g5hUKrUfgv1ZfiKB8JkN5T9iRoduDOaqbwM6XSnEl1ja73iloDcrw==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@nuxt/schema@3.4.1': + resolution: {integrity: sha512-xhPh9JfVKXRQVfdUT6BKieDTCljBjbIGgGCQnxplVi4FUTWRKUXR7MFwsobr5D9AJpeE0mg5/kRRh5gUX37vAQ==} + engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} + + '@nuxt/schema@3.4.2': + resolution: {integrity: sha512-DXB/fyjrAssFt9KGXyS+ZSfm1A0NYKhEoc01wyz1lGo//oETzUh3MmwE6X3x65NPqDlYZ6Mnj+IdftRRophv5Q==} + engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} + + '@nuxt/schema@3.6.1': + resolution: {integrity: sha512-+4pr0lkcPP5QqprYV+/ujmBkt2JHmi/v5vaxCrMhElUFgifvJAfT89BkGFn6W7pz0b8Vd3GcByFUWI7/wX/Pcw==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@nuxt/schema@3.6.5': + resolution: {integrity: sha512-UPUnMB0W5TZ/Pi1fiF71EqIsPlj8LGZqzhSf8wOeh538KHwxbA9r7cuvEUU92eXRksOZaylbea3fJxZWhOITVw==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@nuxt/telemetry@2.4.1': + resolution: {integrity: sha512-Cj+4sXjO5pZNW2sX7Y+djYpf4pZwgYF3rV/YHLWIOq9nAjo2UcDXjh1z7qnhkoUkvJN3lHnvhnCNhfAioe6k/A==} + hasBin: true + + '@nuxt/ui-templates@1.2.0': + resolution: {integrity: sha512-MSZza7dxccNb/p7nuzGF8/m4POaFpHzVhNdR7f4xahOpH7Ja02lFeYR+rHtoHIJC0yym4qriqv0mQ+Qf/R61bQ==} + + '@nuxt/vite-builder@3.6.5': + resolution: {integrity: sha512-pwSpt257ApCp3XWUs8vrC7X9QHeHUv5PbbIR3+5w0n5f95XPNOQWDJa2fTPX/H6oaRJCPYAsBPqiQhQ7qW/NZQ==} + engines: {node: ^14.18.0 || >=16.10.0} + peerDependencies: + vue: ^3.3.4 + + '@nuxthq/studio@0.13.4': + resolution: {integrity: sha512-+Jn0iN6TvRTTtTBX4qXWhtOMLL4rsyUIX3/9HM+eBAwr5/cELLw3RuI1tgp942QteTi7PvI5Av4nEi6BlLBr+A==} + + '@nuxtjs/color-mode@3.2.0': + resolution: {integrity: sha512-isDR01yfadopiHQ/VEVUpyNSPrk5PCjUHS4t1qYRZwuRGefU4s9Iaxf6H9nmr1QFzoMgTm+3T0r/54jLwtpZbA==} + + '@parcel/watcher-wasm@2.3.0-alpha.1': + resolution: {integrity: sha512-wo6065l1MQ6SJPPchYw/q8J+pFL40qBXLu4Td2CXeQ/+mUk8NenNqC75P/P1Cyvpam0kfk91iszd+XL+xKDQww==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.21': + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + + '@rollup/plugin-alias@4.0.3': + resolution: {integrity: sha512-ZuDWE1q4PQDhvm/zc5Prun8sBpLJy41DMptYrS6MhAy9s9kL/doN1613BWfEchGVfKxzliJ3BjbOPizXX38DbQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-alias@5.0.0': + resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@24.1.0': + resolution: {integrity: sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@25.0.2': + resolution: {integrity: sha512-NGTwaJxIO0klMs+WSFFtBP7b9TdTJ3K76HZkewT8/+yHzMiUGVQgaPtLQxNVYIgT5F7lxkEyVID+yS3K7bhCow==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-inject@5.0.3': + resolution: {integrity: sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.0.0': + resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.1.0': + resolution: {integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@5.0.2': + resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.4.3': + resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.x || ^3.x + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-wasm@6.1.3': + resolution: {integrity: sha512-7ItTTeyauE6lwdDtQWceEHZ9+txbi4RRy0mYPFn9BW7rD7YdgBDu7HTHsLtHrRzJc313RM/1m6GKgV3np/aEaw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/pluginutils@5.0.2': + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rushstack/eslint-patch@1.10.2': + resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} + + '@shuding/opentype.js@1.4.0-beta.0': + resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} + engines: {node: '>= 8.0.0'} + hasBin: true + + '@sideway/address@4.1.4': + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sigstore/protobuf-specs@0.1.0': + resolution: {integrity: sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@socket.io/component-emitter@3.1.0': + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + + '@stylistic/eslint-plugin-js@1.7.2': + resolution: {integrity: sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin-jsx@1.7.2': + resolution: {integrity: sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin-plus@1.7.2': + resolution: {integrity: sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==} + peerDependencies: + eslint: '*' + + '@stylistic/eslint-plugin-ts@1.7.2': + resolution: {integrity: sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin@1.7.2': + resolution: {integrity: sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@tufjs/canonical-json@1.0.0': + resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@tufjs/models@1.0.4': + resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@types/d3-scale-chromatic@3.0.0': + resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} + + '@types/d3-scale@4.0.3': + resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} + + '@types/d3-time@3.0.0': + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} + + '@types/debug@4.1.7': + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + + '@types/estree@1.0.0': + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + + '@types/fs-extra@11.0.1': + resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} + + '@types/hast@2.3.4': + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + + '@types/http-proxy@1.17.11': + resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} + + '@types/json-schema@7.0.11': + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonfile@6.1.1': + resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} + + '@types/mdast@3.0.10': + resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + + '@types/ms@0.7.31': + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@18.15.3': + resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} + + '@types/normalize-package-data@2.4.1': + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + + '@types/parse5@6.0.3': + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/sax@1.2.4': + resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} + + '@types/semver@7.5.0': + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/unist@2.0.6': + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + + '@types/unist@3.0.0': + resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@types/web-bluetooth@0.0.17': + resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} + + '@typescript-eslint/eslint-plugin@7.7.0': + resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.7.0': + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@7.7.0': + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.7.0': + resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@7.7.0': + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.7.0': + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.7.0': + resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@7.7.0': + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@unhead/addons@1.1.26': + resolution: {integrity: sha512-tt4BrGXPiQB1ZAYnVEQb3oPYgk7h3K1UpUD4T/mtQ2hWkm32y4mfz/GEj9qc0CZOr5wGRZcsLZ/aRZGFkJNhHg==} + + '@unhead/dom@1.1.26': + resolution: {integrity: sha512-6I8z170OAO19h/AslASN4Xw0hqItQFMKhRJQtplQs1BZ62LsDmNKuqJiYueX39U+IfIvIV3j/q1mQwt9lgMwTw==} + + '@unhead/dom@1.1.28': + resolution: {integrity: sha512-o5w3GUo1en9OWNHpUkrkZxmlx2Xf7q++VLb5Lm0MtbHYM578lWmB1zLfmJMN13kvaNKN8RUhTYG5WMtKMzDfGw==} + + '@unhead/dom@1.2.2': + resolution: {integrity: sha512-ohganmg4i1Dd4wwQ2A9oLWEkJNpJRoERJNmFgzmScw9Vi3zMqoS4gPIofT20zUR5rhyyAsFojuDPojJ5vKcmqw==} + + '@unhead/schema-org-vue@0.6.0': + resolution: {integrity: sha512-2zTVczJ8iI8jDOzaz2md8fr8j+jWqkmMdo89OI/VVPYWpA6Cy2BFCMvDqrptBZ2h3ieOZ/lhA/y+cTobBZEvaQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@unhead/vue': '>=1.1.9' + + '@unhead/schema@1.1.26': + resolution: {integrity: sha512-l93zaizm+pu36uMssdtzSC2Y61ncZaBBouZn0pB8rVI14V0hPxeXuSNIuPh2WjAm8wfb8EnCSE3LNguoqTar7g==} + + '@unhead/schema@1.1.28': + resolution: {integrity: sha512-KDAPSYcYZHC3ni3Hd3Ye/piBasaHa/uQWCLICOVADwKi1Pm6hhMxCCwpsPSJtfekN31kOvIA09vZv8roPwTthQ==} + + '@unhead/schema@1.2.2': + resolution: {integrity: sha512-cGtNvadL76eGl7QxGjWHZxFqLv9a2VrmRpeEb1d7sm0cvnN0bWngdXDTdUyXzn7RVv/Um+/yae6eiT6A+pyQOw==} + + '@unhead/shared@1.1.26': + resolution: {integrity: sha512-gnUfNrl8w7hQHke9P0au7klcG9bHVOXqbDvya2uARA/8TyxNz87i0uakraO+P6/+zf484dw3b3MYkXq0thK2eg==} + + '@unhead/shared@1.1.28': + resolution: {integrity: sha512-mC0k7a4Cb4vKsASjD/Ws5hrRdZfTf5uapRF+1ekVqeyo1VVISoXNB6CdxTjHgqi8vKQr5wmvoSvEt1fOoU1PQQ==} + + '@unhead/shared@1.2.2': + resolution: {integrity: sha512-bWRjRyVzFsunih9GbHctvS8Aenj6KBe5ycql1JE4LawBL/NRYvCYUCPpdK5poVOqjYr0yDAf9m4JGaM2HwpVLw==} + + '@unhead/ssr@1.1.28': + resolution: {integrity: sha512-gnSVyvpx/R1byQ8mArh2QRI1PdQ9mlRvtnt1Qiy7JUrtkJeqf/Hfn85fwZ+RhHRSDBPhMl7qD24FSlz5EwA9Zw==} + + '@unhead/ssr@1.2.2': + resolution: {integrity: sha512-mpWSNNbrQFJZolAfdVInPPiSGUva08bK9UbNV1zgDScUz+p+FnRg4cj77X+PpVeJ0+KPgjXfOsI8VQKYt+buYA==} + + '@unhead/vue@1.1.28': + resolution: {integrity: sha512-n/4UusPccA0eyLxeinEagfm7hswzg4Uud+dYNlPByHHThCBobYcHjhnOOeS9YvkMGbdZpG1l7k/kywQIcwYqgg==} + peerDependencies: + vue: '>=2.7 || >=3' + + '@unhead/vue@1.2.2': + resolution: {integrity: sha512-AxOmY5JPn4fS34ovaivPnqg2my+InIkZDNSxCKfRkmbBtstFre/Fyf0d92Qfx0u8PJiSRPOjthEHx5vKDgTEJQ==} + peerDependencies: + vue: '>=2.7 || >=3' + + '@unocss/reset@0.50.5': + resolution: {integrity: sha512-nxagkvGAlJa2r5LF3ucfEgV0RpB7PGMJMRiYO+XyvsPdzcCKVaui8VA7Mo+13Z7nDlZ+XOP5YGqowZgoGOCGSg==} + + '@vercel/nft@0.22.6': + resolution: {integrity: sha512-gTsFnnT4mGxodr4AUlW3/urY+8JKKB452LwF3m477RFUJTAaDmcz2JqFuInzvdybYIeyIv1sSONEJxsxnbQ5JQ==} + engines: {node: '>=14'} + hasBin: true + + '@vitejs/plugin-vue-jsx@3.0.1': + resolution: {integrity: sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@4.2.3': + resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + + '@volar/language-core@1.3.0-alpha.0': + resolution: {integrity: sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==} + + '@volar/language-core@1.4.0-alpha.3': + resolution: {integrity: sha512-TDDqgvVgNWE952EQ6+iyasksYeLHdSKKhWMVmsMIywmE2gPdcqKIUBI+M8JNz2uKEraiOEtU+kJZpk5GJaTDTg==} + + '@volar/source-map@1.3.0-alpha.0': + resolution: {integrity: sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==} + + '@volar/source-map@1.4.0-alpha.3': + resolution: {integrity: sha512-3qwtBAp6TkkrNW9dLNjaZYzWttUWEI9XKSi/V7odt3rC9yPoWgqizC0J95essDtrEu9PoxbxTkTeZvRx5c//Ow==} + + '@volar/vue-language-core@1.2.0': + resolution: {integrity: sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==} + + '@volar/vue-language-core@1.3.2': + resolution: {integrity: sha512-5HCMVoFFDIuf5bHnHux1jaRscZW5hsK/2T0p7qp+XuGWZ2fDN1nr9Ujn49jSvM7LqQB93Y1fFLKp3vZswV2YUw==} + + '@vue-macros/common@1.4.0': + resolution: {integrity: sha512-Wnpk6OVPYw7ZrrShOS7RZL5AINFbuQWfkNCVWVESSPY+8id75YOKGzMs4X5YcNayywdSGEvV7ntVJ2RQ+ez21A==} + engines: {node: '>=16.14.0'} + peerDependencies: + vue: ^2.7.0 || ^3.2.25 + peerDependenciesMeta: + vue: + optional: true + + '@vue/babel-helper-vue-transform-on@1.0.2': + resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} + + '@vue/babel-plugin-jsx@1.1.1': + resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} + + '@vue/compiler-core@3.3.4': + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + + '@vue/compiler-dom@3.3.4': + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + + '@vue/compiler-sfc@3.3.4': + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + + '@vue/compiler-ssr@3.3.4': + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + + '@vue/devtools-api@6.5.0': + resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} + + '@vue/reactivity-transform@3.3.4': + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + + '@vue/reactivity@3.3.4': + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + + '@vue/runtime-core@3.3.4': + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + + '@vue/runtime-dom@3.3.4': + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + + '@vue/server-renderer@3.3.4': + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + peerDependencies: + vue: 3.3.4 + + '@vue/shared@3.3.4': + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + + '@vueuse/core@10.3.0': + resolution: {integrity: sha512-BEM5yxcFKb5btFjTSAFjTu5jmwoW66fyV9uJIP4wUXXU8aR5Hl44gndaaXp7dC5HSObmgbnR2RN+Un1p68Mf5Q==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/head@1.1.26': + resolution: {integrity: sha512-VUrqvcxKtxt2moKtUa7R/KscnDsNYj5u7HFULLsr84VhWsztzBedxW/8Wh/kTz2+/eMf5gC1KtkZBTFQYOmauQ==} + peerDependencies: + vue: '>=2.7 || >=3' + + '@vueuse/integrations@10.3.0': + resolution: {integrity: sha512-Jgiv7oFyIgC6BxmDtiyG/fxyGysIds00YaY7sefwbhCZ2/tjEx1W/1WcsISSJPNI30in28+HC2J4uuU8184ekg==} + peerDependencies: + async-validator: '*' + axios: '*' + change-case: '*' + drauu: '*' + focus-trap: '*' + fuse.js: '*' + idb-keyval: '*' + jwt-decode: '*' + nprogress: '*' + qrcode: '*' + sortablejs: '*' + universal-cookie: '*' + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@10.3.0': + resolution: {integrity: sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/nuxt@10.3.0': + resolution: {integrity: sha512-Dmkm9H5Ubq279+FHhlJtlFP99wKrn2apuo4hk/0GbEi/6+zif7MJRtAjDBBV4VjmY6XV3kO8dQR8940FStbxsA==} + peerDependencies: + nuxt: ^3.0.0 + + '@vueuse/shared@10.3.0': + resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.9.0: + resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + + agentkeepalive@4.3.0: + resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver@5.3.1: + resolution: {integrity: sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==} + engines: {node: '>= 10'} + + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assert@2.0.0: + resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + + ast-kit@0.6.5: + resolution: {integrity: sha512-XCg0VWvmWU2T/6aMp8VRfJWZ6LZv1P0o8otWY7RAGtfKj0qGi45vtnKNkltJhu9tmbQNZxv+gJA4o7FtLDfmWg==} + engines: {node: '>=16.14.0'} + + ast-types@0.15.2: + resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} + engines: {node: '>=4'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + ast-walker-scope@0.4.2: + resolution: {integrity: sha512-vdCU9JvpsrxWxvJiRHAr8If8cu07LWJXDPhkqLiP4ErbN1fu/mK623QGmU4Qbn2Nq4Mx0vR/Q017B6+HcHg1aQ==} + engines: {node: '>=16.14.0'} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + autoprefixer@10.4.14: + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + birpc@0.2.12: + resolution: {integrity: sha512-6Wz9FXuJ/FE4gDH+IGQhrYdalAvAQU1Yrtcu1UlMk3+9mMXxIRXiL+MxUcGokso42s+Fy+YoUXGLOdOs0siV3A==} + + bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + c12@1.4.2: + resolution: {integrity: sha512-3IP/MuamSVRVw8W8+CHWAz9gKN4gd+voF2zm/Ln6D25C2RhytEZ1ABbC8MjKr4BR9rhoV1JQ7jJA158LDiTkLg==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + cacache@17.1.0: + resolution: {integrity: sha512-hXpFU+Z3AfVmNuiLve1qxWHMq0RSIt5gjCKAHi/M6DktwFwDdAXAtunl1i4WSKaaVcU9IsRvXFg42jTHigcC6Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001466: + resolution: {integrity: sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==} + + caniuse-lite@1.0.30001611: + resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + case-police@0.6.1: + resolution: {integrity: sha512-tOgkG3HhtzNVHU+HVHqbpVJ3CICPDihtlgoM2C4dx0RLeo6qcNVeBgiYJN5Bln+stxKrnKrw89CFgqYQDqwZQg==} + hasBin: true + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chroma-js@2.4.2: + resolution: {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==} + + chrome-launcher@0.15.1: + resolution: {integrity: sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==} + engines: {node: '>=12.13.0'} + hasBin: true + + ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + citty@0.1.1: + resolution: {integrity: sha512-fL/EEp9TyXlNkgYFQYNqtMJhnAk2tAq8lCST7O5LPn1NrzWPsOKE5wafR7J+8W87oxqolpxNli+w7khq5WP7tg==} + + citty@0.1.2: + resolution: {integrity: sha512-Me9nf0/BEmMOnuQzMOVXgpzkMUNbd0Am8lTl/13p0aRGAoLGk5T5sdet/42CrIGmWdG67BgHUhcKK1my1ujUEg==} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + clear@0.1.0: + resolution: {integrity: sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + clipboardy@3.0.0: + resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compress-commons@4.1.1: + resolution: {integrity: sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + consola@3.1.0: + resolution: {integrity: sha512-rrrJE6rP0qzl/Srg+C9x/AE5Kxfux7reVm1Wh0wCjuXvih6DqZgqDZe8auTD28fzJ9TF0mHlSDrPpWlujQRo1Q==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + cookie-es@1.0.0: + resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} + + core-js-compat@3.37.0: + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.2: + resolution: {integrity: sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==} + engines: {node: '>= 10'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-background-parser@0.1.0: + resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} + + css-box-shadow@1.0.0-3: + resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-declaration-sorter@6.3.1: + resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-default@6.0.1: + resolution: {integrity: sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano-utils@4.0.0: + resolution: {integrity: sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano@6.0.1: + resolution: {integrity: sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + + cuint@0.2.2: + resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.23.0: + resolution: {integrity: sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.3: + resolution: {integrity: sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.2: + resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.8.2: + resolution: {integrity: sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + dayjs@1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + + decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + + decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + + decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + + decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.0: + resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} + engines: {node: '>=0.10.0'} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + + defu@6.1.2: + resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} + + delaunator@5.0.0: + resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.0: + resolution: {integrity: sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==} + + destr@2.0.1: + resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detab@3.0.2: + resolution: {integrity: sha512-7Bp16Bk8sk0Y6gdXiCtnpGbghn8atnTJdd/82aWvS5ESnlcNvgUc10U2NYS0PAiDSGjWiI8qs/Cv1b2uSGdQ8w==} + + detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + + devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + + diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + dompurify@3.0.5: + resolution: {integrity: sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==} + + domutils@3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@7.2.0: + resolution: {integrity: sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.4.332: + resolution: {integrity: sha512-c1Vbv5tuUlBFp0mb3mCIjw+REEsgthRgNE8BlbEDKmvzb8rxjcVki6OkQP83vLN34s0XCxpSkq7AZNep1a6xhw==} + + electron-to-chromium@1.4.744: + resolution: {integrity: sha512-nAGcF0yeKKfrP13LMFr5U1eghfFSvFLg302VUFzWlcjPOnUYd52yU5x6PBYrujhNbc4jYmZFrGZFK+xasaEzVA==} + + elkjs@0.8.2: + resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + + emoji-regex@10.2.1: + resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emoticon@4.0.1: + resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-client@6.4.0: + resolution: {integrity: sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==} + + engine.io-client@6.5.2: + resolution: {integrity: sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==} + + engine.io-parser@5.0.6: + resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} + engines: {node: '>=10.0.0'} + + engine.io-parser@5.2.1: + resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engines: {node: '>=10.0.0'} + + enhanced-resolve@4.5.0: + resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} + engines: {node: '>=6.9.0'} + + enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + + entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + + entities@4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + error-stack-parser-es@0.1.0: + resolution: {integrity: sha512-K5/Oncl6ZizGM7tqGUc3Sd82zVKGsZ+l8FqhhnF8+10QujC/xT2VKwdaM/8rAR5F1BouVqgemMrhHG23vhOpMw==} + + es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + + esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-flat-gitignore@0.1.5: + resolution: {integrity: sha512-hEZLwuZjDBGDERA49c2q7vxc8sCGv8EdBp6PQYzGOMcHIgrfG9YOM6s/4jx24zhD+wnK9AI8mgN5RxSss5nClQ==} + + eslint-flat-config-utils@0.2.3: + resolution: {integrity: sha512-tfrMNXZfuN4q7sFi1Cr//BN3qdI7c8fLJhbshlp8l9PZIqZ7eVeeyd2Regtu/P9kjOlv18lRlBALzsZaF7ByUg==} + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-plugin-import-x@0.5.0: + resolution: {integrity: sha512-C7R8Z4IzxmsoOPMtSzwuOBW5FH6iRlxHR6iTks+MzVlrk3r3TUxokkWTx3ypdj9nGOEP+CG/5e6ebZzHbxgbbQ==} + engines: {node: '>=16'} + peerDependencies: + eslint: ^8.56.0 || ^9.0.0-0 + + eslint-plugin-jsdoc@48.2.3: + resolution: {integrity: sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-unicorn@52.0.0: + resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-plugin-vue@9.25.0: + resolution: {integrity: sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.0.1: + resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.0.0: + resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + + esno@0.16.3: + resolution: {integrity: sha512-6slSBEV1lMKcX13DBifvnDFpNno5WXhw4j/ff7RI0y51BZiDqEe5dNhhjhIQ3iCOQuzsm2MbVzmwqbN78BBhPg==} + hasBin: true + + espree@10.0.1: + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + externality@1.0.2: + resolution: {integrity: sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-folder-size@2.1.0: + resolution: {integrity: sha512-3h+e4YJJ6fze5RMaByScrfRdHE+DnM/as8r/jbjmIGhgty6v2yBRNbtOiItqhRitv4kBv8WAOQvbPtnyYK3gHw==} + hasBin: true + + fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fflate@0.7.4: + resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + + file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + + file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + focus-trap@7.5.2: + resolution: {integrity: sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==} + + follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fraction.js@4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.2: + resolution: {integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + fuse.js@6.6.2: + resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==} + engines: {node: '>=10'} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + + get-port-please@3.0.1: + resolution: {integrity: sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-tsconfig@4.5.0: + resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} + + get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + + giget@1.1.2: + resolution: {integrity: sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==} + hasBin: true + + git-config-path@2.0.0: + resolution: {integrity: sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==} + engines: {node: '>=4'} + + git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + + git-url-parse@13.1.0: + resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.2.7: + resolution: {integrity: sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.0.0: + resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} + engines: {node: '>=18'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.0: + resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gzip-size@7.0.0: + resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + h3@1.7.1: + resolution: {integrity: sha512-A9V2NEDNHet7v1gCg7CMwerSigLi0SRbhTy7C3lGb0N4YKIpPmLDjedTUopqp4dnn7COHfqUjjaz3zbtz4QduA==} + + h3@1.8.0-rc.3: + resolution: {integrity: sha512-NhDCNXhrJkt42BDQF57787yXJa2eX2Hl4OMlu+Ym9QBdBaOByUjBrovYaBc+27mtIhHvs2IqPf56to8qcNBI7Q==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + hash-sum@2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + + hast-util-has-property@2.0.1: + resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} + + hast-util-heading-rank@2.1.1: + resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==} + + hast-util-is-element@2.1.3: + resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} + + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + + hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + + hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + + hast-util-to-string@2.0.0: + resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} + + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + html-tags@3.2.0: + resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} + engines: {node: '>=8'} + + html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + + htmlparser2@8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-graceful-shutdown@3.1.13: + resolution: {integrity: sha512-Ci5LRufQ8AtrQ1U26AevS8QoMXDOhnAHCJI3eZu1com7mZGHxREmw3dNj85ftpQokQCvak8nI2pnFS8zyM1M+Q==} + engines: {node: '>=4.0.0'} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.0: + resolution: {integrity: sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-walk@6.0.3: + resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + image-meta@0.1.1: + resolution: {integrity: sha512-+oXiHwOEPr1IE5zY0tcBLED/CYcre15J4nwL50x3o0jxWqEkyjrusiKP3YSU+tr9fvJp33ZcP5Gpj2295g3aEw==} + engines: {node: '>=10.18.0'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + ini@3.0.1: + resolution: {integrity: sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + + ip-regex@5.0.0: + resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + + iron-webcrypto@0.7.0: + resolution: {integrity: sha512-WkX32iTcwd79ZsWRPP5wq1Jq6XXfPwO783ZiUBY8uMw4/AByx5WvBmxvYGnpVt6AOVJ0F41Qo420r8lIneT9Wg==} + + iron-webcrypto@0.8.0: + resolution: {integrity: sha512-gScdcWHjTGclCU15CIv2r069NoQrys1UeUFFfaO1hL++ytLHkVw7N5nXJmFf3J2LEDMz1PkrvC0m62JEeu1axQ==} + + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-primitive@3.0.1: + resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} + engines: {node: '>=0.10.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@2.2.0: + resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==} + engines: {node: '>=14'} + + jiti@1.18.2: + resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + hasBin: true + + jiti@1.19.1: + resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + hasBin: true + + joi@17.9.2: + resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdoc-type-pratt-parser@4.0.0: + resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} + engines: {node: '>=12.0.0'} + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@5.0.0: + resolution: {integrity: sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.0.0: + resolution: {integrity: sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + knitwork@1.0.0: + resolution: {integrity: sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + launch-editor@2.6.0: + resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lighthouse-logger@1.3.0: + resolution: {integrity: sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + + listhen@1.0.4: + resolution: {integrity: sha512-r94k7kmXHb8e8wpv7+UP/qqhhD+j/9TgX19QKim2cEJuWCLwlTw+5BkCFmYyjhQ7Bt8KdVun/2DcD7MF2Fe3+g==} + + listhen@1.2.2: + resolution: {integrity: sha512-fQaXe+DAQ5QiYP1B4uXfAgwqIwNS+0WMIwRd5l2a3npQAEhlCJ1pN11d41yHtbeReE7oRtfL+h6Nzxq+Wc4vIg==} + hasBin: true + + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash._reinterpolate@3.0.0: + resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.pick@4.4.0: + resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} + + lodash.template@4.5.0: + resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} + + lodash.templatesettings@4.2.0: + resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.0.0: + resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru-cache@9.1.1: + resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==} + engines: {node: 14 || >=16.14} + + magic-string-ast@0.1.2: + resolution: {integrity: sha512-P53AZrzq7hclCU6HWj88xNZHmP15DKjMmK/vBytO1qnpYP3ul4IEZlyCE0aU3JRnmgWmZPmoTKj4Bls7v0pMyA==} + engines: {node: '>=14.19.0'} + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + + magic-string@0.29.0: + resolution: {integrity: sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==} + engines: {node: '>=12'} + + magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + + magic-string@0.30.2: + resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + engines: {node: '>=12'} + + magicast@0.2.10: + resolution: {integrity: sha512-Ah2qatigknxwmoYCd9hx/mmVyrRNhDKiaWZIuW4gL6dWrAGMoOpCVkQ3VpGWARtkaJVFhe8uIphcsxDzLPQUyg==} + + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + make-fetch-happen@11.1.1: + resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + markdown-it@13.0.1: + resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} + hasBin: true + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + markdownlint-cli@0.34.0: + resolution: {integrity: sha512-4G9I++VBTZkaye6Yfc/7dU6HQHcyldZEVB+bYyQJLcpJOHKk/q5ZpGqK80oKMIdlxzsA3aWOJLZ4DkoaoUWXbQ==} + engines: {node: '>=14'} + hasBin: true + + markdownlint-micromark@0.1.2: + resolution: {integrity: sha512-jRxlQg8KpOfM2IbCL9RXM8ZiYWz2rv6DlZAnGv8ASJQpUh6byTBnEsbuMZ6T2/uIgntyf7SKg/mEaEBo1164fQ==} + engines: {node: '>=14.18.0'} + + markdownlint@0.28.2: + resolution: {integrity: sha512-yYaQXoKKPV1zgrFsyAuZPEQoe+JrY9GDag9ObKpk09twx4OCU5lut+0/kZPrQ3W7w82SmgKhd7D8m34aG1unVw==} + engines: {node: '>=14.18.0'} + + marky@1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + + mdast-squeeze-paragraphs@5.2.1: + resolution: {integrity: sha512-npINYQrt0E5AvSvM7ZxIIyrG/7DX+g8jKWcJMudrcjI+b1eNOKbbu+wTo6cKvy5IzH159IPfpWoRVH7kwEmnug==} + + mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + + mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + + mdast-util-from-markdown@1.3.0: + resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} + + mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + + mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + + mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + + mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + + mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + + mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + + mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + + mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + + mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + + mdast-util-to-string@3.1.1: + resolution: {integrity: sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + memory-fs@0.5.0: + resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@10.3.1: + resolution: {integrity: sha512-hkenh7WkuRWPcob3oJtrN3W+yzrrIYuWF1OIfk/d0xGE8UWlvDhfexaHmDwwe8DKQgqMLI8DWEPwGprxkumjuw==} + + micromark-core-commonmark@1.0.6: + resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} + + micromark-extension-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} + + micromark-extension-gfm-footnote@1.0.4: + resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==} + + micromark-extension-gfm-strikethrough@1.0.4: + resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==} + + micromark-extension-gfm-table@1.0.5: + resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} + + micromark-extension-gfm-tagfilter@1.0.1: + resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==} + + micromark-extension-gfm-task-list-item@1.0.3: + resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==} + + micromark-extension-gfm@2.0.1: + resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} + + micromark-factory-destination@1.0.0: + resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} + + micromark-factory-label@1.0.2: + resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} + + micromark-factory-space@1.0.0: + resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} + + micromark-factory-title@1.0.2: + resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} + + micromark-factory-whitespace@1.0.0: + resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} + + micromark-util-character@1.1.0: + resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} + + micromark-util-chunked@1.0.0: + resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} + + micromark-util-classify-character@1.0.0: + resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} + + micromark-util-combine-extensions@1.0.0: + resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} + + micromark-util-decode-numeric-character-reference@1.0.0: + resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} + + micromark-util-decode-string@1.0.2: + resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} + + micromark-util-encode@1.0.1: + resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} + + micromark-util-html-tag-name@1.1.0: + resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} + + micromark-util-normalize-identifier@1.0.0: + resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} + + micromark-util-resolve-all@1.0.0: + resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} + + micromark-util-sanitize-uri@1.1.0: + resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} + + micromark-util-subtokenize@1.0.2: + resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} + + micromark-util-symbol@1.0.1: + resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} + + micromark-util-types@1.0.2: + resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} + + micromark@3.1.0: + resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.5.2: + resolution: {integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@6.2.0: + resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==} + engines: {node: '>=10'} + + minimatch@9.0.2: + resolution: {integrity: sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + minipass-fetch@3.0.3: + resolution: {integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-json-stream@1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.5: + resolution: {integrity: sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdist@1.1.2: + resolution: {integrity: sha512-s9whPlQsr84iY3XoufsDrVlzGiDdTnMwf2+7QU6ekJPgTIgGwn7EsU8lcefWqLH6no+/4UqjDBwyIkGKfZyH9g==} + hasBin: true + peerDependencies: + sass: ^1.58.3 + typescript: '>=4.9.5' + peerDependenciesMeta: + sass: + optional: true + typescript: + optional: true + + mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.2.2: + resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==} + + nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + + napi-wasm@1.1.0: + resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + nitropack@2.5.2: + resolution: {integrity: sha512-hXEHY9NJmOOETFFTPCBB9PB0+txoAbU/fB2ovUF6UMRo4ucQZztYnZdX+YSxa6FVz6eONvcxXvf9/9s6t08KWw==} + engines: {node: ^14.16.0 || ^16.11.0 || >=17.0.0} + hasBin: true + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + + node-fetch-native@1.2.0: + resolution: {integrity: sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==} + + node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true + + node-gyp@9.3.1: + resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + + node-releases@2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-bundled@3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-install-checks@6.1.1: + resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-packlist@7.0.4: + resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-pick-manifest@8.0.1: + resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-registry-fetch@14.0.5: + resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nuxi@3.6.5: + resolution: {integrity: sha512-4XEXYz71UiWWiKC1/cJCzqRSUEImYRmjcvKpSsBKMU58ALYVSx5KIoas5SwLO8tEKO5BS4DAe4u7MYix7hfuHQ==} + engines: {node: ^14.18.0 || >=16.10.0} + hasBin: true + + nuxt-component-meta@0.5.1: + resolution: {integrity: sha512-vwx5wySyVX+QbFrNb3wLYNMPlADho8E66MO45d5i5fTlEkmhopVpQ9YXwlAvM3pLCPjupxG3R3D5rKpLDeitkw==} + + nuxt-config-schema@0.4.6: + resolution: {integrity: sha512-kHLWJFynj5QrxVZ1MjY2xmDaTSN1BCMLGExA+hMMLoCb3wn9TJlDVqnE/nSdUJPMRkNn/NQ5WP9NLA9vlAXRUw==} + + nuxt-icon@0.3.3: + resolution: {integrity: sha512-KdhJAigBGTP8/YIFZ3orwetk40AgLq6VQ5HRYuDLmv5hiDptor9Ro+WIdZggHw7nciRxZvDdQkEwi9B5G/jrkQ==} + + nuxt-link-checker@1.0.4: + resolution: {integrity: sha512-I9QkOsHjDX2RkanPlAZOb6+vIwn4Jxh/aRFHeUJJhX4XGWCPfcXu+fjVgeqK9lKLz4+G8bewzVxukWFf1mOKyA==} + + nuxt-og-image@1.5.9: + resolution: {integrity: sha512-N5VNIn+4jWXFRV7BoZefPljz2qDVTCVz1+CPv63sXWZSZ0rVx8ojjG9An7aM0jewZa29l40EM6VYBRwVoUzRug==} + + nuxt-schema-org@2.2.0: + resolution: {integrity: sha512-V0LHh4A3tZSRLGv9P+SG8zm9N4e1qZt2x6z7FgL9qYjpNDyCJ5G186vmTqT4kN0JErjRiYVxantBjDQa7DcVKQ==} + + nuxt-seo-kit@1.3.9: + resolution: {integrity: sha512-j5GakxvUH0ofMPGt833CqG6RDKCvg6d3k87j4kaWouDQlbOdpoLA4BFFc3PiV5sHd1pY+b3csbUuH4hmzVXwXQ==} + + nuxt-simple-robots@1.0.9: + resolution: {integrity: sha512-KR4zbVnHG2lKV97LOZeLIb8KR90VNfzRX9wj1qXZSbt3wzTgS6YM10QMoXWXjDN5YAVlq99QwJ6OERgq1Fwj7g==} + + nuxt-simple-sitemap@1.0.11: + resolution: {integrity: sha512-FW4kxAKW0FHA3+y2yT790bz4yupHV5qPkf1aaY0Xi3Ct4jKQE4BwX9oKlqz8F4qq3WURETkV7ttzxWmXlNcDsg==} + + nuxt-unhead@1.4.17: + resolution: {integrity: sha512-8DpCE5gmUEKT//KOI+gCzTc315poxNHrbIsOMfv80tyxZIe35VlO14q9wScpL6dE1MxwJ87YtI9rxnq4JZOKLw==} + + nuxt@3.6.5: + resolution: {integrity: sha512-0A7V8B1HrIXX9IlqPc2w+5ZPXi+7MYa9QVhtuGYuLvjRKoSFANhCoMPRP6pKdoxigM1MBxhLue2VmHA/VbtJCw==} + engines: {node: ^14.18.0 || >=16.10.0} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.1.0 + '@types/node': ^14.18.0 || >=16.10.0 + peerDependenciesMeta: + '@parcel/watcher': + optional: true + + nypm@0.2.2: + resolution: {integrity: sha512-O7bumfWgUXlJefT1Y41SF4vsCvzeUYmnKABuOKStheCObzrkWPDmqJc+RJVU+57oFu9bITcrUq8sKFIHgjCnTg==} + engines: {node: ^14.16.0 || >=16.10.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + ofetch@1.1.1: + resolution: {integrity: sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ==} + + ohash@1.1.2: + resolution: {integrity: sha512-9CIOSq5945rI045GFtcO3uudyOkYVY1nyfFxVQp+9BRgslr8jPNiSSrsFGg/BNTUFOLqx0P5tng6G32brIPw0w==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + openapi-typescript@6.2.8: + resolution: {integrity: sha512-yA+y5MHiu6cjmtsGfNLavzVuvGCKzjL3H+exgHDPK6bnp6ZVFibtAiafenNSRDWL0x+7Sw/VPv5SbaqiPLW46w==} + hasBin: true + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pacote@15.2.0: + resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + paneer@0.1.0: + resolution: {integrity: sha512-SZfJe/y9fbpeXZU+Kf7cSG2G7rnGP50hUYzCvcWyhp7hYzA3YXGthpkGfv6NSt0oo6QbcRyKwycg/6dpG5p8aw==} + deprecated: Please migrate to https://github.com/unjs/magicast + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-git-config@3.0.0: + resolution: {integrity: sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==} + engines: {node: '>=8'} + + parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + + parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + + parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.7.0: + resolution: {integrity: sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==} + engines: {node: '>=16 || 14 >=14.17'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pinceau@0.18.8: + resolution: {integrity: sha512-aVIRYxz80nweDjabJzauKtsSVS48JdWWVwWnHxG/e1HI9/aV0/RmdTD3P/8KXfYZ9OySl3MjCgUc7MZb+IwwEw==} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + playwright-core@1.31.2: + resolution: {integrity: sha512-a1dFgCNQw4vCsG7bnojZjDnPewZcw7tZUNFN0ZkcLYKj+mPmXvg4MpaaKZ5SgqPsOmqIf2YsVRkgqiRDxD+fDQ==} + engines: {node: '>=14'} + hasBin: true + + playwright-core@1.37.0: + resolution: {integrity: sha512-1c46jhTH/myQw6sesrcuHVtLoSNfJv8Pfy9t3rs6subY7kARv0HRw5PpyfPYPpPtQvBOmgbE6K+qgYUpj81LAA==} + engines: {node: '>=16'} + hasBin: true + + playwright@1.37.0: + resolution: {integrity: sha512-CrAEFfVioamMwDKmygc/HAkzEAxYAwjD+zod2poTxM7ObivkoDsKHu1ned16fnQV/Tf1kDB8KtsyH8Qd3VzJIg==} + engines: {node: '>=16'} + hasBin: true + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss-calc@9.0.1: + resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.2 + + postcss-colormin@6.0.0: + resolution: {integrity: sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-convert-values@6.0.0: + resolution: {integrity: sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-custom-properties@13.1.4: + resolution: {integrity: sha512-iSAdaZrM3KMec8cOSzeTUNXPYDlhqsMJHpt62yrjwG6nAnMtRHPk5JdMzGosBJtqEahDolvD5LNbcq+EZ78o5g==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + + postcss-dark-theme-class@0.7.3: + resolution: {integrity: sha512-M9vtfh8ORzQsVdT9BWb+xpEDAzC7nHBn7wVc988/JkEVLPupKcUnV0jw7RZ8sSj0ovpqN1POf6PLdt19JCHfhQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-discard-comments@6.0.0: + resolution: {integrity: sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-duplicates@6.0.0: + resolution: {integrity: sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-empty@6.0.0: + resolution: {integrity: sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-overridden@6.0.0: + resolution: {integrity: sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-import-resolver@2.0.0: + resolution: {integrity: sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-merge-longhand@6.0.0: + resolution: {integrity: sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-merge-rules@6.0.1: + resolution: {integrity: sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-font-values@6.0.0: + resolution: {integrity: sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-gradients@6.0.0: + resolution: {integrity: sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-params@6.0.0: + resolution: {integrity: sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-selectors@6.0.0: + resolution: {integrity: sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-normalize-charset@6.0.0: + resolution: {integrity: sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-display-values@6.0.0: + resolution: {integrity: sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-positions@6.0.0: + resolution: {integrity: sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-repeat-style@6.0.0: + resolution: {integrity: sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-string@6.0.0: + resolution: {integrity: sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-timing-functions@6.0.0: + resolution: {integrity: sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-unicode@6.0.0: + resolution: {integrity: sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-url@6.0.0: + resolution: {integrity: sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-whitespace@6.0.0: + resolution: {integrity: sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-ordered-values@6.0.0: + resolution: {integrity: sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-initial@6.0.0: + resolution: {integrity: sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-transforms@6.0.0: + resolution: {integrity: sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-selector-parser@6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + engines: {node: '>=4'} + + postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + + postcss-svgo@6.0.0: + resolution: {integrity: sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==} + engines: {node: ^14 || ^16 || >= 18} + peerDependencies: + postcss: ^8.2.15 + + postcss-unique-selectors@6.0.0: + resolution: {integrity: sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-url@10.1.3: + resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.0.0 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.24: + resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + pretty-bytes@6.1.0: + resolution: {integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + property-information@6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + + protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radix3@1.0.1: + resolution: {integrity: sha512-y+AcwZ3HcUIGc9zGsNVf5+BY/LxL+z+4h4J3/pp8jxSmy1STaCocPS3qrj4tA5ehUSzqtqK+0Aygvz/r/8vy4g==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + rc9@2.1.1: + resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-package-json@6.0.3: + resolution: {integrity: sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.2: + resolution: {integrity: sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recast@0.22.0: + resolution: {integrity: sha512-5AAx+mujtXijsEavc5lWXBPQqrM4+Dl5qNH96N2aNeuJFUzpiiToKPsxQD/zAIJHspz7zz0maX0PCtCTFVlixQ==} + engines: {node: '>= 4'} + + recast@0.23.4: + resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} + engines: {node: '>= 4'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + rehype-external-links@2.1.0: + resolution: {integrity: sha512-2YMJZVM1hxZnwl9IPkbN5Pjn78kXkAX7lq9VEtlaGA29qIls25vZN+ucNIJdbQUe+9NNFck17BiOhGmsD6oLIg==} + + rehype-raw@6.1.1: + resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + + rehype-slug@5.1.0: + resolution: {integrity: sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==} + + rehype-sort-attribute-values@4.0.0: + resolution: {integrity: sha512-+Y3OWTbbxSIutbXMVY7+aWFmcRyEvdz6HkghXAyVPjee1Y8HUi+/vryBL1UdEI9VknVBiGvphXAf5n6MDNOXOA==} + + rehype-sort-attributes@4.0.0: + resolution: {integrity: sha512-sCT58e12F+fJL8ZmvpEP2vAK7cpYffUAf0cMQjNfLIewWjMHMGo0Io+H8eztJoI1S9dvEm2XZT5zzchqe8gYJw==} + + remark-emoji@3.1.2: + resolution: {integrity: sha512-QwhAzNk27Ol64uV4z/3n55MKrNz9bhr8wg+mO5aGqIYDS+jUarS1d8Y0ZIeEBVhfGkXj6gGYM+727sOgAPvV/A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + + remark-mdc@1.1.3: + resolution: {integrity: sha512-ilYSkkQJhu5cUCEE2CJEncoMDoarP32ugfJpFWghXbnv3sWI3j2HtJuArc9tZzxN4ID6fngio3d8N87QfQAnRQ==} + + remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + + remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + + remark-squeeze-paragraphs@5.0.1: + resolution: {integrity: sha512-VWPAoa1bAAtU/aQfSLRZ7vOrwH9I02RhZTSo+e0LT3fVO9RKNCq/bwobIEBhxvNCt00JoQ7GwR3sYGhmD2/y6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + robust-predicates@3.0.1: + resolution: {integrity: sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==} + + rollup-plugin-dts@5.2.0: + resolution: {integrity: sha512-B68T/haEu2MKcz4kNUhXB8/h5sq4gpplHAJIYNHbh8cp4ZkvzDvNca/11KQdFrB9ZeKucegQIotzo5T0JUtM8w==} + engines: {node: '>=v14'} + peerDependencies: + rollup: ^3.0.0 + typescript: ^4.1 + + rollup-plugin-visualizer@5.9.2: + resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + + rollup@3.25.1: + resolution: {integrity: sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rollup@3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-con@1.2.11: + resolution: {integrity: sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + satori-html@0.3.2: + resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==} + + satori@0.4.3: + resolution: {integrity: sha512-gGiXXD52Rk0vkknf0ntf7Bmn0BzoMp9bU/wVdQiUFTf1vRLpxixlsMlT4hP6oqF+Z7sb98+dNtLGJ3ZVVPDyrg==} + engines: {node: '>=16'} + + sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + + scule@1.0.0: + resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} + + seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + + semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + + semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + + semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + + serve-placeholder@2.0.1: + resolution: {integrity: sha512-rUzLlXk4uPFnbEaIz3SW8VISTxMuONas88nYWjAWaM2W9VDbt9tyFOr3lq8RhVOFrT3XISoBw8vni5una8qMnQ==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.0: + resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} + + shiki-es@0.14.0: + resolution: {integrity: sha512-e+/aueHx0YeIEut6RXC6K8gSf0PykwZiHD7q7AHtpTW8Kd8TpFUIWqTwhAnrGjOyOMyrwv+syr5WPagMpDpVYQ==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.0.1: + resolution: {integrity: sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==} + engines: {node: '>=14'} + + sigstore@1.4.0: + resolution: {integrity: sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + sirv@2.0.3: + resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} + engines: {node: '>= 10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slugify@1.6.6: + resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} + engines: {node: '>=8.0.0'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + smob@1.4.0: + resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + socket.io-client@4.6.1: + resolution: {integrity: sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==} + engines: {node: '>=10.0.0'} + + socket.io-client@4.7.2: + resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.2: + resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + + socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + + ssri@10.0.4: + resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.codepointat@0.2.1: + resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + + strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + + strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + + style-dictionary-esm@1.3.7: + resolution: {integrity: sha512-xO2o8sKGera0SMLCLtix1dPvgD2ZyX2VohZ09cGRRuXBb8HQObqhgDQw4dLW+qJy4gj7r4Mdhz9J1rS2p50xDw==} + engines: {node: '>=12.0.0'} + hasBin: true + + stylehacks@6.0.0: + resolution: {integrity: sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + + stylis@4.1.3: + resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@9.3.1: + resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} + engines: {node: '>=12'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + svg2png-wasm@1.3.4: + resolution: {integrity: sha512-gnegOEiLojoUA8l1ZpyuevruqLTIeiMry6gFcLvXf20cBnaSKLCNl1n+sNrDbBQswsnxIAbI2kU2/P4mwArCgA==} + + svgo@3.0.2: + resolution: {integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.1.13: + resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} + engines: {node: '>=10'} + + terser@5.17.7: + resolution: {integrity: sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + tinyws@0.1.0: + resolution: {integrity: sha512-6WQ2FlFM7qm6lAXxeKnzsAEfmnBHz5W5EwonNs52V0++YfK1IoCCAWM429afcChFE9BFrDgOFnq7ligaWMsa/A==} + engines: {node: '>=12.4'} + peerDependencies: + ws: '>=8' + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.0: + resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsx@3.12.7: + resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} + hasBin: true + + tuf-js@1.1.5: + resolution: {integrity: sha512-inqodgxdsmuxrtQVbu6tPNgRKWD1Boy3VB6GO7KczJZpAHiTukwhSzXUSzvDcw5pE2Jo8ua+e1ykpHv7VdPVlQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + twemoji-parser@14.0.0: + resolution: {integrity: sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA==} + + twemoji@14.0.2: + resolution: {integrity: sha512-BzOoXIe1QVdmsUmZ54xbEH+8AgtOKUiG53zO5vVP2iUu6h5u9lN15NcuS6te4OY96qx0H7JK9vjjl9WQbkTRuA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + + ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + + ufo@1.2.0: + resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + + ultrahtml@1.2.0: + resolution: {integrity: sha512-vxZM2yNvajRmCj/SknRYGNXk2tqiy6kRNvZjJLaleG3zJbSh/aNkOqD1/CVzypw8tyHyhpzYuwQgMMhUB4ZVNQ==} + + unbuild@1.1.2: + resolution: {integrity: sha512-EK5LeABThyn5KbX0eo5c7xKRQhnHVxKN8/e5Y+YQEf4ZobJB6OZ766756wbVqzIY/G/MvAfLbc6EwFPdSNnlpA==} + hasBin: true + + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + unctx@2.3.1: + resolution: {integrity: sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==} + + undici@5.22.1: + resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} + engines: {node: '>=14.0'} + + unenv@1.5.1: + resolution: {integrity: sha512-tQHlmQUPyIoyGc2bF8phugmQd6wVatkVe5FqxxhM1vHfmPKWTiogSVTHA0mO8gNztDKZLpBEJx3M3CJrTZyExg==} + + unenv@1.7.1: + resolution: {integrity: sha512-iINrdDcqoAjGqoIeOW85TIfI13KGgW1VWwqNO/IzcvvZ/JGBApMAQPZhWcKhE5oC/woFSpCSXg5lc7r1UaLPng==} + + unhead@1.1.26: + resolution: {integrity: sha512-MshcPoPLXSGRgYtczddGvMgLUISTbt2pxihqD5kZVXKmY2FZLj1OQIY111aX45Xq47XJxjvYavvoyeUFroKQcg==} + + unhead@1.1.28: + resolution: {integrity: sha512-lJqXq5YMAD3p+Nhnvb7fNJwkU91kJNhrnZNcEuAlaTB+0L4es69UvMzekT/wvoE7pde4Yxs0upcTyL4BBz4vQw==} + + unhead@1.2.2: + resolution: {integrity: sha512-9wDuiso7YWNe0BTA5NGsHR0dtqn0YrL/5+NumfuXDxxYykavc6N27pzZxTXiuvVHbod8tFicsxA6pC9WhQvzqg==} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unimport@3.0.10: + resolution: {integrity: sha512-rKxlbbjxVQR+6dL7OxJSuVOu96MtTvoRY0VBasGQTgZGTzKPrawZ4zMv7bmhLHRmUqG/CUAJ4uNZlaip+F/6+A==} + + unimport@3.1.3: + resolution: {integrity: sha512-up4TE2yA+nMyyErGTjbYGVw95MriGa2hVRXQ3/JRp7984cwwqULcnBjHaovVpsO8tZc2j0fvgGu9yiBKOyxvYw==} + + unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unist-builder@4.0.0: + resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} + + unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + unplugin-ast@0.7.0: + resolution: {integrity: sha512-tPSr1yaEigjjHuxa7GaFp5eYW3R7FLmU3D+tu2+iF2rnH+Lnqb2jE9gFKZbqdk7UFTYgvPFvOzfhIF48imgZDw==} + engines: {node: '>=14.19.0'} + + unplugin-vue-router@0.6.4: + resolution: {integrity: sha512-9THVhhtbVFxbsIibjK59oPwMI1UCxRWRPX7azSkTUABsxovlOXJys5SJx0kd/0oKIqNJuYgkRfAgPuO77SqCOg==} + peerDependencies: + vue-router: ^4.1.0 + peerDependenciesMeta: + vue-router: + optional: true + + unplugin@1.3.1: + resolution: {integrity: sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw==} + + unplugin@1.4.0: + resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} + + unstorage@1.7.0: + resolution: {integrity: sha512-f78UtR4HyUGWuET35iNPdKMvCh9YPQpC7WvkGpP6XiLlolT/9wjyAICYN9AMD/tlB8ZdOqWQHZn+j7mXcTSO4w==} + peerDependencies: + '@azure/app-configuration': ^1.4.1 + '@azure/cosmos': ^3.17.3 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^3.2.2 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.14.0 + '@planetscale/database': ^1.7.0 + '@upstash/redis': ^1.20.6 + '@vercel/kv': ^0.2.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + + unstorage@1.9.0: + resolution: {integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==} + peerDependencies: + '@azure/app-configuration': ^1.4.1 + '@azure/cosmos': ^3.17.3 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^3.2.3 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.14.0 + '@capacitor/preferences': ^5.0.0 + '@planetscale/database': ^1.8.0 + '@upstash/redis': ^1.22.0 + '@vercel/kv': ^0.2.2 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + untyped@1.3.2: + resolution: {integrity: sha512-z219Z65rOGD6jXIvIhpZFfwWdqQckB8sdZec2NO+TkcH1Bph7gL0hwLzRJs1KsOo4Jz4mF9guBXhsEnyEBGVfw==} + hasBin: true + + update-browserslist-db@1.0.10: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + vite-node@0.33.0: + resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} + engines: {node: '>=v14.18.0'} + hasBin: true + + vite-plugin-checker@0.6.1: + resolution: {integrity: sha512-4fAiu3W/IwRJuJkkUZlWbLunSzsvijDf0eDN6g/MGh6BUK4SMclOTGbLJCPvdAcMOQvVmm8JyJeYLYd4//8CkA==} + engines: {node: '>=14.16'} + peerDependencies: + eslint: '>=7' + meow: ^9.0.0 + optionator: ^0.9.1 + stylelint: '>=13' + typescript: '*' + vite: '>=2.0.0' + vls: '*' + vti: '*' + vue-tsc: '>=1.3.9' + peerDependenciesMeta: + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + stylelint: + optional: true + typescript: + optional: true + vls: + optional: true + vti: + optional: true + vue-tsc: + optional: true + + vite-plugin-inspect@0.7.36: + resolution: {integrity: sha512-zdFTvLAU0Xb0C9B+JepUN353bZxBWqgkE71URe/9kfM38r6PtR5y2mo0CH1lBuX1DHNhKumLMUGXkvJ+z2OJ4w==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^3.1.0 || ^4.0.0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-vue-inspector@3.6.0: + resolution: {integrity: sha512-Fi+9JaMx/reuic+MWbrdw8g5TwZM5a/BmdBT8OKKZi3rK4Qw3wND9smT+Ld+Daitbgly17uvuCiull2KV/hEBQ==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 + + vite@4.3.9: + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + vscode-languageclient@7.0.0: + resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==} + engines: {vscode: ^1.52.0} + + vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + + vscode-languageserver-textdocument@1.0.8: + resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} + + vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + + vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + + vscode-uri@3.0.7: + resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} + + vue-bundle-renderer@1.0.3: + resolution: {integrity: sha512-EfjX+5TTUl70bki9hPuVp+54JiZOvFIfoWBcfXsSwLzKEiDYyHNi5iX8srnqLIv3YRnvxgbntdcG1WPq0MvffQ==} + + vue-component-meta@1.2.0: + resolution: {integrity: sha512-z+/pL4txu5qCULbGHFn6vOlSR1V5gFDGWkD64Z2yLlKtYr0Wlb9oOfWTaXxpSl7R+EiX7JusbTlek0szSYeH1g==} + peerDependencies: + typescript: '*' + + vue-demi@0.14.0: + resolution: {integrity: sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-demi@0.14.5: + resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-devtools-stub@0.1.0: + resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} + + vue-eslint-parser@9.4.2: + resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-router@4.2.4: + resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==} + peerDependencies: + vue: ^3.2.0 + + vue-template-compiler@2.7.14: + resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} + + vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + + wait-on@7.0.1: + resolution: {integrity: sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==} + engines: {node: '>=12.0.0'} + hasBin: true + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + + web-worker@1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-typed-array@1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + xxhashjs@0.2.2: + resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + yoga-wasm-web@0.3.3: + resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} + + zhead@2.0.10: + resolution: {integrity: sha512-irug8fXNKjqazkA27cFQs7C6/ZD3qNiEzLC56kDyzQART/Z9GMGfg8h2i6fb9c8ZWnIx/QgOgFJxK3A/CYHG0g==} + + zhead@2.0.7: + resolution: {integrity: sha512-q9iCCXBWndfYNMGCN7S970+e3ILAPzmX78Skblx7+SGlo6x6SXW0GJ5mJzigYsq2mkHCGqEUhe0QGDEDZauw8g==} + + zip-stream@4.1.0: + resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==} + engines: {node: '>= 10'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@ampproject/remapping@2.2.0': + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + + '@aneoconsultingfr/armonik-docs-theme@0.6.13(@types/node@18.15.3)(@unhead/vue@1.2.2(vue@3.3.4))(axios@0.27.2)(change-case@4.1.2)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(postcss@8.4.24)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7))(vue@3.3.4)': + dependencies: + '@nuxt-themes/docus': 1.14.6(axios@0.27.2)(change-case@4.1.2)(nuxt@3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4))(postcss@8.4.24)(rollup@3.28.0)(vue@3.3.4) + '@nuxt/devtools': 0.7.6(nuxt@3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4))(rollup@3.28.0)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7)) + mermaid: 10.3.1 + nuxt: 3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4) + nuxt-seo-kit: 1.3.9(@unhead/vue@1.2.2(vue@3.3.4))(rollup@3.28.0)(vue@3.3.4) + playwright: 1.37.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@parcel/watcher' + - '@planetscale/database' + - '@types/node' + - '@unhead/vue' + - '@upstash/redis' + - '@vercel/kv' + - '@vue/composition-api' + - async-validator + - axios + - bluebird + - bufferutil + - change-case + - debug + - drauu + - encoding + - eslint + - idb-keyval + - jwt-decode + - less + - meow + - nprogress + - optionator + - postcss + - qrcode + - rollup + - sass + - sortablejs + - stylelint + - stylus + - sugarss + - supports-color + - terser + - typescript + - universal-cookie + - utf-8-validate + - vite + - vls + - vti + - vue + - vue-tsc + + '@antfu/utils@0.7.4': {} + + '@antfu/utils@0.7.5': {} + + '@babel/code-frame@7.18.6': + dependencies: + '@babel/highlight': 7.18.6 + + '@babel/compat-data@7.21.0': {} + + '@babel/core@7.21.3': + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.22.5 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.21.3': + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.18.6': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.3)': + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + + '@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.21.3)': + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-environment-visitor@7.18.9': {} + + '@babel/helper-function-name@7.21.0': + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.22.5 + + '@babel/helper-hoist-variables@7.18.6': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-member-expression-to-functions@7.21.0': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-module-transforms@7.21.2': + 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.22.5 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.18.6': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-plugin-utils@7.20.2': {} + + '@babel/helper-replace-supers@7.20.7': + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.20.2': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-skip-transparent-expression-wrappers@7.20.0': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-split-export-declaration@7.18.6': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-string-parser@7.22.5': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-identifier@7.22.5': {} + + '@babel/helper-validator-option@7.21.0': {} + + '@babel/helpers@7.21.0': + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.18.6': + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/parser@7.22.10': + dependencies: + '@babel/types': 7.22.5 + + '@babel/parser@7.22.5': + dependencies: + '@babel/types': 7.22.5 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.3)': + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + + '@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.3)': + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + + '@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.21.3)': + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + + '@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.3)': + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.3) + transitivePeerDependencies: + - supports-color + + '@babel/standalone@7.21.3': {} + + '@babel/template@7.20.7': + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 + + '@babel/traverse@7.21.3': + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.22.5': + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + + '@braintree/sanitize-url@6.0.2': {} + + '@cloudflare/kv-asset-handler@0.3.0': + dependencies: + mime: 3.0.0 + + '@csstools/cascade-layer-name-parser@1.0.1(@csstools/css-parser-algorithms@2.0.1(@csstools/css-tokenizer@2.1.0))(@csstools/css-tokenizer@2.1.0)': + dependencies: + '@csstools/css-parser-algorithms': 2.0.1(@csstools/css-tokenizer@2.1.0) + '@csstools/css-tokenizer': 2.1.0 + + '@csstools/css-parser-algorithms@2.0.1(@csstools/css-tokenizer@2.1.0)': + dependencies: + '@csstools/css-tokenizer': 2.1.0 + + '@csstools/css-tokenizer@2.1.0': {} + + '@es-joy/jsdoccomment@0.42.0': + dependencies: + comment-parser: 1.4.1 + esquery: 1.5.0 + jsdoc-type-pratt-parser: 4.0.0 + + '@esbuild-kit/cjs-loader@2.4.2': + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.5.0 + + '@esbuild-kit/core-utils@3.1.0': + dependencies: + esbuild: 0.17.19 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.5.5': + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.5.0 + + '@esbuild/android-arm64@0.17.19': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.17.19': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.17.19': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.17.19': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.17.19': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.17.19': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.17.19': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.17.19': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.17.19': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.17.19': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.17.19': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.17.19': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.17.19': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.17.19': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.17.19': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.17.19': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.17.19': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.17.19': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.17.19': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.17.19': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.17.19': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.17.19': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.0.0)': + dependencies: + eslint: 9.0.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint-community/regexpp@4.6.2': {} + + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -908,126 +6039,95 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.47.0: - resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.0.2': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 10.0.1 + globals: 14.0.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - dev: false + '@eslint/js@9.0.0': {} - /@hapi/hoek@9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - dev: false + '@gar/promisify@1.1.3': {} - /@hapi/topo@5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': dependencies: '@hapi/hoek': 9.3.0 - dev: false - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.12.3': dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + '@humanwhocodes/object-schema@2.0.3': {} - /@iconify/types@2.0.0: - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - dev: false + '@iconify/types@2.0.0': {} - /@iconify/vue@4.1.0(vue@3.3.4): - resolution: {integrity: sha512-rBQVxNoSDooqgWkQg2MqkIHkH/huNuvXGqui5wijc1zLnU7TKzbBHW9VGmbnV4asNTmIHmqV4Nvt0M2rZ/9nHA==} - peerDependencies: - vue: '>=3' + '@iconify/vue@4.1.0(vue@3.3.4)': dependencies: '@iconify/types': 2.0.0 vue: 3.3.4 - dev: false - /@ioredis/commands@1.2.0: - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - dev: false + '@ioredis/commands@1.2.0': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.0.1 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@jridgewell/gen-mapping@0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.1.1': dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 - dev: false - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.2': dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 '@jridgewell/trace-mapping': 0.3.17 - dev: false - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: false + '@jridgewell/resolve-uri@3.1.0': {} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: false + '@jridgewell/set-array@1.1.2': {} - /@jridgewell/source-map@0.3.3: - resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + '@jridgewell/source-map@0.3.3': dependencies: '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.17 - dev: false - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: false + '@jridgewell/sourcemap-codec@1.4.14': {} - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: false + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + '@jridgewell/trace-mapping@0.3.17': dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 - dev: false - /@mapbox/node-pre-gyp@1.0.10: - resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} - hasBin: true + '@mapbox/node-pre-gyp@1.0.10(encoding@0.1.13)': dependencies: detect-libc: 2.0.1 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.6.9 + node-fetch: 2.6.9(encoding@0.1.13) nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -1036,51 +6136,33 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /@netlify/functions@1.6.0: - resolution: {integrity: sha512-6G92AlcpFrQG72XU8YH8pg94eDnq7+Q0YJhb8x4qNpdGsvuzvrfHWBmqFGp/Yshmv4wex9lpsTRZOocdrA2erQ==} - engines: {node: '>=14.0.0'} + '@netlify/functions@1.6.0': dependencies: is-promise: 4.0.0 - dev: false - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@npmcli/fs@2.1.2: - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 semver: 7.5.4 - dev: false - /@npmcli/fs@3.1.0: - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@3.1.0': dependencies: semver: 7.5.4 - dev: false - /@npmcli/git@4.0.4: - resolution: {integrity: sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/git@4.0.4': dependencies: '@npmcli/promise-spawn': 6.0.2 lru-cache: 7.18.3 @@ -1092,41 +6174,24 @@ packages: which: 3.0.1 transitivePeerDependencies: - bluebird - dev: false - /@npmcli/installed-package-contents@2.0.2: - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + '@npmcli/installed-package-contents@2.0.2': dependencies: npm-bundled: 3.0.0 npm-normalize-package-bin: 3.0.1 - dev: false - /@npmcli/move-file@2.0.1: - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs + '@npmcli/move-file@2.0.1': dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 - dev: false - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: false + '@npmcli/node-gyp@3.0.0': {} - /@npmcli/promise-spawn@6.0.2: - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/promise-spawn@6.0.2': dependencies: which: 3.0.1 - dev: false - /@npmcli/run-script@6.0.2: - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/run-script@6.0.2': dependencies: '@npmcli/node-gyp': 3.0.0 '@npmcli/promise-spawn': 6.0.2 @@ -1136,18 +6201,16 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: false - /@nuxt-themes/docus@1.14.6(nuxt@3.6.5)(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-tkSG7j0jhVo53wEpK9V48hIvaK0XEzVU64hXhFfnIMv6LJu99cKOC//boebPbN9qLbJmkBdo4IAIJ0tN5MD0qw==} + '@nuxt-themes/docus@1.14.6(axios@0.27.2)(change-case@4.1.2)(nuxt@3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4))(postcss@8.4.24)(rollup@3.28.0)(vue@3.3.4)': dependencies: - '@nuxt-themes/elements': 0.9.4(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) - '@nuxt-themes/tokens': 1.9.1(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) - '@nuxt-themes/typography': 0.11.0(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) - '@nuxt/content': 2.7.2(rollup@3.25.1) - '@nuxthq/studio': 0.13.4(rollup@3.25.1) - '@vueuse/integrations': 10.3.0(focus-trap@7.5.2)(fuse.js@6.6.2)(vue@3.3.4) - '@vueuse/nuxt': 10.3.0(nuxt@3.6.5)(rollup@3.25.1)(vue@3.3.4) + '@nuxt-themes/elements': 0.9.4(postcss@8.4.24)(rollup@3.28.0)(vue@3.3.4) + '@nuxt-themes/tokens': 1.9.1(postcss@8.4.24)(rollup@3.28.0)(vue@3.3.4) + '@nuxt-themes/typography': 0.11.0(postcss@8.4.24)(rollup@3.28.0)(vue@3.3.4) + '@nuxt/content': 2.7.2(rollup@3.28.0) + '@nuxthq/studio': 0.13.4(rollup@3.28.0) + '@vueuse/integrations': 10.3.0(axios@0.27.2)(change-case@4.1.2)(focus-trap@7.5.2)(fuse.js@6.6.2)(vue@3.3.4) + '@vueuse/nuxt': 10.3.0(nuxt@3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4))(rollup@3.28.0)(vue@3.3.4) focus-trap: 7.5.2 fuse.js: 6.6.2 transitivePeerDependencies: @@ -1180,12 +6243,10 @@ packages: - universal-cookie - utf-8-validate - vue - dev: false - /@nuxt-themes/elements@0.9.4(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-d7XgHc/gjMpre26+N76APL1vlnQHiZTOk61GC4I/ZYQuioSfoKuoIP+Ixrr0QgM22j4MRBtAaBnDAg1wRJrDCQ==} + '@nuxt-themes/elements@0.9.4(postcss@8.4.24)(rollup@3.28.0)(vue@3.3.4)': dependencies: - '@nuxt-themes/tokens': 1.9.1(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4) + '@nuxt-themes/tokens': 1.9.1(postcss@8.4.24)(rollup@3.28.0)(vue@3.3.4) '@vueuse/core': 9.13.0(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' @@ -1194,12 +6255,10 @@ packages: - sass - supports-color - vue - dev: false - /@nuxt-themes/tokens@1.9.1(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-5C28kfRvKnTX8Tux+xwyaf+2pxKgQ53dC9l6C33sZwRRyfUJulGDZCFjKbuNq4iqVwdGvkFSQBYBYjFAv6t75g==} + '@nuxt-themes/tokens@1.9.1(postcss@8.4.24)(rollup@3.28.0)(vue@3.3.4)': dependencies: - '@nuxtjs/color-mode': 3.2.0(rollup@3.25.1) + '@nuxtjs/color-mode': 3.2.0(rollup@3.28.0) '@vueuse/core': 9.13.0(vue@3.3.4) pinceau: 0.18.8(postcss@8.4.24) transitivePeerDependencies: @@ -1209,14 +6268,12 @@ packages: - sass - supports-color - vue - dev: false - /@nuxt-themes/typography@0.11.0(postcss@8.4.24)(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-TqyvD7sDWnqGmL00VtuI7JdmNTPL5/g957HCAWNzcNp+S20uJjW/FXSdkM76d4JSVDHvBqw7Wer3RsqVhqvA4w==} + '@nuxt-themes/typography@0.11.0(postcss@8.4.24)(rollup@3.28.0)(vue@3.3.4)': dependencies: - '@nuxtjs/color-mode': 3.2.0(rollup@3.25.1) - nuxt-config-schema: 0.4.6(rollup@3.25.1) - nuxt-icon: 0.3.3(rollup@3.25.1)(vue@3.3.4) + '@nuxtjs/color-mode': 3.2.0(rollup@3.28.0) + nuxt-config-schema: 0.4.6(rollup@3.28.0) + nuxt-icon: 0.3.3(rollup@3.28.0)(vue@3.3.4) pinceau: 0.18.8(postcss@8.4.24) ufo: 1.1.2 transitivePeerDependencies: @@ -1225,12 +6282,10 @@ packages: - sass - supports-color - vue - dev: false - /@nuxt/content@2.7.2(rollup@3.25.1): - resolution: {integrity: sha512-fP0nrnyjtFbluKltKUtC7jSMFc1xAH+bwweZyLwXb3gkIap2EHlVL+e9ptGt39+4HIkRkLgME7TNr/fUO+CHug==} + '@nuxt/content@2.7.2(rollup@3.28.0)': dependencies: - '@nuxt/kit': 3.6.5(rollup@3.25.1) + '@nuxt/kit': 3.6.5(rollup@3.28.0) consola: 3.2.3 defu: 6.1.2 destr: 2.0.0 @@ -1282,31 +6337,21 @@ packages: - rollup - supports-color - utf-8-validate - dev: false - /@nuxt/devalue@2.0.2: - resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} - dev: false + '@nuxt/devalue@2.0.2': {} - /@nuxt/devtools-kit@0.7.6(nuxt@3.6.5)(rollup@3.25.1)(vite@4.3.9): - resolution: {integrity: sha512-2jSQ1rgStZifRHtfsdqmmvq/O5NskLCwg34JPchBRAx9Kv5IadABlBIWz1jLuaGarI/jsEEAmA5EpfxI5z/PJQ==} - peerDependencies: - nuxt: ^3.6.5 - vite: '*' + '@nuxt/devtools-kit@0.7.6(nuxt@3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4))(rollup@3.28.0)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7))': dependencies: - '@nuxt/kit': 3.6.5(rollup@3.25.1) - '@nuxt/schema': 3.6.5(rollup@3.25.1) + '@nuxt/kit': 3.6.5(rollup@3.28.0) + '@nuxt/schema': 3.6.5(rollup@3.28.0) execa: 7.2.0 - nuxt: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) - vite: 4.3.9(@types/node@18.15.3) + nuxt: 3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4) + vite: 4.3.9(@types/node@18.15.3)(terser@5.17.7) transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/devtools-wizard@0.7.6: - resolution: {integrity: sha512-XCznlUTk66ApYJygGc+6FVborAp2F4PAIvY4b6dVSUf1f47Hs3CPe6eEdatarmEqiTmFMInaX4y8z1hDXrFF0Q==} - hasBin: true + '@nuxt/devtools-wizard@0.7.6': dependencies: consola: 3.2.3 diff: 5.1.0 @@ -1319,18 +6364,12 @@ packages: prompts: 2.4.2 rc9: 2.1.1 semver: 7.5.4 - dev: false - /@nuxt/devtools@0.7.6(nuxt@3.6.5)(rollup@3.25.1)(vite@4.3.9): - resolution: {integrity: sha512-2x/eS0KbzTCK4+OozSZTcbjndM2ySy84MltF/suwLP7Wp/ehY8vzRp+yMTksxLjsf0sbiAa4K8WJCzKd8wLXxA==} - hasBin: true - peerDependencies: - nuxt: ^3.6.5 - vite: '*' + '@nuxt/devtools@0.7.6(nuxt@3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4))(rollup@3.28.0)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7))': dependencies: - '@nuxt/devtools-kit': 0.7.6(nuxt@3.6.5)(rollup@3.25.1)(vite@4.3.9) + '@nuxt/devtools-kit': 0.7.6(nuxt@3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4))(rollup@3.28.0)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7)) '@nuxt/devtools-wizard': 0.7.6 - '@nuxt/kit': 3.6.5(rollup@3.25.1) + '@nuxt/kit': 3.6.5(rollup@3.28.0) birpc: 0.2.12 boxen: 7.1.1 consola: 3.2.3 @@ -1347,7 +6386,7 @@ packages: launch-editor: 2.6.0 local-pkg: 0.4.3 magicast: 0.2.10 - nuxt: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) + nuxt: 3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4) nypm: 0.2.2 pacote: 15.2.0 pathe: 1.1.1 @@ -1357,10 +6396,10 @@ packages: rc9: 2.1.1 semver: 7.5.4 sirv: 2.0.3 - unimport: 3.1.3(rollup@3.25.1) - vite: 4.3.9(@types/node@18.15.3) - vite-plugin-inspect: 0.7.36(@nuxt/kit@3.6.5)(rollup@3.25.1)(vite@4.3.9) - vite-plugin-vue-inspector: 3.6.0(vite@4.3.9) + unimport: 3.1.3(rollup@3.28.0) + vite: 4.3.9(@types/node@18.15.3)(terser@5.17.7) + vite-plugin-inspect: 0.7.36(@nuxt/kit@3.6.5(rollup@3.28.0))(rollup@3.28.0)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7)) + vite-plugin-vue-inspector: 3.6.0(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7)) wait-on: 7.0.1 which: 3.0.1 ws: 8.13.0 @@ -1371,13 +6410,42 @@ packages: - rollup - supports-color - utf-8-validate - dev: false - /@nuxt/kit@3.4.1(rollup@3.25.1): - resolution: {integrity: sha512-VeH26umZW6Rf4F1QX9nTIuTBp6HeL/MgmKY3+FgQiLD07afgFTLUJZohVE5xU7hb66zCnYvwKxa3JpjXFJZrhQ==} - engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} + '@nuxt/eslint-config@0.3.8(eslint@9.0.0)(typescript@5.0.4)': + dependencies: + '@eslint/js': 9.0.0 + '@nuxt/eslint-plugin': 0.3.8(eslint@9.0.0)(typescript@5.0.4) + '@rushstack/eslint-patch': 1.10.2 + '@stylistic/eslint-plugin': 1.7.2(eslint@9.0.0)(typescript@5.0.4) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.0.4))(eslint@9.0.0)(typescript@5.0.4) + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.0.4) + eslint: 9.0.0 + eslint-config-flat-gitignore: 0.1.5 + eslint-flat-config-utils: 0.2.3 + eslint-plugin-import-x: 0.5.0(eslint@9.0.0)(typescript@5.0.4) + eslint-plugin-jsdoc: 48.2.3(eslint@9.0.0) + eslint-plugin-unicorn: 52.0.0(eslint@9.0.0) + eslint-plugin-vue: 9.25.0(eslint@9.0.0) + globals: 15.0.0 + pathe: 1.1.2 + tslib: 2.6.2 + vue-eslint-parser: 9.4.2(eslint@9.0.0) + transitivePeerDependencies: + - supports-color + - typescript + + '@nuxt/eslint-plugin@0.3.8(eslint@9.0.0)(typescript@5.0.4)': + dependencies: + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.0.4) + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@nuxt/kit@3.4.1(rollup@3.28.0)': dependencies: - '@nuxt/schema': 3.4.1(rollup@3.25.1) + '@nuxt/schema': 3.4.1(rollup@3.28.0) c12: 1.4.2 consola: 3.1.0 defu: 6.1.2 @@ -1393,18 +6461,15 @@ packages: scule: 1.0.0 semver: 7.5.3 unctx: 2.3.1 - unimport: 3.0.10(rollup@3.25.1) + unimport: 3.0.10(rollup@3.28.0) untyped: 1.3.2 transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/kit@3.4.2(rollup@3.25.1): - resolution: {integrity: sha512-bFUpkyG2ZF6RYqiW+tXnWssccHQQqMF4kZJJLP/0eKXf+Fkt/Is0R7IY768jy8ylnyqeMBbmpg4Zv5gSZjfZQw==} - engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} + '@nuxt/kit@3.4.2(rollup@3.28.0)': dependencies: - '@nuxt/schema': 3.4.2(rollup@3.25.1) + '@nuxt/schema': 3.4.2(rollup@3.28.0) c12: 1.4.2 consola: 3.1.0 defu: 6.1.2 @@ -1420,18 +6485,15 @@ packages: scule: 1.0.0 semver: 7.5.3 unctx: 2.3.1 - unimport: 3.0.10(rollup@3.25.1) + unimport: 3.0.10(rollup@3.28.0) untyped: 1.3.2 transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/kit@3.6.1(rollup@3.25.1): - resolution: {integrity: sha512-7AoiKV0zAtyT3ZvjMfGislMcB+JMbBZxYw68/oWtkEPXCfGQMYuiMI9Ue246/0JT2Yp2KZclEgrJEJ6NLkqFcw==} - engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/kit@3.6.1(rollup@3.28.0)': dependencies: - '@nuxt/schema': 3.6.1(rollup@3.25.1) + '@nuxt/schema': 3.6.1(rollup@3.28.0) c12: 1.4.2 consola: 3.1.0 defu: 6.1.2 @@ -1446,18 +6508,15 @@ packages: scule: 1.0.0 semver: 7.5.3 unctx: 2.3.1 - unimport: 3.0.10(rollup@3.25.1) + unimport: 3.0.10(rollup@3.28.0) untyped: 1.3.2 transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/kit@3.6.5(rollup@3.25.1): - resolution: {integrity: sha512-uBI5I2Zx6sk+vRHU+nBmifwxg/nyXCGZ1g5hUKrUfgv1ZfiKB8JkN5T9iRoduDOaqbwM6XSnEl1ja73iloDcrw==} - engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/kit@3.6.5(rollup@3.28.0)': dependencies: - '@nuxt/schema': 3.6.5(rollup@3.25.1) + '@nuxt/schema': 3.6.5(rollup@3.28.0) c12: 1.4.2 consola: 3.2.3 defu: 6.1.2 @@ -1472,16 +6531,13 @@ packages: scule: 1.0.0 semver: 7.5.3 unctx: 2.3.1 - unimport: 3.1.3(rollup@3.25.1) + unimport: 3.1.3(rollup@3.28.0) untyped: 1.3.2 transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/schema@3.4.1(rollup@3.25.1): - resolution: {integrity: sha512-xhPh9JfVKXRQVfdUT6BKieDTCljBjbIGgGCQnxplVi4FUTWRKUXR7MFwsobr5D9AJpeE0mg5/kRRh5gUX37vAQ==} - engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} + '@nuxt/schema@3.4.1(rollup@3.28.0)': dependencies: c12: 1.4.2 create-require: 1.1.1 @@ -1494,16 +6550,13 @@ packages: scule: 1.0.0 std-env: 3.3.3 ufo: 1.1.2 - unimport: 3.0.10(rollup@3.25.1) + unimport: 3.0.10(rollup@3.28.0) untyped: 1.3.2 transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/schema@3.4.2(rollup@3.25.1): - resolution: {integrity: sha512-DXB/fyjrAssFt9KGXyS+ZSfm1A0NYKhEoc01wyz1lGo//oETzUh3MmwE6X3x65NPqDlYZ6Mnj+IdftRRophv5Q==} - engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} + '@nuxt/schema@3.4.2(rollup@3.28.0)': dependencies: defu: 6.1.2 hookable: 5.5.3 @@ -1512,16 +6565,13 @@ packages: postcss-import-resolver: 2.0.0 std-env: 3.3.3 ufo: 1.1.2 - unimport: 3.0.10(rollup@3.25.1) + unimport: 3.0.10(rollup@3.28.0) untyped: 1.3.2 transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/schema@3.6.1(rollup@3.25.1): - resolution: {integrity: sha512-+4pr0lkcPP5QqprYV+/ujmBkt2JHmi/v5vaxCrMhElUFgifvJAfT89BkGFn6W7pz0b8Vd3GcByFUWI7/wX/Pcw==} - engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/schema@3.6.1(rollup@3.28.0)': dependencies: defu: 6.1.2 hookable: 5.5.3 @@ -1530,16 +6580,13 @@ packages: postcss-import-resolver: 2.0.0 std-env: 3.3.3 ufo: 1.1.2 - unimport: 3.0.10(rollup@3.25.1) + unimport: 3.0.10(rollup@3.28.0) untyped: 1.3.2 transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/schema@3.6.5(rollup@3.25.1): - resolution: {integrity: sha512-UPUnMB0W5TZ/Pi1fiF71EqIsPlj8LGZqzhSf8wOeh538KHwxbA9r7cuvEUU92eXRksOZaylbea3fJxZWhOITVw==} - engines: {node: ^14.18.0 || >=16.10.0} + '@nuxt/schema@3.6.5(rollup@3.28.0)': dependencies: defu: 6.1.2 hookable: 5.5.3 @@ -1548,18 +6595,15 @@ packages: postcss-import-resolver: 2.0.0 std-env: 3.3.3 ufo: 1.1.2 - unimport: 3.1.3(rollup@3.25.1) + unimport: 3.1.3(rollup@3.28.0) untyped: 1.3.2 transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/telemetry@2.4.1(rollup@3.25.1): - resolution: {integrity: sha512-Cj+4sXjO5pZNW2sX7Y+djYpf4pZwgYF3rV/YHLWIOq9nAjo2UcDXjh1z7qnhkoUkvJN3lHnvhnCNhfAioe6k/A==} - hasBin: true + '@nuxt/telemetry@2.4.1(rollup@3.28.0)': dependencies: - '@nuxt/kit': 3.6.5(rollup@3.25.1) + '@nuxt/kit': 3.6.5(rollup@3.28.0) chalk: 5.3.0 ci-info: 3.8.0 consola: 3.2.3 @@ -1582,22 +6626,15 @@ packages: transitivePeerDependencies: - rollup - supports-color - dev: false - /@nuxt/ui-templates@1.2.0: - resolution: {integrity: sha512-MSZza7dxccNb/p7nuzGF8/m4POaFpHzVhNdR7f4xahOpH7Ja02lFeYR+rHtoHIJC0yym4qriqv0mQ+Qf/R61bQ==} - dev: false + '@nuxt/ui-templates@1.2.0': {} - /@nuxt/vite-builder@3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4)(vue@3.3.4): - resolution: {integrity: sha512-pwSpt257ApCp3XWUs8vrC7X9QHeHUv5PbbIR3+5w0n5f95XPNOQWDJa2fTPX/H6oaRJCPYAsBPqiQhQ7qW/NZQ==} - engines: {node: ^14.18.0 || >=16.10.0} - peerDependencies: - vue: ^3.3.4 + '@nuxt/vite-builder@3.6.5(@types/node@18.15.3)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4)(vue@3.3.4)': dependencies: - '@nuxt/kit': 3.6.5(rollup@3.25.1) - '@rollup/plugin-replace': 5.0.2(rollup@3.25.1) - '@vitejs/plugin-vue': 4.2.3(vite@4.3.9)(vue@3.3.4) - '@vitejs/plugin-vue-jsx': 3.0.1(vite@4.3.9)(vue@3.3.4) + '@nuxt/kit': 3.6.5(rollup@3.28.0) + '@rollup/plugin-replace': 5.0.2(rollup@3.28.0) + '@vitejs/plugin-vue': 4.2.3(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7))(vue@3.3.4) + '@vitejs/plugin-vue-jsx': 3.0.1(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7))(vue@3.3.4) autoprefixer: 10.4.14(postcss@8.4.24) clear: 0.1.0 consola: 3.2.3 @@ -1620,14 +6657,14 @@ packages: postcss: 8.4.24 postcss-import: 15.1.0(postcss@8.4.24) postcss-url: 10.1.3(postcss@8.4.24) - rollup-plugin-visualizer: 5.9.2(rollup@3.25.1) + rollup-plugin-visualizer: 5.9.2(rollup@3.28.0) std-env: 3.3.3 strip-literal: 1.0.1 ufo: 1.1.2 unplugin: 1.4.0 - vite: 4.3.9(@types/node@18.15.3) - vite-node: 0.33.0(@types/node@18.15.3) - vite-plugin-checker: 0.6.1(eslint@8.47.0)(typescript@5.0.4)(vite@4.3.9) + vite: 4.3.9(@types/node@18.15.3)(terser@5.17.7) + vite-node: 0.33.0(@types/node@18.15.3)(terser@5.17.7) + vite-plugin-checker: 0.6.1(eslint@9.0.0)(optionator@0.9.3)(typescript@5.0.4)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7)) vue: 3.3.4 vue-bundle-renderer: 1.0.3 transitivePeerDependencies: @@ -1647,15 +6684,13 @@ packages: - vls - vti - vue-tsc - dev: false - /@nuxthq/studio@0.13.4(rollup@3.25.1): - resolution: {integrity: sha512-+Jn0iN6TvRTTtTBX4qXWhtOMLL4rsyUIX3/9HM+eBAwr5/cELLw3RuI1tgp942QteTi7PvI5Av4nEi6BlLBr+A==} + '@nuxthq/studio@0.13.4(rollup@3.28.0)': dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) + '@nuxt/kit': 3.6.1(rollup@3.28.0) defu: 6.1.2 - nuxt-component-meta: 0.5.1(rollup@3.25.1) - nuxt-config-schema: 0.4.6(rollup@3.25.1) + nuxt-component-meta: 0.5.1(rollup@3.28.0) + nuxt-config-schema: 0.4.6(rollup@3.28.0) socket.io-client: 4.6.1 ufo: 1.1.2 transitivePeerDependencies: @@ -1663,124 +6698,40 @@ packages: - rollup - supports-color - utf-8-validate - dev: false - /@nuxtjs/color-mode@3.2.0(rollup@3.25.1): - resolution: {integrity: sha512-isDR01yfadopiHQ/VEVUpyNSPrk5PCjUHS4t1qYRZwuRGefU4s9Iaxf6H9nmr1QFzoMgTm+3T0r/54jLwtpZbA==} + '@nuxtjs/color-mode@3.2.0(rollup@3.28.0)': dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) + '@nuxt/kit': 3.6.1(rollup@3.28.0) lodash.template: 4.5.0 pathe: 1.1.1 transitivePeerDependencies: - rollup - supports-color - dev: false - - /@nuxtjs/eslint-config-typescript@12.0.0(eslint@8.47.0)(typescript@5.0.4): - resolution: {integrity: sha512-HJR0ho5MYuOCFjkL+eMX/VXbUwy36J12DUMVy+dj3Qz1GYHwX92Saxap3urFzr8oPkzzFiuOknDivfCeRBWakg==} - peerDependencies: - eslint: ^8.23.0 - dependencies: - '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) - '@typescript-eslint/eslint-plugin': 5.59.5(@typescript-eslint/parser@5.59.5)(eslint@8.47.0)(typescript@5.0.4) - '@typescript-eslint/parser': 5.59.5(eslint@8.47.0)(typescript@5.0.4) - eslint: 8.47.0 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.5)(eslint-plugin-import@2.27.5)(eslint@8.47.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) - eslint-plugin-vue: 9.11.1(eslint@8.47.0) - transitivePeerDependencies: - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - typescript - dev: true - - /@nuxtjs/eslint-config@12.0.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0): - resolution: {integrity: sha512-ewenelo75x0eYEUK+9EBXjc/OopQCvdkmYmlZuoHq5kub/vtiRpyZ/autppwokpHUq8tiVyl2ejMakoiHiDTrg==} - peerDependencies: - eslint: ^8.23.0 - dependencies: - eslint: 8.47.0 - eslint-config-standard: 17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) - eslint-plugin-n: 15.7.0(eslint@8.47.0) - eslint-plugin-node: 11.1.0(eslint@8.47.0) - eslint-plugin-promise: 6.1.1(eslint@8.47.0) - eslint-plugin-unicorn: 44.0.2(eslint@8.47.0) - eslint-plugin-vue: 9.11.1(eslint@8.47.0) - local-pkg: 0.4.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /@parcel/watcher-wasm@2.3.0-alpha.1: - resolution: {integrity: sha512-wo6065l1MQ6SJPPchYw/q8J+pFL40qBXLu4Td2CXeQ/+mUk8NenNqC75P/P1Cyvpam0kfk91iszd+XL+xKDQww==} - engines: {node: '>= 10.0.0'} + '@parcel/watcher-wasm@2.3.0-alpha.1': dependencies: is-glob: 4.0.3 micromatch: 4.0.5 napi-wasm: 1.1.0 - dev: false - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true + '@pkgjs/parseargs@0.11.0': optional: true - /@pkgr/utils@2.4.0: - resolution: {integrity: sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.2.12 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.5.0 - dev: true - - /@polka/url@1.0.0-next.21: - resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} - dev: false + '@polka/url@1.0.0-next.21': {} - /@rollup/plugin-alias@4.0.3(rollup@3.25.1): - resolution: {integrity: sha512-ZuDWE1q4PQDhvm/zc5Prun8sBpLJy41DMptYrS6MhAy9s9kL/doN1613BWfEchGVfKxzliJ3BjbOPizXX38DbQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-alias@4.0.3(rollup@3.25.1)': dependencies: - rollup: 3.25.1 slash: 4.0.0 - dev: false + optionalDependencies: + rollup: 3.25.1 - /@rollup/plugin-alias@5.0.0(rollup@3.28.0): - resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-alias@5.0.0(rollup@3.28.0)': dependencies: - rollup: 3.28.0 slash: 4.0.0 - dev: false + optionalDependencies: + rollup: 3.28.0 - /@rollup/plugin-commonjs@24.1.0(rollup@3.25.1): - resolution: {integrity: sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-commonjs@24.1.0(rollup@3.25.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.25.1) commondir: 1.0.1 @@ -1788,17 +6739,10 @@ packages: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 + optionalDependencies: rollup: 3.25.1 - dev: false - /@rollup/plugin-commonjs@25.0.2(rollup@3.28.0): - resolution: {integrity: sha512-NGTwaJxIO0klMs+WSFFtBP7b9TdTJ3K76HZkewT8/+yHzMiUGVQgaPtLQxNVYIgT5F7lxkEyVID+yS3K7bhCow==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-commonjs@25.0.2(rollup@3.28.0)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.28.0) commondir: 1.0.1 @@ -1806,58 +6750,30 @@ packages: glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 + optionalDependencies: rollup: 3.28.0 - dev: false - /@rollup/plugin-inject@5.0.3(rollup@3.28.0): - resolution: {integrity: sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-inject@5.0.3(rollup@3.28.0)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.28.0) estree-walker: 2.0.2 magic-string: 0.27.0 - rollup: 3.28.0 - dev: false - - /@rollup/plugin-json@6.0.0(rollup@3.25.1): - resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + optionalDependencies: + rollup: 3.28.0 + + '@rollup/plugin-json@6.0.0(rollup@3.25.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + optionalDependencies: rollup: 3.25.1 - dev: false - /@rollup/plugin-json@6.0.0(rollup@3.28.0): - resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-json@6.0.0(rollup@3.28.0)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.28.0) + optionalDependencies: rollup: 3.28.0 - dev: false - /@rollup/plugin-node-resolve@15.1.0(rollup@3.25.1): - resolution: {integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-node-resolve@15.1.0(rollup@3.25.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.25.1) '@types/resolve': 1.20.2 @@ -1865,17 +6781,10 @@ packages: is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.1 + optionalDependencies: rollup: 3.25.1 - dev: false - /@rollup/plugin-node-resolve@15.1.0(rollup@3.28.0): - resolution: {integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-node-resolve@15.1.0(rollup@3.28.0)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.28.0) '@types/resolve': 1.20.2 @@ -1883,404 +6792,336 @@ packages: is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.1 + optionalDependencies: rollup: 3.28.0 - dev: false - /@rollup/plugin-replace@5.0.2(rollup@3.25.1): - resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-replace@5.0.2(rollup@3.25.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.25.1) magic-string: 0.27.0 + optionalDependencies: rollup: 3.25.1 - dev: false - /@rollup/plugin-replace@5.0.2(rollup@3.28.0): - resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-replace@5.0.2(rollup@3.28.0)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.28.0) magic-string: 0.27.0 + optionalDependencies: rollup: 3.28.0 - dev: false - /@rollup/plugin-terser@0.4.3(rollup@3.28.0): - resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.x || ^3.x - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-terser@0.4.3(rollup@3.28.0)': dependencies: - rollup: 3.28.0 serialize-javascript: 6.0.1 smob: 1.4.0 terser: 5.17.7 - dev: false + optionalDependencies: + rollup: 3.28.0 - /@rollup/plugin-wasm@6.1.3(rollup@3.28.0): - resolution: {integrity: sha512-7ItTTeyauE6lwdDtQWceEHZ9+txbi4RRy0mYPFn9BW7rD7YdgBDu7HTHsLtHrRzJc313RM/1m6GKgV3np/aEaw==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: + '@rollup/plugin-wasm@6.1.3(rollup@3.28.0)': + optionalDependencies: rollup: 3.28.0 - dev: false - /@rollup/pluginutils@4.2.1: - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} + '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - dev: false - /@rollup/pluginutils@5.0.2(rollup@3.25.1): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/pluginutils@5.0.2(rollup@3.25.1)': dependencies: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 3.25.1 - dev: false - /@rollup/pluginutils@5.0.2(rollup@3.28.0): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/pluginutils@5.0.2(rollup@3.28.0)': dependencies: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 3.28.0 - dev: false - /@shuding/opentype.js@1.4.0-beta.0: - resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} - engines: {node: '>= 8.0.0'} - hasBin: true + '@rushstack/eslint-patch@1.10.2': {} + + '@shuding/opentype.js@1.4.0-beta.0': dependencies: fflate: 0.7.4 string.prototype.codepointat: 0.2.1 - dev: false - /@sideway/address@4.1.4: - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + '@sideway/address@4.1.4': dependencies: '@hapi/hoek': 9.3.0 - dev: false - /@sideway/formula@3.0.1: - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - dev: false + '@sideway/formula@3.0.1': {} - /@sideway/pinpoint@2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - dev: false + '@sideway/pinpoint@2.0.0': {} - /@sigstore/protobuf-specs@0.1.0: - resolution: {integrity: sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: false + '@sigstore/protobuf-specs@0.1.0': {} - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: false + '@socket.io/component-emitter@3.1.0': {} - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: false + '@stylistic/eslint-plugin-js@1.7.2(eslint@9.0.0)': + dependencies: + '@types/eslint': 8.56.10 + acorn: 8.11.3 + escape-string-regexp: 4.0.0 + eslint: 9.0.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 - /@trysound/sax@0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - dev: false + '@stylistic/eslint-plugin-jsx@1.7.2(eslint@9.0.0)': + dependencies: + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@types/eslint': 8.56.10 + eslint: 9.0.0 + estraverse: 5.3.0 + picomatch: 4.0.2 - /@tufjs/canonical-json@1.0.0: - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: false + '@stylistic/eslint-plugin-plus@1.7.2(eslint@9.0.0)(typescript@5.0.4)': + dependencies: + '@types/eslint': 8.56.10 + '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.0.4) + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript - /@tufjs/models@1.0.4: - resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@stylistic/eslint-plugin-ts@1.7.2(eslint@9.0.0)(typescript@5.0.4)': + dependencies: + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@types/eslint': 8.56.10 + '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.0.4) + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@stylistic/eslint-plugin@1.7.2(eslint@9.0.0)(typescript@5.0.4)': + dependencies: + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@stylistic/eslint-plugin-jsx': 1.7.2(eslint@9.0.0) + '@stylistic/eslint-plugin-plus': 1.7.2(eslint@9.0.0)(typescript@5.0.4) + '@stylistic/eslint-plugin-ts': 1.7.2(eslint@9.0.0)(typescript@5.0.4) + '@types/eslint': 8.56.10 + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@tootallnate/once@2.0.0': {} + + '@trysound/sax@0.2.0': {} + + '@tufjs/canonical-json@1.0.0': {} + + '@tufjs/models@1.0.4': dependencies: '@tufjs/canonical-json': 1.0.0 minimatch: 9.0.2 - dev: false - /@types/d3-scale-chromatic@3.0.0: - resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} - dev: false + '@types/d3-scale-chromatic@3.0.0': {} - /@types/d3-scale@4.0.3: - resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} + '@types/d3-scale@4.0.3': dependencies: '@types/d3-time': 3.0.0 - dev: false - /@types/d3-time@3.0.0: - resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} - dev: false + '@types/d3-time@3.0.0': {} - /@types/debug@4.1.7: - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + '@types/debug@4.1.7': dependencies: '@types/ms': 0.7.31 - dev: false - /@types/estree@1.0.0: - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - dev: false + '@types/eslint@8.56.10': + dependencies: + '@types/estree': 1.0.0 + '@types/json-schema': 7.0.11 - /@types/fs-extra@11.0.1: - resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} + '@types/estree@1.0.0': {} + + '@types/fs-extra@11.0.1': dependencies: '@types/jsonfile': 6.1.1 '@types/node': 18.15.3 - dev: false - /@types/hast@2.3.4: - resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + '@types/hast@2.3.4': dependencies: '@types/unist': 2.0.6 - dev: false - /@types/http-proxy@1.17.11: - resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} + '@types/http-proxy@1.17.11': dependencies: '@types/node': 18.15.3 - dev: false - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - dev: true + '@types/json-schema@7.0.11': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/jsonfile@6.1.1: - resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} + '@types/jsonfile@6.1.1': dependencies: '@types/node': 18.15.3 - dev: false - /@types/mdast@3.0.10: - resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + '@types/mdast@3.0.10': dependencies: '@types/unist': 2.0.6 - dev: false - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: false + '@types/ms@0.7.31': {} - /@types/node@17.0.45: - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - dev: false + '@types/node@17.0.45': {} - /@types/node@18.15.3: - resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} - dev: false + '@types/node@18.15.3': {} - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true + '@types/normalize-package-data@2.4.1': {} - /@types/parse5@6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - dev: false + '@types/parse5@6.0.3': {} - /@types/resolve@1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: false + '@types/resolve@1.20.2': {} - /@types/sax@1.2.4: - resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} + '@types/sax@1.2.4': dependencies: '@types/node': 18.15.3 - dev: false - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - dev: true + '@types/semver@7.5.0': {} - /@types/unist@2.0.6: - resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - dev: false + '@types/semver@7.5.8': {} - /@types/unist@3.0.0: - resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} - dev: false + '@types/unist@2.0.6': {} - /@types/web-bluetooth@0.0.16: - resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} - dev: false + '@types/unist@3.0.0': {} - /@types/web-bluetooth@0.0.17: - resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} - dev: false + '@types/web-bluetooth@0.0.16': {} - /@typescript-eslint/eslint-plugin@5.59.5(@typescript-eslint/parser@5.59.5)(eslint@8.47.0)(typescript@5.0.4): - resolution: {integrity: sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@types/web-bluetooth@0.0.17': {} + + '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.0.4))(eslint@9.0.0)(typescript@5.0.4)': dependencies: - '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.59.5(eslint@8.47.0)(typescript@5.0.4) - '@typescript-eslint/scope-manager': 5.59.5 - '@typescript-eslint/type-utils': 5.59.5(eslint@8.47.0)(typescript@5.0.4) - '@typescript-eslint/utils': 5.59.5(eslint@8.47.0)(typescript@5.0.4) + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.0.4) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/type-utils': 7.7.0(eslint@9.0.0)(typescript@5.0.4) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.0.4) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 - eslint: 8.47.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.5.0 - tsutils: 3.21.0(typescript@5.0.4) + eslint: 9.0.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.0.4) + optionalDependencies: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@5.59.5(eslint@8.47.0)(typescript@5.0.4): - resolution: {integrity: sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.0.4)': dependencies: - '@typescript-eslint/scope-manager': 5.59.5 - '@typescript-eslint/types': 5.59.5 - '@typescript-eslint/typescript-estree': 5.59.5(typescript@5.0.4) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.0.4) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 - eslint: 8.47.0 + eslint: 9.0.0 + optionalDependencies: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@5.59.5: - resolution: {integrity: sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@6.21.0': dependencies: - '@typescript-eslint/types': 5.59.5 - '@typescript-eslint/visitor-keys': 5.59.5 - dev: true + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 - /@typescript-eslint/type-utils@5.59.5(eslint@8.47.0)(typescript@5.0.4): - resolution: {integrity: sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/scope-manager@7.7.0': + dependencies: + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + + '@typescript-eslint/type-utils@7.7.0(eslint@9.0.0)(typescript@5.0.4)': dependencies: - '@typescript-eslint/typescript-estree': 5.59.5(typescript@5.0.4) - '@typescript-eslint/utils': 5.59.5(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.0.4) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.0.4) debug: 4.3.4 - eslint: 8.47.0 - tsutils: 3.21.0(typescript@5.0.4) + eslint: 9.0.0 + ts-api-utils: 1.3.0(typescript@5.0.4) + optionalDependencies: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@5.59.5: - resolution: {integrity: sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@typescript-eslint/types@6.21.0': {} - /@typescript-eslint/typescript-estree@5.59.5(typescript@5.0.4): - resolution: {integrity: sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/types@7.7.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.0.4)': dependencies: - '@typescript-eslint/types': 5.59.5 - '@typescript-eslint/visitor-keys': 5.59.5 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.3 - tsutils: 3.21.0(typescript@5.0.4) + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.3.0(typescript@5.0.4) + optionalDependencies: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@5.59.5(eslint@8.47.0)(typescript@5.0.4): - resolution: {integrity: sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/typescript-estree@7.7.0(typescript@5.0.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@types/json-schema': 7.0.11 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.0.4) + optionalDependencies: + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@9.0.0)(typescript@5.0.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@types/json-schema': 7.0.15 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.59.5 - '@typescript-eslint/types': 5.59.5 - '@typescript-eslint/typescript-estree': 5.59.5(typescript@5.0.4) - eslint: 8.47.0 - eslint-scope: 5.1.1 - semver: 7.5.3 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.0.4) + eslint: 9.0.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@5.59.5: - resolution: {integrity: sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/utils@7.7.0(eslint@9.0.0)(typescript@5.0.4)': dependencies: - '@typescript-eslint/types': 5.59.5 - eslint-visitor-keys: 3.4.1 - dev: true + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.0.4) + eslint: 9.0.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript - /@unhead/addons@1.1.26(rollup@3.25.1): - resolution: {integrity: sha512-tt4BrGXPiQB1ZAYnVEQb3oPYgk7h3K1UpUD4T/mtQ2hWkm32y4mfz/GEj9qc0CZOr5wGRZcsLZ/aRZGFkJNhHg==} + '@typescript-eslint/visitor-keys@6.21.0': dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.7.0': + dependencies: + '@typescript-eslint/types': 7.7.0 + eslint-visitor-keys: 3.4.3 + + '@unhead/addons@1.1.26(rollup@3.28.0)': + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) '@unhead/schema': 1.1.26 '@unhead/shared': 1.1.26 magic-string: 0.30.0 @@ -2288,128 +7129,87 @@ packages: ufo: 1.1.2 unhead: 1.1.26 unplugin: 1.3.1 - unplugin-ast: 0.7.0(rollup@3.25.1) + unplugin-ast: 0.7.0(rollup@3.28.0) transitivePeerDependencies: - rollup - dev: false - /@unhead/dom@1.1.26: - resolution: {integrity: sha512-6I8z170OAO19h/AslASN4Xw0hqItQFMKhRJQtplQs1BZ62LsDmNKuqJiYueX39U+IfIvIV3j/q1mQwt9lgMwTw==} + '@unhead/dom@1.1.26': dependencies: '@unhead/schema': 1.1.26 '@unhead/shared': 1.1.26 - dev: false - /@unhead/dom@1.1.28: - resolution: {integrity: sha512-o5w3GUo1en9OWNHpUkrkZxmlx2Xf7q++VLb5Lm0MtbHYM578lWmB1zLfmJMN13kvaNKN8RUhTYG5WMtKMzDfGw==} + '@unhead/dom@1.1.28': dependencies: '@unhead/schema': 1.1.28 '@unhead/shared': 1.1.28 - dev: false - /@unhead/dom@1.2.2: - resolution: {integrity: sha512-ohganmg4i1Dd4wwQ2A9oLWEkJNpJRoERJNmFgzmScw9Vi3zMqoS4gPIofT20zUR5rhyyAsFojuDPojJ5vKcmqw==} + '@unhead/dom@1.2.2': dependencies: '@unhead/schema': 1.2.2 '@unhead/shared': 1.2.2 - dev: false - /@unhead/schema-org-vue@0.6.0(@unhead/vue@1.1.28): - resolution: {integrity: sha512-2zTVczJ8iI8jDOzaz2md8fr8j+jWqkmMdo89OI/VVPYWpA6Cy2BFCMvDqrptBZ2h3ieOZ/lhA/y+cTobBZEvaQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@unhead/vue': '>=1.1.9' + '@unhead/schema-org-vue@0.6.0(@unhead/vue@1.2.2(vue@3.3.4))': dependencies: - '@unhead/vue': 1.1.28(vue@3.3.4) - dev: false + '@unhead/vue': 1.2.2(vue@3.3.4) - /@unhead/schema@1.1.26: - resolution: {integrity: sha512-l93zaizm+pu36uMssdtzSC2Y61ncZaBBouZn0pB8rVI14V0hPxeXuSNIuPh2WjAm8wfb8EnCSE3LNguoqTar7g==} + '@unhead/schema@1.1.26': dependencies: hookable: 5.5.3 zhead: 2.0.7 - dev: false - /@unhead/schema@1.1.28: - resolution: {integrity: sha512-KDAPSYcYZHC3ni3Hd3Ye/piBasaHa/uQWCLICOVADwKi1Pm6hhMxCCwpsPSJtfekN31kOvIA09vZv8roPwTthQ==} + '@unhead/schema@1.1.28': dependencies: hookable: 5.5.3 zhead: 2.0.7 - dev: false - /@unhead/schema@1.2.2: - resolution: {integrity: sha512-cGtNvadL76eGl7QxGjWHZxFqLv9a2VrmRpeEb1d7sm0cvnN0bWngdXDTdUyXzn7RVv/Um+/yae6eiT6A+pyQOw==} + '@unhead/schema@1.2.2': dependencies: hookable: 5.5.3 zhead: 2.0.10 - dev: false - /@unhead/shared@1.1.26: - resolution: {integrity: sha512-gnUfNrl8w7hQHke9P0au7klcG9bHVOXqbDvya2uARA/8TyxNz87i0uakraO+P6/+zf484dw3b3MYkXq0thK2eg==} + '@unhead/shared@1.1.26': dependencies: '@unhead/schema': 1.1.26 - dev: false - /@unhead/shared@1.1.28: - resolution: {integrity: sha512-mC0k7a4Cb4vKsASjD/Ws5hrRdZfTf5uapRF+1ekVqeyo1VVISoXNB6CdxTjHgqi8vKQr5wmvoSvEt1fOoU1PQQ==} + '@unhead/shared@1.1.28': dependencies: '@unhead/schema': 1.1.28 - dev: false - /@unhead/shared@1.2.2: - resolution: {integrity: sha512-bWRjRyVzFsunih9GbHctvS8Aenj6KBe5ycql1JE4LawBL/NRYvCYUCPpdK5poVOqjYr0yDAf9m4JGaM2HwpVLw==} + '@unhead/shared@1.2.2': dependencies: '@unhead/schema': 1.2.2 - dev: false - /@unhead/ssr@1.1.28: - resolution: {integrity: sha512-gnSVyvpx/R1byQ8mArh2QRI1PdQ9mlRvtnt1Qiy7JUrtkJeqf/Hfn85fwZ+RhHRSDBPhMl7qD24FSlz5EwA9Zw==} + '@unhead/ssr@1.1.28': dependencies: '@unhead/schema': 1.1.28 '@unhead/shared': 1.1.28 - dev: false - /@unhead/ssr@1.2.2: - resolution: {integrity: sha512-mpWSNNbrQFJZolAfdVInPPiSGUva08bK9UbNV1zgDScUz+p+FnRg4cj77X+PpVeJ0+KPgjXfOsI8VQKYt+buYA==} + '@unhead/ssr@1.2.2': dependencies: '@unhead/schema': 1.2.2 '@unhead/shared': 1.2.2 - dev: false - /@unhead/vue@1.1.28(vue@3.3.4): - resolution: {integrity: sha512-n/4UusPccA0eyLxeinEagfm7hswzg4Uud+dYNlPByHHThCBobYcHjhnOOeS9YvkMGbdZpG1l7k/kywQIcwYqgg==} - peerDependencies: - vue: '>=2.7 || >=3' + '@unhead/vue@1.1.28(vue@3.3.4)': dependencies: '@unhead/schema': 1.1.28 '@unhead/shared': 1.1.28 hookable: 5.5.3 unhead: 1.1.28 vue: 3.3.4 - dev: false - /@unhead/vue@1.2.2(vue@3.3.4): - resolution: {integrity: sha512-AxOmY5JPn4fS34ovaivPnqg2my+InIkZDNSxCKfRkmbBtstFre/Fyf0d92Qfx0u8PJiSRPOjthEHx5vKDgTEJQ==} - peerDependencies: - vue: '>=2.7 || >=3' + '@unhead/vue@1.2.2(vue@3.3.4)': dependencies: '@unhead/schema': 1.2.2 '@unhead/shared': 1.2.2 hookable: 5.5.3 unhead: 1.2.2 vue: 3.3.4 - dev: false - /@unocss/reset@0.50.5: - resolution: {integrity: sha512-nxagkvGAlJa2r5LF3ucfEgV0RpB7PGMJMRiYO+XyvsPdzcCKVaui8VA7Mo+13Z7nDlZ+XOP5YGqowZgoGOCGSg==} - dev: false + '@unocss/reset@0.50.5': {} - /@vercel/nft@0.22.6: - resolution: {integrity: sha512-gTsFnnT4mGxodr4AUlW3/urY+8JKKB452LwF3m477RFUJTAaDmcz2JqFuInzvdybYIeyIv1sSONEJxsxnbQ5JQ==} - engines: {node: '>=14'} - hasBin: true + '@vercel/nft@0.22.6(encoding@0.1.13)': dependencies: - '@mapbox/node-pre-gyp': 1.0.10 + '@mapbox/node-pre-gyp': 1.0.10(encoding@0.1.13) '@rollup/pluginutils': 4.2.1 acorn: 8.10.0 async-sema: 3.1.1 @@ -2423,61 +7223,39 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /@vitejs/plugin-vue-jsx@3.0.1(vite@4.3.9)(vue@3.3.4): - resolution: {integrity: sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.0.0 - vue: ^3.0.0 + '@vitejs/plugin-vue-jsx@3.0.1(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7))(vue@3.3.4)': dependencies: '@babel/core': 7.21.3 '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.3) '@vue/babel-plugin-jsx': 1.1.1(@babel/core@7.21.3) - vite: 4.3.9(@types/node@18.15.3) + vite: 4.3.9(@types/node@18.15.3)(terser@5.17.7) vue: 3.3.4 transitivePeerDependencies: - supports-color - dev: false - /@vitejs/plugin-vue@4.2.3(vite@4.3.9)(vue@3.3.4): - resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.0.0 - vue: ^3.2.25 + '@vitejs/plugin-vue@4.2.3(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7))(vue@3.3.4)': dependencies: - vite: 4.3.9(@types/node@18.15.3) + vite: 4.3.9(@types/node@18.15.3)(terser@5.17.7) vue: 3.3.4 - dev: false - /@volar/language-core@1.3.0-alpha.0: - resolution: {integrity: sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==} + '@volar/language-core@1.3.0-alpha.0': dependencies: '@volar/source-map': 1.3.0-alpha.0 - dev: false - /@volar/language-core@1.4.0-alpha.3: - resolution: {integrity: sha512-TDDqgvVgNWE952EQ6+iyasksYeLHdSKKhWMVmsMIywmE2gPdcqKIUBI+M8JNz2uKEraiOEtU+kJZpk5GJaTDTg==} + '@volar/language-core@1.4.0-alpha.3': dependencies: '@volar/source-map': 1.4.0-alpha.3 - dev: false - /@volar/source-map@1.3.0-alpha.0: - resolution: {integrity: sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==} + '@volar/source-map@1.3.0-alpha.0': dependencies: muggle-string: 0.2.2 - dev: false - /@volar/source-map@1.4.0-alpha.3: - resolution: {integrity: sha512-3qwtBAp6TkkrNW9dLNjaZYzWttUWEI9XKSi/V7odt3rC9yPoWgqizC0J95essDtrEu9PoxbxTkTeZvRx5c//Ow==} + '@volar/source-map@1.4.0-alpha.3': dependencies: muggle-string: 0.2.2 - dev: false - /@volar/vue-language-core@1.2.0: - resolution: {integrity: sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==} + '@volar/vue-language-core@1.2.0': dependencies: '@volar/language-core': 1.3.0-alpha.0 '@volar/source-map': 1.3.0-alpha.0 @@ -2488,10 +7266,8 @@ packages: minimatch: 6.2.0 muggle-string: 0.2.2 vue-template-compiler: 2.7.14 - dev: false - /@volar/vue-language-core@1.3.2: - resolution: {integrity: sha512-5HCMVoFFDIuf5bHnHux1jaRscZW5hsK/2T0p7qp+XuGWZ2fDN1nr9Ujn49jSvM7LqQB93Y1fFLKp3vZswV2YUw==} + '@volar/vue-language-core@1.3.2': dependencies: '@volar/language-core': 1.4.0-alpha.3 '@volar/source-map': 1.4.0-alpha.3 @@ -2502,34 +7278,23 @@ packages: minimatch: 6.2.0 muggle-string: 0.2.2 vue-template-compiler: 2.7.14 - dev: false - /@vue-macros/common@1.4.0(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-Wnpk6OVPYw7ZrrShOS7RZL5AINFbuQWfkNCVWVESSPY+8id75YOKGzMs4X5YcNayywdSGEvV7ntVJ2RQ+ez21A==} - engines: {node: '>=16.14.0'} - peerDependencies: - vue: ^2.7.0 || ^3.2.25 - peerDependenciesMeta: - vue: - optional: true + '@vue-macros/common@1.4.0(rollup@3.28.0)(vue@3.3.4)': dependencies: '@babel/types': 7.22.5 - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) '@vue/compiler-sfc': 3.3.4 - ast-kit: 0.6.5(rollup@3.25.1) + ast-kit: 0.6.5(rollup@3.28.0) local-pkg: 0.4.3 magic-string-ast: 0.1.2 + optionalDependencies: vue: 3.3.4 transitivePeerDependencies: - rollup - dev: false - /@vue/babel-helper-vue-transform-on@1.0.2: - resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} - dev: false + '@vue/babel-helper-vue-transform-on@1.0.2': {} - /@vue/babel-plugin-jsx@1.1.1(@babel/core@7.21.3): - resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} + '@vue/babel-plugin-jsx@1.1.1(@babel/core@7.21.3)': dependencies: '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.3) @@ -2543,26 +7308,20 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color - dev: false - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + '@vue/compiler-core@3.3.4': dependencies: '@babel/parser': 7.22.5 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 - dev: false - /@vue/compiler-dom@3.3.4: - resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + '@vue/compiler-dom@3.3.4': dependencies: '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 - dev: false - /@vue/compiler-sfc@3.3.4: - resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + '@vue/compiler-sfc@3.3.4': dependencies: '@babel/parser': 7.22.5 '@vue/compiler-core': 3.3.4 @@ -2574,66 +7333,46 @@ packages: magic-string: 0.30.2 postcss: 8.4.24 source-map-js: 1.0.2 - dev: false - /@vue/compiler-ssr@3.3.4: - resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + '@vue/compiler-ssr@3.3.4': dependencies: '@vue/compiler-dom': 3.3.4 '@vue/shared': 3.3.4 - dev: false - /@vue/devtools-api@6.5.0: - resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} - dev: false + '@vue/devtools-api@6.5.0': {} - /@vue/reactivity-transform@3.3.4: - resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + '@vue/reactivity-transform@3.3.4': dependencies: '@babel/parser': 7.22.5 '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 magic-string: 0.30.2 - dev: false - /@vue/reactivity@3.3.4: - resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + '@vue/reactivity@3.3.4': dependencies: '@vue/shared': 3.3.4 - dev: false - /@vue/runtime-core@3.3.4: - resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + '@vue/runtime-core@3.3.4': dependencies: '@vue/reactivity': 3.3.4 '@vue/shared': 3.3.4 - dev: false - /@vue/runtime-dom@3.3.4: - resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + '@vue/runtime-dom@3.3.4': dependencies: '@vue/runtime-core': 3.3.4 '@vue/shared': 3.3.4 csstype: 3.1.1 - dev: false - /@vue/server-renderer@3.3.4(vue@3.3.4): - resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} - peerDependencies: - vue: 3.3.4 + '@vue/server-renderer@3.3.4(vue@3.3.4)': dependencies: '@vue/compiler-ssr': 3.3.4 '@vue/shared': 3.3.4 vue: 3.3.4 - dev: false - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} - dev: false + '@vue/shared@3.3.4': {} - /@vueuse/core@10.3.0(vue@3.3.4): - resolution: {integrity: sha512-BEM5yxcFKb5btFjTSAFjTu5jmwoW66fyV9uJIP4wUXXU8aR5Hl44gndaaXp7dC5HSObmgbnR2RN+Un1p68Mf5Q==} + '@vueuse/core@10.3.0(vue@3.3.4)': dependencies: '@types/web-bluetooth': 0.0.17 '@vueuse/metadata': 10.3.0 @@ -2642,10 +7381,8 @@ packages: transitivePeerDependencies: - '@vue/composition-api' - vue - dev: false - /@vueuse/core@9.13.0(vue@3.3.4): - resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + '@vueuse/core@9.13.0(vue@3.3.4)': dependencies: '@types/web-bluetooth': 0.0.16 '@vueuse/metadata': 9.13.0 @@ -2654,243 +7391,143 @@ packages: transitivePeerDependencies: - '@vue/composition-api' - vue - dev: false - /@vueuse/head@1.1.26(vue@3.3.4): - resolution: {integrity: sha512-VUrqvcxKtxt2moKtUa7R/KscnDsNYj5u7HFULLsr84VhWsztzBedxW/8Wh/kTz2+/eMf5gC1KtkZBTFQYOmauQ==} - peerDependencies: - vue: '>=2.7 || >=3' + '@vueuse/head@1.1.26(vue@3.3.4)': dependencies: '@unhead/dom': 1.1.28 '@unhead/schema': 1.1.28 '@unhead/ssr': 1.1.28 '@unhead/vue': 1.1.28(vue@3.3.4) vue: 3.3.4 - dev: false - /@vueuse/integrations@10.3.0(focus-trap@7.5.2)(fuse.js@6.6.2)(vue@3.3.4): - resolution: {integrity: sha512-Jgiv7oFyIgC6BxmDtiyG/fxyGysIds00YaY7sefwbhCZ2/tjEx1W/1WcsISSJPNI30in28+HC2J4uuU8184ekg==} - peerDependencies: - async-validator: '*' - axios: '*' - change-case: '*' - drauu: '*' - focus-trap: '*' - fuse.js: '*' - idb-keyval: '*' - jwt-decode: '*' - nprogress: '*' - qrcode: '*' - sortablejs: '*' - universal-cookie: '*' - peerDependenciesMeta: - async-validator: - optional: true - axios: - optional: true - change-case: - optional: true - drauu: - optional: true - focus-trap: - optional: true - fuse.js: - optional: true - idb-keyval: - optional: true - jwt-decode: - optional: true - nprogress: - optional: true - qrcode: - optional: true - sortablejs: - optional: true - universal-cookie: - optional: true + '@vueuse/integrations@10.3.0(axios@0.27.2)(change-case@4.1.2)(focus-trap@7.5.2)(fuse.js@6.6.2)(vue@3.3.4)': dependencies: '@vueuse/core': 10.3.0(vue@3.3.4) '@vueuse/shared': 10.3.0(vue@3.3.4) + vue-demi: 0.14.5(vue@3.3.4) + optionalDependencies: + axios: 0.27.2 + change-case: 4.1.2 focus-trap: 7.5.2 fuse.js: 6.6.2 - vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - vue - dev: false - /@vueuse/metadata@10.3.0: - resolution: {integrity: sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==} - dev: false + '@vueuse/metadata@10.3.0': {} - /@vueuse/metadata@9.13.0: - resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} - dev: false + '@vueuse/metadata@9.13.0': {} - /@vueuse/nuxt@10.3.0(nuxt@3.6.5)(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-Dmkm9H5Ubq279+FHhlJtlFP99wKrn2apuo4hk/0GbEi/6+zif7MJRtAjDBBV4VjmY6XV3kO8dQR8940FStbxsA==} - peerDependencies: - nuxt: ^3.0.0 + '@vueuse/nuxt@10.3.0(nuxt@3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4))(rollup@3.28.0)(vue@3.3.4)': dependencies: - '@nuxt/kit': 3.6.5(rollup@3.25.1) + '@nuxt/kit': 3.6.5(rollup@3.28.0) '@vueuse/core': 10.3.0(vue@3.3.4) '@vueuse/metadata': 10.3.0 local-pkg: 0.4.3 - nuxt: 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4) + nuxt: 3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4) vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - rollup - supports-color - vue - dev: false - /@vueuse/shared@10.3.0(vue@3.3.4): - resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} + '@vueuse/shared@10.3.0(vue@3.3.4)': dependencies: vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - vue - dev: false - /@vueuse/shared@9.13.0(vue@3.3.4): - resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + '@vueuse/shared@9.13.0(vue@3.3.4)': dependencies: vue-demi: 0.14.0(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - vue - dev: false - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false + abbrev@1.1.1: {} - /acorn-jsx@5.3.2(acorn@8.9.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.10.0): dependencies: - acorn: 8.9.0 + acorn: 8.10.0 - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 - /acorn@8.9.0: - resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.10.0: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + acorn@8.11.3: {} + + acorn@8.9.0: {} + + agent-base@6.0.2: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} + agent-base@7.1.0: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /agentkeepalive@4.3.0: - resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} - engines: {node: '>= 8.0.0'} + agentkeepalive@4.3.0: dependencies: debug: 4.3.4 depd: 2.0.0 humanize-ms: 1.2.1 transitivePeerDependencies: - supports-color - dev: false - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: false - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: false - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: false + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: false - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + ansi-styles@6.2.1: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: false - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: false + aproba@2.0.0: {} - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: false + arch@2.2.0: {} - /archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} + archiver-utils@2.1.0: dependencies: glob: 7.2.3 graceful-fs: 4.2.10 @@ -2902,11 +7539,8 @@ packages: lodash.union: 4.6.0 normalize-path: 3.0.0 readable-stream: 2.3.8 - dev: false - /archiver@5.3.1: - resolution: {integrity: sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==} - engines: {node: '>= 10'} + archiver@5.3.1: dependencies: archiver-utils: 2.1.0 async: 3.2.4 @@ -2915,134 +7549,60 @@ packages: readdir-glob: 1.1.2 tar-stream: 2.2.0 zip-stream: 4.1.0 - dev: false - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} + are-docs-informative@0.0.2: {} + + are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: false - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: false - - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: false - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - dev: true - - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.0 - is-string: 1.0.7 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + arg@5.0.2: {} - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - dev: true + argparse@2.0.1: {} - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - dev: true + array-union@2.1.0: {} - /assert@2.0.0: - resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + assert@2.0.0: dependencies: es6-object-assign: 1.1.0 is-nan: 1.3.2 object-is: 1.1.5 util: 0.12.5 - dev: false - /ast-kit@0.6.5(rollup@3.25.1): - resolution: {integrity: sha512-XCg0VWvmWU2T/6aMp8VRfJWZ6LZv1P0o8otWY7RAGtfKj0qGi45vtnKNkltJhu9tmbQNZxv+gJA4o7FtLDfmWg==} - engines: {node: '>=16.14.0'} + ast-kit@0.6.5(rollup@3.28.0): dependencies: '@babel/parser': 7.22.5 - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) pathe: 1.1.1 transitivePeerDependencies: - rollup - dev: false - /ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} + ast-types@0.15.2: dependencies: tslib: 2.5.0 - dev: false - /ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + ast-types@0.16.1: dependencies: tslib: 2.5.0 - dev: false - /ast-walker-scope@0.4.2: - resolution: {integrity: sha512-vdCU9JvpsrxWxvJiRHAr8If8cu07LWJXDPhkqLiP4ErbN1fu/mK623QGmU4Qbn2Nq4Mx0vR/Q017B6+HcHg1aQ==} - engines: {node: '>=16.14.0'} + ast-walker-scope@0.4.2: dependencies: '@babel/parser': 7.22.5 '@babel/types': 7.22.5 - dev: false - /async-sema@3.1.1: - resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} - dev: false + async-sema@3.1.1: {} - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: false + async@3.2.4: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false + asynckit@0.4.0: {} - /autoprefixer@10.4.14(postcss@8.4.24): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.14(postcss@8.4.24): dependencies: browserslist: 4.21.5 caniuse-lite: 1.0.30001466 @@ -3051,77 +7611,48 @@ packages: picocolors: 1.0.0 postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.5: {} - /axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + axios@0.27.2: dependencies: follow-redirects: 1.15.2 form-data: 4.0.0 transitivePeerDependencies: - debug - dev: false - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false + bail@2.0.2: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /base64-js@0.0.8: - resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} - engines: {node: '>= 0.4'} - dev: false + base64-js@0.0.8: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false + base64-js@1.5.1: {} - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} + big-integer@1.6.51: {} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: false + binary-extensions@2.2.0: {} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - dev: false - /birpc@0.2.12: - resolution: {integrity: sha512-6Wz9FXuJ/FE4gDH+IGQhrYdalAvAQU1Yrtcu1UlMk3+9mMXxIRXiL+MxUcGokso42s+Fy+YoUXGLOdOs0siV3A==} - dev: false + birpc@0.2.12: {} - /bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + bl@1.2.3: dependencies: readable-stream: 2.3.8 safe-buffer: 5.2.1 - dev: false - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolbase@1.0.0: {} - /boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + boxen@7.1.1: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 @@ -3131,96 +7662,71 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: false - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.51 - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.21.5: dependencies: caniuse-lite: 1.0.30001466 electron-to-chromium: 1.4.332 node-releases: 2.0.10 update-browserslist-db: 1.0.10(browserslist@4.21.5) - dev: false - /buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: false + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001611 + electron-to-chromium: 1.4.744 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) - /buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: dependencies: buffer-alloc-unsafe: 1.1.0 buffer-fill: 1.0.0 - dev: false - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: false + buffer-crc32@0.2.13: {} - /buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - dev: false + buffer-fill@1.0.0: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + builtin-modules@3.3.0: {} - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + builtins@5.0.1: dependencies: semver: 7.5.4 - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} + bundle-name@3.0.0: dependencies: run-applescript: 5.0.0 - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - dev: false - /c12@1.4.2: - resolution: {integrity: sha512-3IP/MuamSVRVw8W8+CHWAz9gKN4gd+voF2zm/Ln6D25C2RhytEZ1ABbC8MjKr4BR9rhoV1JQ7jJA158LDiTkLg==} + c12@1.4.2: dependencies: chokidar: 3.5.3 defu: 6.1.2 @@ -3235,16 +7741,10 @@ packages: rc9: 2.1.1 transitivePeerDependencies: - supports-color - dev: false - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: false + cac@6.7.14: {} - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + cacache@16.1.3: dependencies: '@npmcli/fs': 2.1.2 '@npmcli/move-file': 2.0.1 @@ -3266,11 +7766,8 @@ packages: unique-filename: 2.0.1 transitivePeerDependencies: - bluebird - dev: false - /cacache@17.1.0: - resolution: {integrity: sha512-hXpFU+Z3AfVmNuiLve1qxWHMq0RSIt5gjCKAHi/M6DktwFwDdAXAtunl1i4WSKaaVcU9IsRvXFg42jTHigcC6Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + cacache@17.1.0: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.2 @@ -3284,96 +7781,62 @@ packages: ssri: 10.0.4 tar: 6.1.13 unique-filename: 3.0.0 - dev: false - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + call-bind@1.0.2: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camel-case@4.1.2: dependencies: pascal-case: 3.1.2 tslib: 2.5.0 - dev: false - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: false + camelcase@6.3.0: {} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: false + camelcase@7.0.1: {} - /camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: false + camelize@1.0.1: {} - /caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + caniuse-api@3.0.0: dependencies: browserslist: 4.21.5 caniuse-lite: 1.0.30001466 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - dev: false - /caniuse-lite@1.0.30001466: - resolution: {integrity: sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==} - dev: false + caniuse-lite@1.0.30001466: {} - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + caniuse-lite@1.0.30001611: {} + + capital-case@1.0.4: dependencies: no-case: 3.0.4 tslib: 2.5.0 upper-case-first: 2.0.2 - dev: false - /case-police@0.6.1: - resolution: {integrity: sha512-tOgkG3HhtzNVHU+HVHqbpVJ3CICPDihtlgoM2C4dx0RLeo6qcNVeBgiYJN5Bln+stxKrnKrw89CFgqYQDqwZQg==} - hasBin: true - dev: true + case-police@0.6.1: {} - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false + ccount@2.0.1: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false + chalk@5.2.0: {} - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false + chalk@5.3.0: {} - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + change-case@4.1.2: dependencies: camel-case: 4.1.2 capital-case: 1.0.4 @@ -3387,26 +7850,16 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.5.0 - dev: false - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: false + character-entities-html4@2.1.0: {} - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: false + character-entities-legacy@3.0.0: {} - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false + character-entities@2.0.2: {} - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: false + character-reference-invalid@2.0.1: {} - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 css-select: 5.1.0 @@ -3414,11 +7867,8 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.0.1 - dev: false - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} + cheerio@1.0.0-rc.12: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 @@ -3427,11 +7877,8 @@ packages: htmlparser2: 8.0.1 parse5: 7.1.2 parse5-htmlparser2-tree-adapter: 7.0.0 - dev: false - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -3442,21 +7889,12 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.2 - dev: false - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: false + chownr@2.0.0: {} - /chroma-js@2.4.2: - resolution: {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==} - dev: false + chroma-js@2.4.2: {} - /chrome-launcher@0.15.1: - resolution: {integrity: sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==} - engines: {node: '>=12.13.0'} - hasBin: true + chrome-launcher@0.15.1: dependencies: '@types/node': 18.15.3 escape-string-regexp: 4.0.0 @@ -3464,294 +7902,172 @@ packages: lighthouse-logger: 1.3.0 transitivePeerDependencies: - supports-color - dev: false - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} + ci-info@3.8.0: {} - /citty@0.1.1: - resolution: {integrity: sha512-fL/EEp9TyXlNkgYFQYNqtMJhnAk2tAq8lCST7O5LPn1NrzWPsOKE5wafR7J+8W87oxqolpxNli+w7khq5WP7tg==} - dev: false + ci-info@4.0.0: {} - /citty@0.1.2: - resolution: {integrity: sha512-Me9nf0/BEmMOnuQzMOVXgpzkMUNbd0Am8lTl/13p0aRGAoLGk5T5sdet/42CrIGmWdG67BgHUhcKK1my1ujUEg==} + citty@0.1.1: {} + + citty@0.1.2: dependencies: consola: 3.2.3 - dev: false - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: false + clean-stack@2.2.0: {} - /clear@0.1.0: - resolution: {integrity: sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==} - dev: false + clear@0.1.0: {} - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: false + cli-boxes@3.0.0: {} - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + clipboardy@3.0.0: dependencies: arch: 2.2.0 execa: 5.1.1 is-wsl: 2.2.0 - dev: false - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false - /cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - dev: false + cluster-key-slot@1.1.2: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: false + color-support@1.1.3: {} - /colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - dev: false + colord@2.9.3: {} - /colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - dev: false + colorette@2.0.19: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: false - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false + comma-separated-tokens@2.0.3: {} - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - dev: false + commander@10.0.1: {} - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} - dev: true + commander@2.20.3: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false + commander@7.2.0: {} - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: false + commander@8.3.0: {} - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: false + comment-parser@1.4.1: {} - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: false + commondir@1.0.1: {} - /compress-commons@4.1.1: - resolution: {integrity: sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==} - engines: {node: '>= 10'} + compress-commons@4.1.1: dependencies: buffer-crc32: 0.2.13 crc32-stream: 4.0.2 normalize-path: 3.0.0 readable-stream: 3.6.2 - dev: false - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-map@0.0.1: {} - /consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} - dev: false + consola@2.15.3: {} - /consola@3.1.0: - resolution: {integrity: sha512-rrrJE6rP0qzl/Srg+C9x/AE5Kxfux7reVm1Wh0wCjuXvih6DqZgqDZe8auTD28fzJ9TF0mHlSDrPpWlujQRo1Q==} - dev: false + consola@3.1.0: {} - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} - dev: false + consola@3.2.3: {} - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: false + console-control-strings@1.1.0: {} - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + constant-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.5.0 upper-case: 2.0.2 - dev: false - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false + convert-source-map@1.9.0: {} - /cookie-es@1.0.0: - resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} - dev: false + cookie-es@1.0.0: {} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false + core-js-compat@3.37.0: + dependencies: + browserslist: 4.23.0 - /cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + core-util-is@1.0.3: {} + + cose-base@1.0.3: dependencies: layout-base: 1.0.2 - dev: false - /cose-base@2.2.0: - resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cose-base@2.2.0: dependencies: layout-base: 2.0.1 - dev: false - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: false + crc-32@1.2.2: {} - /crc32-stream@4.0.2: - resolution: {integrity: sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==} - engines: {node: '>= 10'} + crc32-stream@4.0.2: dependencies: crc-32: 1.2.2 readable-stream: 3.6.2 - dev: false - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: false + create-require@1.1.1: {} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /css-background-parser@0.1.0: - resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} - dev: false + css-background-parser@0.1.0: {} - /css-box-shadow@1.0.0-3: - resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} - dev: false + css-box-shadow@1.0.0-3: {} - /css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - dev: false + css-color-keywords@1.0.0: {} - /css-declaration-sorter@6.3.1(postcss@8.4.24): - resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 + css-declaration-sorter@6.3.1(postcss@8.4.24): dependencies: postcss: 8.4.24 - dev: false - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.0.1 nth-check: 2.1.1 - dev: false - /css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + css-to-react-native@3.2.0: dependencies: camelize: 1.0.1 css-color-keywords: 1.0.0 postcss-value-parser: 4.2.0 - dev: false - /css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + css-tree@2.2.1: dependencies: mdn-data: 2.0.28 source-map-js: 1.0.2 - dev: false - /css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-tree@2.3.1: dependencies: mdn-data: 2.0.30 source-map-js: 1.0.2 - dev: false - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: false + css-what@6.1.0: {} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true + cssesc@3.0.0: {} - /cssnano-preset-default@6.0.1(postcss@8.4.24): - resolution: {integrity: sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + cssnano-preset-default@6.0.1(postcss@8.4.24): dependencies: css-declaration-sorter: 6.3.1(postcss@8.4.24) cssnano-utils: 4.0.0(postcss@8.4.24) @@ -3783,284 +8099,158 @@ packages: postcss-reduce-transforms: 6.0.0(postcss@8.4.24) postcss-svgo: 6.0.0(postcss@8.4.24) postcss-unique-selectors: 6.0.0(postcss@8.4.24) - dev: false - /cssnano-utils@4.0.0(postcss@8.4.24): - resolution: {integrity: sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + cssnano-utils@4.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - dev: false - /cssnano@6.0.1(postcss@8.4.24): - resolution: {integrity: sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + cssnano@6.0.1(postcss@8.4.24): dependencies: cssnano-preset-default: 6.0.1(postcss@8.4.24) lilconfig: 2.1.0 postcss: 8.4.24 - dev: false - /csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + csso@5.0.5: dependencies: css-tree: 2.2.1 - dev: false - /csstype@3.1.1: - resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - dev: false + csstype@3.1.1: {} - /cuint@0.2.2: - resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} - dev: false + cuint@0.2.2: {} - /cytoscape-cose-bilkent@4.1.0(cytoscape@3.23.0): - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 + cytoscape-cose-bilkent@4.1.0(cytoscape@3.23.0): dependencies: cose-base: 1.0.3 cytoscape: 3.23.0 - dev: false - /cytoscape-fcose@2.2.0(cytoscape@3.23.0): - resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} - peerDependencies: - cytoscape: ^3.2.0 + cytoscape-fcose@2.2.0(cytoscape@3.23.0): dependencies: cose-base: 2.2.0 cytoscape: 3.23.0 - dev: false - /cytoscape@3.23.0: - resolution: {integrity: sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==} - engines: {node: '>=0.10'} + cytoscape@3.23.0: dependencies: heap: 0.2.7 lodash: 4.17.21 - dev: false - /d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + d3-array@2.12.1: dependencies: internmap: 1.0.1 - dev: false - /d3-array@3.2.3: - resolution: {integrity: sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==} - engines: {node: '>=12'} + d3-array@3.2.3: dependencies: internmap: 2.0.3 - dev: false - /d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - dev: false + d3-axis@3.0.0: {} - /d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} + d3-brush@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - /d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} + d3-chord@3.0.1: dependencies: d3-path: 3.1.0 - dev: false - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false + d3-color@3.1.0: {} - /d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} + d3-contour@4.0.2: dependencies: d3-array: 3.2.3 - dev: false - /d3-delaunay@6.0.2: - resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==} - engines: {node: '>=12'} + d3-delaunay@6.0.2: dependencies: delaunator: 5.0.0 - dev: false - /d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - dev: false + d3-dispatch@3.0.1: {} - /d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} + d3-drag@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-selection: 3.0.0 - dev: false - /d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true + d3-dsv@3.0.1: dependencies: commander: 7.2.0 iconv-lite: 0.6.3 rw: 1.3.3 - dev: false - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false + d3-ease@3.0.1: {} - /d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} + d3-fetch@3.0.1: dependencies: d3-dsv: 3.0.1 - dev: false - /d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} + d3-force@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-quadtree: 3.0.1 d3-timer: 3.0.1 - dev: false - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false + d3-format@3.1.0: {} - /d3-geo@3.1.0: - resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} - engines: {node: '>=12'} + d3-geo@3.1.0: dependencies: d3-array: 3.2.3 - dev: false - /d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - dev: false + d3-hierarchy@3.1.2: {} - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 - dev: false - /d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - dev: false + d3-path@1.0.9: {} - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false + d3-path@3.1.0: {} - /d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - dev: false + d3-polygon@3.0.1: {} - /d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - dev: false + d3-quadtree@3.0.1: {} - /d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - dev: false + d3-random@3.0.1: {} - /d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + d3-sankey@0.12.3: dependencies: d3-array: 2.12.1 d3-shape: 1.3.7 - dev: false - /d3-scale-chromatic@3.0.0: - resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} - engines: {node: '>=12'} + d3-scale-chromatic@3.0.0: dependencies: d3-color: 3.1.0 d3-interpolate: 3.0.1 - dev: false - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + d3-scale@4.0.2: dependencies: d3-array: 3.2.3 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 - dev: false - /d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - dev: false + d3-selection@3.0.0: {} - /d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + d3-shape@1.3.7: dependencies: d3-path: 1.0.9 - dev: false - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} + d3-shape@3.2.0: dependencies: d3-path: 3.1.0 - dev: false - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 - dev: false - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + d3-time@3.1.0: dependencies: d3-array: 3.2.3 - dev: false - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false + d3-timer@3.0.1: {} - /d3-transition@3.0.1(d3-selection@3.0.0): - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 + d3-transition@3.0.1(d3-selection@3.0.0): dependencies: d3-color: 3.1.0 d3-dispatch: 3.0.1 @@ -4068,22 +8258,16 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-timer: 3.0.1 - dev: false - /d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} + d3-zoom@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - /d3@7.8.2: - resolution: {integrity: sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==} - engines: {node: '>=12'} + d3@7.8.2: dependencies: d3-array: 3.2.3 d3-axis: 3.0.0 @@ -4115,109 +8299,62 @@ packages: d3-timer: 3.0.1 d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 - dev: false - /dagre-d3-es@7.0.10: - resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + dagre-d3-es@7.0.10: dependencies: d3: 7.8.2 lodash-es: 4.17.21 - dev: false - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: false + data-uri-to-buffer@4.0.1: {} - /dayjs@1.11.7: - resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} - dev: false + dayjs@1.11.7: {} - /de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - dev: false + de-indent@1.0.2: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - dev: false - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 - dev: false - /decompress-tar@4.1.1: - resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} - engines: {node: '>=4'} + decompress-tar@4.1.1: dependencies: file-type: 5.2.0 is-stream: 1.1.0 tar-stream: 1.6.2 - dev: false - /decompress-tarbz2@4.1.1: - resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} - engines: {node: '>=4'} + decompress-tarbz2@4.1.1: dependencies: decompress-tar: 4.1.1 file-type: 6.2.0 is-stream: 1.1.0 seek-bzip: 1.0.6 unbzip2-stream: 1.4.3 - dev: false - /decompress-targz@4.1.1: - resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} - engines: {node: '>=4'} + decompress-targz@4.1.1: dependencies: decompress-tar: 4.1.1 file-type: 5.2.0 is-stream: 1.1.0 - dev: false - /decompress-unzip@4.0.1: - resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} - engines: {node: '>=4'} + decompress-unzip@4.0.1: dependencies: file-type: 3.9.0 get-stream: 2.3.1 pify: 2.3.0 yauzl: 2.10.0 - dev: false - /decompress@4.2.1: - resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} - engines: {node: '>=4'} + decompress@4.2.1: dependencies: decompress-tar: 4.1.1 decompress-tarbz2: 4.1.1 @@ -4227,241 +8364,135 @@ packages: make-dir: 1.3.0 pify: 2.3.0 strip-dirs: 2.1.0 - dev: false - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deep-is@0.1.4: {} - /deepmerge@4.3.0: - resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} - engines: {node: '>=0.10.0'} - dev: false + deepmerge@4.3.0: {} - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} + default-browser-id@3.0.0: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} + default-browser@4.0.0: dependencies: bundle-name: 3.0.0 default-browser-id: 3.0.0 execa: 7.2.0 titleize: 3.0.0 - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: false + define-lazy-prop@2.0.0: {} - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} + define-lazy-prop@3.0.0: {} - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} + define-properties@1.2.0: dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /defu@6.1.2: - resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} - dev: false + defu@6.1.2: {} - /delaunator@5.0.0: - resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} + delaunator@5.0.0: dependencies: robust-predicates: 3.0.1 - dev: false - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false + delayed-stream@1.0.0: {} - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false + delegates@1.0.0: {} - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false + denque@2.1.0: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: false + depd@2.0.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: false + dequal@2.0.3: {} - /destr@2.0.0: - resolution: {integrity: sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==} - dev: false + destr@2.0.0: {} - /destr@2.0.1: - resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} - dev: false + destr@2.0.1: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: false + destroy@1.2.0: {} - /detab@3.0.2: - resolution: {integrity: sha512-7Bp16Bk8sk0Y6gdXiCtnpGbghn8atnTJdd/82aWvS5ESnlcNvgUc10U2NYS0PAiDSGjWiI8qs/Cv1b2uSGdQ8w==} - dev: false + detab@3.0.2: {} - /detect-libc@2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} - engines: {node: '>=8'} - dev: false + detect-libc@2.0.1: {} - /devalue@4.3.2: - resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} - dev: false + devalue@4.3.2: {} - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: false + diff@5.1.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.4.0 - dev: false - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: false + domelementtype@2.3.0: {} - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: false - /dompurify@3.0.5: - resolution: {integrity: sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==} - dev: false + dompurify@3.0.5: {} - /domutils@3.0.1: - resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + domutils@3.0.1: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: false - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.5.0 - dev: false - /dot-prop@7.2.0: - resolution: {integrity: sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dot-prop@7.2.0: dependencies: type-fest: 2.19.0 - dev: false - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false + dotenv@16.3.1: {} - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: false + duplexer@0.1.2: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eastasianwidth@0.2.0: {} - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: false + ee-first@1.1.1: {} - /electron-to-chromium@1.4.332: - resolution: {integrity: sha512-c1Vbv5tuUlBFp0mb3mCIjw+REEsgthRgNE8BlbEDKmvzb8rxjcVki6OkQP83vLN34s0XCxpSkq7AZNep1a6xhw==} - dev: false + electron-to-chromium@1.4.332: {} - /elkjs@0.8.2: - resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} - dev: false + electron-to-chromium@1.4.744: {} - /emoji-regex@10.2.1: - resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} - dev: false + elkjs@0.8.2: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@10.2.1: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emoji-regex@8.0.0: {} - /emoticon@4.0.1: - resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==} - dev: false + emoji-regex@9.2.2: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: false + emoticon@4.0.1: {} - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true + encodeurl@1.0.2: {} + + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 - dev: false optional: true - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - dev: false - /engine.io-client@6.4.0: - resolution: {integrity: sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==} + engine.io-client@6.4.0: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 @@ -4472,10 +8503,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /engine.io-client@6.5.2: - resolution: {integrity: sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==} + engine.io-client@6.5.2: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 @@ -4486,152 +8515,43 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /engine.io-parser@5.0.6: - resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} - engines: {node: '>=10.0.0'} - dev: false + engine.io-parser@5.0.6: {} - /engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} - engines: {node: '>=10.0.0'} - dev: false + engine.io-parser@5.2.1: {} - /enhanced-resolve@4.5.0: - resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} - engines: {node: '>=6.9.0'} + enhanced-resolve@4.5.0: dependencies: graceful-fs: 4.2.10 memory-fs: 0.5.0 tapable: 1.1.3 - dev: false - - /enhanced-resolve@5.12.0: - resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.10 - tapable: 2.2.1 - dev: true - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.15.0: dependencies: graceful-fs: 4.2.10 tapable: 2.2.1 - dev: false - /entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} - engines: {node: '>=0.12'} - dev: true + entities@3.0.1: {} - /entities@4.4.0: - resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} - engines: {node: '>=0.12'} - dev: false + entities@4.4.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: false + env-paths@2.2.1: {} - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: false + err-code@2.0.3: {} - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true + errno@0.1.8: dependencies: prr: 1.0.1 - dev: false - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - - /error-stack-parser-es@0.1.0: - resolution: {integrity: sha512-K5/Oncl6ZizGM7tqGUc3Sd82zVKGsZ+l8FqhhnF8+10QujC/xT2VKwdaM/8rAR5F1BouVqgemMrhHG23vhOpMw==} - dev: false - - /es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.10 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 - dev: true - - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: true - - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.3 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true + error-stack-parser-es@0.1.0: {} - /es6-object-assign@1.1.0: - resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} - dev: false + es6-object-assign@1.1.0: {} - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 '@esbuild/android-arm64': 0.17.19 @@ -4655,13 +8575,8 @@ packages: '@esbuild/win32-arm64': 0.17.19 '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - dev: false - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 '@esbuild/android-arm64': 0.18.20 @@ -4685,338 +8600,143 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - dev: false - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: false + escalade@3.1.1: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + escape-string-regexp@4.0.0: {} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: false + escape-string-regexp@5.0.0: {} - /eslint-config-standard@17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.47.0): - resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} - peerDependencies: - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: ^15.0.0 - eslint-plugin-promise: ^6.0.0 + eslint-config-flat-gitignore@0.1.5: + dependencies: + find-up: 7.0.0 + parse-gitignore: 2.0.0 + + eslint-flat-config-utils@0.2.3: dependencies: - eslint: 8.47.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) - eslint-plugin-n: 15.7.0(eslint@8.47.0) - eslint-plugin-promise: 6.1.1(eslint@8.47.0) - dev: true + '@types/eslint': 8.56.10 + pathe: 1.1.2 - /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.11.0 - resolve: 1.22.1 + is-core-module: 2.13.1 + resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: true - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.5)(eslint-plugin-import@2.27.5)(eslint@8.47.0): - resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' + eslint-plugin-import-x@0.5.0(eslint@9.0.0)(typescript@5.0.4): dependencies: + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.0.4) debug: 4.3.4 - enhanced-resolve: 5.12.0 - eslint: 8.47.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) - get-tsconfig: 4.5.0 - globby: 13.2.0 - is-core-module: 2.11.0 + doctrine: 3.0.0 + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.7.3 is-glob: 4.0.3 - synckit: 0.8.5 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.59.5(eslint@8.47.0)(typescript@5.0.4) - debug: 3.2.7 - eslint: 8.47.0 - eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.5)(eslint-plugin-import@2.27.5)(eslint@8.47.0) + minimatch: 9.0.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - dev: true - - /eslint-plugin-es@3.0.1(eslint@8.47.0): - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 8.47.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - dev: true - - /eslint-plugin-es@4.1.0(eslint@8.47.0): - resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 8.47.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - dev: true + - typescript - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-jsdoc@48.2.3(eslint@9.0.0): dependencies: - '@typescript-eslint/parser': 5.59.5(eslint@8.47.0)(typescript@5.0.4) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.47.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) - has: 1.0.3 - is-core-module: 2.11.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.1 - semver: 6.3.0 - tsconfig-paths: 3.14.2 + '@es-joy/jsdoccomment': 0.42.0 + are-docs-informative: 0.0.2 + comment-parser: 1.4.1 + debug: 4.3.4 + escape-string-regexp: 4.0.0 + eslint: 9.0.0 + esquery: 1.5.0 + is-builtin-module: 3.2.1 + semver: 7.6.0 + spdx-expression-parse: 4.0.0 transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color - dev: true - - /eslint-plugin-n@15.7.0(eslint@8.47.0): - resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} - engines: {node: '>=12.22.0'} - peerDependencies: - eslint: '>=7.0.0' - dependencies: - builtins: 5.0.1 - eslint: 8.47.0 - eslint-plugin-es: 4.1.0(eslint@8.47.0) - eslint-utils: 3.0.0(eslint@8.47.0) - ignore: 5.2.4 - is-core-module: 2.11.0 - minimatch: 3.1.2 - resolve: 1.22.1 - semver: 7.5.3 - dev: true - - /eslint-plugin-node@11.1.0(eslint@8.47.0): - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 8.47.0 - eslint-plugin-es: 3.0.1(eslint@8.47.0) - eslint-utils: 2.1.0 - ignore: 5.2.4 - minimatch: 3.1.2 - resolve: 1.22.1 - semver: 6.3.0 - dev: true - - /eslint-plugin-promise@6.1.1(eslint@8.47.0): - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - eslint: 8.47.0 - dev: true - /eslint-plugin-unicorn@44.0.2(eslint@8.47.0): - resolution: {integrity: sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==} - engines: {node: '>=14.18'} - peerDependencies: - eslint: '>=8.23.1' + eslint-plugin-unicorn@52.0.0(eslint@9.0.0): dependencies: - '@babel/helper-validator-identifier': 7.22.5 - ci-info: 3.8.0 + '@babel/helper-validator-identifier': 7.22.20 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@eslint/eslintrc': 2.1.4 + ci-info: 4.0.0 clean-regexp: 1.0.0 - eslint: 8.47.0 - eslint-utils: 3.0.0(eslint@8.47.0) + core-js-compat: 3.37.0 + eslint: 9.0.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 - lodash: 4.17.21 + jsesc: 3.0.2 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 - safe-regex: 2.1.1 - semver: 7.5.3 + regjsparser: 0.10.0 + semver: 7.5.4 strip-indent: 3.0.0 - dev: true + transitivePeerDependencies: + - supports-color - /eslint-plugin-vue@9.11.1(eslint@8.47.0): - resolution: {integrity: sha512-SNtBGDrRkPUFsREswPceqdvZ7YVdWY+iCYiDC+RoxwVieeQ7GJU1FLDlkcaYTOD2os/YuVgI1Fdu8YGM7fmoow==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-vue@9.25.0(eslint@9.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - eslint: 8.47.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + eslint: 9.0.0 + globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.0.11 - semver: 7.5.0 - vue-eslint-parser: 9.2.1(eslint@8.47.0) + postcss-selector-parser: 6.0.16 + semver: 7.6.0 + vue-eslint-parser: 9.4.2(eslint@9.0.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.0.1: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.47.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.47.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.0.0: {} - /eslint@8.47.0: - resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@9.0.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.47.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint/eslintrc': 3.0.2 + '@eslint/js': 9.0.0 + '@humanwhocodes/config-array': 0.12.3 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.0.1 + eslint-visitor-keys: 4.0.0 + espree: 10.0.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -5028,83 +8748,47 @@ packages: transitivePeerDependencies: - supports-color - /esno@0.16.3: - resolution: {integrity: sha512-6slSBEV1lMKcX13DBifvnDFpNno5WXhw4j/ff7RI0y51BZiDqEe5dNhhjhIQ3iCOQuzsm2MbVzmwqbN78BBhPg==} - hasBin: true + esno@0.16.3: dependencies: tsx: 3.12.7 - dev: false - /espree@9.6.0: - resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.0.1: dependencies: - acorn: 8.9.0 - acorn-jsx: 5.3.2(acorn@8.9.0) - eslint-visitor-keys: 3.4.1 - dev: true + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 4.0.0 - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: - acorn: 8.9.0 - acorn-jsx: 5.3.2(acorn@8.9.0) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: false + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + estraverse@5.3.0: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: false + estree-walker@2.0.2: {} - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.0 - dev: false - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + esutils@2.0.3: {} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: false + etag@1.8.1: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false + eventemitter3@4.0.7: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -5116,9 +8800,7 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /execa@7.1.1: - resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -5129,11 +8811,8 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: false - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.2.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -5145,36 +8824,25 @@ packages: signal-exit: 3.0.7 strip-final-newline: 3.0.0 - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false + extend@3.0.2: {} - /externality@1.0.2: - resolution: {integrity: sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==} + externality@1.0.2: dependencies: enhanced-resolve: 5.15.0 mlly: 1.4.0 pathe: 1.1.1 ufo: 1.1.2 - dev: false - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-folder-size@2.1.0: - resolution: {integrity: sha512-3h+e4YJJ6fze5RMaByScrfRdHE+DnM/as8r/jbjmIGhgty6v2yBRNbtOiItqhRitv4kBv8WAOQvbPtnyYK3gHw==} - hasBin: true - requiresBuild: true + fast-folder-size@2.1.0: dependencies: decompress: 4.2.1 https-proxy-agent: 7.0.0 transitivePeerDependencies: - supports-color - dev: false - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} + fast-glob@3.2.12: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -5182,232 +8850,139 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: false - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-levenshtein@2.0.6: {} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.15.0: dependencies: reusify: 1.0.4 - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fd-slicer@1.1.0: dependencies: pend: 1.2.0 - dev: false - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 - dev: false - /fflate@0.7.4: - resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} - dev: false + fflate@0.7.4: {} - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.0.4 + flat-cache: 4.0.1 - /file-type@3.9.0: - resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} - engines: {node: '>=0.10.0'} - dev: false + file-type@3.9.0: {} - /file-type@5.2.0: - resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} - engines: {node: '>=4'} - dev: false + file-type@5.2.0: {} - /file-type@6.2.0: - resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} - engines: {node: '>=4'} - dev: false + file-type@6.2.0: {} - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false + file-uri-to-path@1.0.0: {} - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + find-up@7.0.0: dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: false + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + flat@5.0.2: {} - /focus-trap@7.5.2: - resolution: {integrity: sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==} + flatted@3.2.7: {} + + flatted@3.3.1: {} + + focus-trap@7.5.2: dependencies: tabbable: 6.2.0 - dev: false - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false + follow-redirects@1.15.2: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.0.1 - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 - dev: false - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: false + fraction.js@4.2.0: {} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: false + fresh@0.5.2: {} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false + fs-constants@1.0.0: {} - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} + fs-extra@11.1.1: dependencies: graceful-fs: 4.2.10 jsonfile: 6.1.0 universalify: 2.0.0 - dev: false - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.10 jsonfile: 4.0.0 universalify: 0.1.2 - dev: false - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - dev: false - /fs-minipass@3.0.2: - resolution: {integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs-minipass@3.0.2: dependencies: minipass: 5.0.0 - dev: false - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: false + fsevents@2.3.2: optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - functions-have-names: 1.2.3 - dev: true + function-bind@1.1.1: {} - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + function-bind@1.1.2: {} - /fuse.js@6.6.2: - resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==} - engines: {node: '>=10'} - dev: false + fuse.js@6.6.2: {} - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} + gauge@3.0.2: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -5418,11 +8993,8 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: false - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + gauge@4.0.4: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -5432,60 +9004,35 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: false - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: false + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + get-intrinsic@1.2.0: dependencies: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 - /get-port-please@3.0.1: - resolution: {integrity: sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng==} - dev: false + get-port-please@3.0.1: {} - /get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - dev: true + get-stdin@9.0.0: {} - /get-stream@2.3.1: - resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} - engines: {node: '>=0.10.0'} + get-stream@2.3.1: dependencies: object-assign: 4.1.1 pinkie-promise: 2.0.1 - dev: false - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + get-stream@6.0.1: {} - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - dev: true + get-tsconfig@4.5.0: {} - /get-tsconfig@4.5.0: - resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} + get-tsconfig@4.7.3: + dependencies: + resolve-pkg-maps: 1.0.0 - /giget@1.1.2: - resolution: {integrity: sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==} - hasBin: true + giget@1.1.2: dependencies: colorette: 2.0.19 defu: 6.1.2 @@ -5496,46 +9043,29 @@ packages: tar: 6.1.13 transitivePeerDependencies: - supports-color - dev: false - /git-config-path@2.0.0: - resolution: {integrity: sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==} - engines: {node: '>=4'} - dev: false + git-config-path@2.0.0: {} - /git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + git-up@7.0.0: dependencies: is-ssh: 1.4.0 parse-url: 8.1.0 - dev: false - /git-url-parse@13.1.0: - resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + git-url-parse@13.1.0: dependencies: git-up: 7.0.0 - dev: false - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: false + github-slugger@2.0.0: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - /glob@10.2.7: - resolution: {integrity: sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.2.7: dependencies: foreground-child: 3.1.1 jackspeak: 2.2.0 @@ -5543,8 +9073,7 @@ packages: minipass: 5.0.0 path-scurry: 1.7.0 - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5553,57 +9082,42 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: false - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} + global-dirs@3.0.1: dependencies: ini: 2.0.0 - dev: false - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: false + globals@11.12.0: {} - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} + globals@13.20.0: dependencies: type-fest: 0.20.2 - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globals@13.24.0: dependencies: - define-properties: 1.2.0 - dev: true + type-fest: 0.20.2 - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globals@14.0.0: {} + + globals@15.0.0: {} + + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globby@13.2.0: - resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@13.2.0: dependencies: dir-glob: 3.0.1 fast-glob: 3.2.12 @@ -5611,41 +9125,27 @@ packages: merge2: 1.4.1 slash: 4.0.0 - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@13.2.2: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 - dev: false - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.0 - /graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true + graceful-fs@4.2.10: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphemer@1.4.0: {} - /gzip-size@7.0.0: - resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + gzip-size@7.0.0: dependencies: duplexer: 0.1.2 - dev: false - /h3@1.7.1: - resolution: {integrity: sha512-A9V2NEDNHet7v1gCg7CMwerSigLi0SRbhTy7C3lGb0N4YKIpPmLDjedTUopqp4dnn7COHfqUjjaz3zbtz4QduA==} + h3@1.7.1: dependencies: cookie-es: 1.0.0 defu: 6.1.2 @@ -5654,10 +9154,8 @@ packages: radix3: 1.0.1 ufo: 1.1.2 uncrypto: 0.1.3 - dev: false - /h3@1.8.0-rc.3: - resolution: {integrity: sha512-NhDCNXhrJkt42BDQF57787yXJa2eX2Hl4OMlu+Ym9QBdBaOByUjBrovYaBc+27mtIhHvs2IqPf56to8qcNBI7Q==} + h3@1.8.0-rc.3: dependencies: cookie-es: 1.0.0 defu: 6.1.2 @@ -5667,56 +9165,34 @@ packages: ufo: 1.2.0 uncrypto: 0.1.3 unenv: 1.7.1 - dev: false - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + has-property-descriptors@1.0.0: dependencies: get-intrinsic: 1.2.0 - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: false + has-unicode@2.0.1: {} - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + has@1.0.3: dependencies: function-bind: 1.1.1 - /hash-sum@2.0.0: - resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} - dev: false + hash-sum@2.0.0: {} - /hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-parse5@7.1.2: dependencies: '@types/hast': 2.3.4 '@types/unist': 2.0.6 @@ -5725,33 +9201,23 @@ packages: vfile: 5.3.7 vfile-location: 4.1.0 web-namespaces: 2.0.1 - dev: false - /hast-util-has-property@2.0.1: - resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} - dev: false + hast-util-has-property@2.0.1: {} - /hast-util-heading-rank@2.1.1: - resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==} + hast-util-heading-rank@2.1.1: dependencies: '@types/hast': 2.3.4 - dev: false - /hast-util-is-element@2.1.3: - resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} + hast-util-is-element@2.1.3: dependencies: '@types/hast': 2.3.4 '@types/unist': 2.0.6 - dev: false - /hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + hast-util-parse-selector@3.1.1: dependencies: '@types/hast': 2.3.4 - dev: false - /hast-util-raw@7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + hast-util-raw@7.2.3: dependencies: '@types/hast': 2.3.4 '@types/parse5': 6.0.3 @@ -5764,10 +9230,8 @@ packages: vfile: 5.3.7 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-to-parse5@7.1.0: - resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + hast-util-to-parse5@7.1.0: dependencies: '@types/hast': 2.3.4 comma-separated-tokens: 2.0.3 @@ -5775,248 +9239,148 @@ packages: space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-to-string@2.0.0: - resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} + hast-util-to-string@2.0.0: dependencies: '@types/hast': 2.3.4 - dev: false - /hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + hastscript@7.2.0: dependencies: '@types/hast': 2.3.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 3.1.1 property-information: 6.2.0 space-separated-tokens: 2.0.2 - dev: false - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: false + he@1.2.0: {} - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + header-case@2.0.4: dependencies: capital-case: 1.0.4 tslib: 2.5.0 - dev: false - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: false + heap@0.2.7: {} - /hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - dev: false + hookable@5.5.3: {} - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hosted-git-info@6.1.1: dependencies: lru-cache: 7.18.3 - dev: false - /html-tags@3.2.0: - resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} - engines: {node: '>=8'} - dev: false + html-tags@3.2.0: {} - /html-void-elements@2.0.1: - resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} - dev: false + html-void-elements@2.0.1: {} - /htmlparser2@8.0.1: - resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + htmlparser2@8.0.1: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.0.1 entities: 4.4.0 - dev: false - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: false + http-cache-semantics@4.1.1: {} - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: false - /http-graceful-shutdown@3.1.13: - resolution: {integrity: sha512-Ci5LRufQ8AtrQ1U26AevS8QoMXDOhnAHCJI3eZu1com7mZGHxREmw3dNj85ftpQokQCvak8nI2pnFS8zyM1M+Q==} - engines: {node: '>=4.0.0'} + http-graceful-shutdown@3.1.13: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 follow-redirects: 1.15.2 requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: false - /http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: false + http-shutdown@1.2.2: {} - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /https-proxy-agent@7.0.0: - resolution: {integrity: sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==} - engines: {node: '>= 14'} + https-proxy-agent@7.0.0: dependencies: agent-base: 7.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-signals@2.1.0: {} - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} + human-signals@4.3.1: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - dev: false - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: false - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false + ieee754@1.2.1: {} - /ignore-walk@6.0.3: - resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore-walk@6.0.3: dependencies: minimatch: 9.0.2 - dev: false - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} + ignore@5.2.4: {} - /image-meta@0.1.1: - resolution: {integrity: sha512-+oXiHwOEPr1IE5zY0tcBLED/CYcre15J4nwL50x3o0jxWqEkyjrusiKP3YSU+tr9fvJp33ZcP5Gpj2295g3aEw==} - engines: {node: '>=10.18.0'} - dev: false + ignore@5.3.1: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + image-meta@0.1.1: {} + + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + indent-string@4.0.0: {} - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: false + infer-owner@1.0.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false + inherits@2.0.4: {} - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: false + ini@1.3.8: {} - /ini@3.0.1: - resolution: {integrity: sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dev: true + ini@2.0.0: {} - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - side-channel: 1.0.4 - dev: true + ini@3.0.1: {} - /internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - dev: false + internmap@1.0.1: {} - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false + internmap@2.0.3: {} - /ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} - engines: {node: '>=12.22.0'} + ioredis@5.3.2: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 @@ -6029,273 +9393,116 @@ packages: standard-as-callback: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - - /ip-regex@5.0.0: - resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - dev: false - - /iron-webcrypto@0.7.0: - resolution: {integrity: sha512-WkX32iTcwd79ZsWRPP5wq1Jq6XXfPwO783ZiUBY8uMw4/AByx5WvBmxvYGnpVt6AOVJ0F41Qo420r8lIneT9Wg==} - dev: false - - /iron-webcrypto@0.8.0: - resolution: {integrity: sha512-gScdcWHjTGclCU15CIv2r069NoQrys1UeUFFfaO1hL++ytLHkVw7N5nXJmFf3J2LEDMz1PkrvC0m62JEeu1axQ==} - dev: false - - /is-absolute-url@4.0.1: - resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: false - - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - dev: false - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: false + ip-regex@5.0.0: {} - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-typed-array: 1.1.10 - dev: true + ip@2.0.0: {} - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + iron-webcrypto@0.7.0: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true + iron-webcrypto@0.8.0: {} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-absolute-url@4.0.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: dependencies: - binary-extensions: 2.2.0 - dev: false + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-arguments@1.1.1: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false + is-arrayish@0.2.1: {} - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.2.0 + + is-buffer@2.0.5: {} + + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + is-callable@1.2.7: {} - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + is-core-module@2.11.0: dependencies: has: 1.0.3 - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-core-module@2.13.1: dependencies: - has-tostringtag: 1.0.0 - dev: true + hasown: 2.0.2 - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: false + is-decimal@2.0.1: {} - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true + is-docker@2.2.1: {} - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + is-docker@3.0.0: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: false + is-hexadecimal@2.0.1: {} - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 is-path-inside: 3.0.3 - dev: false - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: false + is-lambda@1.0.1: {} - /is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - dev: false + is-module@1.0.0: {} - /is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} + is-nan@1.3.2: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - dev: false - /is-natural-number@4.0.1: - resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} - dev: false - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true + is-natural-number@4.0.1: {} - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + is-path-inside@3.0.3: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false + is-plain-obj@4.1.0: {} - /is-primitive@3.0.1: - resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} - engines: {node: '>=0.10.0'} - dev: false + is-primitive@3.0.1: {} - /is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - dev: false + is-promise@4.0.0: {} - /is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-reference@1.2.1: dependencies: '@types/estree': 1.0.0 - dev: false - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - dev: true - /is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + is-ssh@1.4.0: dependencies: protocols: 2.0.1 - dev: false - - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@1.1.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true + is-stream@2.0.1: {} - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true + is-stream@3.0.0: {} - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.10: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -6303,215 +9510,133 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false + isarray@1.0.0: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /jackspeak@2.2.0: - resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==} - engines: {node: '>=14'} + jackspeak@2.2.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - /jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} - hasBin: true - dev: false + jiti@1.18.2: {} - /jiti@1.19.1: - resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} - hasBin: true - dev: false + jiti@1.19.1: {} - /joi@17.9.2: - resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==} + joi@17.9.2: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 '@sideway/address': 4.1.4 '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - dev: false - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: false + jsdoc-type-pratt-parser@4.0.0: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + jsesc@0.5.0: {} - /json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: false + jsesc@2.5.2: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + jsesc@3.0.2: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-buffer@3.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true + json-parse-even-better-errors@2.3.1: {} - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: false + json-parse-even-better-errors@3.0.0: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + json-schema-traverse@0.4.1: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonc-parser@3.2.0: {} + + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.10 - dev: false - /jsonfile@5.0.0: - resolution: {integrity: sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==} + jsonfile@5.0.0: dependencies: universalify: 0.1.2 optionalDependencies: graceful-fs: 4.2.10 - dev: false - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.10 - dev: false - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: false + jsonparse@1.3.1: {} - /khroma@2.0.0: - resolution: {integrity: sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==} - dev: false + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: false + khroma@2.0.0: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: false + kleur@3.0.3: {} - /klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - dev: false + kleur@4.1.5: {} - /knitwork@1.0.0: - resolution: {integrity: sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q==} - dev: false + klona@2.0.6: {} - /kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - dev: false + knitwork@1.0.0: {} - /launch-editor@2.6.0: - resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} + kolorist@1.8.0: {} + + launch-editor@2.6.0: dependencies: picocolors: 1.0.0 shell-quote: 1.8.0 - dev: false - /layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - dev: false + layout-base@1.0.2: {} - /layout-base@2.0.1: - resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - dev: false + layout-base@2.0.1: {} - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - dev: false - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - /lighthouse-logger@1.3.0: - resolution: {integrity: sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==} + lighthouse-logger@1.3.0: dependencies: debug: 2.6.9 marky: 1.2.5 transitivePeerDependencies: - supports-color - dev: false - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: false + lilconfig@2.1.0: {} - /linebreak@1.1.0: - resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + linebreak@1.1.0: dependencies: base64-js: 0.0.8 unicode-trie: 2.0.0 - dev: false - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /linkify-it@4.0.1: - resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + linkify-it@4.0.1: dependencies: uc.micro: 1.0.6 - dev: true - /listhen@1.0.4: - resolution: {integrity: sha512-r94k7kmXHb8e8wpv7+UP/qqhhD+j/9TgX19QKim2cEJuWCLwlTw+5BkCFmYyjhQ7Bt8KdVun/2DcD7MF2Fe3+g==} + listhen@1.0.4: dependencies: clipboardy: 3.0.0 colorette: 2.0.19 @@ -6521,11 +9646,8 @@ packages: ip-regex: 5.0.0 node-forge: 1.3.1 ufo: 1.1.2 - dev: false - /listhen@1.2.2: - resolution: {integrity: sha512-fQaXe+DAQ5QiYP1B4uXfAgwqIwNS+0WMIwRd5l2a3npQAEhlCJ1pN11d41yHtbeReE7oRtfL+h6Nzxq+Wc4vIg==} - hasBin: true + listhen@1.2.2: dependencies: '@parcel/watcher-wasm': 2.3.0-alpha.1 citty: 0.1.2 @@ -6540,188 +9662,113 @@ packages: node-forge: 1.3.1 pathe: 1.1.1 ufo: 1.2.0 - dev: false - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} + local-pkg@0.4.3: {} - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 - /lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - dev: false + lodash-es@4.17.21: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: false + lodash._reinterpolate@3.0.0: {} - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false + lodash.debounce@4.0.8: {} - /lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - dev: false + lodash.defaults@4.2.0: {} - /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: false + lodash.difference@4.5.0: {} - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: false + lodash.flatten@4.4.0: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: false + lodash.isarguments@3.1.0: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: false + lodash.isplainobject@4.0.6: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.memoize@4.1.2: {} - /lodash.pick@4.4.0: - resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} - dev: false + lodash.merge@4.6.2: {} - /lodash.template@4.5.0: - resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} + lodash.pick@4.4.0: {} + + lodash.template@4.5.0: dependencies: lodash._reinterpolate: 3.0.0 lodash.templatesettings: 4.2.0 - dev: false - /lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + lodash.templatesettings@4.2.0: dependencies: lodash._reinterpolate: 3.0.0 - dev: false - /lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - dev: false + lodash.union@4.6.0: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: false + lodash.uniq@4.5.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false + longest-streak@3.1.0: {} - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lower-case@2.0.2: dependencies: tslib: 2.5.0 - dev: false - /lru-cache@10.0.0: - resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} - engines: {node: 14 || >=16.14} - dev: false + lru-cache@10.0.0: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: false - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: false + lru-cache@7.18.3: {} - /lru-cache@9.1.1: - resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==} - engines: {node: 14 || >=16.14} + lru-cache@9.1.1: {} - /magic-string-ast@0.1.2: - resolution: {integrity: sha512-P53AZrzq7hclCU6HWj88xNZHmP15DKjMmK/vBytO1qnpYP3ul4IEZlyCE0aU3JRnmgWmZPmoTKj4Bls7v0pMyA==} - engines: {node: '>=14.19.0'} + magic-string-ast@0.1.2: dependencies: magic-string: 0.30.2 - dev: false - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} + magic-string@0.27.0: dependencies: '@jridgewell/sourcemap-codec': 1.4.14 - dev: false - /magic-string@0.29.0: - resolution: {integrity: sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==} - engines: {node: '>=12'} + magic-string@0.29.0: dependencies: '@jridgewell/sourcemap-codec': 1.4.14 - dev: false - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} + magic-string@0.30.0: dependencies: '@jridgewell/sourcemap-codec': 1.4.14 - dev: false - /magic-string@0.30.2: - resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} - engines: {node: '>=12'} + magic-string@0.30.2: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - /magicast@0.2.10: - resolution: {integrity: sha512-Ah2qatigknxwmoYCd9hx/mmVyrRNhDKiaWZIuW4gL6dWrAGMoOpCVkQ3VpGWARtkaJVFhe8uIphcsxDzLPQUyg==} + magicast@0.2.10: dependencies: '@babel/parser': 7.22.10 '@babel/types': 7.22.5 recast: 0.23.4 - dev: false - /make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} + make-dir@1.3.0: dependencies: pify: 3.0.0 - dev: false - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.0 - dev: false - /make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.3.0 cacache: 16.1.3 @@ -6742,11 +9789,8 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: false - /make-fetch-happen@11.1.1: - resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + make-fetch-happen@11.1.1: dependencies: agentkeepalive: 4.3.0 cacache: 17.1.0 @@ -6765,82 +9809,57 @@ packages: ssri: 10.0.4 transitivePeerDependencies: - supports-color - dev: false - /markdown-it@13.0.1: - resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} - hasBin: true + markdown-it@13.0.1: dependencies: argparse: 2.0.1 entities: 3.0.1 linkify-it: 4.0.1 mdurl: 1.0.1 uc.micro: 1.0.6 - dev: true - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: false + markdown-table@3.0.3: {} - /markdownlint-cli@0.35.0: - resolution: {integrity: sha512-lVIIIV1MrUtjoocgDqXLxUCxlRbn7Ve8rsWppfwciUNwLlNS28AhNiyQ3PU7jjj4Qvj+rWTTvwkqg7AcdG988g==} - engines: {node: '>=16'} - hasBin: true + markdownlint-cli@0.34.0: dependencies: - commander: 11.0.0 + commander: 10.0.1 get-stdin: 9.0.0 glob: 10.2.7 ignore: 5.2.4 js-yaml: 4.1.0 jsonc-parser: 3.2.0 - markdownlint: 0.29.0 + markdownlint: 0.28.2 minimatch: 9.0.2 run-con: 1.2.11 - dev: true - /markdownlint-micromark@0.1.5: - resolution: {integrity: sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==} - engines: {node: '>=16'} - dev: true + markdownlint-micromark@0.1.2: {} - /markdownlint@0.29.0: - resolution: {integrity: sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==} - engines: {node: '>=16'} + markdownlint@0.28.2: dependencies: markdown-it: 13.0.1 - markdownlint-micromark: 0.1.5 - dev: true + markdownlint-micromark: 0.1.2 - /marky@1.2.5: - resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} - dev: false + marky@1.2.5: {} - /mdast-squeeze-paragraphs@5.2.1: - resolution: {integrity: sha512-npINYQrt0E5AvSvM7ZxIIyrG/7DX+g8jKWcJMudrcjI+b1eNOKbbu+wTo6cKvy5IzH159IPfpWoRVH7kwEmnug==} + mdast-squeeze-paragraphs@5.2.1: dependencies: '@types/mdast': 3.0.10 unist-util-visit: 4.1.2 - dev: false - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + mdast-util-definitions@5.1.2: dependencies: '@types/mdast': 3.0.10 '@types/unist': 2.0.6 unist-util-visit: 4.1.2 - dev: false - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + mdast-util-find-and-replace@2.2.2: dependencies: '@types/mdast': 3.0.10 escape-string-regexp: 5.0.0 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - dev: false - /mdast-util-from-markdown@1.3.0: - resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} + mdast-util-from-markdown@1.3.0: dependencies: '@types/mdast': 3.0.10 '@types/unist': 2.0.6 @@ -6856,34 +9875,26 @@ packages: uvu: 0.5.6 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + mdast-util-gfm-autolink-literal@1.0.3: dependencies: '@types/mdast': 3.0.10 ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 micromark-util-character: 1.1.0 - dev: false - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + mdast-util-gfm-footnote@1.0.2: dependencies: '@types/mdast': 3.0.10 mdast-util-to-markdown: 1.5.0 micromark-util-normalize-identifier: 1.0.0 - dev: false - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + mdast-util-gfm-strikethrough@1.0.3: dependencies: '@types/mdast': 3.0.10 mdast-util-to-markdown: 1.5.0 - dev: false - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + mdast-util-gfm-table@1.0.7: dependencies: '@types/mdast': 3.0.10 markdown-table: 3.0.3 @@ -6891,17 +9902,13 @@ packages: mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + mdast-util-gfm-task-list-item@1.0.2: dependencies: '@types/mdast': 3.0.10 mdast-util-to-markdown: 1.5.0 - dev: false - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + mdast-util-gfm@2.0.2: dependencies: mdast-util-from-markdown: 1.3.0 mdast-util-gfm-autolink-literal: 1.0.3 @@ -6912,17 +9919,13 @@ packages: mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + mdast-util-phrasing@3.0.1: dependencies: '@types/mdast': 3.0.10 unist-util-is: 5.2.1 - dev: false - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + mdast-util-to-hast@12.3.0: dependencies: '@types/hast': 2.3.4 '@types/mdast': 3.0.10 @@ -6932,10 +9935,8 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: false - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + mdast-util-to-markdown@1.5.0: dependencies: '@types/mdast': 3.0.10 '@types/unist': 2.0.6 @@ -6945,42 +9946,27 @@ packages: micromark-util-decode-string: 1.0.2 unist-util-visit: 4.1.2 zwitch: 2.0.4 - dev: false - /mdast-util-to-string@3.1.1: - resolution: {integrity: sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==} + mdast-util-to-string@3.1.1: dependencies: '@types/mdast': 3.0.10 - dev: false - /mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - dev: false + mdn-data@2.0.28: {} - /mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - dev: false + mdn-data@2.0.30: {} - /mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + mdurl@1.0.1: {} - /memory-fs@0.5.0: - resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + memory-fs@0.5.0: dependencies: errno: 0.1.8 readable-stream: 2.3.8 - dev: false - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /mermaid@10.3.1: - resolution: {integrity: sha512-hkenh7WkuRWPcob3oJtrN3W+yzrrIYuWF1OIfk/d0xGE8UWlvDhfexaHmDwwe8DKQgqMLI8DWEPwGprxkumjuw==} + mermaid@10.3.1: dependencies: '@braintree/sanitize-url': 6.0.2 '@types/d3-scale': 4.0.3 @@ -7004,10 +9990,8 @@ packages: web-worker: 1.2.0 transitivePeerDependencies: - supports-color - dev: false - /micromark-core-commonmark@1.0.6: - resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} + micromark-core-commonmark@1.0.6: dependencies: decode-named-character-reference: 1.0.2 micromark-factory-destination: 1.0.0 @@ -7025,20 +10009,16 @@ packages: micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 uvu: 0.5.6 - dev: false - /micromark-extension-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} + micromark-extension-gfm-autolink-literal@1.0.3: dependencies: micromark-util-character: 1.1.0 micromark-util-sanitize-uri: 1.1.0 micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 uvu: 0.5.6 - dev: false - /micromark-extension-gfm-footnote@1.0.4: - resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==} + micromark-extension-gfm-footnote@1.0.4: dependencies: micromark-core-commonmark: 1.0.6 micromark-factory-space: 1.0.0 @@ -7048,10 +10028,8 @@ packages: micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 uvu: 0.5.6 - dev: false - /micromark-extension-gfm-strikethrough@1.0.4: - resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==} + micromark-extension-gfm-strikethrough@1.0.4: dependencies: micromark-util-chunked: 1.0.0 micromark-util-classify-character: 1.0.0 @@ -7059,36 +10037,28 @@ packages: micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 uvu: 0.5.6 - dev: false - /micromark-extension-gfm-table@1.0.5: - resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} + micromark-extension-gfm-table@1.0.5: dependencies: micromark-factory-space: 1.0.0 micromark-util-character: 1.1.0 micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 uvu: 0.5.6 - dev: false - /micromark-extension-gfm-tagfilter@1.0.1: - resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==} + micromark-extension-gfm-tagfilter@1.0.1: dependencies: micromark-util-types: 1.0.2 - dev: false - /micromark-extension-gfm-task-list-item@1.0.3: - resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==} + micromark-extension-gfm-task-list-item@1.0.3: dependencies: micromark-factory-space: 1.0.0 micromark-util-character: 1.1.0 micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 uvu: 0.5.6 - dev: false - /micromark-extension-gfm@2.0.1: - resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} + micromark-extension-gfm@2.0.1: dependencies: micromark-extension-gfm-autolink-literal: 1.0.3 micromark-extension-gfm-footnote: 1.0.4 @@ -7098,141 +10068,101 @@ packages: micromark-extension-gfm-task-list-item: 1.0.3 micromark-util-combine-extensions: 1.0.0 micromark-util-types: 1.0.2 - dev: false - /micromark-factory-destination@1.0.0: - resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} + micromark-factory-destination@1.0.0: dependencies: micromark-util-character: 1.1.0 micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 - dev: false - /micromark-factory-label@1.0.2: - resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} + micromark-factory-label@1.0.2: dependencies: micromark-util-character: 1.1.0 micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 uvu: 0.5.6 - dev: false - /micromark-factory-space@1.0.0: - resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} + micromark-factory-space@1.0.0: dependencies: micromark-util-character: 1.1.0 micromark-util-types: 1.0.2 - dev: false - /micromark-factory-title@1.0.2: - resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} + micromark-factory-title@1.0.2: dependencies: micromark-factory-space: 1.0.0 micromark-util-character: 1.1.0 micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 uvu: 0.5.6 - dev: false - /micromark-factory-whitespace@1.0.0: - resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} + micromark-factory-whitespace@1.0.0: dependencies: micromark-factory-space: 1.0.0 micromark-util-character: 1.1.0 micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 - dev: false - /micromark-util-character@1.1.0: - resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} + micromark-util-character@1.1.0: dependencies: micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 - dev: false - /micromark-util-chunked@1.0.0: - resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} + micromark-util-chunked@1.0.0: dependencies: micromark-util-symbol: 1.0.1 - dev: false - /micromark-util-classify-character@1.0.0: - resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} + micromark-util-classify-character@1.0.0: dependencies: micromark-util-character: 1.1.0 micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 - dev: false - /micromark-util-combine-extensions@1.0.0: - resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} + micromark-util-combine-extensions@1.0.0: dependencies: micromark-util-chunked: 1.0.0 micromark-util-types: 1.0.2 - dev: false - /micromark-util-decode-numeric-character-reference@1.0.0: - resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} + micromark-util-decode-numeric-character-reference@1.0.0: dependencies: micromark-util-symbol: 1.0.1 - dev: false - /micromark-util-decode-string@1.0.2: - resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} + micromark-util-decode-string@1.0.2: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 1.1.0 micromark-util-decode-numeric-character-reference: 1.0.0 micromark-util-symbol: 1.0.1 - dev: false - /micromark-util-encode@1.0.1: - resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} - dev: false + micromark-util-encode@1.0.1: {} - /micromark-util-html-tag-name@1.1.0: - resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} - dev: false + micromark-util-html-tag-name@1.1.0: {} - /micromark-util-normalize-identifier@1.0.0: - resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} + micromark-util-normalize-identifier@1.0.0: dependencies: micromark-util-symbol: 1.0.1 - dev: false - /micromark-util-resolve-all@1.0.0: - resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} + micromark-util-resolve-all@1.0.0: dependencies: micromark-util-types: 1.0.2 - dev: false - /micromark-util-sanitize-uri@1.1.0: - resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} + micromark-util-sanitize-uri@1.1.0: dependencies: micromark-util-character: 1.1.0 micromark-util-encode: 1.0.1 micromark-util-symbol: 1.0.1 - dev: false - /micromark-util-subtokenize@1.0.2: - resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} + micromark-util-subtokenize@1.0.2: dependencies: micromark-util-chunked: 1.0.0 micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 uvu: 0.5.6 - dev: false - /micromark-util-symbol@1.0.1: - resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} - dev: false + micromark-util-symbol@1.0.1: {} - /micromark-util-types@1.0.2: - resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} - dev: false + micromark-util-types@1.0.2: {} - /micromark@3.1.0: - resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} + micromark@3.1.0: dependencies: '@types/debug': 4.1.7 debug: 4.3.4 @@ -7253,190 +10183,113 @@ packages: uvu: 0.5.6 transitivePeerDependencies: - supports-color - dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: false - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: false + mime@1.6.0: {} - /mime@2.5.2: - resolution: {integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: false + mime@2.5.2: {} - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: false + mime@3.0.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + mimic-fn@4.0.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + minimatch@3.0.8: dependencies: brace-expansion: 1.1.11 - dev: false - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: false - /minimatch@6.2.0: - resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==} - engines: {node: '>=10'} + minimatch@6.2.0: dependencies: brace-expansion: 2.0.1 - dev: false - /minimatch@9.0.2: - resolution: {integrity: sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.2: dependencies: brace-expansion: 2.0.1 - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass-collect@1.0.2: dependencies: minipass: 3.3.6 - dev: false - /minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + minipass-fetch@2.1.2: dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 - dev: false - /minipass-fetch@3.0.3: - resolution: {integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@3.0.3: dependencies: minipass: 5.0.0 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 - dev: false - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 - dev: false - /minipass-json-stream@1.0.1: - resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + minipass-json-stream@1.0.1: dependencies: jsonparse: 1.3.1 minipass: 3.3.6 - dev: false - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + minipass-pipeline@1.2.4: dependencies: minipass: 3.3.6 - dev: false - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} + minipass-sized@1.0.3: dependencies: minipass: 3.3.6 - dev: false - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - dev: false - /minipass@4.2.5: - resolution: {integrity: sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==} - engines: {node: '>=8'} - dev: false + minipass@4.2.5: {} - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + minipass@5.0.0: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: false - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: false + mkdirp@1.0.4: {} - /mkdist@1.1.2(typescript@4.9.5): - resolution: {integrity: sha512-s9whPlQsr84iY3XoufsDrVlzGiDdTnMwf2+7QU6ekJPgTIgGwn7EsU8lcefWqLH6no+/4UqjDBwyIkGKfZyH9g==} - hasBin: true - peerDependencies: - sass: ^1.58.3 - typescript: '>=4.9.5' - peerDependenciesMeta: - sass: - optional: true - typescript: - optional: true + mkdist@1.1.2(typescript@4.9.5): dependencies: defu: 6.1.2 esbuild: 0.17.19 @@ -7446,74 +10299,39 @@ packages: mlly: 1.4.0 mri: 1.2.0 pathe: 1.1.1 + optionalDependencies: typescript: 4.9.5 - dev: false - /mlly@1.4.0: - resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + mlly@1.4.0: dependencies: acorn: 8.10.0 pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.1.2 - dev: false - - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false - /mrmime@1.0.1: - resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} - engines: {node: '>=10'} - dev: false + mri@1.2.0: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false + mrmime@1.0.1: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.0.0: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@2.1.2: {} - /muggle-string@0.2.2: - resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==} - dev: false + ms@2.1.3: {} - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false + muggle-string@0.2.2: {} - /nanoid@4.0.2: - resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} - engines: {node: ^14 || ^16 || >=18} - hasBin: true - dev: false + nanoid@3.3.6: {} - /napi-wasm@1.1.0: - resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} - dev: false + nanoid@4.0.2: {} - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true + napi-wasm@1.1.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + natural-compare@1.4.0: {} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: false + negotiator@0.6.3: {} - /nitropack@2.5.2: - resolution: {integrity: sha512-hXEHY9NJmOOETFFTPCBB9PB0+txoAbU/fB2ovUF6UMRo4ucQZztYnZdX+YSxa6FVz6eONvcxXvf9/9s6t08KWw==} - engines: {node: ^14.16.0 || ^16.11.0 || >=17.0.0} - hasBin: true + nitropack@2.5.2(encoding@0.1.13): dependencies: '@cloudflare/kv-asset-handler': 0.3.0 '@netlify/functions': 1.6.0 @@ -7527,7 +10345,7 @@ packages: '@rollup/plugin-wasm': 6.1.3(rollup@3.28.0) '@rollup/pluginutils': 5.0.2(rollup@3.28.0) '@types/http-proxy': 1.17.11 - '@vercel/nft': 0.22.6 + '@vercel/nft': 0.22.6(encoding@0.1.13) archiver: 5.3.1 c12: 1.4.2 chalk: 5.2.0 @@ -7592,65 +10410,37 @@ packages: - debug - encoding - supports-color - dev: false - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.5.0 - dev: false - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false + node-domexception@1.0.0: {} - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 - dev: false - /node-fetch-native@1.2.0: - resolution: {integrity: sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==} - dev: false + node-fetch-native@1.2.0: {} - /node-fetch@2.6.9: - resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.6.9(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 - dev: false + optionalDependencies: + encoding: 0.1.13 - /node-fetch@3.3.1: - resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-fetch@3.3.1: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - dev: false - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: false + node-forge@1.3.1: {} - /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} - hasBin: true - dev: false + node-gyp-build@4.6.0: {} - /node-gyp@9.3.1: - resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true + node-gyp@9.3.1: dependencies: env-paths: 2.2.1 glob: 7.2.3 @@ -7665,110 +10455,68 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: false - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - dev: false + node-releases@2.0.10: {} - /non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - dev: false + node-releases@2.0.14: {} - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + non-layered-tidy-tree-layout@2.0.2: {} + + nopt@5.0.0: dependencies: abbrev: 1.1.1 - dev: false - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true + nopt@6.0.0: dependencies: abbrev: 1.1.1 - dev: false - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.1 semver: 5.7.1 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.11.0 semver: 7.5.4 validate-npm-package-license: 3.0.4 - dev: false - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: false + normalize-range@0.1.2: {} - /npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-bundled@3.0.0: dependencies: npm-normalize-package-bin: 3.0.1 - dev: false - /npm-install-checks@6.1.1: - resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-install-checks@6.1.1: dependencies: semver: 7.5.4 - dev: false - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: false + npm-normalize-package-bin@3.0.1: {} - /npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-package-arg@10.1.0: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 semver: 7.5.4 validate-npm-package-name: 5.0.0 - dev: false - /npm-packlist@7.0.4: - resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-packlist@7.0.4: dependencies: ignore-walk: 6.0.3 - dev: false - /npm-pick-manifest@8.0.1: - resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-pick-manifest@8.0.1: dependencies: npm-install-checks: 6.1.1 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 semver: 7.5.4 - dev: false - /npm-registry-fetch@14.0.5: - resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-registry-fetch@14.0.5: dependencies: make-fetch-happen: 11.1.1 minipass: 5.0.0 @@ -7779,68 +10527,50 @@ packages: proc-log: 3.0.0 transitivePeerDependencies: - supports-color - dev: false - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.1.0: dependencies: path-key: 4.0.0 - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 - dev: false - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 - dev: false - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - /nuxi@3.6.5: - resolution: {integrity: sha512-4XEXYz71UiWWiKC1/cJCzqRSUEImYRmjcvKpSsBKMU58ALYVSx5KIoas5SwLO8tEKO5BS4DAe4u7MYix7hfuHQ==} - engines: {node: ^14.18.0 || >=16.10.0} - hasBin: true + nuxi@3.6.5: optionalDependencies: fsevents: 2.3.2 - dev: false - /nuxt-component-meta@0.5.1(rollup@3.25.1): - resolution: {integrity: sha512-vwx5wySyVX+QbFrNb3wLYNMPlADho8E66MO45d5i5fTlEkmhopVpQ9YXwlAvM3pLCPjupxG3R3D5rKpLDeitkw==} + nuxt-component-meta@0.5.1(rollup@3.28.0): dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) + '@nuxt/kit': 3.6.1(rollup@3.28.0) scule: 1.0.0 typescript: 5.0.4 vue-component-meta: 1.2.0(typescript@5.0.4) transitivePeerDependencies: - rollup - supports-color - dev: false - /nuxt-config-schema@0.4.6(rollup@3.25.1): - resolution: {integrity: sha512-kHLWJFynj5QrxVZ1MjY2xmDaTSN1BCMLGExA+hMMLoCb3wn9TJlDVqnE/nSdUJPMRkNn/NQ5WP9NLA9vlAXRUw==} + nuxt-config-schema@0.4.6(rollup@3.28.0): dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) + '@nuxt/kit': 3.6.1(rollup@3.28.0) defu: 6.1.2 jiti: 1.18.2 pathe: 1.1.1 @@ -7848,24 +10578,20 @@ packages: transitivePeerDependencies: - rollup - supports-color - dev: false - /nuxt-icon@0.3.3(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-KdhJAigBGTP8/YIFZ3orwetk40AgLq6VQ5HRYuDLmv5hiDptor9Ro+WIdZggHw7nciRxZvDdQkEwi9B5G/jrkQ==} + nuxt-icon@0.3.3(rollup@3.28.0)(vue@3.3.4): dependencies: '@iconify/vue': 4.1.0(vue@3.3.4) - '@nuxt/kit': 3.6.1(rollup@3.25.1) - nuxt-config-schema: 0.4.6(rollup@3.25.1) + '@nuxt/kit': 3.6.1(rollup@3.28.0) + nuxt-config-schema: 0.4.6(rollup@3.28.0) transitivePeerDependencies: - rollup - supports-color - vue - dev: false - /nuxt-link-checker@1.0.4(rollup@3.25.1): - resolution: {integrity: sha512-I9QkOsHjDX2RkanPlAZOb6+vIwn4Jxh/aRFHeUJJhX4XGWCPfcXu+fjVgeqK9lKLz4+G8bewzVxukWFf1mOKyA==} + nuxt-link-checker@1.0.4(rollup@3.28.0): dependencies: - '@nuxt/kit': 3.4.1(rollup@3.25.1) + '@nuxt/kit': 3.4.1(rollup@3.28.0) chalk: 5.2.0 cheerio: 1.0.0-rc.12 radix3: 1.0.1 @@ -7873,12 +10599,10 @@ packages: transitivePeerDependencies: - rollup - supports-color - dev: false - /nuxt-og-image@1.5.9(rollup@3.25.1): - resolution: {integrity: sha512-N5VNIn+4jWXFRV7BoZefPljz2qDVTCVz1+CPv63sXWZSZ0rVx8ojjG9An7aM0jewZa29l40EM6VYBRwVoUzRug==} + nuxt-og-image@1.5.9(rollup@3.28.0): dependencies: - '@nuxt/kit': 3.4.2(rollup@3.25.1) + '@nuxt/kit': 3.4.2(rollup@3.28.0) '@types/fs-extra': 11.0.1 birpc: 0.2.12 chalk: 5.2.0 @@ -7908,31 +10632,27 @@ packages: - rollup - supports-color - utf-8-validate - dev: false - /nuxt-schema-org@2.2.0(@unhead/vue@1.1.28)(rollup@3.25.1): - resolution: {integrity: sha512-V0LHh4A3tZSRLGv9P+SG8zm9N4e1qZt2x6z7FgL9qYjpNDyCJ5G186vmTqT4kN0JErjRiYVxantBjDQa7DcVKQ==} + nuxt-schema-org@2.2.0(@unhead/vue@1.2.2(vue@3.3.4))(rollup@3.28.0): dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) - '@unhead/schema-org-vue': 0.6.0(@unhead/vue@1.1.28) + '@nuxt/kit': 3.6.1(rollup@3.28.0) + '@unhead/schema-org-vue': 0.6.0(@unhead/vue@1.2.2(vue@3.3.4)) pathe: 1.1.1 transitivePeerDependencies: - '@unhead/vue' - rollup - supports-color - dev: false - /nuxt-seo-kit@1.3.9(@unhead/vue@1.1.28)(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-j5GakxvUH0ofMPGt833CqG6RDKCvg6d3k87j4kaWouDQlbOdpoLA4BFFc3PiV5sHd1pY+b3csbUuH4hmzVXwXQ==} + nuxt-seo-kit@1.3.9(@unhead/vue@1.2.2(vue@3.3.4))(rollup@3.28.0)(vue@3.3.4): dependencies: - '@nuxt/kit': 3.6.1(rollup@3.25.1) + '@nuxt/kit': 3.6.1(rollup@3.28.0) defu: 6.1.2 - nuxt-link-checker: 1.0.4(rollup@3.25.1) - nuxt-og-image: 1.5.9(rollup@3.25.1) - nuxt-schema-org: 2.2.0(@unhead/vue@1.1.28)(rollup@3.25.1) - nuxt-simple-robots: 1.0.9(rollup@3.25.1) - nuxt-simple-sitemap: 1.0.11(rollup@3.25.1) - nuxt-unhead: 1.4.17(rollup@3.25.1)(vue@3.3.4) + nuxt-link-checker: 1.0.4(rollup@3.28.0) + nuxt-og-image: 1.5.9(rollup@3.28.0) + nuxt-schema-org: 2.2.0(@unhead/vue@1.2.2(vue@3.3.4))(rollup@3.28.0) + nuxt-simple-robots: 1.0.9(rollup@3.28.0) + nuxt-simple-sitemap: 1.0.11(rollup@3.28.0) + nuxt-unhead: 1.4.17(rollup@3.28.0)(vue@3.3.4) ufo: 1.1.2 transitivePeerDependencies: - '@unhead/vue' @@ -7941,23 +10661,19 @@ packages: - supports-color - utf-8-validate - vue - dev: false - /nuxt-simple-robots@1.0.9(rollup@3.25.1): - resolution: {integrity: sha512-KR4zbVnHG2lKV97LOZeLIb8KR90VNfzRX9wj1qXZSbt3wzTgS6YM10QMoXWXjDN5YAVlq99QwJ6OERgq1Fwj7g==} + nuxt-simple-robots@1.0.9(rollup@3.28.0): dependencies: - '@nuxt/kit': 3.4.2(rollup@3.25.1) + '@nuxt/kit': 3.4.2(rollup@3.28.0) pathe: 1.1.1 ufo: 1.1.2 transitivePeerDependencies: - rollup - supports-color - dev: false - /nuxt-simple-sitemap@1.0.11(rollup@3.25.1): - resolution: {integrity: sha512-FW4kxAKW0FHA3+y2yT790bz4yupHV5qPkf1aaY0Xi3Ct4jKQE4BwX9oKlqz8F4qq3WURETkV7ttzxWmXlNcDsg==} + nuxt-simple-sitemap@1.0.11(rollup@3.28.0): dependencies: - '@nuxt/kit': 3.4.2(rollup@3.25.1) + '@nuxt/kit': 3.4.2(rollup@3.28.0) chalk: 5.2.0 defu: 6.1.2 escape-string-regexp: 5.0.0 @@ -7969,13 +10685,11 @@ packages: transitivePeerDependencies: - rollup - supports-color - dev: false - /nuxt-unhead@1.4.17(rollup@3.25.1)(vue@3.3.4): - resolution: {integrity: sha512-8DpCE5gmUEKT//KOI+gCzTc315poxNHrbIsOMfv80tyxZIe35VlO14q9wScpL6dE1MxwJ87YtI9rxnq4JZOKLw==} + nuxt-unhead@1.4.17(rollup@3.28.0)(vue@3.3.4): dependencies: - '@nuxt/kit': 3.4.2(rollup@3.25.1) - '@unhead/addons': 1.1.26(rollup@3.25.1) + '@nuxt/kit': 3.4.2(rollup@3.28.0) + '@unhead/addons': 1.1.26(rollup@3.28.0) '@vueuse/head': 1.1.26(vue@3.3.4) fast-glob: 3.2.12 pathe: 1.1.1 @@ -7984,25 +10698,15 @@ packages: - rollup - supports-color - vue - dev: false - /nuxt@3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4): - resolution: {integrity: sha512-0A7V8B1HrIXX9IlqPc2w+5ZPXi+7MYa9QVhtuGYuLvjRKoSFANhCoMPRP6pKdoxigM1MBxhLue2VmHA/VbtJCw==} - engines: {node: ^14.18.0 || >=16.10.0} - hasBin: true - peerDependencies: - '@parcel/watcher': ^2.1.0 - '@types/node': ^14.18.0 || >=16.10.0 - peerDependenciesMeta: - '@parcel/watcher': - optional: true + nuxt@3.6.5(@types/node@18.15.3)(encoding@0.1.13)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4): dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/kit': 3.6.5(rollup@3.25.1) - '@nuxt/schema': 3.6.5(rollup@3.25.1) - '@nuxt/telemetry': 2.4.1(rollup@3.25.1) + '@nuxt/kit': 3.6.5(rollup@3.28.0) + '@nuxt/schema': 3.6.5(rollup@3.28.0) + '@nuxt/telemetry': 2.4.1(rollup@3.28.0) '@nuxt/ui-templates': 1.2.0 - '@nuxt/vite-builder': 3.6.5(@types/node@18.15.3)(eslint@8.47.0)(rollup@3.25.1)(typescript@5.0.4)(vue@3.3.4) + '@nuxt/vite-builder': 3.6.5(@types/node@18.15.3)(eslint@9.0.0)(optionator@0.9.3)(rollup@3.28.0)(terser@5.17.7)(typescript@5.0.4)(vue@3.3.4) '@types/node': 18.15.3 '@unhead/ssr': 1.2.2 '@unhead/vue': 1.2.2(vue@3.3.4) @@ -8027,7 +10731,7 @@ packages: local-pkg: 0.4.3 magic-string: 0.30.2 mlly: 1.4.0 - nitropack: 2.5.2 + nitropack: 2.5.2(encoding@0.1.13) nuxi: 3.6.5 nypm: 0.2.2 ofetch: 1.1.1 @@ -8042,9 +10746,9 @@ packages: uncrypto: 0.1.3 unctx: 2.3.1 unenv: 1.5.1 - unimport: 3.1.3(rollup@3.25.1) + unimport: 3.1.3(rollup@3.28.0) unplugin: 1.4.0 - unplugin-vue-router: 0.6.4(rollup@3.25.1)(vue-router@4.2.4)(vue@3.3.4) + unplugin-vue-router: 0.6.4(rollup@3.28.0)(vue-router@4.2.4(vue@3.3.4))(vue@3.3.4) untyped: 1.3.2 vue: 3.3.4 vue-bundle-renderer: 1.0.3 @@ -8077,112 +10781,58 @@ packages: - vls - vti - vue-tsc - dev: false - /nypm@0.2.2: - resolution: {integrity: sha512-O7bumfWgUXlJefT1Y41SF4vsCvzeUYmnKABuOKStheCObzrkWPDmqJc+RJVU+57oFu9bITcrUq8sKFIHgjCnTg==} - engines: {node: ^14.16.0 || >=16.10.0} + nypm@0.2.2: dependencies: execa: 7.1.1 - dev: false - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - dev: false - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + object-assign@4.1.1: {} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + object-is@1.1.5: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true + object-keys@1.1.1: {} - /ofetch@1.1.1: - resolution: {integrity: sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ==} + ofetch@1.1.1: dependencies: destr: 2.0.0 node-fetch-native: 1.2.0 ufo: 1.1.2 - dev: false - /ohash@1.1.2: - resolution: {integrity: sha512-9CIOSq5945rI045GFtcO3uudyOkYVY1nyfFxVQp+9BRgslr8jPNiSSrsFGg/BNTUFOLqx0P5tng6G32brIPw0w==} - dev: false + ohash@1.1.2: {} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - dev: false - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: false - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} + open@9.1.0: dependencies: default-browser: 4.0.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 - /openapi-typescript@6.2.8: - resolution: {integrity: sha512-yA+y5MHiu6cjmtsGfNLavzVuvGCKzjL3H+exgHDPK6bnp6ZVFibtAiafenNSRDWL0x+7Sw/VPv5SbaqiPLW46w==} - hasBin: true + openapi-typescript@6.2.8: dependencies: ansi-colors: 4.1.3 fast-glob: 3.2.12 @@ -8190,11 +10840,8 @@ packages: supports-color: 9.3.1 undici: 5.22.1 yargs-parser: 21.1.1 - dev: false - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -8203,48 +10850,37 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-limit@4.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - dev: false - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /pacote@15.2.0: - resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + pacote@15.2.0: dependencies: '@npmcli/git': 4.0.4 '@npmcli/installed-package-contents': 2.0.2 @@ -8267,36 +10903,25 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: false - /pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: false + pako@0.2.9: {} - /paneer@0.1.0: - resolution: {integrity: sha512-SZfJe/y9fbpeXZU+Kf7cSG2G7rnGP50hUYzCvcWyhp7hYzA3YXGthpkGfv6NSt0oo6QbcRyKwycg/6dpG5p8aw==} - deprecated: Please migrate to https://github.com/unjs/magicast + paneer@0.1.0: dependencies: '@babel/parser': 7.22.5 '@types/estree': 1.0.0 recast: 0.22.0 - dev: false - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + param-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.5.0 - dev: false - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.1: dependencies: '@types/unist': 2.0.6 character-entities: 2.0.2 @@ -8306,135 +10931,90 @@ packages: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - dev: false - /parse-git-config@3.0.0: - resolution: {integrity: sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==} - engines: {node: '>=8'} + parse-git-config@3.0.0: dependencies: git-config-path: 2.0.0 ini: 1.3.8 - dev: false - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-gitignore@2.0.0: {} + + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.18.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + parse-path@7.0.0: dependencies: protocols: 2.0.1 - dev: false - /parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + parse-url@8.1.0: dependencies: parse-path: 7.0.0 - dev: false - /parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + parse5-htmlparser2-tree-adapter@7.0.0: dependencies: domhandler: 5.0.3 parse5: 7.1.2 - dev: false - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false + parse5@6.0.1: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.4.0 - dev: false - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: false + parseurl@1.3.3: {} - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + pascal-case@3.1.2: dependencies: no-case: 3.0.4 tslib: 2.5.0 - dev: false - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + path-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.5.0 - dev: false - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-exists@5.0.0: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-is-absolute@1.0.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + path-key@3.1.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-key@4.0.0: {} - /path-scurry@1.7.0: - resolution: {integrity: sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==} - engines: {node: '>=16 || 14 >=14.17'} + path-parse@1.0.7: {} + + path-scurry@1.7.0: dependencies: lru-cache: 9.1.1 minipass: 5.0.0 - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@4.0.0: {} - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: false + pathe@1.1.1: {} - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: false + pathe@1.1.2: {} - /perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - dev: false + pend@1.2.0: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + perfect-debounce@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picocolors@1.0.0: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false + picomatch@2.3.1: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: false + picomatch@4.0.2: {} - /pinceau@0.18.8(postcss@8.4.24): - resolution: {integrity: sha512-aVIRYxz80nweDjabJzauKtsSVS48JdWWVwWnHxG/e1HI9/aV0/RmdTD3P/8KXfYZ9OySl3MjCgUc7MZb+IwwEw==} + pify@2.3.0: {} + + pify@3.0.0: {} + + pinceau@0.18.8(postcss@8.4.24): dependencies: '@unocss/reset': 0.50.5 '@volar/vue-language-core': 1.3.2 @@ -8460,549 +11040,304 @@ packages: - postcss - sass - supports-color - dev: false - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 - dev: false - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: false + pinkie@2.0.4: {} - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + pkg-types@1.0.3: dependencies: jsonc-parser: 3.2.0 mlly: 1.4.0 pathe: 1.1.1 - dev: false - /playwright-core@1.31.2: - resolution: {integrity: sha512-a1dFgCNQw4vCsG7bnojZjDnPewZcw7tZUNFN0ZkcLYKj+mPmXvg4MpaaKZ5SgqPsOmqIf2YsVRkgqiRDxD+fDQ==} - engines: {node: '>=14'} - hasBin: true - dev: false + playwright-core@1.31.2: {} - /playwright-core@1.37.0: - resolution: {integrity: sha512-1c46jhTH/myQw6sesrcuHVtLoSNfJv8Pfy9t3rs6subY7kARv0HRw5PpyfPYPpPtQvBOmgbE6K+qgYUpj81LAA==} - engines: {node: '>=16'} - hasBin: true - dev: false + playwright-core@1.37.0: {} - /playwright@1.37.0: - resolution: {integrity: sha512-CrAEFfVioamMwDKmygc/HAkzEAxYAwjD+zod2poTxM7ObivkoDsKHu1ned16fnQV/Tf1kDB8KtsyH8Qd3VzJIg==} - engines: {node: '>=16'} - hasBin: true - requiresBuild: true + playwright@1.37.0: dependencies: playwright-core: 1.37.0 - dev: false - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true + pluralize@8.0.0: {} - /postcss-calc@9.0.1(postcss@8.4.24): - resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.2 + postcss-calc@9.0.1(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 - dev: false - /postcss-colormin@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-colormin@6.0.0(postcss@8.4.24): dependencies: browserslist: 4.21.5 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-convert-values@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-convert-values@6.0.0(postcss@8.4.24): dependencies: browserslist: 4.21.5 postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-custom-properties@13.1.4(postcss@8.4.24): - resolution: {integrity: sha512-iSAdaZrM3KMec8cOSzeTUNXPYDlhqsMJHpt62yrjwG6nAnMtRHPk5JdMzGosBJtqEahDolvD5LNbcq+EZ78o5g==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 + postcss-custom-properties@13.1.4(postcss@8.4.24): dependencies: - '@csstools/cascade-layer-name-parser': 1.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0) + '@csstools/cascade-layer-name-parser': 1.0.1(@csstools/css-parser-algorithms@2.0.1(@csstools/css-tokenizer@2.1.0))(@csstools/css-tokenizer@2.1.0) '@csstools/css-parser-algorithms': 2.0.1(@csstools/css-tokenizer@2.1.0) '@csstools/css-tokenizer': 2.1.0 postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-dark-theme-class@0.7.3(postcss@8.4.24): - resolution: {integrity: sha512-M9vtfh8ORzQsVdT9BWb+xpEDAzC7nHBn7wVc988/JkEVLPupKcUnV0jw7RZ8sSj0ovpqN1POf6PLdt19JCHfhQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + postcss-dark-theme-class@0.7.3(postcss@8.4.24): dependencies: postcss: 8.4.24 - dev: false - /postcss-discard-comments@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-comments@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - dev: false - /postcss-discard-duplicates@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-duplicates@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - dev: false - /postcss-discard-empty@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-empty@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - dev: false - /postcss-discard-overridden@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-overridden@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - dev: false - /postcss-import-resolver@2.0.0: - resolution: {integrity: sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==} + postcss-import-resolver@2.0.0: dependencies: enhanced-resolve: 4.5.0 - dev: false - /postcss-import@15.1.0(postcss@8.4.24): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 + postcss-import@15.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 - dev: false - /postcss-merge-longhand@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-merge-longhand@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 stylehacks: 6.0.0(postcss@8.4.24) - dev: false - /postcss-merge-rules@6.0.1(postcss@8.4.24): - resolution: {integrity: sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-merge-rules@6.0.1(postcss@8.4.24): dependencies: browserslist: 4.21.5 caniuse-api: 3.0.0 cssnano-utils: 4.0.0(postcss@8.4.24) postcss: 8.4.24 postcss-selector-parser: 6.0.11 - dev: false - /postcss-minify-font-values@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-font-values@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-minify-gradients@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-gradients@6.0.0(postcss@8.4.24): dependencies: colord: 2.9.3 cssnano-utils: 4.0.0(postcss@8.4.24) postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-minify-params@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-params@6.0.0(postcss@8.4.24): dependencies: browserslist: 4.21.5 cssnano-utils: 4.0.0(postcss@8.4.24) postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-minify-selectors@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-selectors@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.11 - dev: false - /postcss-nested@6.0.1(postcss@8.4.24): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + postcss-nested@6.0.1(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.11 - dev: false - /postcss-normalize-charset@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-charset@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - dev: false - /postcss-normalize-display-values@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-display-values@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-positions@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-positions@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-repeat-style@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-repeat-style@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-string@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-string@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-timing-functions@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-timing-functions@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-unicode@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-unicode@6.0.0(postcss@8.4.24): dependencies: browserslist: 4.21.5 postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-url@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-url@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-normalize-whitespace@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-whitespace@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-ordered-values@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-ordered-values@6.0.0(postcss@8.4.24): dependencies: cssnano-utils: 4.0.0(postcss@8.4.24) postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-reduce-initial@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-reduce-initial@6.0.0(postcss@8.4.24): dependencies: browserslist: 4.21.5 caniuse-api: 3.0.0 postcss: 8.4.24 - dev: false - /postcss-reduce-transforms@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-reduce-transforms@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-selector-parser@6.0.11: - resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} - engines: {node: '>=4'} + postcss-selector-parser@6.0.11: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-svgo@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==} - engines: {node: ^14 || ^16 || >= 18} - peerDependencies: - postcss: ^8.2.15 + postcss-selector-parser@6.0.16: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 svgo: 3.0.2 - dev: false - /postcss-unique-selectors@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + postcss-unique-selectors@6.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.11 - dev: false - /postcss-url@10.1.3(postcss@8.4.24): - resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} - engines: {node: '>=10'} - peerDependencies: - postcss: ^8.0.0 + postcss-url@10.1.3(postcss@8.4.24): dependencies: make-dir: 3.1.0 mime: 2.5.2 minimatch: 3.0.8 postcss: 8.4.24 xxhashjs: 0.2.2 - dev: false - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false + postcss-value-parser@4.2.0: {} - /postcss@8.4.24: - resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.24: dependencies: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: false - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + prelude-ls@1.2.1: {} - /pretty-bytes@6.1.0: - resolution: {integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==} - engines: {node: ^14.13.1 || >=16.0.0} - dev: false + pretty-bytes@6.1.0: {} - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: false + proc-log@3.0.0: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false + process-nextick-args@2.0.1: {} - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: false + promise-inflight@1.0.1: {} - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 - dev: false - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: false - /property-information@6.2.0: - resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} - dev: false + property-information@6.2.0: {} - /protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - dev: false + protocols@2.0.1: {} - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: false + prr@1.0.1: {} - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} + punycode@2.3.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-microtask@1.2.3: {} - /radix3@1.0.1: - resolution: {integrity: sha512-y+AcwZ3HcUIGc9zGsNVf5+BY/LxL+z+4h4J3/pp8jxSmy1STaCocPS3qrj4tA5ehUSzqtqK+0Aygvz/r/8vy4g==} - dev: false + radix3@1.0.1: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: false - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: false + range-parser@1.2.1: {} - /rc9@2.1.1: - resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} + rc9@2.1.1: dependencies: defu: 6.1.2 destr: 2.0.0 flat: 5.0.2 - dev: false - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-cache@1.0.0: dependencies: pify: 2.3.0 - dev: false - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.0 npm-normalize-package-bin: 3.0.1 - dev: false - /read-package-json@6.0.3: - resolution: {integrity: sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json@6.0.3: dependencies: glob: 10.2.7 json-parse-even-better-errors: 3.0.0 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 - dev: false - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.1 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -9011,85 +11346,50 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: false - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: false - /readdir-glob@1.1.2: - resolution: {integrity: sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==} + readdir-glob@1.1.2: dependencies: minimatch: 5.1.6 - dev: false - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: false - /recast@0.22.0: - resolution: {integrity: sha512-5AAx+mujtXijsEavc5lWXBPQqrM4+Dl5qNH96N2aNeuJFUzpiiToKPsxQD/zAIJHspz7zz0maX0PCtCTFVlixQ==} - engines: {node: '>= 4'} + recast@0.22.0: dependencies: assert: 2.0.0 ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 tslib: 2.5.0 - dev: false - /recast@0.23.4: - resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} - engines: {node: '>= 4'} + recast@0.23.4: dependencies: assert: 2.0.0 ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 tslib: 2.5.0 - dev: false - - /redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - dev: false - - /redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} - dependencies: - redis-errors: 1.2.0 - dev: false - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true + redis-errors@1.2.0: {} - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} + redis-parser@3.0.0: dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - dev: true + redis-errors: 1.2.0 - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true + regexp-tree@0.1.27: {} - /rehype-external-links@2.1.0: - resolution: {integrity: sha512-2YMJZVM1hxZnwl9IPkbN5Pjn78kXkAX7lq9VEtlaGA29qIls25vZN+ucNIJdbQUe+9NNFck17BiOhGmsD6oLIg==} + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + + rehype-external-links@2.1.0: dependencies: '@types/hast': 2.3.4 extend: 3.0.2 @@ -9098,18 +11398,14 @@ packages: space-separated-tokens: 2.0.2 unified: 10.1.2 unist-util-visit: 4.1.2 - dev: false - /rehype-raw@6.1.1: - resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + rehype-raw@6.1.1: dependencies: '@types/hast': 2.3.4 hast-util-raw: 7.2.3 unified: 10.1.2 - dev: false - /rehype-slug@5.1.0: - resolution: {integrity: sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==} + rehype-slug@5.1.0: dependencies: '@types/hast': 2.3.4 github-slugger: 2.0.0 @@ -9118,36 +11414,27 @@ packages: hast-util-to-string: 2.0.0 unified: 10.1.2 unist-util-visit: 4.1.2 - dev: false - /rehype-sort-attribute-values@4.0.0: - resolution: {integrity: sha512-+Y3OWTbbxSIutbXMVY7+aWFmcRyEvdz6HkghXAyVPjee1Y8HUi+/vryBL1UdEI9VknVBiGvphXAf5n6MDNOXOA==} + rehype-sort-attribute-values@4.0.0: dependencies: '@types/hast': 2.3.4 hast-util-is-element: 2.1.3 unified: 10.1.2 unist-util-visit: 4.1.2 - dev: false - /rehype-sort-attributes@4.0.0: - resolution: {integrity: sha512-sCT58e12F+fJL8ZmvpEP2vAK7cpYffUAf0cMQjNfLIewWjMHMGo0Io+H8eztJoI1S9dvEm2XZT5zzchqe8gYJw==} + rehype-sort-attributes@4.0.0: dependencies: '@types/hast': 2.3.4 unified: 10.1.2 unist-util-visit: 4.1.2 - dev: false - /remark-emoji@3.1.2: - resolution: {integrity: sha512-QwhAzNk27Ol64uV4z/3n55MKrNz9bhr8wg+mO5aGqIYDS+jUarS1d8Y0ZIeEBVhfGkXj6gGYM+727sOgAPvV/A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + remark-emoji@3.1.2: dependencies: emoticon: 4.0.1 mdast-util-find-and-replace: 2.2.2 node-emoji: 1.11.0 - dev: false - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + remark-gfm@3.0.1: dependencies: '@types/mdast': 3.0.10 mdast-util-gfm: 2.0.2 @@ -9155,10 +11442,8 @@ packages: unified: 10.1.2 transitivePeerDependencies: - supports-color - dev: false - /remark-mdc@1.1.3: - resolution: {integrity: sha512-ilYSkkQJhu5cUCEE2CJEncoMDoarP32ugfJpFWghXbnv3sWI3j2HtJuArc9tZzxN4ID6fngio3d8N87QfQAnRQ==} + remark-mdc@1.1.3: dependencies: flat: 5.0.2 js-yaml: 4.1.0 @@ -9176,217 +11461,121 @@ packages: unist-util-visit-parents: 5.1.3 transitivePeerDependencies: - supports-color - dev: false - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + remark-parse@10.0.2: dependencies: '@types/mdast': 3.0.10 mdast-util-from-markdown: 1.3.0 unified: 10.1.2 transitivePeerDependencies: - supports-color - dev: false - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + remark-rehype@10.1.0: dependencies: '@types/hast': 2.3.4 '@types/mdast': 3.0.10 mdast-util-to-hast: 12.3.0 unified: 10.1.2 - dev: false - /remark-squeeze-paragraphs@5.0.1: - resolution: {integrity: sha512-VWPAoa1bAAtU/aQfSLRZ7vOrwH9I02RhZTSo+e0LT3fVO9RKNCq/bwobIEBhxvNCt00JoQ7GwR3sYGhmD2/y6Q==} + remark-squeeze-paragraphs@5.0.1: dependencies: '@types/mdast': 3.0.10 mdast-squeeze-paragraphs: 5.2.1 unified: 10.1.2 - dev: false - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false + require-directory@2.1.1: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false + requires-port@1.0.0: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: false + resolve-from@5.0.0: {} - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.1: dependencies: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: false + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + retry@0.12.0: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + reusify@1.0.4: {} + + rimraf@3.0.2: dependencies: glob: 7.2.3 - /robust-predicates@3.0.1: - resolution: {integrity: sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==} - dev: false + robust-predicates@3.0.1: {} - /rollup-plugin-dts@5.2.0(rollup@3.25.1)(typescript@4.9.5): - resolution: {integrity: sha512-B68T/haEu2MKcz4kNUhXB8/h5sq4gpplHAJIYNHbh8cp4ZkvzDvNca/11KQdFrB9ZeKucegQIotzo5T0JUtM8w==} - engines: {node: '>=v14'} - peerDependencies: - rollup: ^3.0.0 - typescript: ^4.1 + rollup-plugin-dts@5.2.0(rollup@3.25.1)(typescript@4.9.5): dependencies: magic-string: 0.29.0 rollup: 3.25.1 typescript: 4.9.5 optionalDependencies: '@babel/code-frame': 7.18.6 - dev: false - /rollup-plugin-visualizer@5.9.2(rollup@3.25.1): - resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - rollup: 2.x || 3.x - peerDependenciesMeta: - rollup: - optional: true + rollup-plugin-visualizer@5.9.2(rollup@3.28.0): dependencies: open: 8.4.2 picomatch: 2.3.1 - rollup: 3.25.1 source-map: 0.7.4 yargs: 17.7.1 - dev: false - - /rollup-plugin-visualizer@5.9.2(rollup@3.28.0): - resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - rollup: 2.x || 3.x - peerDependenciesMeta: - rollup: - optional: true - dependencies: - open: 8.4.2 - picomatch: 2.3.1 + optionalDependencies: rollup: 3.28.0 - source-map: 0.7.4 - yargs: 17.7.1 - dev: false - /rollup@3.25.1: - resolution: {integrity: sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + rollup@3.25.1: optionalDependencies: fsevents: 2.3.2 - dev: false - /rollup@3.28.0: - resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + rollup@3.28.0: optionalDependencies: fsevents: 2.3.2 - dev: false - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} + run-applescript@5.0.0: dependencies: execa: 5.1.1 - /run-con@1.2.11: - resolution: {integrity: sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==} - hasBin: true + run-con@1.2.11: dependencies: deep-extend: 0.6.0 ini: 3.0.1 minimist: 1.2.8 strip-json-comments: 3.1.1 - dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false + rw@1.3.3: {} - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.5.0 - dev: false - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + sade@1.8.1: dependencies: mri: 1.2.0 - dev: false - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-regex: 1.1.4 - dev: true + safe-buffer@5.1.2: {} - /safe-regex@2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} - dependencies: - regexp-tree: 0.1.27 - dev: true + safe-buffer@5.2.1: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false + safer-buffer@2.1.2: {} - /satori-html@0.3.2: - resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==} + satori-html@0.3.2: dependencies: ultrahtml: 1.2.0 - dev: false - /satori@0.4.3: - resolution: {integrity: sha512-gGiXXD52Rk0vkknf0ntf7Bmn0BzoMp9bU/wVdQiUFTf1vRLpxixlsMlT4hP6oqF+Z7sb98+dNtLGJ3ZVVPDyrg==} - engines: {node: '>=16'} + satori@0.4.3: dependencies: '@shuding/opentype.js': 1.4.0-beta.0 css-background-parser: 0.1.0 @@ -9396,57 +11585,32 @@ packages: linebreak: 1.1.0 postcss-value-parser: 4.2.0 yoga-wasm-web: 0.3.3 - dev: false - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: false + sax@1.2.4: {} - /scule@1.0.0: - resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} - dev: false + scule@1.0.0: {} - /seek-bzip@1.0.6: - resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} - hasBin: true + seek-bzip@1.0.6: dependencies: commander: 2.20.3 - dev: false - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true + semver@5.7.1: {} - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true + semver@6.3.0: {} - /semver@7.5.0: - resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.3: dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -9463,31 +11627,22 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: false - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + sentence-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.5.0 upper-case-first: 2.0.2 - dev: false - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + serialize-javascript@6.0.1: dependencies: randombytes: 2.1.0 - dev: false - /serve-placeholder@2.0.1: - resolution: {integrity: sha512-rUzLlXk4uPFnbEaIz3SW8VISTxMuONas88nYWjAWaM2W9VDbt9tyFOr3lq8RhVOFrT3XISoBw8vni5una8qMnQ==} + serve-placeholder@2.0.1: dependencies: defu: 6.1.2 - dev: false - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -9495,118 +11650,64 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: false - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false + set-blocking@2.0.0: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: false + setprototypeof@1.2.0: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /shell-quote@1.8.0: - resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} - dev: false + shebang-regex@3.0.0: {} - /shiki-es@0.14.0: - resolution: {integrity: sha512-e+/aueHx0YeIEut6RXC6K8gSf0PykwZiHD7q7AHtpTW8Kd8TpFUIWqTwhAnrGjOyOMyrwv+syr5WPagMpDpVYQ==} - dev: false + shell-quote@1.8.0: {} - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 - dev: true + shiki-es@0.14.0: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.0.1: - resolution: {integrity: sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==} - engines: {node: '>=14'} + signal-exit@4.0.1: {} - /sigstore@1.4.0: - resolution: {integrity: sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + sigstore@1.4.0: dependencies: '@sigstore/protobuf-specs': 0.1.0 make-fetch-happen: 11.1.1 tuf-js: 1.1.5 transitivePeerDependencies: - supports-color - dev: false - /sirv@2.0.3: - resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} - engines: {node: '>= 10'} + sirv@2.0.3: dependencies: '@polka/url': 1.0.0-next.21 mrmime: 1.0.1 totalist: 3.0.0 - dev: false - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: false + sisteransi@1.0.5: {} - /sitemap@7.1.1: - resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} - hasBin: true + sitemap@7.1.1: dependencies: '@types/node': 17.0.45 '@types/sax': 1.2.4 arg: 5.0.2 sax: 1.2.4 - dev: false - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} + slash@4.0.0: {} - /slugify@1.6.6: - resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} - engines: {node: '>=8.0.0'} - dev: false + slugify@1.6.6: {} - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: false + smart-buffer@4.2.0: {} - /smob@1.4.0: - resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} - dev: false + smob@1.4.0: {} - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.5.0 - dev: false - /socket.io-client@4.6.1: - resolution: {integrity: sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==} - engines: {node: '>=10.0.0'} + socket.io-client@4.6.1: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 @@ -9616,11 +11717,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /socket.io-client@4.7.2: - resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} - engines: {node: '>=10.0.0'} + socket.io-client@4.7.2: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 @@ -9630,245 +11728,140 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /socket.io-parser@4.2.2: - resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} - engines: {node: '>=10.0.0'} + socket.io-parser@4.2.2: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} + socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} + socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 debug: 4.3.4 socks: 2.7.1 transitivePeerDependencies: - supports-color - dev: false - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + socks@2.7.1: dependencies: ip: 2.0.0 smart-buffer: 4.2.0 - dev: false - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: false + source-map-js@1.0.2: {} - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: false - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.6.1: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false + source-map@0.7.4: {} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false + space-separated-tokens@2.0.2: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 - /ssri@10.0.4: - resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + spdx-license-ids@3.0.13: {} + + ssri@10.0.4: dependencies: minipass: 5.0.0 - dev: false - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ssri@9.0.1: dependencies: minipass: 3.3.6 - dev: false - /standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - dev: false + standard-as-callback@2.1.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: false + statuses@2.0.1: {} - /std-env@3.3.3: - resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} - dev: false + std-env@3.3.3: {} - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false + streamsearch@1.1.0: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.0.1 - /string.prototype.codepointat@0.2.1: - resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - dev: false - - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true + string.prototype.codepointat@0.2.1: {} - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - dev: false - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: false - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + stringify-entities@4.0.3: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - dev: false - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} + strip-ansi@7.0.1: dependencies: ansi-regex: 6.0.1 - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-dirs@2.1.0: - resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + strip-dirs@2.1.0: dependencies: is-natural-number: 4.0.1 - dev: false - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + strip-final-newline@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@3.1.1: {} - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + strip-literal@1.0.1: dependencies: acorn: 8.10.0 - dev: false - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + strip-literal@1.3.0: dependencies: acorn: 8.10.0 - dev: false - /style-dictionary-esm@1.3.7: - resolution: {integrity: sha512-xO2o8sKGera0SMLCLtix1dPvgD2ZyX2VohZ09cGRRuXBb8HQObqhgDQw4dLW+qJy4gj7r4Mdhz9J1rS2p50xDw==} - engines: {node: '>=12.0.0'} - hasBin: true + style-dictionary-esm@1.3.7: dependencies: chalk: 4.1.2 change-case: 4.1.2 @@ -9880,56 +11873,32 @@ packages: jsonc-parser: 3.2.0 lodash.template: 4.5.0 tinycolor2: 1.6.0 - dev: false - /stylehacks@6.0.0(postcss@8.4.24): - resolution: {integrity: sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.15 + stylehacks@6.0.0(postcss@8.4.24): dependencies: browserslist: 4.21.5 postcss: 8.4.24 postcss-selector-parser: 6.0.11 - dev: false - /stylis@4.1.3: - resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} - dev: false + stylis@4.1.3: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@9.3.1: - resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} - engines: {node: '>=12'} - dev: false + supports-color@9.3.1: {} - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - dev: false + svg-tags@1.0.0: {} - /svg2png-wasm@1.3.4: - resolution: {integrity: sha512-gnegOEiLojoUA8l1ZpyuevruqLTIeiMry6gFcLvXf20cBnaSKLCNl1n+sNrDbBQswsnxIAbI2kU2/P4mwArCgA==} - dev: false + svg2png-wasm@1.3.4: {} - /svgo@3.0.2: - resolution: {integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==} - engines: {node: '>=14.0.0'} - hasBin: true + svgo@3.0.2: dependencies: '@trysound/sax': 0.2.0 commander: 7.2.0 @@ -9937,32 +11906,14 @@ packages: css-tree: 2.3.1 csso: 5.0.5 picocolors: 1.0.0 - dev: false - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/utils': 2.4.0 - tslib: 2.5.0 - dev: true - - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: false - - /tapable@1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} - dev: false + tabbable@6.2.0: {} - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + tapable@1.1.3: {} - /tar-stream@1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} + tapable@2.2.1: {} + + tar-stream@1.6.2: dependencies: bl: 1.2.3 buffer-alloc: 1.2.0 @@ -9971,22 +11922,16 @@ packages: readable-stream: 2.3.8 to-buffer: 1.1.1 xtend: 4.0.2 - dev: false - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-stream@2.2.0: dependencies: bl: 4.1.0 end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false - /tar@6.1.13: - resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} - engines: {node: '>=10'} + tar@6.1.13: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -9994,234 +11939,111 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: false - /terser@5.17.7: - resolution: {integrity: sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==} - engines: {node: '>=10'} - hasBin: true + terser@5.17.7: dependencies: '@jridgewell/source-map': 0.3.3 acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: false - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + text-table@0.2.0: {} - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false + through@2.3.8: {} - /tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - dev: false + tiny-inflate@1.0.3: {} - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: false + tiny-invariant@1.3.1: {} - /tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - dev: false + tinycolor2@1.6.0: {} - /tinyws@0.1.0(ws@8.13.0): - resolution: {integrity: sha512-6WQ2FlFM7qm6lAXxeKnzsAEfmnBHz5W5EwonNs52V0++YfK1IoCCAWM429afcChFE9BFrDgOFnq7ligaWMsa/A==} - engines: {node: '>=12.4'} - peerDependencies: - ws: '>=8' + tinyws@0.1.0(ws@8.13.0): dependencies: ws: 8.13.0 - dev: false - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} + titleize@3.0.0: {} - /to-buffer@1.1.1: - resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} - dev: false + to-buffer@1.1.1: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: false + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: false - - /totalist@3.0.0: - resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} - engines: {node: '>=6'} - dev: false + toidentifier@1.0.1: {} - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false + totalist@3.0.0: {} - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false + tr46@0.0.3: {} - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false + trim-lines@3.0.1: {} - /ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - dev: false + trough@2.1.0: {} - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + ts-api-utils@1.3.0(typescript@5.0.4): dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true + typescript: 5.0.4 - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true + ts-dedent@2.2.0: {} - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + tslib@2.5.0: {} - /tsutils@3.21.0(typescript@5.0.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.0.4 - dev: true + tslib@2.6.2: {} - /tsx@3.12.7: - resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} - hasBin: true + tsx@3.12.7: dependencies: '@esbuild-kit/cjs-loader': 2.4.2 '@esbuild-kit/core-utils': 3.1.0 '@esbuild-kit/esm-loader': 2.5.5 optionalDependencies: fsevents: 2.3.2 - dev: false - /tuf-js@1.1.5: - resolution: {integrity: sha512-inqodgxdsmuxrtQVbu6tPNgRKWD1Boy3VB6GO7KczJZpAHiTukwhSzXUSzvDcw5pE2Jo8ua+e1ykpHv7VdPVlQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + tuf-js@1.1.5: dependencies: '@tufjs/models': 1.0.4 make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color - dev: false - /twemoji-parser@14.0.0: - resolution: {integrity: sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA==} - dev: false + twemoji-parser@14.0.0: {} - /twemoji@14.0.2: - resolution: {integrity: sha512-BzOoXIe1QVdmsUmZ54xbEH+8AgtOKUiG53zO5vVP2iUu6h5u9lN15NcuS6te4OY96qx0H7JK9vjjl9WQbkTRuA==} + twemoji@14.0.2: dependencies: fs-extra: 8.1.0 jsonfile: 5.0.0 twemoji-parser: 14.0.0 universalify: 0.1.2 - dev: false - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: false - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.21.3: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: false + type-fest@0.6.0: {} - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.10 - dev: true + type-fest@0.8.1: {} - /typesafe-path@0.2.2: - resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} - dev: false + type-fest@2.19.0: {} - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: false + typesafe-path@0.2.2: {} - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true + typescript@4.9.5: {} - /uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - dev: true + typescript@5.0.4: {} - /ufo@1.1.2: - resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} - dev: false + uc.micro@1.0.6: {} - /ufo@1.2.0: - resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} - dev: false + ufo@1.1.2: {} - /ultrahtml@1.2.0: - resolution: {integrity: sha512-vxZM2yNvajRmCj/SknRYGNXk2tqiy6kRNvZjJLaleG3zJbSh/aNkOqD1/CVzypw8tyHyhpzYuwQgMMhUB4ZVNQ==} - dev: false + ufo@1.2.0: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true + ultrahtml@1.2.0: {} - /unbuild@1.1.2: - resolution: {integrity: sha512-EK5LeABThyn5KbX0eo5c7xKRQhnHVxKN8/e5Y+YQEf4ZobJB6OZ766756wbVqzIY/G/MvAfLbc6EwFPdSNnlpA==} - hasBin: true + unbuild@1.1.2: dependencies: '@rollup/plugin-alias': 4.0.3(rollup@3.25.1) '@rollup/plugin-commonjs': 24.1.0(rollup@3.25.1) @@ -10229,7 +12051,7 @@ packages: '@rollup/plugin-node-resolve': 15.1.0(rollup@3.25.1) '@rollup/plugin-replace': 5.0.2(rollup@3.25.1) '@rollup/pluginutils': 5.0.2(rollup@3.25.1) - chalk: 5.2.0 + chalk: 5.3.0 consola: 2.15.3 defu: 6.1.2 esbuild: 0.17.19 @@ -10251,91 +12073,70 @@ packages: transitivePeerDependencies: - sass - supports-color - dev: false - /unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + unbzip2-stream@1.4.3: dependencies: buffer: 5.7.1 through: 2.3.8 - dev: false - /uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - dev: false + uncrypto@0.1.3: {} - /unctx@2.3.1: - resolution: {integrity: sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==} + unctx@2.3.1: dependencies: acorn: 8.10.0 estree-walker: 3.0.3 magic-string: 0.30.2 unplugin: 1.4.0 - dev: false - /undici@5.22.1: - resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} - engines: {node: '>=14.0'} + undici@5.22.1: dependencies: busboy: 1.6.0 - dev: false - /unenv@1.5.1: - resolution: {integrity: sha512-tQHlmQUPyIoyGc2bF8phugmQd6wVatkVe5FqxxhM1vHfmPKWTiogSVTHA0mO8gNztDKZLpBEJx3M3CJrTZyExg==} + unenv@1.5.1: dependencies: consola: 3.1.0 defu: 6.1.2 mime: 3.0.0 node-fetch-native: 1.2.0 pathe: 1.1.1 - dev: false - /unenv@1.7.1: - resolution: {integrity: sha512-iINrdDcqoAjGqoIeOW85TIfI13KGgW1VWwqNO/IzcvvZ/JGBApMAQPZhWcKhE5oC/woFSpCSXg5lc7r1UaLPng==} + unenv@1.7.1: dependencies: consola: 3.2.3 defu: 6.1.2 mime: 3.0.0 node-fetch-native: 1.2.0 pathe: 1.1.1 - dev: false - /unhead@1.1.26: - resolution: {integrity: sha512-MshcPoPLXSGRgYtczddGvMgLUISTbt2pxihqD5kZVXKmY2FZLj1OQIY111aX45Xq47XJxjvYavvoyeUFroKQcg==} + unhead@1.1.26: dependencies: '@unhead/dom': 1.1.26 '@unhead/schema': 1.1.26 '@unhead/shared': 1.1.26 hookable: 5.5.3 - dev: false - /unhead@1.1.28: - resolution: {integrity: sha512-lJqXq5YMAD3p+Nhnvb7fNJwkU91kJNhrnZNcEuAlaTB+0L4es69UvMzekT/wvoE7pde4Yxs0upcTyL4BBz4vQw==} + unhead@1.1.28: dependencies: '@unhead/dom': 1.1.28 '@unhead/schema': 1.1.28 '@unhead/shared': 1.1.28 hookable: 5.5.3 - dev: false - /unhead@1.2.2: - resolution: {integrity: sha512-9wDuiso7YWNe0BTA5NGsHR0dtqn0YrL/5+NumfuXDxxYykavc6N27pzZxTXiuvVHbod8tFicsxA6pC9WhQvzqg==} + unhead@1.2.2: dependencies: '@unhead/dom': 1.2.2 '@unhead/schema': 1.2.2 '@unhead/shared': 1.2.2 hookable: 5.5.3 - dev: false - /unicode-trie@2.0.0: - resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + unicode-trie@2.0.0: dependencies: pako: 0.2.9 tiny-inflate: 1.0.3 - dev: false - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + unicorn-magic@0.1.0: {} + + unified@10.1.2: dependencies: '@types/unist': 2.0.6 bail: 2.0.2 @@ -10344,12 +12145,10 @@ packages: is-plain-obj: 4.1.0 trough: 2.1.0 vfile: 5.3.7 - dev: false - /unimport@3.0.10(rollup@3.25.1): - resolution: {integrity: sha512-rKxlbbjxVQR+6dL7OxJSuVOu96MtTvoRY0VBasGQTgZGTzKPrawZ4zMv7bmhLHRmUqG/CUAJ4uNZlaip+F/6+A==} + unimport@3.0.10(rollup@3.28.0): dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) escape-string-regexp: 5.0.0 fast-glob: 3.2.12 local-pkg: 0.4.3 @@ -10362,28 +12161,8 @@ packages: unplugin: 1.3.1 transitivePeerDependencies: - rollup - dev: false - - /unimport@3.1.3(rollup@3.25.1): - resolution: {integrity: sha512-up4TE2yA+nMyyErGTjbYGVw95MriGa2hVRXQ3/JRp7984cwwqULcnBjHaovVpsO8tZc2j0fvgGu9yiBKOyxvYw==} - dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) - escape-string-regexp: 5.0.0 - fast-glob: 3.3.1 - local-pkg: 0.4.3 - magic-string: 0.30.2 - mlly: 1.4.0 - pathe: 1.1.1 - pkg-types: 1.0.3 - scule: 1.0.0 - strip-literal: 1.3.0 - unplugin: 1.4.0 - transitivePeerDependencies: - - rollup - dev: false - /unimport@3.1.3(rollup@3.28.0): - resolution: {integrity: sha512-up4TE2yA+nMyyErGTjbYGVw95MriGa2hVRXQ3/JRp7984cwwqULcnBjHaovVpsO8tZc2j0fvgGu9yiBKOyxvYw==} + unimport@3.1.3(rollup@3.28.0): dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.28.0) escape-string-regexp: 5.0.0 @@ -10398,147 +12177,95 @@ packages: unplugin: 1.4.0 transitivePeerDependencies: - rollup - dev: false - /unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-filename@2.0.1: dependencies: unique-slug: 3.0.0 - dev: false - /unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 - dev: false - /unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-slug@3.0.0: dependencies: imurmurhash: 0.1.4 - dev: false - /unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 - dev: false - /unist-builder@4.0.0: - resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} + unist-builder@4.0.0: dependencies: '@types/unist': 3.0.0 - dev: false - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - dev: false + unist-util-generated@2.0.1: {} - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.6 - dev: false - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.0 - dev: false - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + unist-util-position@4.0.4: dependencies: '@types/unist': 2.0.6 - dev: false - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.0 - dev: false - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.6 - dev: false - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.0 - dev: false - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-parents@5.1.3: dependencies: '@types/unist': 2.0.6 unist-util-is: 5.2.1 - dev: false - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.0 unist-util-is: 6.0.0 - dev: false - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + unist-util-visit@4.1.2: dependencies: '@types/unist': 2.0.6 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - dev: false - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: false - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: false + universalify@0.1.2: {} - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: false + universalify@2.0.0: {} - /unplugin-ast@0.7.0(rollup@3.25.1): - resolution: {integrity: sha512-tPSr1yaEigjjHuxa7GaFp5eYW3R7FLmU3D+tu2+iF2rnH+Lnqb2jE9gFKZbqdk7UFTYgvPFvOzfhIF48imgZDw==} - engines: {node: '>=14.19.0'} + unplugin-ast@0.7.0(rollup@3.28.0): dependencies: '@antfu/utils': 0.7.4 '@babel/generator': 7.21.3 '@babel/parser': 7.22.5 - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) magic-string: 0.27.0 unplugin: 1.3.1 transitivePeerDependencies: - rollup - dev: false - /unplugin-vue-router@0.6.4(rollup@3.25.1)(vue-router@4.2.4)(vue@3.3.4): - resolution: {integrity: sha512-9THVhhtbVFxbsIibjK59oPwMI1UCxRWRPX7azSkTUABsxovlOXJys5SJx0kd/0oKIqNJuYgkRfAgPuO77SqCOg==} - peerDependencies: - vue-router: ^4.1.0 - peerDependenciesMeta: - vue-router: - optional: true + unplugin-vue-router@0.6.4(rollup@3.28.0)(vue-router@4.2.4(vue@3.3.4))(vue@3.3.4): dependencies: '@babel/types': 7.22.5 - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) - '@vue-macros/common': 1.4.0(rollup@3.25.1)(vue@3.3.4) + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) + '@vue-macros/common': 1.4.0(rollup@3.28.0)(vue@3.3.4) ast-walker-scope: 0.4.2 chokidar: 3.5.3 fast-glob: 3.2.12 @@ -10548,115 +12275,44 @@ packages: pathe: 1.1.1 scule: 1.0.0 unplugin: 1.4.0 - vue-router: 4.2.4(vue@3.3.4) yaml: 2.3.1 + optionalDependencies: + vue-router: 4.2.4(vue@3.3.4) transitivePeerDependencies: - rollup - - vue - dev: false - - /unplugin@1.3.1: - resolution: {integrity: sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw==} - dependencies: - acorn: 8.9.0 - chokidar: 3.5.3 - webpack-sources: 3.2.3 - webpack-virtual-modules: 0.5.0 - dev: false - - /unplugin@1.4.0: - resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} - dependencies: - acorn: 8.10.0 - chokidar: 3.5.3 - webpack-sources: 3.2.3 - webpack-virtual-modules: 0.5.0 - dev: false - - /unstorage@1.7.0: - resolution: {integrity: sha512-f78UtR4HyUGWuET35iNPdKMvCh9YPQpC7WvkGpP6XiLlolT/9wjyAICYN9AMD/tlB8ZdOqWQHZn+j7mXcTSO4w==} - peerDependencies: - '@azure/app-configuration': ^1.4.1 - '@azure/cosmos': ^3.17.3 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^3.2.2 - '@azure/keyvault-secrets': ^4.7.0 - '@azure/storage-blob': ^12.14.0 - '@planetscale/database': ^1.7.0 - '@upstash/redis': ^1.20.6 - '@vercel/kv': ^0.2.1 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/kv': - optional: true - dependencies: - anymatch: 3.1.3 - chokidar: 3.5.3 - destr: 2.0.0 - h3: 1.7.1 - ioredis: 5.3.2 - listhen: 1.0.4 - lru-cache: 10.0.0 - mri: 1.2.0 - node-fetch-native: 1.2.0 - ofetch: 1.1.1 - ufo: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /unstorage@1.9.0: - resolution: {integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==} - peerDependencies: - '@azure/app-configuration': ^1.4.1 - '@azure/cosmos': ^3.17.3 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^3.2.3 - '@azure/keyvault-secrets': ^4.7.0 - '@azure/storage-blob': ^12.14.0 - '@capacitor/preferences': ^5.0.0 - '@planetscale/database': ^1.8.0 - '@upstash/redis': ^1.22.0 - '@vercel/kv': ^0.2.2 - idb-keyval: ^6.2.1 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/kv': - optional: true - idb-keyval: - optional: true + - vue + + unplugin@1.3.1: + dependencies: + acorn: 8.10.0 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + + unplugin@1.4.0: + dependencies: + acorn: 8.10.0 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + + unstorage@1.7.0: + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.0 + h3: 1.7.1 + ioredis: 5.3.2 + listhen: 1.0.4 + lru-cache: 10.0.0 + mri: 1.2.0 + node-fetch-native: 1.2.0 + ofetch: 1.1.1 + ufo: 1.1.2 + transitivePeerDependencies: + - supports-color + + unstorage@1.9.0: dependencies: anymatch: 3.1.3 chokidar: 3.5.3 @@ -10671,15 +12327,10 @@ packages: ufo: 1.2.0 transitivePeerDependencies: - supports-color - dev: false - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} + untildify@4.0.0: {} - /untyped@1.3.2: - resolution: {integrity: sha512-z219Z65rOGD6jXIvIhpZFfwWdqQckB8sdZec2NO+TkcH1Bph7gL0hwLzRJs1KsOo4Jz4mF9guBXhsEnyEBGVfw==} - hasBin: true + untyped@1.3.2: dependencies: '@babel/core': 7.21.3 '@babel/standalone': 7.21.3 @@ -10690,112 +12341,84 @@ packages: scule: 1.0.0 transitivePeerDependencies: - supports-color - dev: false - /update-browserslist-db@1.0.10(browserslist@4.21.5): - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.10(browserslist@4.21.5): dependencies: browserslist: 4.21.5 escalade: 3.1.1 picocolors: 1.0.0 - dev: false - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + + upper-case-first@2.0.2: dependencies: tslib: 2.5.0 - dev: false - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + upper-case@2.0.2: dependencies: tslib: 2.5.0 - dev: false - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.0 - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + util@0.12.5: dependencies: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.10 which-typed-array: 1.1.9 - dev: false - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: false + uuid@9.0.0: {} - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true + uvu@0.5.6: dependencies: dequal: 2.0.3 diff: 5.1.0 kleur: 4.1.5 sade: 1.8.1 - dev: false - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - /validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@5.0.0: dependencies: builtins: 5.0.1 - dev: false - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + vfile-location@4.1.0: dependencies: '@types/unist': 2.0.6 vfile: 5.3.7 - dev: false - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vfile-message@3.1.4: dependencies: '@types/unist': 2.0.6 unist-util-stringify-position: 3.0.3 - dev: false - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vfile@5.3.7: dependencies: '@types/unist': 2.0.6 is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - dev: false - /vite-node@0.33.0(@types/node@18.15.3): - resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} - engines: {node: '>=v14.18.0'} - hasBin: true + vite-node@0.33.0(@types/node@18.15.3)(terser@5.17.7): dependencies: cac: 6.7.14 debug: 4.3.4 mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.3.9(@types/node@18.15.3) + vite: 4.3.9(@types/node@18.15.3)(terser@5.17.7) transitivePeerDependencies: - '@types/node' - less @@ -10804,45 +12427,14 @@ packages: - sugarss - supports-color - terser - dev: false - /vite-plugin-checker@0.6.1(eslint@8.47.0)(typescript@5.0.4)(vite@4.3.9): - resolution: {integrity: sha512-4fAiu3W/IwRJuJkkUZlWbLunSzsvijDf0eDN6g/MGh6BUK4SMclOTGbLJCPvdAcMOQvVmm8JyJeYLYd4//8CkA==} - engines: {node: '>=14.16'} - peerDependencies: - eslint: '>=7' - meow: ^9.0.0 - optionator: ^0.9.1 - stylelint: '>=13' - typescript: '*' - vite: '>=2.0.0' - vls: '*' - vti: '*' - vue-tsc: '>=1.3.9' - peerDependenciesMeta: - eslint: - optional: true - meow: - optional: true - optionator: - optional: true - stylelint: - optional: true - typescript: - optional: true - vls: - optional: true - vti: - optional: true - vue-tsc: - optional: true + vite-plugin-checker@0.6.1(eslint@9.0.0)(optionator@0.9.3)(typescript@5.0.4)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7)): dependencies: '@babel/code-frame': 7.18.6 ansi-escapes: 4.3.2 chalk: 4.1.2 chokidar: 3.5.3 commander: 8.3.0 - eslint: 8.47.0 fast-glob: 3.2.12 fs-extra: 11.1.1 lodash.debounce: 4.0.8 @@ -10851,42 +12443,33 @@ packages: semver: 7.5.3 strip-ansi: 6.0.1 tiny-invariant: 1.3.1 - typescript: 5.0.4 - vite: 4.3.9(@types/node@18.15.3) + vite: 4.3.9(@types/node@18.15.3)(terser@5.17.7) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.8 vscode-uri: 3.0.7 - dev: false + optionalDependencies: + eslint: 9.0.0 + optionator: 0.9.3 + typescript: 5.0.4 - /vite-plugin-inspect@0.7.36(@nuxt/kit@3.6.5)(rollup@3.25.1)(vite@4.3.9): - resolution: {integrity: sha512-zdFTvLAU0Xb0C9B+JepUN353bZxBWqgkE71URe/9kfM38r6PtR5y2mo0CH1lBuX1DHNhKumLMUGXkvJ+z2OJ4w==} - engines: {node: '>=14'} - peerDependencies: - '@nuxt/kit': '*' - vite: ^3.1.0 || ^4.0.0 - peerDependenciesMeta: - '@nuxt/kit': - optional: true + vite-plugin-inspect@0.7.36(@nuxt/kit@3.6.5(rollup@3.28.0))(rollup@3.28.0)(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7)): dependencies: '@antfu/utils': 0.7.5 - '@nuxt/kit': 3.6.5(rollup@3.25.1) - '@rollup/pluginutils': 5.0.2(rollup@3.25.1) + '@rollup/pluginutils': 5.0.2(rollup@3.28.0) debug: 4.3.4 fs-extra: 11.1.1 open: 9.1.0 picocolors: 1.0.0 sirv: 2.0.3 - vite: 4.3.9(@types/node@18.15.3) + vite: 4.3.9(@types/node@18.15.3)(terser@5.17.7) + optionalDependencies: + '@nuxt/kit': 3.6.5(rollup@3.28.0) transitivePeerDependencies: - rollup - supports-color - dev: false - /vite-plugin-vue-inspector@3.6.0(vite@4.3.9): - resolution: {integrity: sha512-Fi+9JaMx/reuic+MWbrdw8g5TwZM5a/BmdBT8OKKZi3rK4Qw3wND9smT+Ld+Daitbgly17uvuCiull2KV/hEBQ==} - peerDependencies: - vite: ^3.0.0-0 || ^4.0.0-0 + vite-plugin-vue-inspector@3.6.0(vite@4.3.9(@types/node@18.15.3)(terser@5.17.7)): dependencies: '@babel/core': 7.21.3 '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.3) @@ -10897,183 +12480,96 @@ packages: kolorist: 1.8.0 magic-string: 0.30.0 shell-quote: 1.8.0 - vite: 4.3.9(@types/node@18.15.3) + vite: 4.3.9(@types/node@18.15.3)(terser@5.17.7) transitivePeerDependencies: - supports-color - dev: false - /vite@4.3.9(@types/node@18.15.3): - resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@4.3.9(@types/node@18.15.3)(terser@5.17.7): dependencies: - '@types/node': 18.15.3 esbuild: 0.17.19 postcss: 8.4.24 rollup: 3.25.1 optionalDependencies: + '@types/node': 18.15.3 fsevents: 2.3.2 - dev: false + terser: 5.17.7 - /vscode-jsonrpc@6.0.0: - resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} - engines: {node: '>=8.0.0 || >=10.0.0'} - dev: false + vscode-jsonrpc@6.0.0: {} - /vscode-languageclient@7.0.0: - resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==} - engines: {vscode: ^1.52.0} + vscode-languageclient@7.0.0: dependencies: minimatch: 3.1.2 semver: 7.5.3 vscode-languageserver-protocol: 3.16.0 - dev: false - /vscode-languageserver-protocol@3.16.0: - resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + vscode-languageserver-protocol@3.16.0: dependencies: vscode-jsonrpc: 6.0.0 vscode-languageserver-types: 3.16.0 - dev: false - /vscode-languageserver-textdocument@1.0.8: - resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} - dev: false + vscode-languageserver-textdocument@1.0.8: {} - /vscode-languageserver-types@3.16.0: - resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} - dev: false + vscode-languageserver-types@3.16.0: {} - /vscode-languageserver@7.0.0: - resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} - hasBin: true + vscode-languageserver@7.0.0: dependencies: vscode-languageserver-protocol: 3.16.0 - dev: false - /vscode-uri@3.0.7: - resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} - dev: false + vscode-uri@3.0.7: {} - /vue-bundle-renderer@1.0.3: - resolution: {integrity: sha512-EfjX+5TTUl70bki9hPuVp+54JiZOvFIfoWBcfXsSwLzKEiDYyHNi5iX8srnqLIv3YRnvxgbntdcG1WPq0MvffQ==} + vue-bundle-renderer@1.0.3: dependencies: ufo: 1.1.2 - dev: false - /vue-component-meta@1.2.0(typescript@5.0.4): - resolution: {integrity: sha512-z+/pL4txu5qCULbGHFn6vOlSR1V5gFDGWkD64Z2yLlKtYr0Wlb9oOfWTaXxpSl7R+EiX7JusbTlek0szSYeH1g==} - peerDependencies: - typescript: '*' + vue-component-meta@1.2.0(typescript@5.0.4): dependencies: '@volar/language-core': 1.3.0-alpha.0 '@volar/vue-language-core': 1.2.0 typesafe-path: 0.2.2 typescript: 5.0.4 - dev: false - /vue-demi@0.14.0(vue@3.3.4): - resolution: {integrity: sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true + vue-demi@0.14.0(vue@3.3.4): dependencies: vue: 3.3.4 - dev: false - /vue-demi@0.14.5(vue@3.3.4): - resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true + vue-demi@0.14.5(vue@3.3.4): dependencies: vue: 3.3.4 - dev: false - /vue-devtools-stub@0.1.0: - resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} - dev: false + vue-devtools-stub@0.1.0: {} - /vue-eslint-parser@9.2.1(eslint@8.47.0): - resolution: {integrity: sha512-tPOex4n6jit4E7h68auOEbDMwE58XiP4dylfaVTCOVCouR45g+QFDBjgIdEU52EXJxKyjgh91dLfN2rxUcV0bQ==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' + vue-eslint-parser@9.4.2(eslint@9.0.0): dependencies: debug: 4.3.4 - eslint: 8.47.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.6.0 + eslint: 9.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 lodash: 4.17.21 - semver: 7.5.3 + semver: 7.5.4 transitivePeerDependencies: - supports-color - dev: true - /vue-router@4.2.4(vue@3.3.4): - resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==} - peerDependencies: - vue: ^3.2.0 + vue-router@4.2.4(vue@3.3.4): dependencies: '@vue/devtools-api': 6.5.0 vue: 3.3.4 - dev: false - /vue-template-compiler@2.7.14: - resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} + vue-template-compiler@2.7.14: dependencies: de-indent: 1.0.2 he: 1.2.0 - dev: false - /vue@3.3.4: - resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + vue@3.3.4: dependencies: '@vue/compiler-dom': 3.3.4 '@vue/compiler-sfc': 3.3.4 '@vue/runtime-dom': 3.3.4 '@vue/server-renderer': 3.3.4(vue@3.3.4) '@vue/shared': 3.3.4 - dev: false - /wait-on@7.0.1: - resolution: {integrity: sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==} - engines: {node: '>=12.0.0'} - hasBin: true + wait-on@7.0.1: dependencies: axios: 0.27.2 joi: 17.9.2 @@ -11082,54 +12578,25 @@ packages: rxjs: 7.8.1 transitivePeerDependencies: - debug - dev: false - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false + web-namespaces@2.0.1: {} - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} - dev: false + web-streams-polyfill@3.2.1: {} - /web-worker@1.2.0: - resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} - dev: false + web-worker@1.2.0: {} - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false + webidl-conversions@3.0.1: {} - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: false + webpack-sources@3.2.3: {} - /webpack-virtual-modules@0.5.0: - resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - dev: false + webpack-virtual-modules@0.5.0: {} - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: false - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.9: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -11138,125 +12605,61 @@ packages: has-tostringtag: 1.0.0 is-typed-array: 1.1.10 - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + which@3.0.1: dependencies: isexe: 2.0.0 - dev: false - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wide-align@1.1.5: dependencies: string-width: 4.2.3 - dev: false - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@4.0.1: dependencies: string-width: 5.1.2 - dev: false - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.0.1 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + ws@8.11.0: {} - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + ws@8.13.0: {} - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true + xml-name-validator@4.0.0: {} - /xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - dev: false + xmlhttprequest-ssl@2.0.0: {} - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: false + xtend@4.0.2: {} - /xxhashjs@0.2.2: - resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} + xxhashjs@0.2.2: dependencies: cuint: 0.2.2 - dev: false - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: false + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - dev: false + yaml@2.3.1: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: false + yargs-parser@21.1.1: {} - /yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} - engines: {node: '>=12'} + yargs@17.7.1: dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -11265,40 +12668,26 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: false - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: false - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yoga-wasm-web@0.3.3: - resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} - dev: false + yocto-queue@1.0.0: {} - /zhead@2.0.10: - resolution: {integrity: sha512-irug8fXNKjqazkA27cFQs7C6/ZD3qNiEzLC56kDyzQART/Z9GMGfg8h2i6fb9c8ZWnIx/QgOgFJxK3A/CYHG0g==} - dev: false + yoga-wasm-web@0.3.3: {} - /zhead@2.0.7: - resolution: {integrity: sha512-q9iCCXBWndfYNMGCN7S970+e3ILAPzmX78Skblx7+SGlo6x6SXW0GJ5mJzigYsq2mkHCGqEUhe0QGDEDZauw8g==} - dev: false + zhead@2.0.10: {} - /zip-stream@4.1.0: - resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==} - engines: {node: '>= 10'} + zhead@2.0.7: {} + + zip-stream@4.1.0: dependencies: archiver-utils: 2.1.0 compress-commons: 4.1.1 readable-stream: 3.6.2 - dev: false - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false + zwitch@2.0.4: {} diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index fbc696051..000000000 --- a/.eslintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "@antfu", - "rules": { - "yml/no-empty-mapping-value": "off" - }, - "ignorePatterns": [ - "generated" - ] -} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000..49c5b2cbb --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,15 @@ +import { antfu } from '@antfu/eslint-config' + +export default antfu({ + ignores: [ + '**/generated', + 'packages/python', + '.docs', + 'packages/csharp', + 'packages/cpp', + ], +}).overrideRules({ + 'antfu/consistent-list-newline': 'off', + 'ts/ban-ts-comment': 'off', + 'curly': 'off', +}) diff --git a/package.json b/package.json index 99472f9ff..7293d91f7 100644 --- a/package.json +++ b/package.json @@ -9,19 +9,19 @@ "lint:fix": "eslint --fix ." }, "devDependencies": { - "@antfu/eslint-config": "^0.41.0", - "@typescript-eslint/eslint-plugin": "^6.4.1", + "@antfu/eslint-config": "^2.15.0", + "@typescript-eslint/eslint-plugin": "^7.7.0", "consola": "^3.2.3", - "eslint": "^8.47.0", - "eslint-config-standard-with-typescript": "^38.0.0", + "eslint": "^9.0.0", + "eslint-config-standard-with-typescript": "^43.0.1", "eslint-plugin-import": "^2.28.1", - "eslint-plugin-n": "^16.0.2", + "eslint-plugin-n": "^17.2.1", "eslint-plugin-promise": "^6.1.1", "glob": "^10.3.3", "jiti": "^1.19.3", "pathe": "^1.1.1", "tslib": "^2.6.2", "typescript": "^5.2.2", - "zx": "^7.2.3" + "zx": "^8.0.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f22d80dd..14fb302f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,29 +9,29 @@ importers: .: devDependencies: '@antfu/eslint-config': - specifier: ^0.41.0 - version: 0.41.4(eslint@8.57.0)(typescript@5.2.2) + specifier: ^2.15.0 + version: 2.15.0(@vue/compiler-sfc@3.4.23)(eslint@9.0.0)(typescript@5.2.2) '@typescript-eslint/eslint-plugin': - specifier: ^6.4.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + specifier: ^7.7.0 + version: 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) consola: specifier: ^3.2.3 version: 3.2.3 eslint: - specifier: ^8.47.0 - version: 8.57.0 + specifier: ^9.0.0 + version: 9.0.0 eslint-config-standard-with-typescript: - specifier: ^38.0.0 - version: 38.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0)(typescript@5.2.2) + specifier: ^43.0.1 + version: 43.0.1(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0)(typescript@5.2.2) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) eslint-plugin-n: - specifier: ^16.0.2 - version: 16.6.2(eslint@8.57.0) + specifier: ^17.2.1 + version: 17.2.1(eslint@9.0.0) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.0) + version: 6.1.1(eslint@9.0.0) glob: specifier: ^10.3.3 version: 10.3.3 @@ -48,8 +48,8 @@ importers: specifier: ^5.2.2 version: 5.2.2 zx: - specifier: ^7.2.3 - version: 7.2.3 + specifier: ^8.0.1 + version: 8.0.1 packages: @@ -57,31 +57,60 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - '@antfu/eslint-config-basic@0.41.4': - resolution: {integrity: sha512-bdBC8tyJzTa4a883m50efVLRjiVX8lMAhvmFxvpue6ScBnPLqW+J3sJupolefp/Xc00VU8ThD3iOBCE8Ja9qfg==} - peerDependencies: - eslint: '>=7.4.0' - - '@antfu/eslint-config-ts@0.41.4': - resolution: {integrity: sha512-YikIdwZwFPKEAL08GELjC0tzSaEKceINg8R4cwpvVlkXIaut9Tiyhgw69OBlfWdf3oMhpJ4ksy2WFfWh2qmjaw==} - peerDependencies: - eslint: '>=7.4.0' - typescript: '>=3.9' - - '@antfu/eslint-config-vue@0.41.4': - resolution: {integrity: sha512-tOZ4ria8wahZ4bn5Sglarcw+IPVn+QXNincjzB0tmwBzQP2XTM8fXYlvqO1VBA1/Jgr2BVGgZVXBHy1StDBTnA==} + '@antfu/eslint-config@2.15.0': + resolution: {integrity: sha512-qoqw+0N8bqz0vBIigGJamaIf1LdzXcmCDuleygJAF3EtACLieKyIMvpOdc2TU9AnuPbMBFCkN40340UWRChELw==} + hasBin: true peerDependencies: - eslint: '>=7.4.0' + '@eslint-react/eslint-plugin': ^1.5.8 + '@unocss/eslint-plugin': '>=0.50.0' + astro-eslint-parser: ^0.16.3 + eslint: '>=8.40.0' + eslint-plugin-astro: ^0.31.4 + eslint-plugin-format: '>=0.1.0' + eslint-plugin-react-hooks: ^4.6.0 + eslint-plugin-react-refresh: ^0.4.4 + eslint-plugin-solid: ^0.13.2 + eslint-plugin-svelte: '>=2.35.1' + prettier-plugin-astro: ^0.13.0 + prettier-plugin-slidev: ^1.0.5 + svelte-eslint-parser: ^0.33.1 + peerDependenciesMeta: + '@eslint-react/eslint-plugin': + optional: true + '@unocss/eslint-plugin': + optional: true + astro-eslint-parser: + optional: true + eslint-plugin-astro: + optional: true + eslint-plugin-format: + optional: true + eslint-plugin-react-hooks: + optional: true + eslint-plugin-react-refresh: + optional: true + eslint-plugin-solid: + optional: true + eslint-plugin-svelte: + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-slidev: + optional: true + svelte-eslint-parser: + optional: true - '@antfu/eslint-config@0.41.4': - resolution: {integrity: sha512-1bPnXjrv3DqF4FsRgorJvCjGM5oB1fOYeAXAER/TLS7WXO1oD/9s/G39mBy9K7HxLLyFuLuZAw0h/Uz0GR1k9w==} - peerDependencies: - eslint: '>=7.4.0' + '@antfu/install-pkg@0.3.2': + resolution: {integrity: sha512-FFYqME8+UHlPnRlX/vn+8cTD4Wo/nG/lzRxpABs3XANBmdJdNImVz3QvjNAE/W3PSCNbG387FOz8o5WelnWOlg==} '@babel/code-frame@7.22.10': resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} @@ -90,8 +119,25 @@ packages: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} - '@es-joy/jsdoccomment@0.41.0': - resolution: {integrity: sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==} + '@babel/parser@7.24.4': + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@clack/core@0.3.4': + resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} + + '@clack/prompts@0.7.0': + resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} + bundledDependencies: + - is-unicode-supported + + '@es-joy/jsdoccomment@0.42.0': + resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} engines: {node: '>=16'} '@eslint-community/eslint-utils@4.4.0': @@ -108,12 +154,16 @@ packages: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.0.2': + resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.0.0': + resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + '@humanwhocodes/config-array@0.12.3': + resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} engines: {node: '>=10.10.0'} '@humanwhocodes/module-importer@1.0.1': @@ -127,6 +177,9 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -143,6 +196,41 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@stylistic/eslint-plugin-js@1.7.2': + resolution: {integrity: sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin-jsx@1.7.2': + resolution: {integrity: sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin-plus@1.7.2': + resolution: {integrity: sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==} + peerDependencies: + eslint: '*' + + '@stylistic/eslint-plugin-ts@1.7.2': + resolution: {integrity: sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@stylistic/eslint-plugin@1.7.2': + resolution: {integrity: sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' + + '@types/eslint@8.56.9': + resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -158,36 +246,24 @@ packages: '@types/mdast@3.0.12': resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - - '@types/node@18.19.31': - resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} - '@types/node@20.12.7': resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - '@types/ps-tree@1.1.6': - resolution: {integrity: sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ==} - '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@types/unist@2.0.7': resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} - '@types/which@3.0.3': - resolution: {integrity: sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==} - - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/eslint-plugin@7.7.0': + resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: @@ -203,40 +279,41 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/parser@7.7.0': + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@typescript-eslint/scope-manager@6.21.0': resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@7.7.0': + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.7.0': + resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@6.21.0': resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/types@7.7.0': + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + engines: {node: ^18.18.0 || >=20.0.0} '@typescript-eslint/typescript-estree@6.21.0': resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} @@ -247,11 +324,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/typescript-estree@7.7.0': + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@typescript-eslint/utils@6.21.0': resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} @@ -259,16 +339,34 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/utils@7.7.0': + resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 '@typescript-eslint/visitor-keys@6.21.0': resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript-eslint/visitor-keys@7.7.0': + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@vue/compiler-core@3.4.23': + resolution: {integrity: sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==} + + '@vue/compiler-dom@3.4.23': + resolution: {integrity: sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==} + + '@vue/compiler-sfc@3.4.23': + resolution: {integrity: sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==} + + '@vue/compiler-ssr@3.4.23': + resolution: {integrity: sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==} + + '@vue/shared@3.4.23': + resolution: {integrity: sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -358,13 +456,15 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtins@5.1.0: - resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} - call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -373,6 +473,9 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + caniuse-lite@1.0.30001611: + resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -381,10 +484,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -394,14 +493,18 @@ packages: character-reference-invalid@1.1.4: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -422,10 +525,16 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} + core-js-compat@3.37.0: + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -435,10 +544,6 @@ packages: engines: {node: '>=4'} hasBin: true - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -491,31 +596,22 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + electron-to-chromium@1.4.741: + resolution: {integrity: sha512-AyTBZqDoS7/mvQK22gOQpjxbeV8iPeUBTvYlEh/1S9dKAHgQdxuF49g9rLbj0cRKtqH8PzLJzqT3nAdl+qoZTA==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -550,6 +646,10 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -564,11 +664,14 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-standard-with-typescript@38.1.0: - resolution: {integrity: sha512-sdgN8Gf7BMVhVKlY7/mB426yO/MozU1zV7TKnh0z1wIoPq4lD0CHQ+b/UkgqKfiZ4Io0j3xIY1j+lHhVXQck0g==} + eslint-config-flat-gitignore@0.1.5: + resolution: {integrity: sha512-hEZLwuZjDBGDERA49c2q7vxc8sCGv8EdBp6PQYzGOMcHIgrfG9YOM6s/4jx24zhD+wnK9AI8mgN5RxSss5nClQ==} + + eslint-config-standard-with-typescript@43.0.1: + resolution: {integrity: sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==} deprecated: Please use eslint-config-love, instead. peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.1.0 + '@typescript-eslint/eslint-plugin': ^6.4.0 eslint: ^8.0.1 eslint-plugin-import: ^2.25.2 eslint-plugin-n: '^15.0.0 || ^16.0.0 ' @@ -584,9 +687,17 @@ packages: eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 + eslint-flat-config-utils@0.2.3: + resolution: {integrity: sha512-tfrMNXZfuN4q7sFi1Cr//BN3qdI7c8fLJhbshlp8l9PZIqZ7eVeeyd2Regtu/P9kjOlv18lRlBALzsZaF7ByUg==} + eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-merge-processors@0.1.0: + resolution: {integrity: sha512-IvRXXtEajLeyssvW4wJcZ2etxkR9mUf4zpNwgI+m/Uac9RfXHskuJefkHUcawVzePnd6xp24enp5jfgdHzjRdQ==} + peerDependencies: + eslint: '*' + eslint-module-utils@2.8.1: resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} @@ -608,8 +719,10 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-antfu@0.41.4: - resolution: {integrity: sha512-naDIFqCW/7vFIz/TZNuapLEjGd8XoWFot0h8SStbqUIcdXFKc0MgDXCKtHQIyJp6plkKiucOW3gZJ0jjYrc3Qg==} + eslint-plugin-antfu@2.1.2: + resolution: {integrity: sha512-s7ZTOM3uq0iqpp6gF0UEotnvup7f2PHBUftCytLZX0+6C9j9KadKZQh6bVVngAyFgsmeD9+gcBopOYLClb2oDg==} + peerDependencies: + eslint: '*' eslint-plugin-es-x@7.6.0: resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} @@ -623,14 +736,11 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-html@7.1.0: - resolution: {integrity: sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==} - - eslint-plugin-i@2.28.1: - resolution: {integrity: sha512-a4oVt0j3ixNhGhvV4XF6NS7OWRFK2rrJ0Q5C4S2dSRb8FxZi31J0uUd5WJLL58wnVJ/OiQ1BxiXnFA4dWQO1Cg==} - engines: {node: '>=12'} + eslint-plugin-import-x@0.5.0: + resolution: {integrity: sha512-C7R8Z4IzxmsoOPMtSzwuOBW5FH6iRlxHR6iTks+MzVlrk3r3TUxokkWTx3ypdj9nGOEP+CG/5e6ebZzHbxgbbQ==} + engines: {node: '>=16'} peerDependencies: - eslint: ^7.2.0 || ^8 + eslint: ^8.56.0 || ^9.0.0-0 eslint-plugin-import@2.29.1: resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} @@ -642,22 +752,9 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jest@27.9.0: - resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - - eslint-plugin-jsdoc@46.10.1: - resolution: {integrity: sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==} - engines: {node: '>=16'} + eslint-plugin-jsdoc@48.2.3: + resolution: {integrity: sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==} + engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -667,33 +764,57 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-plugin-markdown@3.0.1: - resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-plugin-markdown@4.0.1: + resolution: {integrity: sha512-5/MnGvYU0i8MbHH5cg8S+Vl3DL+bqRNYshk1xUO86DilNBaxtTkhH+5FD0/yO03AmlI6+lfNFdk2yOw72EPzpA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: '>=8' - eslint-plugin-n@16.6.2: - resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} - engines: {node: '>=16.0.0'} + eslint-plugin-n@17.2.1: + resolution: {integrity: sha512-uW1+df2bo06kR7ix6nB614RUlvjRPrYxlaX832O6e1MCJp4V7YozEdvMgCYuvn4ltnjPu1FVYhQ2KRrmTNoJfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=7.0.0' + eslint: '>=8.23.0' eslint-plugin-no-only-tests@3.1.0: resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} engines: {node: '>=5.0.0'} + eslint-plugin-perfectionist@2.9.0: + resolution: {integrity: sha512-ipFtDrqtF99qVVo+FE1fo6aHyLLp7hg6PNGfzY5KxQjcl0XCbyEFvjtR1NfkHDTN9rdFeEDxg59LLOv3VOAHAw==} + peerDependencies: + astro-eslint-parser: ^0.16.0 + eslint: '>=8.0.0' + svelte: '>=3.0.0' + svelte-eslint-parser: ^0.33.0 + vue-eslint-parser: '>=9.0.0' + peerDependenciesMeta: + astro-eslint-parser: + optional: true + svelte: + optional: true + svelte-eslint-parser: + optional: true + vue-eslint-parser: + optional: true + eslint-plugin-promise@6.1.1: resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 - eslint-plugin-unicorn@48.0.1: - resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} + eslint-plugin-toml@0.11.0: + resolution: {integrity: sha512-sau+YvPU4fWTjB+qtBt3n8WS87aoDCs+BVbSUAemGaIsRNbvR9uEk+Tt892iLHTGvp/DPWYoCX4/8DoyAbB+sQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + eslint-plugin-unicorn@52.0.0: + resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} engines: {node: '>=16'} peerDependencies: - eslint: '>=8.44.0' + eslint: '>=8.56.0' eslint-plugin-unused-imports@3.1.0: resolution: {integrity: sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==} @@ -705,6 +826,19 @@ packages: '@typescript-eslint/eslint-plugin': optional: true + eslint-plugin-vitest@0.5.3: + resolution: {integrity: sha512-D0iu6ppP6FmNSZP4cdhEXqyI+fuW6JwwWdECRrNymd1jiVgUmDgSvtryytonNxHQQWhGNmZM3V/qvpXttH1rRQ==} + engines: {node: ^18.0.0 || >= 20.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': '*' + eslint: ^8.57.0 || ^9.0.0 + vitest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + vitest: + optional: true + eslint-plugin-vue@9.25.0: resolution: {integrity: sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==} engines: {node: ^14.17.0 || >=16.0.0} @@ -717,27 +851,41 @@ packages: peerDependencies: eslint: '>=6.0.0' + eslint-processor-vue-blocks@0.1.2: + resolution: {integrity: sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==} + peerDependencies: + '@vue/compiler-sfc': ^3.3.0 + eslint: ^8.50.0 || ^9.0.0 + eslint-rule-composer@0.3.0: resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} engines: {node: '>=4.0.0'} - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.0.1: + resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.0.0: + resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + espree@10.0.1: + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -750,28 +898,24 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - event-stream@3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -785,13 +929,9 @@ packages: fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -805,9 +945,13 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -819,20 +963,6 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - - from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} @@ -846,14 +976,18 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - fx@34.0.0: - resolution: {integrity: sha512-/fZih3/WLsrtlaj2mahjWxAmyuikmcl3D5kKPqLtFmEilLsy9wp0+/vEmfvYXXhwJc+ajtCFDCf+yttXmPMHSQ==} - hasBin: true + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -874,13 +1008,18 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.0.0: + resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} + engines: {node: '>=18'} + globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -889,10 +1028,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -939,8 +1074,9 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} @@ -958,12 +1094,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} @@ -1052,6 +1182,10 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -1121,9 +1255,6 @@ packages: resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1134,8 +1265,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} locate-path@5.0.0: @@ -1146,6 +1277,10 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -1160,8 +1295,8 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} mdast-util-from-markdown@0.8.5: resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} @@ -1169,6 +1304,9 @@ packages: mdast-util-to-string@2.0.0: resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1180,6 +1318,10 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -1191,6 +1333,10 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -1198,26 +1344,36 @@ packages: resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} engines: {node: '>=16 || 14 >=14.17'} + mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - - node-fetch@3.3.1: - resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -1244,8 +1400,9 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} @@ -1259,6 +1416,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -1267,6 +1428,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -1278,6 +1443,10 @@ packages: parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -1286,14 +1455,18 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -1308,13 +1481,23 @@ packages: pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pkg-types@1.1.0: + resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -1327,15 +1510,14 @@ packages: resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - ps-tree@1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - hasBin: true - punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -1363,6 +1545,10 @@ packages: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1378,10 +1564,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1430,13 +1612,16 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -1453,12 +1638,6 @@ packages: spdx-license-ids@3.0.13: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} - - stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1490,6 +1669,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -1514,16 +1697,25 @@ packages: resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} engines: {node: '>=12.20'} + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toml-eslint-parser@0.9.3: + resolution: {integrity: sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -1533,18 +1725,9 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1582,18 +1765,27 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1610,14 +1802,6 @@ packages: peerDependencies: eslint: '>=6.0.0' - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - - webpod@0.0.2: - resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} - hasBin: true - which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -1630,11 +1814,6 @@ packages: engines: {node: '>= 8'} hasBin: true - which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1643,13 +1822,14 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -1661,12 +1841,24 @@ packages: resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} engines: {node: '>= 14'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zx@7.2.3: - resolution: {integrity: sha512-QODu38nLlYXg/B/Gw7ZKiZrvPkEsjPN3LQ5JFXM7h0JvwhEdPNNl+4Ao1y4+o3CLNiDUNcwzQYZ4/Ko7kKzCMA==} + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zx@8.0.1: + resolution: {integrity: sha512-Y+ITW1GQjADk7qgrbhnukMgoNsJmlyx53cUQ6/6NXU+BMBdCbTc6flTOHUctmzKvPjTmdwaddzJY/dbLie9sQg==} engines: {node: '>= 16.0.0'} hasBin: true @@ -1674,91 +1866,60 @@ snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} - '@antfu/eslint-config-basic@0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2)': - dependencies: - eslint: 8.57.0 - eslint-plugin-antfu: 0.41.4(eslint@8.57.0)(typescript@5.2.2) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) - eslint-plugin-html: 7.1.0 - eslint-plugin-import: eslint-plugin-i@2.28.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) - eslint-plugin-jsdoc: 46.10.1(eslint@8.57.0) - eslint-plugin-jsonc: 2.15.1(eslint@8.57.0) - eslint-plugin-markdown: 3.0.1(eslint@8.57.0) - eslint-plugin-n: 16.6.2(eslint@8.57.0) + '@antfu/eslint-config@2.15.0(@vue/compiler-sfc@3.4.23)(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@antfu/install-pkg': 0.3.2 + '@clack/prompts': 0.7.0 + '@stylistic/eslint-plugin': 1.7.2(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + eslint-config-flat-gitignore: 0.1.5 + eslint-flat-config-utils: 0.2.3 + eslint-merge-processors: 0.1.0(eslint@9.0.0) + eslint-plugin-antfu: 2.1.2(eslint@9.0.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@9.0.0) + eslint-plugin-import-x: 0.5.0(eslint@9.0.0)(typescript@5.2.2) + eslint-plugin-jsdoc: 48.2.3(eslint@9.0.0) + eslint-plugin-jsonc: 2.15.1(eslint@9.0.0) + eslint-plugin-markdown: 4.0.1(eslint@9.0.0) + eslint-plugin-n: 17.2.1(eslint@9.0.0) eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-promise: 6.1.1(eslint@8.57.0) - eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) - eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) - eslint-plugin-yml: 1.14.0(eslint@8.57.0) + eslint-plugin-perfectionist: 2.9.0(eslint@9.0.0)(typescript@5.2.2)(vue-eslint-parser@9.4.2(eslint@9.0.0)) + eslint-plugin-toml: 0.11.0(eslint@9.0.0) + eslint-plugin-unicorn: 52.0.0(eslint@9.0.0) + eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) + eslint-plugin-vitest: 0.5.3(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + eslint-plugin-vue: 9.25.0(eslint@9.0.0) + eslint-plugin-yml: 1.14.0(eslint@9.0.0) + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.0.0) + globals: 15.0.0 jsonc-eslint-parser: 2.4.0 + local-pkg: 0.5.0 + parse-gitignore: 2.0.0 + picocolors: 1.0.0 + toml-eslint-parser: 0.9.3 + vue-eslint-parser: 9.4.2(eslint@9.0.0) yaml-eslint-parser: 1.2.2 + yargs: 17.7.2 transitivePeerDependencies: - - '@typescript-eslint/eslint-plugin' - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack + - '@vue/compiler-sfc' - supports-color + - svelte - typescript + - vitest - '@antfu/eslint-config-ts@0.41.4(eslint@8.57.0)(typescript@5.2.2)': + '@antfu/install-pkg@0.3.2': dependencies: - '@antfu/eslint-config-basic': 0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - eslint: 8.57.0 - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - - '@antfu/eslint-config-vue@0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2)': - dependencies: - '@antfu/eslint-config-basic': 0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) - '@antfu/eslint-config-ts': 0.41.4(eslint@8.57.0)(typescript@5.2.2) - eslint: 8.57.0 - eslint-plugin-vue: 9.25.0(eslint@8.57.0) - local-pkg: 0.4.3 - transitivePeerDependencies: - - '@typescript-eslint/eslint-plugin' - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - - typescript - - '@antfu/eslint-config@0.41.4(eslint@8.57.0)(typescript@5.2.2)': - dependencies: - '@antfu/eslint-config-vue': 0.41.4(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - eslint: 8.57.0 - eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) - eslint-plugin-html: 7.1.0 - eslint-plugin-import: eslint-plugin-i@2.28.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) - eslint-plugin-jsonc: 2.15.1(eslint@8.57.0) - eslint-plugin-n: 16.6.2(eslint@8.57.0) - eslint-plugin-promise: 6.1.1(eslint@8.57.0) - eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) - eslint-plugin-vue: 9.25.0(eslint@8.57.0) - eslint-plugin-yml: 1.14.0(eslint@8.57.0) - jsonc-eslint-parser: 2.4.0 - yaml-eslint-parser: 1.2.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - - typescript + execa: 8.0.1 '@babel/code-frame@7.22.10': dependencies: '@babel/highlight': 7.22.10 chalk: 2.4.2 + '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-validator-identifier@7.22.20': {} '@babel/highlight@7.22.10': @@ -1767,15 +1928,36 @@ snapshots: chalk: 2.4.2 js-tokens: 4.0.0 - '@es-joy/jsdoccomment@0.41.0': + '@babel/parser@7.24.4': + dependencies: + '@babel/types': 7.24.0 + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@clack/core@0.3.4': + dependencies: + picocolors: 1.0.0 + sisteransi: 1.0.5 + + '@clack/prompts@0.7.0': + dependencies: + '@clack/core': 0.3.4 + picocolors: 1.0.0 + sisteransi: 1.0.5 + + '@es-joy/jsdoccomment@0.42.0': dependencies: comment-parser: 1.4.1 esquery: 1.5.0 jsdoc-type-pratt-parser: 4.0.0 - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.0.0)': dependencies: - eslint: 8.57.0 + eslint: 9.0.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.0': {} @@ -1794,9 +1976,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/eslintrc@3.0.2': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 10.0.1 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - '@humanwhocodes/config-array@0.11.14': + '@eslint/js@9.0.0': {} + + '@humanwhocodes/config-array@0.12.3': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 @@ -1817,6 +2013,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/sourcemap-codec@1.4.15': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1832,10 +2030,66 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@stylistic/eslint-plugin-js@1.7.2(eslint@9.0.0)': + dependencies: + '@types/eslint': 8.56.9 + acorn: 8.11.3 + escape-string-regexp: 4.0.0 + eslint: 9.0.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + + '@stylistic/eslint-plugin-jsx@1.7.2(eslint@9.0.0)': + dependencies: + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@types/eslint': 8.56.9 + eslint: 9.0.0 + estraverse: 5.3.0 + picomatch: 4.0.2 + + '@stylistic/eslint-plugin-plus@1.7.2(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@types/eslint': 8.56.9 + '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@stylistic/eslint-plugin-ts@1.7.2(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@types/eslint': 8.56.9 + '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@stylistic/eslint-plugin@1.7.2(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@stylistic/eslint-plugin-jsx': 1.7.2(eslint@9.0.0) + '@stylistic/eslint-plugin-plus': 1.7.2(eslint@9.0.0)(typescript@5.2.2) + '@stylistic/eslint-plugin-ts': 1.7.2(eslint@9.0.0)(typescript@5.2.2) + '@types/eslint': 8.56.9 + eslint: 9.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@types/eslint@8.56.9': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.1 '@types/node': 20.12.7 + optional: true '@types/json-schema@7.0.15': {} @@ -1844,41 +2098,33 @@ snapshots: '@types/jsonfile@6.1.1': dependencies: '@types/node': 20.12.7 + optional: true '@types/mdast@3.0.12': dependencies: '@types/unist': 2.0.7 - '@types/minimist@1.2.5': {} - - '@types/node@18.19.31': - dependencies: - undici-types: 5.26.5 - '@types/node@20.12.7': dependencies: undici-types: 5.26.5 + optional: true '@types/normalize-package-data@2.4.1': {} - '@types/ps-tree@1.1.6': {} - '@types/semver@7.5.8': {} '@types/unist@2.0.7': {} - '@types/which@3.0.3': {} - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2)': + '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/type-utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 - eslint: 8.57.0 + eslint: 9.0.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -1889,67 +2135,81 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2)': + '@typescript-eslint/parser@6.21.0(eslint@9.0.0)(typescript@5.2.2)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 - eslint: 8.57.0 + eslint: 9.0.0 + optionalDependencies: + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 9.0.0 optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.2.2)': + '@typescript-eslint/scope-manager@7.7.0': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + + '@typescript-eslint/type-utils@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + dependencies: + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.57.0 + eslint: 9.0.0 ts-api-utils: 1.3.0(typescript@5.2.2) optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2)': + '@typescript-eslint/types@7.7.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.2.2)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 + minimatch: 9.0.3 semver: 7.6.0 - tsutils: 3.21.0(typescript@5.2.2) + ts-api-utils: 1.3.0(typescript@5.2.2) optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.2.2)': + '@typescript-eslint/typescript-estree@7.7.0(typescript@5.2.2)': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 + minimatch: 9.0.4 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.2.2) optionalDependencies: @@ -1957,46 +2217,75 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.2.2)': + '@typescript-eslint/utils@6.21.0(eslint@9.0.0)(typescript@5.2.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.57.0 - eslint-scope: 5.1.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) + eslint: 9.0.0 semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.2.2)': + '@typescript-eslint/utils@7.7.0(eslint@9.0.0)(typescript@5.2.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) - eslint: 8.57.0 + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) + eslint: 9.0.0 semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@5.62.0': + '@typescript-eslint/visitor-keys@6.21.0': dependencies: - '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@6.21.0': + '@typescript-eslint/visitor-keys@7.7.0': dependencies: - '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/types': 7.7.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.2.0': {} + '@vue/compiler-core@3.4.23': + dependencies: + '@babel/parser': 7.24.4 + '@vue/shared': 3.4.23 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.23': + dependencies: + '@vue/compiler-core': 3.4.23 + '@vue/shared': 3.4.23 + + '@vue/compiler-sfc@3.4.23': + dependencies: + '@babel/parser': 7.24.4 + '@vue/compiler-core': 3.4.23 + '@vue/compiler-dom': 3.4.23 + '@vue/compiler-ssr': 3.4.23 + '@vue/shared': 3.4.23 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.23': + dependencies: + '@vue/compiler-dom': 3.4.23 + '@vue/shared': 3.4.23 + + '@vue/shared@3.4.23': {} acorn-jsx@5.3.2(acorn@8.11.3): dependencies: @@ -2100,11 +2389,14 @@ snapshots: dependencies: fill-range: 7.0.1 - builtin-modules@3.3.0: {} - - builtins@5.1.0: + browserslist@4.23.0: dependencies: - semver: 7.6.0 + caniuse-lite: 1.0.30001611 + electron-to-chromium: 1.4.741 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + builtin-modules@3.3.0: {} call-bind@1.0.7: dependencies: @@ -2116,6 +2408,8 @@ snapshots: callsites@3.1.0: {} + caniuse-lite@1.0.30001611: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -2127,20 +2421,24 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} - character-entities-legacy@1.1.4: {} character-entities@1.2.4: {} character-reference-invalid@1.1.4: {} - ci-info@3.9.0: {} + ci-info@4.0.0: {} clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -2157,8 +2455,14 @@ snapshots: concat-map@0.0.1: {} + confbox@0.1.7: {} + consola@3.2.3: {} + core-js-compat@3.37.0: + dependencies: + browserslist: 4.23.0 + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -2167,8 +2471,6 @@ snapshots: cssesc@3.0.0: {} - data-uri-to-buffer@4.0.1: {} - data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -2221,32 +2523,19 @@ snapshots: dependencies: esutils: 2.0.3 - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.1.0: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - duplexer@0.1.2: {} - eastasianwidth@0.2.0: {} + electron-to-chromium@1.4.741: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + enhanced-resolve@5.16.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + entities@4.5.0: {} error-ex@1.3.2: @@ -2328,34 +2617,46 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + escalade@3.1.2: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.0(eslint@8.57.0): + eslint-compat-utils@0.5.0(eslint@9.0.0): dependencies: - eslint: 8.57.0 + eslint: 9.0.0 semver: 7.6.0 - eslint-config-standard-with-typescript@38.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0)(typescript@5.2.2): + eslint-config-flat-gitignore@0.1.5: + dependencies: + find-up: 7.0.0 + parse-gitignore: 2.0.0 + + eslint-config-standard-with-typescript@43.0.1(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0)(typescript@5.2.2): dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - eslint: 8.57.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) - eslint-plugin-n: 16.6.2(eslint@8.57.0) - eslint-plugin-promise: 6.1.1(eslint@8.57.0) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.21.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) + eslint-plugin-n: 17.2.1(eslint@9.0.0) + eslint-plugin-promise: 6.1.1(eslint@9.0.0) typescript: 5.2.2 transitivePeerDependencies: - supports-color - eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0): + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0): dependencies: - eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0) - eslint-plugin-n: 16.6.2(eslint@8.57.0) - eslint-plugin-promise: 6.1.1(eslint@8.57.0) + eslint: 9.0.0 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) + eslint-plugin-n: 17.2.1(eslint@9.0.0) + eslint-plugin-promise: 6.1.1(eslint@9.0.0) + + eslint-flat-config-utils@0.2.3: + dependencies: + '@types/eslint': 8.56.9 + pathe: 1.1.2 eslint-import-resolver-node@0.3.9: dependencies: @@ -2365,60 +2666,53 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-merge-processors@0.1.0(eslint@9.0.0): + dependencies: + eslint: 9.0.0 + + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@9.0.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - eslint: 8.57.0 + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-antfu@0.41.4(eslint@8.57.0)(typescript@5.2.2): + eslint-plugin-antfu@2.1.2(eslint@9.0.0): dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - transitivePeerDependencies: - - eslint - - supports-color - - typescript + eslint: 9.0.0 - eslint-plugin-es-x@7.6.0(eslint@8.57.0): + eslint-plugin-es-x@7.6.0(eslint@9.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@eslint-community/regexpp': 4.10.0 - eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint: 9.0.0 + eslint-compat-utils: 0.5.0(eslint@9.0.0) - eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): + eslint-plugin-eslint-comments@3.2.0(eslint@9.0.0): dependencies: escape-string-regexp: 1.0.5 - eslint: 8.57.0 + eslint: 9.0.0 ignore: 5.3.1 - eslint-plugin-html@7.1.0: - dependencies: - htmlparser2: 8.0.2 - - eslint-plugin-i@2.28.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0): + eslint-plugin-import-x@0.5.0(eslint@9.0.0)(typescript@5.2.2): dependencies: - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + debug: 4.3.4 + doctrine: 3.0.0 + eslint: 9.0.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) get-tsconfig: 4.7.3 is-glob: 4.0.3 - minimatch: 3.1.2 - resolve: 1.22.4 + minimatch: 9.0.3 semver: 7.6.0 transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color + - typescript - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -2426,9 +2720,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.0 + eslint: 9.0.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@9.0.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -2439,30 +2733,20 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2): - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.2.2) - eslint: 8.57.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-jsdoc@46.10.1(eslint@8.57.0): + eslint-plugin-jsdoc@48.2.3(eslint@9.0.0): dependencies: - '@es-joy/jsdoccomment': 0.41.0 + '@es-joy/jsdoccomment': 0.42.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.3.4 escape-string-regexp: 4.0.0 - eslint: 8.57.0 + eslint: 9.0.0 esquery: 1.5.0 is-builtin-module: 3.2.1 semver: 7.6.0 @@ -2470,142 +2754,177 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.15.1(eslint@8.57.0): + eslint-plugin-jsonc@2.15.1(eslint@9.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + eslint: 9.0.0 + eslint-compat-utils: 0.5.0(eslint@9.0.0) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 synckit: 0.6.2 - eslint-plugin-markdown@3.0.1(eslint@8.57.0): + eslint-plugin-markdown@4.0.1(eslint@9.0.0): dependencies: - eslint: 8.57.0 + eslint: 9.0.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - eslint-plugin-n@16.6.2(eslint@8.57.0): + eslint-plugin-n@17.2.1(eslint@9.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - builtins: 5.1.0 - eslint: 8.57.0 - eslint-plugin-es-x: 7.6.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + enhanced-resolve: 5.16.0 + eslint: 9.0.0 + eslint-plugin-es-x: 7.6.0(eslint@9.0.0) get-tsconfig: 4.7.3 - globals: 13.24.0 + globals: 14.0.0 ignore: 5.3.1 - is-builtin-module: 3.2.1 - is-core-module: 2.13.0 - minimatch: 3.1.2 - resolve: 1.22.4 + minimatch: 9.0.3 semver: 7.6.0 eslint-plugin-no-only-tests@3.1.0: {} - eslint-plugin-promise@6.1.1(eslint@8.57.0): + eslint-plugin-perfectionist@2.9.0(eslint@9.0.0)(typescript@5.2.2)(vue-eslint-parser@9.4.2(eslint@9.0.0)): + dependencies: + '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + minimatch: 9.0.3 + natural-compare-lite: 1.4.0 + optionalDependencies: + vue-eslint-parser: 9.4.2(eslint@9.0.0) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-promise@6.1.1(eslint@9.0.0): + dependencies: + eslint: 9.0.0 + + eslint-plugin-toml@0.11.0(eslint@9.0.0): dependencies: - eslint: 8.57.0 + debug: 4.3.4 + eslint: 9.0.0 + eslint-compat-utils: 0.5.0(eslint@9.0.0) + lodash: 4.17.21 + toml-eslint-parser: 0.9.3 + transitivePeerDependencies: + - supports-color - eslint-plugin-unicorn@48.0.1(eslint@8.57.0): + eslint-plugin-unicorn@52.0.0(eslint@9.0.0): dependencies: '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - ci-info: 3.9.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@eslint/eslintrc': 2.1.4 + ci-info: 4.0.0 clean-regexp: 1.0.0 - eslint: 8.57.0 + core-js-compat: 3.37.0 + eslint: 9.0.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 jsesc: 3.0.2 - lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 semver: 7.6.0 strip-indent: 3.0.0 + transitivePeerDependencies: + - supports-color - eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0): + eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0): dependencies: - eslint: 8.57.0 + eslint: 9.0.0 eslint-rule-composer: 0.3.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + + eslint-plugin-vitest@0.5.3(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2): + dependencies: + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + eslint: 9.0.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + transitivePeerDependencies: + - supports-color + - typescript - eslint-plugin-vue@9.25.0(eslint@8.57.0): + eslint-plugin-vue@9.25.0(eslint@9.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - eslint: 8.57.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + eslint: 9.0.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.16 semver: 7.6.0 - vue-eslint-parser: 9.4.2(eslint@8.57.0) + vue-eslint-parser: 9.4.2(eslint@9.0.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-yml@1.14.0(eslint@8.57.0): + eslint-plugin-yml@1.14.0(eslint@9.0.0): dependencies: debug: 4.3.4 - eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint: 9.0.0 + eslint-compat-utils: 0.5.0(eslint@9.0.0) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - supports-color + eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.0.0): + dependencies: + '@vue/compiler-sfc': 3.4.23 + eslint: 9.0.0 + eslint-rule-composer@0.3.0: {} - eslint-scope@5.1.1: + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 - estraverse: 4.3.0 + estraverse: 5.3.0 - eslint-scope@7.2.2: + eslint-scope@8.0.1: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint@8.57.0: + eslint-visitor-keys@4.0.0: {} + + eslint@9.0.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/eslintrc': 3.0.2 + '@eslint/js': 9.0.0 + '@humanwhocodes/config-array': 0.12.3 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.0.1 + eslint-visitor-keys: 4.0.0 + espree: 10.0.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 graphemer: 1.4.0 ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -2617,6 +2936,12 @@ snapshots: transitivePeerDependencies: - supports-color + espree@10.0.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 4.0.0 + espree@9.6.1: dependencies: acorn: 8.11.3 @@ -2631,32 +2956,26 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} + estree-walker@2.0.2: {} + esutils@2.0.3: {} - event-stream@3.3.4: + execa@8.0.1: dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 fast-deep-equal@3.1.3: {} - fast-glob@3.2.12: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2673,14 +2992,9 @@ snapshots: dependencies: reusify: 1.0.4 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 fill-range@7.0.1: dependencies: @@ -2696,11 +3010,16 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + flat-cache@4.0.1: dependencies: flatted: 3.3.1 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.1: {} @@ -2713,20 +3032,6 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - - from@0.1.7: {} - - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs.realpath@1.0.0: {} - function-bind@1.1.1: {} function-bind@1.1.2: {} @@ -2740,7 +3045,7 @@ snapshots: functions-have-names@1.2.3: {} - fx@34.0.0: {} + get-caller-file@2.0.5: {} get-intrinsic@1.2.4: dependencies: @@ -2750,6 +3055,8 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-stream@8.0.1: {} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 @@ -2776,19 +3083,14 @@ snapshots: minipass: 7.0.3 path-scurry: 1.10.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - globals@13.24.0: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + + globals@15.0.0: {} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 @@ -2796,19 +3098,11 @@ snapshots: globby@11.1.0: dependencies: array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - - globby@13.2.2: - dependencies: dir-glob: 3.0.1 fast-glob: 3.3.2 ignore: 5.3.1 merge2: 1.4.1 - slash: 4.0.0 + slash: 3.0.0 gopd@1.0.1: dependencies: @@ -2846,12 +3140,7 @@ snapshots: hosted-git-info@2.8.9: {} - htmlparser2@8.0.2: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 + human-signals@5.0.0: {} ignore@5.3.1: {} @@ -2864,13 +3153,6 @@ snapshots: indent-string@4.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - internal-slot@1.0.7: dependencies: es-errors: 1.3.0 @@ -2953,6 +3235,8 @@ snapshots: dependencies: call-bind: 1.0.7 + is-stream@3.0.0: {} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -3012,12 +3296,6 @@ snapshots: espree: 9.6.1 semver: 7.6.0 - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -3029,7 +3307,10 @@ snapshots: lines-and-columns@1.2.4: {} - local-pkg@0.4.3: {} + local-pkg@0.5.0: + dependencies: + mlly: 1.6.1 + pkg-types: 1.1.0 locate-path@5.0.0: dependencies: @@ -3039,6 +3320,10 @@ snapshots: dependencies: p-locate: 5.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + lodash.merge@4.6.2: {} lodash@4.17.21: {} @@ -3049,7 +3334,9 @@ snapshots: dependencies: yallist: 4.0.0 - map-stream@0.1.0: {} + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 mdast-util-from-markdown@0.8.5: dependencies: @@ -3063,6 +3350,8 @@ snapshots: mdast-util-to-string@2.0.0: {} + merge-stream@2.0.0: {} + merge2@1.4.1: {} micromark@2.11.4: @@ -3077,6 +3366,8 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 + mimic-fn@4.0.0: {} + min-indent@1.0.1: {} minimatch@3.1.2: @@ -3087,23 +3378,32 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + minimist@1.2.8: {} minipass@7.0.3: {} + mlly@1.6.1: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.1.0 + ufo: 1.5.3 + ms@2.1.2: {} ms@2.1.3: {} - natural-compare@1.4.0: {} + nanoid@3.3.7: {} - node-domexception@1.0.0: {} + natural-compare-lite@1.4.0: {} - node-fetch@3.3.1: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 + natural-compare@1.4.0: {} + + node-releases@2.0.14: {} normalize-package-data@2.5.0: dependencies: @@ -3112,6 +3412,10 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -3146,9 +3450,9 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - once@1.4.0: + onetime@6.0.0: dependencies: - wrappy: 1.0.2 + mimic-fn: 4.0.0 optionator@0.9.3: dependencies: @@ -3167,6 +3471,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.0.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -3175,6 +3483,10 @@ snapshots: dependencies: p-limit: 3.1.0 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + p-try@2.2.0: {} parent-module@1.0.1: @@ -3190,6 +3502,8 @@ snapshots: is-decimal: 1.0.4 is-hexadecimal: 1.0.4 + parse-gitignore@2.0.0: {} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.22.10 @@ -3199,10 +3513,12 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} + path-exists@5.0.0: {} path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.10.1: @@ -3214,12 +3530,20 @@ snapshots: pathe@1.1.1: {} - pause-stream@0.0.11: - dependencies: - through: 2.3.8 + pathe@1.1.2: {} + + picocolors@1.0.0: {} picomatch@2.3.1: {} + picomatch@4.0.2: {} + + pkg-types@1.1.0: + dependencies: + confbox: 0.1.7 + mlly: 1.6.1 + pathe: 1.1.2 + pluralize@8.0.0: {} possible-typed-array-names@1.0.0: {} @@ -3229,11 +3553,13 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - prelude-ls@1.2.1: {} - - ps-tree@1.2.0: + postcss@8.4.38: dependencies: - event-stream: 3.3.4 + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} punycode@2.3.0: {} @@ -3265,6 +3591,8 @@ snapshots: dependencies: jsesc: 0.5.0 + require-directory@2.1.1: {} + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -3277,10 +3605,6 @@ snapshots: reusify@1.0.4: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -3337,9 +3661,11 @@ snapshots: signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + slash@3.0.0: {} - slash@4.0.0: {} + source-map-js@1.2.0: {} spdx-correct@3.2.0: dependencies: @@ -3360,14 +3686,6 @@ snapshots: spdx-license-ids@3.0.13: {} - split@0.3.3: - dependencies: - through: 2.3.8 - - stream-combiner@0.0.4: - dependencies: - duplexer: 0.1.2 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3409,6 +3727,8 @@ snapshots: strip-bom@3.0.0: {} + strip-final-newline@3.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -3429,14 +3749,20 @@ snapshots: dependencies: tslib: 2.6.2 + tapable@2.2.1: {} + text-table@0.2.0: {} - through@2.3.8: {} + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + toml-eslint-parser@0.9.3: + dependencies: + eslint-visitor-keys: 3.4.3 + ts-api-utils@1.3.0(typescript@5.2.2): dependencies: typescript: 5.2.2 @@ -3448,15 +3774,8 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@1.14.1: {} - tslib@2.6.2: {} - tsutils@3.21.0(typescript@5.2.2): - dependencies: - tslib: 1.14.1 - typescript: 5.2.2 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -3501,6 +3820,8 @@ snapshots: typescript@5.2.2: {} + ufo@1.5.3: {} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 @@ -3508,13 +3829,20 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} + undici-types@5.26.5: + optional: true + + unicorn-magic@0.1.0: {} unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.7 - universalify@2.0.1: {} + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 uri-js@4.4.1: dependencies: @@ -3527,10 +3855,10 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vue-eslint-parser@9.4.2(eslint@8.57.0): + vue-eslint-parser@9.4.2(eslint@9.0.0): dependencies: debug: 4.3.4 - eslint: 8.57.0 + eslint: 9.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -3540,10 +3868,6 @@ snapshots: transitivePeerDependencies: - supports-color - web-streams-polyfill@3.3.3: {} - - webpod@0.0.2: {} - which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -3564,10 +3888,6 @@ snapshots: dependencies: isexe: 2.0.0 - which@3.0.1: - dependencies: - isexe: 2.0.0 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -3580,10 +3900,10 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} - xml-name-validator@4.0.0: {} + y18n@5.0.8: {} + yallist@4.0.0: {} yaml-eslint-parser@1.2.2: @@ -3594,22 +3914,23 @@ snapshots: yaml@2.2.2: {} - yocto-queue@0.1.0: {} + yargs-parser@21.1.1: {} - zx@7.2.3: + yargs@17.7.2: dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yocto-queue@1.0.0: {} + + zx@8.0.1: + optionalDependencies: '@types/fs-extra': 11.0.4 - '@types/minimist': 1.2.5 - '@types/node': 18.19.31 - '@types/ps-tree': 1.1.6 - '@types/which': 3.0.3 - chalk: 5.3.0 - fs-extra: 11.2.0 - fx: 34.0.0 - globby: 13.2.2 - minimist: 1.2.8 - node-fetch: 3.3.1 - ps-tree: 1.2.0 - webpod: 0.0.2 - which: 3.0.1 - yaml: 2.2.2 + '@types/node': 20.12.7 diff --git a/scripts/remove-useless-md.mjs b/scripts/remove-useless-md.mjs index 8ee35b199..2fb93f0ac 100644 --- a/scripts/remove-useless-md.mjs +++ b/scripts/remove-useless-md.mjs @@ -25,7 +25,7 @@ if (!dstFile) { consola.info(`Read file ${srcFile}`) const file = readline.createInterface({ input: fs.createReadStream(srcFile), - crlfDelay: Number.POSITIVE_INFINITY + crlfDelay: Number.POSITIVE_INFINITY, }) // Write to file From 461529538e4445ad0c021599e87dd09d0d9db245 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Wed, 1 May 2024 21:18:54 +0200 Subject: [PATCH 226/344] fix: update pip after venv creation to be able to do it without admin right --- packages/python/proto2python.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh index f6343a67c..bb090459b 100755 --- a/packages/python/proto2python.sh +++ b/packages/python/proto2python.sh @@ -29,9 +29,9 @@ mkdir -p $ARMONIK_WORKER $ARMONIK_CLIENT $ARMONIK_COMMON $PACKAGE_PATH # for debian/ubuntu if you don't have python 3 installed: # sudo apt install python3-venv python3 python-is-python3 python3-pip -python -m pip install --upgrade pip python -m venv $PYTHON_VENV source $PYTHON_VENV/bin/activate +python -m pip install --upgrade pip python -m pip install build grpcio grpcio-tools setuptools_scm[toml] unset proto_files From 8d402954de91fe02fad9cb1ddd417da84dbece1d Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Wed, 1 May 2024 21:25:33 +0200 Subject: [PATCH 227/344] chore: update python api to new protos move python argument in dataclass to be in the same order than in the protos --- .../python/src/armonik/common/enumwrapper.py | 82 ++++++++++--------- packages/python/src/armonik/common/filter.py | 54 ++++++------ packages/python/src/armonik/common/objects.py | 30 ++++++- packages/python/tests/test_tasks.py | 5 +- 4 files changed, 104 insertions(+), 67 deletions(-) diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 43d7a1825..5868031f4 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -2,17 +2,17 @@ from enum import IntEnum from ..protogen.common.task_status_pb2 import ( - TASK_STATUS_CANCELLED, - TASK_STATUS_CANCELLING, - TASK_STATUS_COMPLETED, + TASK_STATUS_UNSPECIFIED, TASK_STATUS_CREATING, + TASK_STATUS_SUBMITTED, TASK_STATUS_DISPATCHED, + TASK_STATUS_COMPLETED, TASK_STATUS_ERROR, - TASK_STATUS_PROCESSED, - TASK_STATUS_PROCESSING, - TASK_STATUS_SUBMITTED, TASK_STATUS_TIMEOUT, - TASK_STATUS_UNSPECIFIED, + TASK_STATUS_CANCELLING, + TASK_STATUS_CANCELLED, + TASK_STATUS_PROCESSING, + TASK_STATUS_PROCESSED, TASK_STATUS_RETRIED, ) from ..protogen.common.events_common_pb2 import ( @@ -27,8 +27,12 @@ SessionStatus as RawSessionStatus, _SESSIONSTATUS, SESSION_STATUS_UNSPECIFIED, - SESSION_STATUS_CANCELLED, SESSION_STATUS_RUNNING, + SESSION_STATUS_CANCELLED, + SESSION_STATUS_PAUSED, + SESSION_STATUS_CLOSED, + SESSION_STATUS_PURGED, + SESSION_STATUS_DELETED, ) from ..protogen.common.result_status_pb2 import ( ResultStatus as RawResultStatus, @@ -52,30 +56,32 @@ # This file is necessary because the grpc types aren't considered proper types -class HealthCheckStatus: - NOT_SERVING = HealthCheckReply.NOT_SERVING - SERVING = HealthCheckReply.SERVING - UNKNOWN = HealthCheckReply.UNKNOWN - - class TaskStatus(IntEnum): - CANCELLED = TASK_STATUS_CANCELLED - CANCELLING = TASK_STATUS_CANCELLING - COMPLETED = TASK_STATUS_COMPLETED + UNSPECIFIED = TASK_STATUS_UNSPECIFIED CREATING = TASK_STATUS_CREATING + SUBMITTED = TASK_STATUS_SUBMITTED DISPATCHED = TASK_STATUS_DISPATCHED + COMPLETED = TASK_STATUS_COMPLETED ERROR = TASK_STATUS_ERROR - PROCESSED = TASK_STATUS_PROCESSED + TIMEOUT = TASK_STATUS_TIMEOUT + CANCELLING = TASK_STATUS_CANCELLING + CANCELLED = TASK_STATUS_CANCELLED PROCESSING = TASK_STATUS_PROCESSING - SUBMITTED = TASK_STATUS_SUBMITTED + PROCESSED = TASK_STATUS_PROCESSED RETRIED = TASK_STATUS_RETRIED - TIMEOUT = TASK_STATUS_TIMEOUT - UNSPECIFIED = TASK_STATUS_UNSPECIFIED -class Direction: - ASC = SORT_DIRECTION_ASC - DESC = SORT_DIRECTION_DESC +class EventTypes: + UNSPECIFIED = EVENTS_ENUM_UNSPECIFIED + NEW_TASK = EVENTS_ENUM_NEW_TASK + TASK_STATUS_UPDATE = EVENTS_ENUM_TASK_STATUS_UPDATE + NEW_RESULT = EVENTS_ENUM_NEW_RESULT + RESULT_STATUS_UPDATE = EVENTS_ENUM_RESULT_STATUS_UPDATE + RESULT_OWNER_UPDATE = EVENTS_ENUM_RESULT_OWNER_UPDATE + + @classmethod + def from_string(cls, name: str): + return getattr(cls, name.upper()) class SessionStatus: @@ -86,6 +92,10 @@ def name_from_value(status: RawSessionStatus) -> str: UNSPECIFIED = SESSION_STATUS_UNSPECIFIED RUNNING = SESSION_STATUS_RUNNING CANCELLED = SESSION_STATUS_CANCELLED + PAUSED = SESSION_STATUS_PAUSED + CLOSED = SESSION_STATUS_CLOSED + PURGED = SESSION_STATUS_PURGED + DELETED = SESSION_STATUS_DELETED class ResultStatus: @@ -101,21 +111,19 @@ def name_from_value(status: RawResultStatus) -> str: NOTFOUND = RESULT_STATUS_NOTFOUND -class EventTypes: - UNSPECIFIED = EVENTS_ENUM_UNSPECIFIED - NEW_TASK = EVENTS_ENUM_NEW_TASK - TASK_STATUS_UPDATE = EVENTS_ENUM_TASK_STATUS_UPDATE - NEW_RESULT = EVENTS_ENUM_NEW_RESULT - RESULT_STATUS_UPDATE = EVENTS_ENUM_RESULT_STATUS_UPDATE - RESULT_OWNER_UPDATE = EVENTS_ENUM_RESULT_OWNER_UPDATE - - @classmethod - def from_string(cls, name: str): - return getattr(cls, name.upper()) - - class ServiceHealthCheckStatus: UNSPECIFIED = HEALTH_STATUS_ENUM_UNSPECIFIED HEALTHY = HEALTH_STATUS_ENUM_HEALTHY DEGRADED = HEALTH_STATUS_ENUM_DEGRADED UNHEALTHY = HEALTH_STATUS_ENUM_UNHEALTHY + + +class HealthCheckStatus: + UNKNOWN = HealthCheckReply.UNKNOWN + SERVING = HealthCheckReply.SERVING + NOT_SERVING = HealthCheckReply.NOT_SERVING + + +class Direction: + ASC = SORT_DIRECTION_ASC + DESC = SORT_DIRECTION_DESC diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py index 56456a885..f23c3f9bf 100644 --- a/packages/python/src/armonik/common/filter.py +++ b/packages/python/src/armonik/common/filter.py @@ -9,41 +9,41 @@ from google.protobuf.message import Message from ..protogen.common.filters_common_pb2 import ( + FILTER_STRING_OPERATOR_EQUAL, + FILTER_STRING_OPERATOR_NOT_EQUAL, + FILTER_STRING_OPERATOR_CONTAINS, + FILTER_STRING_OPERATOR_NOT_CONTAINS, + FILTER_STRING_OPERATOR_STARTS_WITH, + FILTER_STRING_OPERATOR_ENDS_WITH, + FilterString, + FILTER_NUMBER_OPERATOR_EQUAL, + FILTER_NUMBER_OPERATOR_NOT_EQUAL, + FILTER_NUMBER_OPERATOR_LESS_THAN, + FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL, + FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL, + FILTER_NUMBER_OPERATOR_GREATER_THAN, + FilterNumber, + FILTER_DATE_OPERATOR_EQUAL, + FILTER_DATE_OPERATOR_NOT_EQUAL, + FILTER_DATE_OPERATOR_BEFORE, + FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL, + FILTER_DATE_OPERATOR_AFTER, + FILTER_DATE_OPERATOR_AFTER_OR_EQUAL, + FilterDate, FILTER_ARRAY_OPERATOR_CONTAINS, FILTER_ARRAY_OPERATOR_NOT_CONTAINS, + FilterArray, + FILTER_STATUS_OPERATOR_EQUAL, + FILTER_STATUS_OPERATOR_NOT_EQUAL, FILTER_BOOLEAN_OPERATOR_IS, - FILTER_DATE_OPERATOR_AFTER, - FILTER_DATE_OPERATOR_AFTER_OR_EQUAL, - FILTER_DATE_OPERATOR_BEFORE, - FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL, - FILTER_DATE_OPERATOR_EQUAL, - FILTER_DATE_OPERATOR_NOT_EQUAL, + FilterBoolean, FILTER_DURATION_OPERATOR_EQUAL, - FILTER_DURATION_OPERATOR_LONGER_THAN, - FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL, FILTER_DURATION_OPERATOR_NOT_EQUAL, FILTER_DURATION_OPERATOR_SHORTER_THAN, FILTER_DURATION_OPERATOR_SHORTER_THAN_OR_EQUAL, - FILTER_NUMBER_OPERATOR_EQUAL, - FILTER_NUMBER_OPERATOR_GREATER_THAN, - FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL, - FILTER_NUMBER_OPERATOR_LESS_THAN, - FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL, - FILTER_NUMBER_OPERATOR_NOT_EQUAL, - FILTER_STATUS_OPERATOR_EQUAL, - FILTER_STATUS_OPERATOR_NOT_EQUAL, - FILTER_STRING_OPERATOR_CONTAINS, - FILTER_STRING_OPERATOR_ENDS_WITH, - FILTER_STRING_OPERATOR_EQUAL, - FILTER_STRING_OPERATOR_NOT_CONTAINS, - FILTER_STRING_OPERATOR_NOT_EQUAL, - FILTER_STRING_OPERATOR_STARTS_WITH, - FilterArray, - FilterBoolean, - FilterDate, + FILTER_DURATION_OPERATOR_LONGER_THAN, + FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL, FilterDuration, - FilterNumber, - FilterString, ) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index e3948455f..ead6d712e 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -4,6 +4,8 @@ from datetime import datetime, timedelta from typing import Dict, List, Optional +from deprecation import deprecated + from ..protogen.common.objects_pb2 import ( Empty, ) @@ -99,13 +101,16 @@ class Task: id: Optional[str] = None session_id: Optional[str] = None owner_pod_id: Optional[str] = None + + initial_task_id: Optional[str] = None parent_task_ids: List[str] = field(default_factory=list) data_dependencies: List[str] = field(default_factory=list) expected_output_ids: List[str] = field(default_factory=list) retry_of_ids: List[str] = field(default_factory=list) + status: RawTaskStatus = TaskStatus.UNSPECIFIED - payload_id: Optional[str] = None status_message: Optional[str] = None + options: Optional[TaskOptions] = None created_at: Optional[datetime] = None submitted_at: Optional[datetime] = None @@ -116,7 +121,13 @@ class Task: processed_at: Optional[datetime] = None ended_at: Optional[datetime] = None pod_ttl: Optional[datetime] = None + + creation_to_end_duration: Optional[timedelta] = timedelta(0) + processing_to_end_duration: Optional[timedelta] = timedelta(0) + received_to_end_duration: Optional[timedelta] = timedelta(0) + output: Optional[Output] = None + pod_hostname: Optional[str] = None def refresh(self, task_client) -> None: @@ -128,12 +139,16 @@ def refresh(self, task_client) -> None: result: "Task" = task_client.get_task(self.id) self.session_id = result.session_id self.owner_pod_id = result.owner_pod_id + + self.initial_task_id = result.initial_task_id self.parent_task_ids = result.parent_task_ids self.data_dependencies = result.data_dependencies self.expected_output_ids = result.expected_output_ids self.retry_of_ids = result.retry_of_ids + self.status = result.status self.status_message = result.status_message + self.options = result.options self.created_at = result.created_at self.submitted_at = result.submitted_at @@ -144,7 +159,13 @@ def refresh(self, task_client) -> None: self.processed_at = result.processed_at self.ended_at = result.ended_at self.pod_ttl = result.pod_ttl + + self.creation_to_end_duration = result.creation_to_end_duration + self.processing_to_end_duration = result.processing_to_end_duration + self.received_to_end_duration = result.received_to_end_duration + self.output = result.output + self.pod_hostname = result.pod_hostname self.is_init = True @@ -154,6 +175,7 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": id=task_raw.id, session_id=task_raw.session_id, owner_pod_id=task_raw.owner_pod_id, + initial_task_id=task_raw.initial_task_id, parent_task_ids=list(task_raw.parent_task_ids), data_dependencies=list(task_raw.data_dependencies), expected_output_ids=list(task_raw.expected_output_ids), @@ -170,12 +192,16 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": processed_at=timestamp_to_datetime(task_raw.processed_at), ended_at=timestamp_to_datetime(task_raw.ended_at), pod_ttl=timestamp_to_datetime(task_raw.pod_ttl), + creation_to_end_duration=duration_to_timedelta(task_raw.creation_to_end_duration), + processing_to_end_duration=duration_to_timedelta(task_raw.processing_to_end_duration), + received_to_end_duration=duration_to_timedelta(task_raw.received_to_end_duration), output=Output(error=(task_raw.output.error if not task_raw.output.success else None)), pod_hostname=task_raw.pod_hostname, ) -@dataclass() +@deprecated(deprecated_in="3.14.0", details="Use sessions, task and results client instead") +@dataclass class ResultAvailability: errors: List[str] = field(default_factory=list) diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py index 6c5eb4593..cbfbe4404 100644 --- a/packages/python/tests/test_tasks.py +++ b/packages/python/tests/test_tasks.py @@ -10,12 +10,12 @@ class TestArmoniKTasks: id="task-id", session_id="session-id", owner_pod_id="", + initial_task_id="", parent_task_ids=[], data_dependencies=[], expected_output_ids=[], retry_of_ids=[], status=4, - payload_id=None, status_message="", options=TaskOptions( max_duration=datetime.timedelta(seconds=1), @@ -38,6 +38,9 @@ class TestArmoniKTasks: processed_at=None, ended_at=None, pod_ttl=None, + creation_to_end_duration=datetime.timedelta(0), + processing_to_end_duration=datetime.timedelta(0), + received_to_end_duration=datetime.timedelta(0), output=Output(error=""), pod_hostname="", ) From 97d32d15cf113a51beb18804aec9e0e37663ee37 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Thu, 2 May 2024 19:55:08 +0200 Subject: [PATCH 228/344] ci: add uv to speed up python package management --- .github/workflows/ci.yml | 17 +++++++++++++---- packages/python/proto2python.sh | 4 ++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95e225889..5d45d0788 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -91,16 +91,25 @@ jobs: run: bash proto2python.sh ~/pyvenv - name: Install dependencies - run: pip install "$(echo pkg/armonik*.whl)[dev]" + run: | + source ~/pyvenv/bin/activate + python -m pip install uv + python -m uv pip install "$(echo pkg/armonik*.whl)[dev]" - name: Lint - run: python -m ruff check . + run: | + source ~/pyvenv/bin/activate + python -m ruff check . # - name: Check typing - # run: python -m mypy --exclude src/armonik/protogen/ src/ + # run: | + # source ~/pyvenv/bin/activate + # python -m mypy --exclude src/armonik/protogen/ src/ - name: Check format - run: python -m ruff format . + run: | + source ~/pyvenv/bin/activate + python -m ruff format . - name: Check Diff run: | diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh index bb090459b..9b2aa93cf 100755 --- a/packages/python/proto2python.sh +++ b/packages/python/proto2python.sh @@ -31,8 +31,8 @@ mkdir -p $ARMONIK_WORKER $ARMONIK_CLIENT $ARMONIK_COMMON $PACKAGE_PATH python -m venv $PYTHON_VENV source $PYTHON_VENV/bin/activate -python -m pip install --upgrade pip -python -m pip install build grpcio grpcio-tools setuptools_scm[toml] +python -m pip install uv +python -m uv pip install build grpcio grpcio-tools setuptools_scm[toml] unset proto_files for proto in ${armonik_worker_files[@]}; do From 95d3f6edb4f65c16662cb5e6db581b9c2270bcc9 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Fri, 3 May 2024 11:57:23 +0200 Subject: [PATCH 229/344] Fix dependency injection --- .../ArmoniK.Api.Worker/Utils/WorkerServer.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs index d2b955aa5..4335b24b7 100644 --- a/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs +++ b/packages/csharp/ArmoniK.Api.Worker/Utils/WorkerServer.cs @@ -110,20 +110,20 @@ public static WebApplication Create(Action(); + var computePlaneOptions = builder.Configuration.GetRequiredSection(ComputePlane.SettingSection) + .Get(); - if (computePlanOptions?.WorkerChannel is null) + if (computePlaneOptions?.WorkerChannel is null) { - throw new Exception($"{nameof(computePlanOptions.WorkerChannel)} options should not be null"); + throw new Exception($"{nameof(computePlaneOptions.WorkerChannel)} options should not be null"); } - builder.WebHost.ConfigureKestrel(options => options.ListenUnixSocket(computePlanOptions.WorkerChannel.Address, + builder.WebHost.ConfigureKestrel(options => options.ListenUnixSocket(computePlaneOptions.WorkerChannel.Address, listenOptions => { - if (File.Exists(computePlanOptions.WorkerChannel.Address)) + if (File.Exists(computePlaneOptions.WorkerChannel.Address)) { - File.Delete(computePlanOptions.WorkerChannel.Address); + File.Delete(computePlaneOptions.WorkerChannel.Address); } listenOptions.Protocols = HttpProtocols.Http2; @@ -132,7 +132,8 @@ public static WebApplication Create(Action() .AddSingleton(_ => loggerFactory) .AddSingleton() - .AddSingleton(computePlanOptions.AgentChannel) + .AddSingleton(computePlaneOptions) + .AddSingleton(computePlaneOptions.AgentChannel) .AddLogging() .AddGrpcReflection() .AddGrpc(options => options.MaxReceiveMessageSize = null); From f2b4a9a3d5b8ce30e6e1c46cdb5b9e1dfc4dc879 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Tue, 7 May 2024 15:08:33 +0200 Subject: [PATCH 230/344] chore: update files to version 3.17.1 # Conflicts: # packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json # packages/cpp/CMakeLists.txt # packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj # packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj # packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj # packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj # packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj # packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj # packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj # packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj # packages/web/package.json --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 9bdf7e010..714f172b3 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.17.0", + "version": "3.17.1", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index ccf9ca500..bf5fc4627 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.17.0) +set(version 3.17.1) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index b3d16eebf..b9cdd78e8 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.17.0 - 3.17.0 + 3.17.1 + 3.17.1 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index ee8a9d8b4..90ecf815b 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.17.0 - 3.17.0 + 3.17.1 + 3.17.1 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index d7705d526..c55bbbf3c 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.17.0 - 3.17.0 + 3.17.1 + 3.17.1 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 6ea6856f3..6a7090417 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.17.0 - 3.17.0 + 3.17.1 + 3.17.1 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index dab31714c..dc0187fe8 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.17.0 - 3.17.0 + 3.17.1 + 3.17.1 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 91471e0fe..5866ba1bd 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.17.0 - 3.17.0 + 3.17.1 + 3.17.1 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index e729b0738..2a3323624 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.17.0 - 3.17.0 + 3.17.1 + 3.17.1 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 52dd565ad..ba4960e2d 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.17.0 - 3.17.0 + 3.17.1 + 3.17.1 True True diff --git a/packages/web/package.json b/packages/web/package.json index 6d73913f3..bb1d384ca 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.17.0", + "version": "3.17.1", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", From e405a48fd8b2b0f2a559342919f83bcc0fa52088 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Fri, 17 May 2024 14:25:52 +0200 Subject: [PATCH 231/344] Add TLS support for Mock --- .../ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 3 +- packages/csharp/ArmoniK.Api.Mock/Program.cs | 99 ++++++++++++++++++- scripts/certs.sh | 19 ++++ 3 files changed, 117 insertions(+), 4 deletions(-) create mode 100755 scripts/certs.sh diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 5866ba1bd..d7d27ffbd 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 ANEO Copyright (C) ANEO, 2023 Apache-2.0 @@ -20,6 +20,7 @@ + diff --git a/packages/csharp/ArmoniK.Api.Mock/Program.cs b/packages/csharp/ArmoniK.Api.Mock/Program.cs index afc5dc583..2f5fd31c4 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Program.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Program.cs @@ -16,16 +16,20 @@ using System.Collections.Generic; using System.IO; +using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; using ArmoniK.Api.Mock; using ArmoniK.Api.Mock.Services; +using Microsoft.AspNetCore.Authentication.Certificate; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Server.Kestrel.Core; +using Microsoft.AspNetCore.Server.Kestrel.Https; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -48,27 +52,116 @@ .GetSection("Port") .Value ?? "5001"); +X509Certificate2? serverCert = null; +string? clientCertPath = null; + +var serverCertPath = builder.Configuration.GetSection("Http") + .GetSection("Cert") + .Value ?? ""; + +var serverKeyPath = builder.Configuration.GetSection("Http") + .GetSection("Key") + .Value ?? ""; +clientCertPath = builder.Configuration.GetSection("Http") + .GetSection("ClientCert") + .Value; +if (string.IsNullOrEmpty(clientCertPath)) +{ + clientCertPath = null; +} + +if (!string.IsNullOrEmpty(serverCertPath)) +{ + serverCert = X509Certificate2.CreateFromPemFile(serverCertPath, + string.IsNullOrEmpty(serverKeyPath) + ? null + : serverKeyPath); + serverCert = new X509Certificate2(serverCert.Export(X509ContentType.Pfx)); +} + + // Additional configuration is required to successfully run gRPC on macOS. // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682 // Add services to the container. builder.Services.AddGrpc(); +builder.Services.AddLogging(); foreach (var service in CountingService.GetServices()) { builder.Services.AddSingleton(service); } +if (clientCertPath is not null) +{ + builder.Services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme) + .AddCertificate(options => + { + options.AllowedCertificateTypes = CertificateTypes.Chained; + options.RevocationMode = X509RevocationMode.NoCheck; + options.ChainTrustValidationMode = X509ChainTrustMode.CustomRootTrust; + options.CustomTrustStore.ImportFromPemFile(clientCertPath); + options.Events = new CertificateAuthenticationEvents + { + OnAuthenticationFailed = context => + { + context.Fail("Auth failure: Bad Client Certificate"); + + return Task.CompletedTask; + }, + }; + }); + + builder.Services.AddAuthorizationBuilder() + .SetFallbackPolicy(new AuthorizationPolicyBuilder().RequireAuthenticatedUser() + .Build()); +} + builder.WebHost.UseKestrel(options => { + options.ConfigureHttpsDefaults(configureOptions => + { + configureOptions.ServerCertificate = serverCert; + + if (clientCertPath is not null) + { + configureOptions.ClientCertificateMode = ClientCertificateMode.RequireCertificate; + configureOptions.AllowAnyClientCertificate(); + } + }); + options.ListenAnyIP(httpPort, - listenOptions => listenOptions.Protocols = HttpProtocols.Http1); - options.ListenAnyIP(grpcPort, - listenOptions => listenOptions.Protocols = HttpProtocols.Http2); + listenOptions => + { + listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3; + if (serverCert is not null) + { + listenOptions.UseHttps(); + } + }); + if (grpcPort != httpPort) + { + options.ListenAnyIP(grpcPort, + listenOptions => + { + listenOptions.Protocols = HttpProtocols.Http2; + if (serverCert is not null) + { + listenOptions.UseHttps(); + } + }); + } }); var app = builder.Build(); app.UseRouting(); + +if (clientCertPath is not null) +{ + app.UseAuthentication(); + app.UseAuthorization(); +} + app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true, diff --git a/scripts/certs.sh b/scripts/certs.sh new file mode 100755 index 000000000..eb6b73f4b --- /dev/null +++ b/scripts/certs.sh @@ -0,0 +1,19 @@ +#! /bin/sh + +set -ex + +chain() { + openssl req -x509 -newkey rsa:4096 -days 3650 -nodes -keyout "$1-ca.key" -out "$1-ca.pem" -subj "/C=FR/ST=France/L=/O=ArmoniK Ingress Root (NonTrusted)/OU=/CN=ArmoniK Ingress Root (NonTrusted) Private Certificate Authority/emailAddress=" + + openssl genrsa -out "$1.key" 4096 + openssl req -new -key "$1".key -out "$1".csr -subj "/C=FR/ST=France/L=/O=ArmoniK Ingress Root (NonTrusted)/OU=/CN=${2:-ArmoniK Root (NonTrusted}/emailAddress=" + + cat > "$1.cnf" < Date: Mon, 20 May 2024 14:23:39 +0200 Subject: [PATCH 232/344] Add connectivity tests --- .../ArmoniK.Api.Client.Tests.csproj | 4 +- .../ConnectivityKind.cs | 120 ++++++++++++++++++ .../ConnectivityTest.cs | 43 +++++++ 3 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs create mode 100644 packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index b9cdd78e8..96c3cd41e 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -1,9 +1,9 @@ - net6.0 + net4.7;net4.8;net6.0;net8.0 ANEO - Copyright (C) ANEO, 2021-2022 + Copyright (C) ANEO, 2021-2024 false 10 true diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs new file mode 100644 index 000000000..9cf0b7f29 --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs @@ -0,0 +1,120 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2024. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY, without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.IO; + +using ArmoniK.Api.Client.Options; +using ArmoniK.Api.Client.Submitter; + +using Grpc.Core; + +using NUnit.Framework; + +namespace ArmoniK.Api.Client.Tests; + +public enum ConnectivityKind +{ + Unencrypted, + TlsInsecure, + TlsCert, + TlsStore, + MTlsInsecure, + MTlsCert, + MTlsStore, +} + +internal static class ConnectivityKindExt +{ + private const string CertFolder = "../../../../certs"; + + internal static bool IsTls(this ConnectivityKind kind) + => kind switch + { + ConnectivityKind.Unencrypted => false, + _ => true, + }; + + internal static bool IsInsecure(this ConnectivityKind kind) + => kind switch + { + ConnectivityKind.Unencrypted or ConnectivityKind.TlsInsecure or ConnectivityKind.MTlsInsecure => true, + _ => false, + }; + + internal static bool IsMTls(this ConnectivityKind kind) + => kind switch + { + ConnectivityKind.MTlsInsecure => true, + ConnectivityKind.MTlsCert => true, + ConnectivityKind.MTlsStore => true, + _ => false, + }; + + internal static string? GetCaCertPath(this ConnectivityKind kind) + => kind switch + { + ConnectivityKind.TlsCert or ConnectivityKind.MTlsCert => Path.Combine(CertFolder, + "server-ca.pem"), + _ => null, + }; + + internal static (string?, string?) GetClientCertPath(this ConnectivityKind kind) + => kind.IsMTls() + ? (Path.Combine(CertFolder, + "client.pem"), Path.Combine(CertFolder, + "client.key")) + : (null, null); + + internal static string GetEndpoint(this ConnectivityKind kind) + => kind switch + { + ConnectivityKind.Unencrypted => "http://localhost:5000", + ConnectivityKind.TlsInsecure => "https://localhost:5001", + ConnectivityKind.TlsCert => "https://localhost:5001", + ConnectivityKind.TlsStore => "https://localhost:5001", + ConnectivityKind.MTlsInsecure => "https://localhost:5002", + ConnectivityKind.MTlsCert => "https://localhost:5002", + ConnectivityKind.MTlsStore => "https://localhost:5002", + _ => "http://localhost:5000", + }; + + internal static ChannelBase GetChannel(this ConnectivityKind kind) + { + var (certPath, keyPath) = kind.GetClientCertPath(); + + if (kind.GetCaCertPath() is not null && false) + { + Assert.Inconclusive("CA is not yet supported"); + } + + return GrpcChannelFactory.CreateChannel(new GrpcClient + { + Endpoint = kind.GetEndpoint(), + AllowUnsafeConnection = kind.IsInsecure(), + CertPem = certPath ?? "", + KeyPem = keyPath ?? "", + CaCert = kind.GetCaCertPath() ?? "", + }); + } +} diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs new file mode 100644 index 000000000..01477621b --- /dev/null +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs @@ -0,0 +1,43 @@ +// This file is part of the ArmoniK project +// +// Copyright (C) ANEO, 2021-2024. All rights reserved. +// W. Kirschenmann +// J. Gurhem +// D. Dubuc +// L. Ziane Khodja +// F. Lemaitre +// S. Djebbar +// J. Fonseca +// +// 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. + +using ArmoniK.Api.gRPC.V1; +using ArmoniK.Api.gRPC.V1.Results; + +using NUnit.Framework; + +namespace ArmoniK.Api.Client.Tests; + +[TestFixture] +public class ConnectivityTests +{ + [Test] + public void ResultsGetServiceConfiguration([Values] ConnectivityKind connectivityKind) + { + var channel = connectivityKind.GetChannel(); + var resultClient = new Results.ResultsClient(channel); + + Assert.That(() => resultClient.GetServiceConfiguration(new Empty()), + Throws.Nothing); + } +} From 1ddd57d7a82f3308772619a92b725da3f815a90f Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 20 May 2024 14:29:35 +0200 Subject: [PATCH 233/344] CI connectivity tests --- .github/workflows/test.yml | 185 ++++++++++++++++++ .../ArmoniK.Api.Client.Tests.csproj | 1 + .../ConnectivityKind.cs | 39 ++-- scripts/certs.sh | 7 +- 4 files changed, 213 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..ebe1b22f4 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,185 @@ +name: Tests + +on: + pull_request: + +concurrency: + group: test-${{ github.ref }} + cancel-in-progress: true + +jobs: + certs: + name: Generate certificates + runs-on: ubuntu-latest + outputs: + client-ca_pem: ${{ steps.certs.outputs.client-ca_pem }} + client_key: ${{ steps.certs.outputs.client_key }} + client_pem: ${{ steps.certs.outputs.client_pem }} + server1-ca_pem: ${{ steps.certs.outputs.server1-ca_pem }} + server1_key: ${{ steps.certs.outputs.server1_key }} + server1_pem: ${{ steps.certs.outputs.server1_pem }} + server2-ca_pem: ${{ steps.certs.outputs.server2-ca_pem }} + server2_key: ${{ steps.certs.outputs.server2_key }} + server2_pem: ${{ steps.certs.outputs.server2_pem }} + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + fetch-depth: 0 + - name: Generate certificates + id: certs + run: | + mkdir certs + cd certs + ../scripts/certs.sh + for file in *; do + echo "${file//./_}<> "$GITHUB_OUTPUT" + + csharp: + name: Test C# + needs: + - certs + strategy: + fail-fast: false + matrix: + dotnet: + - version: '' + framework: net4.7 + - version: '' + framework: net4.8 + - version: 6.0 + framework: net6.0 + - version: 8.0 + framework: net8.0 + platform: + - os: ubuntu-latest + runtime: linux-x64 + - os: windows-2019 + runtime: windows-x64 + - os: windows-2022 + runtime: windows-x64 + exclude: + - dotnet: + version: '' + framework: net4.7 + platform: + os: ubuntu-latest + runtime: linux-x64 + - dotnet: + version: '' + framework: net4.8 + platform: + os: ubuntu-latest + runtime: linux-x64 + runs-on: ${{ matrix.platform.os }} + + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + fetch-depth: 0 + + - name: Install local certs + working-directory: packages/csharp/ + shell: bash + run: | + mkdir certs + cd certs + cat > client-ca.pem < client.key < client.pem < server1-ca.pem < server1.key < server1.pem < server2-ca.pem < server2.key < server2.pem < + diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs index 9cf0b7f29..5b73fcba4 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs @@ -22,7 +22,9 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +using System; using System.IO; +using System.Runtime.InteropServices; using ArmoniK.Api.Client.Options; using ArmoniK.Api.Client.Submitter; @@ -46,7 +48,8 @@ public enum ConnectivityKind internal static class ConnectivityKindExt { - private const string CertFolder = "../../../../certs"; + private static string CertFolder + => Environment.GetEnvironmentVariable("CertFolder") ?? "../../../../certs"; internal static bool IsTls(this ConnectivityKind kind) => kind switch @@ -72,12 +75,21 @@ internal static bool IsMTls(this ConnectivityKind kind) }; internal static string? GetCaCertPath(this ConnectivityKind kind) - => kind switch - { - ConnectivityKind.TlsCert or ConnectivityKind.MTlsCert => Path.Combine(CertFolder, - "server-ca.pem"), - _ => null, - }; + { + switch (kind) + { + case ConnectivityKind.TlsCert or ConnectivityKind.MTlsCert: + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && !RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) + { + Assert.Inconclusive("Library loading bug on Windows"); + } + + return Path.Combine(CertFolder, + "server1-ca.pem"); + default: + return null; + } + } internal static (string?, string?) GetClientCertPath(this ConnectivityKind kind) => kind.IsMTls() @@ -92,10 +104,10 @@ internal static string GetEndpoint(this ConnectivityKind kind) ConnectivityKind.Unencrypted => "http://localhost:5000", ConnectivityKind.TlsInsecure => "https://localhost:5001", ConnectivityKind.TlsCert => "https://localhost:5001", - ConnectivityKind.TlsStore => "https://localhost:5001", - ConnectivityKind.MTlsInsecure => "https://localhost:5002", - ConnectivityKind.MTlsCert => "https://localhost:5002", - ConnectivityKind.MTlsStore => "https://localhost:5002", + ConnectivityKind.TlsStore => "https://localhost:5002", + ConnectivityKind.MTlsInsecure => "https://localhost:5003", + ConnectivityKind.MTlsCert => "https://localhost:5003", + ConnectivityKind.MTlsStore => "https://localhost:5004", _ => "http://localhost:5000", }; @@ -103,11 +115,6 @@ internal static ChannelBase GetChannel(this ConnectivityKind kind) { var (certPath, keyPath) = kind.GetClientCertPath(); - if (kind.GetCaCertPath() is not null && false) - { - Assert.Inconclusive("CA is not yet supported"); - } - return GrpcChannelFactory.CreateChannel(new GrpcClient { Endpoint = kind.GetEndpoint(), diff --git a/scripts/certs.sh b/scripts/certs.sh index eb6b73f4b..a38700c67 100755 --- a/scripts/certs.sh +++ b/scripts/certs.sh @@ -3,10 +3,10 @@ set -ex chain() { - openssl req -x509 -newkey rsa:4096 -days 3650 -nodes -keyout "$1-ca.key" -out "$1-ca.pem" -subj "/C=FR/ST=France/L=/O=ArmoniK Ingress Root (NonTrusted)/OU=/CN=ArmoniK Ingress Root (NonTrusted) Private Certificate Authority/emailAddress=" + openssl req -x509 -newkey rsa:4096 -days 3650 -nodes -keyout "$1-ca.key" -out "$1-ca.pem" -subj "/C=FR/ST=France/L=/O=ArmoniK Ingress Root (NonTrusted)/OU=$1/CN=ArmoniK Ingress Root (NonTrusted) Private Certificate Authority/emailAddress=" openssl genrsa -out "$1.key" 4096 - openssl req -new -key "$1".key -out "$1".csr -subj "/C=FR/ST=France/L=/O=ArmoniK Ingress Root (NonTrusted)/OU=/CN=${2:-ArmoniK Root (NonTrusted}/emailAddress=" + openssl req -new -key "$1".key -out "$1".csr -subj "/C=FR/ST=France/L=/O=ArmoniK Ingress Root (NonTrusted)/OU=$1/CN=${2:-ArmoniK Root (NonTrusted}/emailAddress=" cat > "$1.cnf" < Date: Tue, 21 May 2024 17:12:48 +0200 Subject: [PATCH 234/344] Generate cert in job --- .github/workflows/test.yml | 64 +------------------ .../ArmoniK.Api.Client.Tests.csproj | 1 - scripts/certs.sh | 35 ++++++++-- 3 files changed, 33 insertions(+), 67 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ebe1b22f4..eb150592b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,40 +8,8 @@ concurrency: cancel-in-progress: true jobs: - certs: - name: Generate certificates - runs-on: ubuntu-latest - outputs: - client-ca_pem: ${{ steps.certs.outputs.client-ca_pem }} - client_key: ${{ steps.certs.outputs.client_key }} - client_pem: ${{ steps.certs.outputs.client_pem }} - server1-ca_pem: ${{ steps.certs.outputs.server1-ca_pem }} - server1_key: ${{ steps.certs.outputs.server1_key }} - server1_pem: ${{ steps.certs.outputs.server1_pem }} - server2-ca_pem: ${{ steps.certs.outputs.server2-ca_pem }} - server2_key: ${{ steps.certs.outputs.server2_key }} - server2_pem: ${{ steps.certs.outputs.server2_pem }} - steps: - - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - with: - fetch-depth: 0 - - name: Generate certificates - id: certs - run: | - mkdir certs - cd certs - ../scripts/certs.sh - for file in *; do - echo "${file//./_}<> "$GITHUB_OUTPUT" - csharp: name: Test C# - needs: - - certs strategy: fail-fast: false matrix: @@ -82,39 +50,13 @@ jobs: with: fetch-depth: 0 - - name: Install local certs + - name: Generate certs working-directory: packages/csharp/ shell: bash run: | mkdir certs cd certs - cat > client-ca.pem < client.key < client.pem < server1-ca.pem < server1.key < server1.pem < server2-ca.pem < server2.key < server2.pem < - diff --git a/scripts/certs.sh b/scripts/certs.sh index a38700c67..7893adf74 100755 --- a/scripts/certs.sh +++ b/scripts/certs.sh @@ -3,16 +3,41 @@ set -ex chain() { - openssl req -x509 -newkey rsa:4096 -days 3650 -nodes -keyout "$1-ca.key" -out "$1-ca.pem" -subj "/C=FR/ST=France/L=/O=ArmoniK Ingress Root (NonTrusted)/OU=$1/CN=ArmoniK Ingress Root (NonTrusted) Private Certificate Authority/emailAddress=" + cat > "$1-ca.cnf" < Date: Mon, 6 May 2024 18:50:31 +0200 Subject: [PATCH 235/344] Remove gRPC Core --- .../ArmoniK.Api.Client.csproj | 1 + .../Submitter/GrpcChannelFactory.cs | 154 +++++++++++++----- 2 files changed, 116 insertions(+), 39 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 90ecf815b..481e2e4e4 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -37,6 +37,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index a06916ded..509c3ff17 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -26,6 +26,7 @@ using System.IO; using System.Net; using System.Net.Http; +using System.Net.Security; using System.Runtime.InteropServices; using System.Security.Authentication; using System.Security.Cryptography; @@ -216,6 +217,111 @@ private static Channel CreateFrameworkChannel(GrpcClient optionsGrpcClient, channel_options); } + /// + /// Get the server certificate validation callback + /// + /// Whether validation should be performed + /// Root certificate to validate Server cert against + /// Validation callback + private static Func? GetServerCertificateValidationCallback(bool insecure, + X509Certificate? caCert) + { + if (insecure) + { + AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", + true); + return (_, + certificate2, + certChain, + sslPolicyErrors) => true; + } + + if (caCert is null) + { + return null; + } + + return (_, + certificate2, + certChain, + sslPolicyErrors) => + { + throw new NotImplementedException("Does not support CA validation"); + }; + } + + /// + /// Creates a HttpMessageHandler for the current platform + /// + /// Whether https is used or not + /// Whether the Server Certificate should be validated or not + /// Root certificate to validate the server certificate against + /// Client certificate to be used for mTLS + /// HttpMessageHandler + private static HttpMessageHandler CreateHttpMessageHandler(bool https, + bool insecure, + X509Certificate? caCert, + X509Certificate2? clientCert) + { + if (RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) + { + var handler = new WinHttpHandler(); + if (!https) + { + return handler; + } + + handler.SslProtocols = GetSslProtocols(); + handler.ServerCertificateValidationCallback = GetServerCertificateValidationCallback(insecure, + caCert); + + if (clientCert is not null) + { + handler.ClientCertificates.Add(clientCert); + } + + return handler; + } + else + { + var handler = new HttpClientHandler(); + if (!https) + { + return handler; + } + + handler.SslProtocols = GetSslProtocols(); + handler.ServerCertificateCustomValidationCallback = GetServerCertificateValidationCallback(insecure, + caCert); + + if (clientCert is not null) + { + handler.ClientCertificates.Add(clientCert); + } + + return handler; + } + } + + /// + /// Get the list of supported SSL protocols, and enable TLS1.3 if possible + /// + /// SSL protocols enum + private static SslProtocols GetSslProtocols() + { + try + { + // try TLS1.3 + ServicePointManager.SecurityProtocol |= (SecurityProtocolType)12288 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; + return (SslProtocols)12288 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls; + } + catch (NotSupportedException) + { + ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; + return SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls; + } + } + /// /// Creates the GrpcChannel /// @@ -260,13 +366,6 @@ public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, }, }; - if (RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) - { - // .NET Framework cannot use Grpc.Net.Client.GrpcChannel as it doesn't support Http2 with this framework - return CreateFrameworkChannel(optionsGrpcClient, - serviceConfig); - } - if (!string.IsNullOrWhiteSpace(optionsGrpcClient.CaCert) && !optionsGrpcClient.AllowUnsafeConnection) { /* You cannot give a root certificate directly using the C# implementation, thus you have to either : @@ -274,6 +373,7 @@ public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, - Somehow validate the certificate with a custom root, but it's difficult : - https://stackoverflow.com/questions/13103295/bouncy-castle-this-certificate-has-an-invalid-digital-signature - https://www.meziantou.net/custom-certificate-validation-in-dotnet.htm + - https://github.com/dotnet/runtime/issues/39835 The issue being that the server certificate is considered to not have a valid signature, and I'm not sure how to handle it */ logger?.LogWarning("Using gRPC Core (deprecated) implementation because CaCert is specified. Please install the CA certificate and unset the option to use the C# implementation"); @@ -286,38 +386,14 @@ public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, var credentials = uri.Scheme == Uri.UriSchemeHttps ? ChannelCredentials.SecureSsl : ChannelCredentials.Insecure; - - var httpHandler = new HttpClientHandler(); - - if (optionsGrpcClient.AllowUnsafeConnection) - { - httpHandler.ServerCertificateCustomValidationCallback = (_, - _, - _, - _) => true; - AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", - true); - } - - if (uri.Scheme == Uri.UriSchemeHttps) - { - if (optionsGrpcClient.HasClientCertificate) - { - httpHandler.ClientCertificates.Add(GetCertificate(optionsGrpcClient)); - } - - try - { - // try TLS1.3 - ServicePointManager.SecurityProtocol |= (SecurityProtocolType)12288 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; - httpHandler.SslProtocols = (SslProtocols)12288 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls; - } - catch (NotSupportedException) - { - ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; - httpHandler.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls; - } - } + var clientCert = optionsGrpcClient.HasClientCertificate + ? GetCertificate(optionsGrpcClient) + : null; + + var httpHandler = CreateHttpMessageHandler(uri.Scheme == Uri.UriSchemeHttps, + optionsGrpcClient.AllowUnsafeConnection, + null, + clientCert); var httpClient = new HttpClient(httpHandler) { From da7a0907d12c74439fb886a7c6bffa7d2cae507a Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Tue, 14 May 2024 10:54:01 +0200 Subject: [PATCH 236/344] Enable HTTP2 --- .../ArmoniK.Api.Client.csproj | 1 + .../Submitter/GrpcChannelFactory.cs | 138 +++++++++++++++++- 2 files changed, 133 insertions(+), 6 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 481e2e4e4..dd0fbd459 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -27,6 +27,7 @@ + diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 509c3ff17..7447d9e39 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -27,18 +27,25 @@ using System.Net; using System.Net.Http; using System.Net.Security; +using System.Net.Sockets; using System.Runtime.InteropServices; using System.Security.Authentication; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; +using System.Threading; +using System.Threading.Tasks; using ArmoniK.Api.Client.Options; using ArmoniK.Api.Client.Utils; +using ArmoniK.Api.gRPC.V1; +using ArmoniK.Api.gRPC.V1.Results; +using ArmoniK.Utils; using Grpc.Core; using Grpc.Net.Client; using Grpc.Net.Client.Configuration; +using Grpc.Net.Client.Web; using JetBrains.Annotations; @@ -60,6 +67,16 @@ namespace ArmoniK.Api.Client.Submitter [PublicAPI] public static class GrpcChannelFactory { + /// + /// Whether the HTTP/2 is supported by the current runtime + /// + private static bool _http2Support = true; + + /// + /// Whether the HTTP/2 support has been actually tested + /// + private static bool _http2Tested; + /// /// Get the root certificates from the OS trusted store /// @@ -257,14 +274,18 @@ private static Channel CreateFrameworkChannel(GrpcClient optionsGrpcClient, /// Whether the Server Certificate should be validated or not /// Root certificate to validate the server certificate against /// Client certificate to be used for mTLS + /// Optional logger /// HttpMessageHandler private static HttpMessageHandler CreateHttpMessageHandler(bool https, bool insecure, X509Certificate? caCert, - X509Certificate2? clientCert) + X509Certificate2? clientCert, + ILogger? logger = null) { if (RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) { + logger?.LogWarning("Creating a WinHttpHandler: {Framework}", + RuntimeInformation.FrameworkDescription); var handler = new WinHttpHandler(); if (!https) { @@ -284,6 +305,8 @@ private static HttpMessageHandler CreateHttpMessageHandler(bool htt } else { + logger?.LogWarning("Creating a HttpClientHandler: {Framework}", + RuntimeInformation.FrameworkDescription); var handler = new HttpClientHandler(); if (!https) { @@ -331,8 +354,8 @@ private static SslProtocols GetSslProtocols() /// The initialized GrpcChannel /// /// Endpoint passed through options is missing - public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, - ILogger? logger = null) + private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, + ILogger? logger) { if (string.IsNullOrEmpty(optionsGrpcClient.Endpoint)) { @@ -368,6 +391,7 @@ public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, if (!string.IsNullOrWhiteSpace(optionsGrpcClient.CaCert) && !optionsGrpcClient.AllowUnsafeConnection) { + throw new NotImplementedException("CA"); /* You cannot give a root certificate directly using the C# implementation, thus you have to either : - Add the CA to the trusted root store - Somehow validate the certificate with a custom root, but it's difficult : @@ -393,7 +417,17 @@ public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, var httpHandler = CreateHttpMessageHandler(uri.Scheme == Uri.UriSchemeHttps, optionsGrpcClient.AllowUnsafeConnection, null, - clientCert); + clientCert, + logger); + + if (!_http2Support) + { + httpHandler = new GrpcWebHandler(httpHandler); + } + else + { + httpHandler = new ForceHttp2Handler(httpHandler); + } var httpClient = new HttpClient(httpHandler) { @@ -415,10 +449,86 @@ public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, ServiceConfig = serviceConfig, }; - return GrpcChannel.ForAddress(optionsGrpcClient.Endpoint!, - channelOptions); + var channel = GrpcChannel.ForAddress(optionsGrpcClient.Endpoint!, + channelOptions); + + return channel; } + /// + /// Creates the GrpcChannel + /// + /// Options for the creation of the channel + /// Optional logger + /// Cancellation token + /// + /// The initialized GrpcChannel + /// + /// Endpoint passed through options is missing + public static async Task CreateChannelAsync(GrpcClient optionsGrpcClient, + ILogger? logger = null, + CancellationToken cancellationToken = default) + { + var channel = CreateChannelInternal(optionsGrpcClient, + logger); + + // FIXME: Once we remove Grpc.Core, we could make CreateChannel return a GrpcChannel and avoid this check + if (_http2Tested || channel is not GrpcChannel grpc) + { + return channel; + } + + + try + { + await new Results.ResultsClient(channel).GetServiceConfigurationAsync(new Empty(), + cancellationToken: cancellationToken) + .ConfigureAwait(false); + _http2Tested = true; + } + // Using Net framework, we have to use WinHttpHandler that does not support HTTP/2 on older Windows (< 11, < Server 2019) + // So if we detect a protocol downgrade, we force the use of the grpcWebHandler that works with HTTP/1.1 + // If that is the case, we need to recreate the whole channel as it is not possible to change the HttpMessageHandler after a request + catch (RpcException e) when (e.StatusCode is StatusCode.Internal && e.InnerException is not HttpRequestException and not SocketException) + { + throw; + if (e.Status.Detail.StartsWith("Bad gRPC response. Response protocol downgraded to HTTP/1") || + (e.InnerException is ArgumentException ae && ae.Message.StartsWith("Only HTTP/1") && ae.TargetSite.Name == "set_ProtocolVersion")) + { + logger?.LogWarning("Runtime does not support HTTP/2, falling back to gRPC Web"); + } + else + { + logger?.LogError(e, + "Runtime error while performing gRPC request. Maybe the runtime does not support HTTP/2, falling back to gRPC Web"); + } + + _http2Tested = true; + _http2Support = false; + grpc.Dispose(); + + channel = CreateChannelInternal(optionsGrpcClient, + logger); + } + + return channel; + } + + /// + /// Creates the GrpcChannel + /// + /// Options for the creation of the channel + /// Optional logger + /// + /// The initialized GrpcChannel + /// + /// Endpoint passed through options is missing + public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, + ILogger? logger = null) + => CreateChannelAsync(optionsGrpcClient, + logger) + .WaitSync(); + /// /// Get the certificate in PFX format from the given options. /// Loads the certificate file directly if is specified, otherwise creates @@ -540,4 +650,20 @@ public static KeyCertificatePair GetKeyCertificatePair(GrpcClient optionsGrpcCli File.ReadAllText(optionsGrpcClient.KeyPem)); } } + + internal class ForceHttp2Handler : DelegatingHandler + { + internal ForceHttp2Handler(HttpMessageHandler inner) + : base(inner) + { + } + + protected override Task SendAsync(HttpRequestMessage request, + CancellationToken cancellationToken) + { + request.Version = new Version("2.0"); + return base.SendAsync(request, + cancellationToken); + } + } } From d5a564ec1a16e254c91345831f233b8d65c7fc24 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Tue, 21 May 2024 22:17:27 +0200 Subject: [PATCH 237/344] Add CA --- .../ConnectivityKind.cs | 4 +- .../Submitter/GrpcChannelFactory.cs | 57 ++++++++++++++++--- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs index 5b73fcba4..3316ae498 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs @@ -31,8 +31,6 @@ using Grpc.Core; -using NUnit.Framework; - namespace ArmoniK.Api.Client.Tests; public enum ConnectivityKind @@ -81,7 +79,7 @@ internal static bool IsMTls(this ConnectivityKind kind) case ConnectivityKind.TlsCert or ConnectivityKind.MTlsCert: if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && !RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) { - Assert.Inconclusive("Library loading bug on Windows"); + //Assert.Inconclusive("Library loading bug on Windows"); } return Path.Combine(CertFolder, diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 7447d9e39..142aaa728 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -24,6 +24,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Net; using System.Net.Http; using System.Net.Security; @@ -247,7 +248,7 @@ private static Channel CreateFrameworkChannel(GrpcClient optionsGrpcClient, { AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); - return (_, + return (request, certificate2, certChain, sslPolicyErrors) => true; @@ -258,12 +259,42 @@ private static Channel CreateFrameworkChannel(GrpcClient optionsGrpcClient, return null; } - return (_, + var authority = new X509Certificate2(DotNetUtilities.ToX509Certificate(caCert)); + + // Implementation inspired from https://stackoverflow.com/a/52926718 + return (request, certificate2, certChain, sslPolicyErrors) => { - throw new NotImplementedException("Does not support CA validation"); + // If there is any error other than untrusted root or partial chain, fail the validation + if ((sslPolicyErrors & ~SslPolicyErrors.RemoteCertificateChainErrors) != 0) + { + return false; + } + + // If there is any error other than untrusted root or partial chain, fail the validation + if (certChain.ChainStatus.Any(status => status.Status is not X509ChainStatusFlags.UntrustedRoot and not X509ChainStatusFlags.PartialChain)) + { + return false; + } + + // Disable some extensive checks that would fail on the authority that is not in store + certChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; + certChain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority; + + // Add unknown authority to the store + certChain.ChainPolicy.ExtraStore.Add(authority); + + // Check if the chain is valid for the actual server certificate (ie: trusted) + if (!certChain.Build(certificate2)) + { + return false; + } + + // Check that the chain root is actually the specified authority (caCert) + return certChain.ChainElements.Cast() + .Any(x => x.Certificate.Thumbprint == authority.Thumbprint); }; } @@ -389,9 +420,19 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, }, }; + X509Certificate? caCert = null; + if (!string.IsNullOrWhiteSpace(optionsGrpcClient.CaCert) && !optionsGrpcClient.AllowUnsafeConnection) { - throw new NotImplementedException("CA"); + var parser = new X509CertificateParser(); + using (var stream = File.Open(optionsGrpcClient.CaCert, + FileMode.Open, + FileAccess.Read)) + { + caCert = parser.ReadCertificate(stream); + } + + //throw new NotImplementedException("CA"); /* You cannot give a root certificate directly using the C# implementation, thus you have to either : - Add the CA to the trusted root store - Somehow validate the certificate with a custom root, but it's difficult : @@ -400,9 +441,9 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, - https://github.com/dotnet/runtime/issues/39835 The issue being that the server certificate is considered to not have a valid signature, and I'm not sure how to handle it */ - logger?.LogWarning("Using gRPC Core (deprecated) implementation because CaCert is specified. Please install the CA certificate and unset the option to use the C# implementation"); - return CreateFrameworkChannel(optionsGrpcClient, - serviceConfig); + //logger?.LogWarning("Using gRPC Core (deprecated) implementation because CaCert is specified. Please install the CA certificate and unset the option to use the C# implementation"); + //return CreateFrameworkChannel(optionsGrpcClient, + // serviceConfig); } var uri = new Uri(optionsGrpcClient.Endpoint!); @@ -416,7 +457,7 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, var httpHandler = CreateHttpMessageHandler(uri.Scheme == Uri.UriSchemeHttps, optionsGrpcClient.AllowUnsafeConnection, - null, + caCert, clientCert, logger); From f7ea048f11b02263a3a5e9c95c9a46804cf55ac1 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Tue, 21 May 2024 23:42:24 +0200 Subject: [PATCH 238/344] Clean --- .../ConnectivityKind.cs | 22 +- .../ArmoniK.Api.Client.csproj | 1 - .../Submitter/GrpcChannelFactory.cs | 245 +----------------- 3 files changed, 10 insertions(+), 258 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs index 3316ae498..1b8bc598f 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs @@ -24,7 +24,6 @@ using System; using System.IO; -using System.Runtime.InteropServices; using ArmoniK.Api.Client.Options; using ArmoniK.Api.Client.Submitter; @@ -73,21 +72,12 @@ internal static bool IsMTls(this ConnectivityKind kind) }; internal static string? GetCaCertPath(this ConnectivityKind kind) - { - switch (kind) - { - case ConnectivityKind.TlsCert or ConnectivityKind.MTlsCert: - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && !RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) - { - //Assert.Inconclusive("Library loading bug on Windows"); - } - - return Path.Combine(CertFolder, - "server1-ca.pem"); - default: - return null; - } - } + => kind switch + { + ConnectivityKind.TlsCert or ConnectivityKind.MTlsCert => Path.Combine(CertFolder, + "server1-ca.pem"), + _ => null, + }; internal static (string?, string?) GetClientCertPath(this ConnectivityKind kind) => kind.IsMTls() diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index dd0fbd459..e5f1d0b97 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -26,7 +26,6 @@ - diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 142aaa728..64ed89bba 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -22,7 +22,6 @@ // limitations under the License. using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; @@ -38,7 +37,6 @@ using System.Threading.Tasks; using ArmoniK.Api.Client.Options; -using ArmoniK.Api.Client.Utils; using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Results; using ArmoniK.Utils; @@ -78,163 +76,6 @@ public static class GrpcChannelFactory /// private static bool _http2Tested; - /// - /// Get the root certificates from the OS trusted store - /// - /// Root certificates in pem format - private static string GetRootCertificates() - { - var builder = new StringBuilder(); - var store = new X509Store(StoreName.Root); - store.Open(OpenFlags.ReadOnly); - foreach (var mCert in store.Certificates) - { - builder.AppendLine($"# Issuer: {mCert.Issuer}\n# Subject: {mCert.Subject}\n# Label: {mCert.FriendlyName}\n# Serial: {mCert.SerialNumber}\n# SHA1 Fingerprint: {mCert.GetCertHashString()}\n{ExportToPem(mCert)}\n"); - } - - store.Close(); - return builder.ToString(); - } - - /// - /// Exports a certificate to pem format - /// - /// Certificate to export - /// Certificate in pem formatted string - private static string ExportToPem(X509Certificate2 cert) - => $"-----BEGIN CERTIFICATE-----\n{Convert.ToBase64String(cert.GetRawCertData(), Base64FormattingOptions.InsertLineBreaks)}\n-----END CERTIFICATE-----"; - - /// - /// Sends a web request to the server to acquire its certificate - /// - /// Uri of the server - /// Client options - /// The server's certificate, null if it doesn't have one - /// The given certificate should not be used when SSL validation is active - public static X509Certificate2? GetServerCertificate(Uri uri, - GrpcClient optionsGrpcClient) - { - var request = (HttpWebRequest)WebRequest.Create(uri); - request.ServerCertificateValidationCallback = (_, - _, - _, - _) => true; - if (optionsGrpcClient.HasClientCertificate) - { - request.ClientCertificates.Add(GetCertificate(optionsGrpcClient)); - } - - var response = (HttpWebResponse)request.GetResponse(); - response.Close(); - return request.ServicePoint.Certificate == null - ? null - : new X509Certificate2(request.ServicePoint.Certificate.GetRawCertData(), - "", - X509KeyStorageFlags.Exportable); - } - - /// - /// Gets the target name to look for during the Grpc.Core internal ssl verification. - /// This should only be used when when overall ssl verification is turned off - /// - /// Client options - /// Server certificate - /// - /// Target name to override, null if the SSL verification is on or if doesn't have - /// a common name - /// - /// - /// If is empty and SSL verification is turned off, this will - /// output the - /// common name. Otherwise it output the target name in the options - /// - public static string? GetOverrideTargetName(GrpcClient optionsGrpcClient, - X509Certificate2? serverCert) - { - if (!optionsGrpcClient.AllowUnsafeConnection) - { - return null; - } - - return string.IsNullOrEmpty(optionsGrpcClient.OverrideTargetName) - ? serverCert?.GetNameInfo(X509NameType.SimpleName, - false) - : optionsGrpcClient.OverrideTargetName; - } - - /// - /// Creates the GrpcChannel for .Net Framework. - /// - /// Options for the creation of the channel - /// Grpc service configuration - /// - /// The initialized Channel - /// - private static Channel CreateFrameworkChannel(GrpcClient optionsGrpcClient, - ServiceConfig serviceConfig) - { - Environment.SetEnvironmentVariable("GRPC_DNS_RESOLVER", - "native"); - var uri = new Uri(optionsGrpcClient.Endpoint ?? ""); - - var channel_options = new List - { - new("grpc.keepalive_time_ms", - (int)optionsGrpcClient.KeepAliveTime.TotalMilliseconds), - new("grpc.max_connection_idle_ms", - (int)optionsGrpcClient.MaxIdleTime.TotalMilliseconds), - new("grpc.service_config", - serviceConfig.ToJson()), - }; - - // Simple credentials when requesting an unencrypted connection - if (uri.Scheme != Uri.UriSchemeHttps) - { - return new Channel(uri.Host, - uri.Port, - ChannelCredentials.Insecure, - channel_options); - } - - // If SSL verification is disabled, load the server certificate as root certificate - if (optionsGrpcClient.AllowUnsafeConnection) - { - var serverCert = GetServerCertificate(uri, - optionsGrpcClient); - var credentials = new SslCredentials(serverCert == null - ? null - : ExportToPem(serverCert), - optionsGrpcClient.HasClientCertificate - ? GetKeyCertificatePair(optionsGrpcClient) - : null, - _ => true); - - // Internal SSL verification of the Grpc.Core library cannot be turned off during the handshake, thus we need to override the name to look up - channel_options.Add(new ChannelOption("grpc.ssl_target_name_override", - GetOverrideTargetName(optionsGrpcClient, - serverCert))); - return new Channel(uri.Host, - uri.Port, - credentials, - channel_options); - } - - // SSL verification is enabled, we need to load the CA root certificate either from a file or from the OS store, as the library does not load it by itself - var ca = string.IsNullOrEmpty(optionsGrpcClient.CaCert) - ? GetRootCertificates() - : File.ReadAllText(optionsGrpcClient.CaCert); - var certKeyPair = optionsGrpcClient.HasClientCertificate - ? GetKeyCertificatePair(optionsGrpcClient) - : null; - - return new Channel(uri.Host, - uri.Port, - new SslCredentials(ca, - certKeyPair, - null), - channel_options); - } - /// /// Get the server certificate validation callback /// @@ -431,19 +272,6 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, { caCert = parser.ReadCertificate(stream); } - - //throw new NotImplementedException("CA"); - /* You cannot give a root certificate directly using the C# implementation, thus you have to either : - - Add the CA to the trusted root store - - Somehow validate the certificate with a custom root, but it's difficult : - - https://stackoverflow.com/questions/13103295/bouncy-castle-this-certificate-has-an-invalid-digital-signature - - https://www.meziantou.net/custom-certificate-validation-in-dotnet.htm - - https://github.com/dotnet/runtime/issues/39835 - The issue being that the server certificate is considered to not have a valid signature, and I'm not sure how to handle it - */ - //logger?.LogWarning("Using gRPC Core (deprecated) implementation because CaCert is specified. Please install the CA certificate and unset the option to use the C# implementation"); - //return CreateFrameworkChannel(optionsGrpcClient, - // serviceConfig); } var uri = new Uri(optionsGrpcClient.Endpoint!); @@ -465,15 +293,12 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, { httpHandler = new GrpcWebHandler(httpHandler); } - else + + if (optionsGrpcClient.RequestTimeout != Timeout.InfiniteTimeSpan) { - httpHandler = new ForceHttp2Handler(httpHandler); + logger?.LogWarning("Request Timeout is not supported, no timeout is applied"); } - var httpClient = new HttpClient(httpHandler) - { - Timeout = optionsGrpcClient.RequestTimeout, - }; var sp = ServicePointManager.FindServicePoint(new Uri(optionsGrpcClient.Endpoint!)); sp.SetTcpKeepAlive(true, @@ -485,7 +310,7 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, var channelOptions = new GrpcChannelOptions { Credentials = credentials, - HttpClient = httpClient, + HttpHandler = httpHandler, DisposeHttpClient = true, ServiceConfig = serviceConfig, }; @@ -644,67 +469,5 @@ public static X509Certificate2 GetCertificate(GrpcClient optionsGrpcClient) string.Empty, X509KeyStorageFlags.Exportable); } - - /// - /// Get the certificate and key pair in Pem format from the options - /// - /// Client options - /// The certificate and key pair - /// Raised when the key in the P12 certificate is not a RSA key - /// No certificate was specified in options - public static KeyCertificatePair GetKeyCertificatePair(GrpcClient optionsGrpcClient) - { - if (!string.IsNullOrEmpty(optionsGrpcClient.CertP12)) - { - var cert = new X509Certificate2(optionsGrpcClient.CertP12, - "", - X509KeyStorageFlags.Exportable); - - if (cert.GetRSAPrivateKey() is not RSA rsaKey) - { - throw new - CryptographicException("Only certificate with RSA key in P12 format is supported in this version. Please use CertPem and KeyPem for other key algorithms."); - } - - var memoryStream = new MemoryStream(); - using (var streamWriter = new StreamWriter(memoryStream)) - { - var pemWriter = new PemWriter(streamWriter); - pemWriter.WriteObject(DotNetUtilities.GetRsaKeyPair(rsaKey) - .Private); - } - - var keyPem = Encoding.ASCII.GetString(memoryStream.GetBuffer()) - .Trim(); - memoryStream.Close(); - - return new KeyCertificatePair(ExportToPem(cert), - keyPem); - } - - if (string.IsNullOrEmpty(optionsGrpcClient.CertPem) || string.IsNullOrEmpty(optionsGrpcClient.KeyPem)) - { - throw new InvalidOperationException("Cannot find requested certificate from options"); - } - - return new KeyCertificatePair(File.ReadAllText(optionsGrpcClient.CertPem), - File.ReadAllText(optionsGrpcClient.KeyPem)); - } - } - - internal class ForceHttp2Handler : DelegatingHandler - { - internal ForceHttp2Handler(HttpMessageHandler inner) - : base(inner) - { - } - - protected override Task SendAsync(HttpRequestMessage request, - CancellationToken cancellationToken) - { - request.Version = new Version("2.0"); - return base.SendAsync(request, - cancellationToken); - } } } From 4877828666b2aa1a1cc4aac743e817b3df49be3e Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Wed, 22 May 2024 00:42:25 +0200 Subject: [PATCH 239/344] Proper dispatch --- .../ConnectivityKind.cs | 7 +- .../ArmoniK.Api.Client.csproj | 6 +- .../Submitter/GrpcChannelFactory.cs | 220 +++++++++--------- .../ArmoniK.Api.Common.csproj | 4 +- .../ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 +- .../ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 +- .../ArmoniK.Api.Worker.csproj | 6 +- 7 files changed, 132 insertions(+), 119 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs index 1b8bc598f..e2f01ec93 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs @@ -24,6 +24,7 @@ using System; using System.IO; +using System.Runtime.InteropServices; using ArmoniK.Api.Client.Options; using ArmoniK.Api.Client.Submitter; @@ -89,14 +90,16 @@ internal static (string?, string?) GetClientCertPath(this ConnectivityKind kind) internal static string GetEndpoint(this ConnectivityKind kind) => kind switch { - ConnectivityKind.Unencrypted => "http://localhost:5000", + ConnectivityKind.Unencrypted => RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework") + ? "http://localhost:4999" + : "http://localhost:5000", ConnectivityKind.TlsInsecure => "https://localhost:5001", ConnectivityKind.TlsCert => "https://localhost:5001", ConnectivityKind.TlsStore => "https://localhost:5002", ConnectivityKind.MTlsInsecure => "https://localhost:5003", ConnectivityKind.MTlsCert => "https://localhost:5003", ConnectivityKind.MTlsStore => "https://localhost:5004", - _ => "http://localhost:5000", + _ => "http://localhost:4999", }; internal static ChannelBase GetChannel(this ConnectivityKind kind) diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index e5f1d0b97..ead2d2065 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -26,14 +26,14 @@ - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 64ed89bba..35aa75c63 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -27,7 +27,6 @@ using System.Net; using System.Net.Http; using System.Net.Security; -using System.Net.Sockets; using System.Runtime.InteropServices; using System.Security.Authentication; using System.Security.Cryptography; @@ -37,9 +36,6 @@ using System.Threading.Tasks; using ArmoniK.Api.Client.Options; -using ArmoniK.Api.gRPC.V1; -using ArmoniK.Api.gRPC.V1.Results; -using ArmoniK.Utils; using Grpc.Core; using Grpc.Net.Client; @@ -66,16 +62,6 @@ namespace ArmoniK.Api.Client.Submitter [PublicAPI] public static class GrpcChannelFactory { - /// - /// Whether the HTTP/2 is supported by the current runtime - /// - private static bool _http2Support = true; - - /// - /// Whether the HTTP/2 support has been actually tested - /// - private static bool _http2Tested; - /// /// Get the server certificate validation callback /// @@ -85,6 +71,7 @@ public static class GrpcChannelFactory private static Func? GetServerCertificateValidationCallback(bool insecure, X509Certificate? caCert) { + // If insecure, allow any certificates if (insecure) { AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", @@ -95,11 +82,13 @@ public static class GrpcChannelFactory sslPolicyErrors) => true; } + // If no CaCert, just use the standard validation against the machine certificate store if (caCert is null) { return null; } + // Validate against a specific certificate var authority = new X509Certificate2(DotNetUtilities.ToX509Certificate(caCert)); // Implementation inspired from https://stackoverflow.com/a/52926718 @@ -146,56 +135,70 @@ public static class GrpcChannelFactory /// Whether the Server Certificate should be validated or not /// Root certificate to validate the server certificate against /// Client certificate to be used for mTLS + /// Which HttpMessageHandler type to use /// Optional logger /// HttpMessageHandler private static HttpMessageHandler CreateHttpMessageHandler(bool https, bool insecure, X509Certificate? caCert, X509Certificate2? clientCert, + HandlerType handlerType, ILogger? logger = null) { - if (RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) + Func? validationCallback = null; + SslProtocols sslProtocols = default; + + if (https) + { + sslProtocols = GetSslProtocols(); + validationCallback = GetServerCertificateValidationCallback(insecure, + caCert); + } + + if (handlerType is HandlerType.Http) { - logger?.LogWarning("Creating a WinHttpHandler: {Framework}", - RuntimeInformation.FrameworkDescription); - var handler = new WinHttpHandler(); + var httpHandler = new HttpClientHandler(); if (!https) { - return handler; + return httpHandler; } - handler.SslProtocols = GetSslProtocols(); - handler.ServerCertificateValidationCallback = GetServerCertificateValidationCallback(insecure, - caCert); + httpHandler.SslProtocols = sslProtocols; + httpHandler.ServerCertificateCustomValidationCallback = validationCallback; if (clientCert is not null) { - handler.ClientCertificates.Add(clientCert); + httpHandler.ClientCertificates.Add(clientCert); } - return handler; + return httpHandler; } - else + + if (!https && handlerType is HandlerType.Win) { - logger?.LogWarning("Creating a HttpClientHandler: {Framework}", - RuntimeInformation.FrameworkDescription); - var handler = new HttpClientHandler(); - if (!https) - { - return handler; - } + throw new InvalidOperationException("WinHttpHandler does not support plain text HTTP/2"); + } - handler.SslProtocols = GetSslProtocols(); - handler.ServerCertificateCustomValidationCallback = GetServerCertificateValidationCallback(insecure, - caCert); + var winHandler = new WinHttpHandler(); + + if (https) + { + winHandler.SslProtocols = GetSslProtocols(); + winHandler.ServerCertificateValidationCallback = GetServerCertificateValidationCallback(insecure, + caCert); if (clientCert is not null) { - handler.ClientCertificates.Add(clientCert); + winHandler.ClientCertificates.Add(clientCert); } + } - return handler; + if (handlerType is HandlerType.Web) + { + return new GrpcWebHandler(winHandler); } + + return winHandler; } /// @@ -221,13 +224,15 @@ private static SslProtocols GetSslProtocols() /// Creates the GrpcChannel /// /// Options for the creation of the channel + /// Which HttpMessageHandler type to use /// Optional logger /// /// The initialized GrpcChannel /// /// Endpoint passed through options is missing - private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, - ILogger? logger) + private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, + HandlerType handlerType, + ILogger? logger) { if (string.IsNullOrEmpty(optionsGrpcClient.Endpoint)) { @@ -263,15 +268,14 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, X509Certificate? caCert = null; + // Parse CaCert from file if (!string.IsNullOrWhiteSpace(optionsGrpcClient.CaCert) && !optionsGrpcClient.AllowUnsafeConnection) { var parser = new X509CertificateParser(); - using (var stream = File.Open(optionsGrpcClient.CaCert, - FileMode.Open, - FileAccess.Read)) - { - caCert = parser.ReadCertificate(stream); - } + using var stream = File.Open(optionsGrpcClient.CaCert, + FileMode.Open, + FileAccess.Read); + caCert = parser.ReadCertificate(stream); } var uri = new Uri(optionsGrpcClient.Endpoint!); @@ -287,13 +291,11 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, optionsGrpcClient.AllowUnsafeConnection, caCert, clientCert, + handlerType, logger); - if (!_http2Support) - { - httpHandler = new GrpcWebHandler(httpHandler); - } - + // Warn that RequestTimeout is not supported. + // If required, it could be easily implemented with a DelegatingHandler and a cancellationToken delayed cancellation if (optionsGrpcClient.RequestTimeout != Timeout.InfiniteTimeSpan) { logger?.LogWarning("Request Timeout is not supported, no timeout is applied"); @@ -310,15 +312,23 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, var channelOptions = new GrpcChannelOptions { Credentials = credentials, - HttpHandler = httpHandler, DisposeHttpClient = true, ServiceConfig = serviceConfig, }; - var channel = GrpcChannel.ForAddress(optionsGrpcClient.Endpoint!, - channelOptions); + if (handlerType is HandlerType.Web) + { + // If GrpcWebHandler is used, we must provide it an HttpClient to overcome a check issue + channelOptions.HttpClient = new HttpClient(httpHandler); + } + else + { + // If using a WinHttpHandler, we must set the httpHandler directly, otherwise, HTTP/2 is not properly supported + channelOptions.HttpHandler = httpHandler; + } - return channel; + return GrpcChannel.ForAddress(optionsGrpcClient.Endpoint!, + channelOptions); } /// @@ -331,54 +341,11 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, /// The initialized GrpcChannel /// /// Endpoint passed through options is missing - public static async Task CreateChannelAsync(GrpcClient optionsGrpcClient, - ILogger? logger = null, - CancellationToken cancellationToken = default) - { - var channel = CreateChannelInternal(optionsGrpcClient, - logger); - - // FIXME: Once we remove Grpc.Core, we could make CreateChannel return a GrpcChannel and avoid this check - if (_http2Tested || channel is not GrpcChannel grpc) - { - return channel; - } - - - try - { - await new Results.ResultsClient(channel).GetServiceConfigurationAsync(new Empty(), - cancellationToken: cancellationToken) - .ConfigureAwait(false); - _http2Tested = true; - } - // Using Net framework, we have to use WinHttpHandler that does not support HTTP/2 on older Windows (< 11, < Server 2019) - // So if we detect a protocol downgrade, we force the use of the grpcWebHandler that works with HTTP/1.1 - // If that is the case, we need to recreate the whole channel as it is not possible to change the HttpMessageHandler after a request - catch (RpcException e) when (e.StatusCode is StatusCode.Internal && e.InnerException is not HttpRequestException and not SocketException) - { - throw; - if (e.Status.Detail.StartsWith("Bad gRPC response. Response protocol downgraded to HTTP/1") || - (e.InnerException is ArgumentException ae && ae.Message.StartsWith("Only HTTP/1") && ae.TargetSite.Name == "set_ProtocolVersion")) - { - logger?.LogWarning("Runtime does not support HTTP/2, falling back to gRPC Web"); - } - else - { - logger?.LogError(e, - "Runtime error while performing gRPC request. Maybe the runtime does not support HTTP/2, falling back to gRPC Web"); - } - - _http2Tested = true; - _http2Support = false; - grpc.Dispose(); - - channel = CreateChannelInternal(optionsGrpcClient, - logger); - } - - return channel; - } + public static Task CreateChannelAsync(GrpcClient optionsGrpcClient, + ILogger? logger = null, + CancellationToken cancellationToken = default) + => Task.FromResult(CreateChannel(optionsGrpcClient, + logger)); /// /// Creates the GrpcChannel @@ -391,9 +358,34 @@ public static async Task CreateChannelAsync(GrpcClient optio /// Endpoint passed through options is missing public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, ILogger? logger = null) - => CreateChannelAsync(optionsGrpcClient, - logger) - .WaitSync(); + { + // If dotnet core (>= Net 5), we can use HttpClientHandler + if (!RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) + { + return CreateChannelInternal(optionsGrpcClient, + HandlerType.Http, + logger); + } + + // If dotnet framework, we can use a plain WinHttpHandler. + // WinHttpHandler supports gRPC on Windows 11 and Windows server 2022 only, and using TLS only. + try + { + return CreateChannelInternal(optionsGrpcClient, + HandlerType.Win, + logger); + } + catch (InvalidOperationException e) + { + // If it is not supported (either plain text or earlier windows version), + // we need to fallback to GrpcWebHandler that works on HTTP/1.1, but can be buggy with large or bidirectional streams + logger?.LogWarning(e, + "Falling back to gRPC Web that does not fully support gRPC streams"); + return CreateChannelInternal(optionsGrpcClient, + HandlerType.Web, + logger); + } + } /// /// Get the certificate in PFX format from the given options. @@ -469,5 +461,23 @@ public static X509Certificate2 GetCertificate(GrpcClient optionsGrpcClient) string.Empty, X509KeyStorageFlags.Exportable); } + + private enum HandlerType + { + /// + /// HttpClientHandler() + /// + Http, + + /// + /// WinHttpHandler() + /// + Win, + + /// + /// GrpcWebHandler(WinHttpHandler) + /// + Web, + } } } diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 6a7090417..78a535f2d 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -22,8 +22,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index dc0187fe8..d4699063d 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -23,8 +23,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index d7d27ffbd..21a9d0cc4 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -21,8 +21,8 @@ - - + + diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index ba4960e2d..8b0bdbeeb 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -27,13 +27,13 @@ - + - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive From eb078b6b453b321f72475bf22cd4615a5ca200e2 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Wed, 22 May 2024 11:47:53 +0200 Subject: [PATCH 240/344] HttpMessageHandler creation log --- .../Submitter/GrpcChannelFactory.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 35aa75c63..34dc87b22 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -287,6 +287,22 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, ? GetCertificate(optionsGrpcClient) : null; + switch (handlerType) + { + case HandlerType.Http: + logger?.LogDebug("Create HttpClientHandler() for {Endpoint}", + optionsGrpcClient.Endpoint); + break; + case HandlerType.Win: + logger?.LogDebug("Create WinHttpHandler() for {Endpoint}", + optionsGrpcClient.Endpoint); + break; + case HandlerType.Web: + logger?.LogDebug("Create GrpcWebHandler(WinHttpHandler()) for {Endpoint}", + optionsGrpcClient.Endpoint); + break; + } + var httpHandler = CreateHttpMessageHandler(uri.Scheme == Uri.UriSchemeHttps, optionsGrpcClient.AllowUnsafeConnection, caCert, @@ -475,7 +491,7 @@ private enum HandlerType Win, /// - /// GrpcWebHandler(WinHttpHandler) + /// GrpcWebHandler(WinHttpHandler()) /// Web, } From 361a66309cf7bf9974b948cb419d4533d84ba58e Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Wed, 22 May 2024 15:52:42 +0200 Subject: [PATCH 241/344] Better error handling --- .../Submitter/GrpcChannelFactory.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 34dc87b22..8307e1ccd 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -271,6 +271,12 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, // Parse CaCert from file if (!string.IsNullOrWhiteSpace(optionsGrpcClient.CaCert) && !optionsGrpcClient.AllowUnsafeConnection) { + if (!File.Exists(optionsGrpcClient.CaCert)) + { + throw new FileNotFoundException("Couldn't find specified CA certificate", + optionsGrpcClient.CaCert); + } + var parser = new X509CertificateParser(); using var stream = File.Open(optionsGrpcClient.CaCert, FileMode.Open, @@ -375,6 +381,11 @@ public static Task CreateChannelAsync(GrpcClient optionsGrpc public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, ILogger? logger = null) { + if (!string.IsNullOrEmpty(optionsGrpcClient.OverrideTargetName)) + { + logger?.LogWarning("OverrideTargetName is not supported"); + } + // If dotnet core (>= Net 5), we can use HttpClientHandler if (!RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) { From 4b0ddb1dd97deade4b9848cb23dc614e5cc96b02 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Thu, 23 May 2024 09:16:48 +0200 Subject: [PATCH 242/344] Use GrpcChannel --- packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs | 4 ++-- .../ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs index e2f01ec93..1c1da2b5f 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs @@ -29,7 +29,7 @@ using ArmoniK.Api.Client.Options; using ArmoniK.Api.Client.Submitter; -using Grpc.Core; +using Grpc.Net.Client; namespace ArmoniK.Api.Client.Tests; @@ -102,7 +102,7 @@ internal static string GetEndpoint(this ConnectivityKind kind) _ => "http://localhost:4999", }; - internal static ChannelBase GetChannel(this ConnectivityKind kind) + internal static GrpcChannel GetChannel(this ConnectivityKind kind) { var (certPath, keyPath) = kind.GetClientCertPath(); diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 8307e1ccd..50e5a39f7 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -230,7 +230,7 @@ private static SslProtocols GetSslProtocols() /// The initialized GrpcChannel /// /// Endpoint passed through options is missing - private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, + private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, HandlerType handlerType, ILogger? logger) { @@ -363,7 +363,7 @@ private static ChannelBase CreateChannelInternal(GrpcClient optionsGrpcClient, /// The initialized GrpcChannel /// /// Endpoint passed through options is missing - public static Task CreateChannelAsync(GrpcClient optionsGrpcClient, + public static Task CreateChannelAsync(GrpcClient optionsGrpcClient, ILogger? logger = null, CancellationToken cancellationToken = default) => Task.FromResult(CreateChannel(optionsGrpcClient, @@ -378,7 +378,7 @@ public static Task CreateChannelAsync(GrpcClient optionsGrpc /// The initialized GrpcChannel /// /// Endpoint passed through options is missing - public static ChannelBase CreateChannel(GrpcClient optionsGrpcClient, + public static GrpcChannel CreateChannel(GrpcClient optionsGrpcClient, ILogger? logger = null) { if (!string.IsNullOrEmpty(optionsGrpcClient.OverrideTargetName)) From 97a8aaf0469f9e7c65c55e9351fbefa432c55669 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Thu, 23 May 2024 12:07:06 +0200 Subject: [PATCH 243/344] Add concurrent channel tests --- .github/workflows/test.yml | 3 +++ .../ConnectivityTest.cs | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eb150592b..4e66e6cd9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,6 +2,9 @@ name: Tests on: pull_request: + push: + branches: + - main concurrency: group: test-${{ github.ref }} diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs index 01477621b..4591b02e5 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs @@ -21,8 +21,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Linq; +using System.Threading.Tasks; + using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Results; +using ArmoniK.Utils; using NUnit.Framework; @@ -40,4 +44,27 @@ public void ResultsGetServiceConfiguration([Values] ConnectivityKind connectivit Assert.That(() => resultClient.GetServiceConfiguration(new Empty()), Throws.Nothing); } + + [Test] + public async Task MultipleChannels([Values] ConnectivityKind connectivityKind, + [Values(1, + 2, + 10, + 100)] + int concurrency) + { + var channels = await Enumerable.Range(0, + concurrency) + .ParallelSelect(i => Task.FromResult(connectivityKind.GetChannel())) + .ToListAsync() + .ConfigureAwait(false); + + await channels.ParallelForEach(async channel => + { + var resultClient = new Results.ResultsClient(channel); + await resultClient.GetServiceConfigurationAsync(new Empty()) + .ConfigureAwait(false); + }) + .ConfigureAwait(false); + } } From a8e6df5ad7f2bb3396d394b76fb80cba1fe30209 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Thu, 23 May 2024 12:23:32 +0200 Subject: [PATCH 244/344] Concurrent access for cert reading --- .../ArmoniK.Api.Client.Test/ConnectivityTest.cs | 3 ++- .../Submitter/GrpcChannelFactory.cs | 16 ++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs index 4591b02e5..6552692a9 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityTest.cs @@ -55,7 +55,8 @@ public async Task MultipleChannels([Values] ConnectivityKind connectivityKind, { var channels = await Enumerable.Range(0, concurrency) - .ParallelSelect(i => Task.FromResult(connectivityKind.GetChannel())) + .ParallelSelect(new ParallelTaskOptions(-1), + i => Task.FromResult(connectivityKind.GetChannel())) .ToListAsync() .ConfigureAwait(false); diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 50e5a39f7..5a1161fd0 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -31,7 +31,6 @@ using System.Security.Authentication; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -280,7 +279,8 @@ private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, var parser = new X509CertificateParser(); using var stream = File.Open(optionsGrpcClient.CaCert, FileMode.Open, - FileAccess.Read); + FileAccess.Read, + FileShare.Read); caCert = parser.ReadCertificate(stream); } @@ -449,16 +449,20 @@ public static X509Certificate2 GetCertificate(GrpcClient optionsGrpcClient) X509Certificate cert; using (var reader = new FileStream(optionsGrpcClient.CertPem, FileMode.Open, - FileAccess.Read)) + FileAccess.Read, + FileShare.Read)) { cert = new X509CertificateParser().ReadCertificate(reader); } var store = new Pkcs12StoreBuilder().Build(); - using (var reader = new StreamReader(optionsGrpcClient.KeyPem, - Encoding.UTF8)) + using (var reader = new FileStream(optionsGrpcClient.KeyPem, + FileMode.Open, + FileAccess.Read, + FileShare.Read)) + using (var textReader = new StreamReader(reader)) { - var pemReader = new PemReader(reader); + var pemReader = new PemReader(textReader); AsymmetricKeyParameter? key; do From 9f0744cbda580b205ad20e44e9964c10e83011e5 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Thu, 23 May 2024 18:18:08 +0200 Subject: [PATCH 245/344] Add GrpcWebHandler test --- .github/workflows/test.yml | 19 +++++++++++-------- .../ConnectivityKind.cs | 7 ++++++- .../ArmoniK.Api.Client/Options/GrpcClient.cs | 10 ++++++++++ .../Submitter/GrpcChannelFactory.cs | 18 ++++++++++++++++++ 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eb150592b..0d3ff18ca 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,19 +29,20 @@ jobs: runtime: windows-x64 - os: windows-2022 runtime: windows-x64 + handler: + - '' + - GrpcWebHandler exclude: - dotnet: version: '' - framework: net4.7 platform: os: ubuntu-latest - runtime: linux-x64 - dotnet: - version: '' - framework: net4.8 - platform: - os: ubuntu-latest - runtime: linux-x64 + version: 6.0 + handler: GrpcWebHandler + - dotnet: + version: 8.0 + handler: GrpcWebHandler runs-on: ${{ matrix.platform.os }} steps: @@ -87,6 +88,8 @@ jobs: - name: Test working-directory: packages/csharp/ shell: bash + env: + GrpcClient__HttpMessageHandler: ${{ matrix.handler }} run: | set +e set -x @@ -122,6 +125,6 @@ jobs: uses: dorny/test-reporter@v1 if: always() with: - name: ConnectivityTests ${{ matrix.platform.os }} ${{ matrix.dotnet.framework }} + name: ConnectivityTests ${{ matrix.platform.os }} ${{ matrix.dotnet.framework }} ${{ matrix.handler }} path: ./packages/csharp/ArmoniK.Api.Client.Test/TestResults/test-results.trx reporter: dotnet-trx diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs index 1c1da2b5f..d054313e3 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs +++ b/packages/csharp/ArmoniK.Api.Client.Test/ConnectivityKind.cs @@ -49,6 +49,9 @@ internal static class ConnectivityKindExt private static string CertFolder => Environment.GetEnvironmentVariable("CertFolder") ?? "../../../../certs"; + private static string MessageHandler + => Environment.GetEnvironmentVariable("GrpcClient__HttpMessageHandler") ?? ""; + internal static bool IsTls(this ConnectivityKind kind) => kind switch { @@ -90,7 +93,8 @@ internal static (string?, string?) GetClientCertPath(this ConnectivityKind kind) internal static string GetEndpoint(this ConnectivityKind kind) => kind switch { - ConnectivityKind.Unencrypted => RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework") + ConnectivityKind.Unencrypted => RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework") || MessageHandler.ToLower() + .Contains("web") ? "http://localhost:4999" : "http://localhost:5000", ConnectivityKind.TlsInsecure => "https://localhost:5001", @@ -113,6 +117,7 @@ internal static GrpcChannel GetChannel(this ConnectivityKind kind) CertPem = certPath ?? "", KeyPem = keyPath ?? "", CaCert = kind.GetCaCertPath() ?? "", + HttpMessageHandler = MessageHandler, }); } } diff --git a/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs b/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs index 8b60ae5e6..938b1b562 100644 --- a/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs +++ b/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs @@ -125,5 +125,15 @@ public bool HasClientCertificate /// Timeout for grpc requests. Defaults to no timeout. /// public TimeSpan RequestTimeout { get; set; } = Timeout.InfiniteTimeSpan; + + /// + /// Which HttpMessageHandler to use. + /// Valid options: + /// - `HttpClientHandler` + /// - `WinHttpHandler` + /// - `GrpcWebHandler` + /// If the handler is not set, the best one will be used. + /// + public string HttpMessageHandler { get; set; } = ""; } } diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 50e5a39f7..0632d06f0 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -386,6 +386,14 @@ public static GrpcChannel CreateChannel(GrpcClient optionsGrpcClient, logger?.LogWarning("OverrideTargetName is not supported"); } + // ReSharper disable once ConvertTypeCheckPatternToNullCheck + if (ParseHandler(optionsGrpcClient.HttpMessageHandler) is HandlerType handlerType) + { + return CreateChannelInternal(optionsGrpcClient, + handlerType, + logger); + } + // If dotnet core (>= Net 5), we can use HttpClientHandler if (!RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework")) { @@ -489,6 +497,16 @@ public static X509Certificate2 GetCertificate(GrpcClient optionsGrpcClient) X509KeyStorageFlags.Exportable); } + private static HandlerType? ParseHandler(string handler) + => handler.ToLower() switch + { + "" => null, + "httpclienthandler" or "httpclient" or "http" or "client" => HandlerType.Http, + "winhttphandler" or "winhttp" or "win" => HandlerType.Win, + "grpcwebhandler" or "grpcweb" or "web" => HandlerType.Web, + _ => throw new ArgumentException($"Invalid HandlerType: {handler}"), + }; + private enum HandlerType { /// From fba6d2e1e4058e4e9e0e0086d07f4aa09b67d378 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Fri, 24 May 2024 10:18:51 +0200 Subject: [PATCH 246/344] Remove duplicated call --- .../ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 1d53f9de6..280a91040 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -182,9 +182,8 @@ private static HttpMessageHandler CreateHttpMessageHandler(bool htt if (https) { - winHandler.SslProtocols = GetSslProtocols(); - winHandler.ServerCertificateValidationCallback = GetServerCertificateValidationCallback(insecure, - caCert); + winHandler.SslProtocols = sslProtocols; + winHandler.ServerCertificateValidationCallback = validationCallback; if (clientCert is not null) { From d529433df8ee3f298e31701f190fa4a406ac8a29 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Fri, 24 May 2024 18:36:32 +0200 Subject: [PATCH 247/344] Propagate Obsolete --- .../Submitter/SubmitterClientExt.cs | 5 ++++- .../csharp/ArmoniK.Api.Mock/Services/Submitter.cs | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/SubmitterClientExt.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/SubmitterClientExt.cs index 1d9f8c897..3b01c716c 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/SubmitterClientExt.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/SubmitterClientExt.cs @@ -1,6 +1,6 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2022. All rights reserved. +// Copyright (C) ANEO, 2021-2024. All rights reserved. // W. Kirschenmann // J. Gurhem // D. Dubuc @@ -54,6 +54,7 @@ public static class SubmitterClientExt /// /// The reply to task creation /// + [Obsolete] public static async Task CreateTasksAsync(this gRPC.V1.Submitter.Submitter.SubmitterClient client, string sessionId, TaskOptions? taskOptions, @@ -77,6 +78,7 @@ public static async Task CreateTasksAsync(this gRPC.V1.Submitte /// /// The reply to task creation /// + [Obsolete] public static async Task CreateTasksAsync(this gRPC.V1.Submitter.Submitter.SubmitterClient client, string sessionId, TaskOptions? taskOptions, @@ -249,6 +251,7 @@ private static async IAsyncEnumerable ToRequestStream(th /// /// a result reply chunk is not data, rending it impossible to reconstitute the data /// result reply type is unknown + [Obsolete] public static async Task GetResultAsync(this gRPC.V1.Submitter.Submitter.SubmitterClient client, ResultRequest resultRequest, CancellationToken cancellationToken = default) diff --git a/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs b/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs index dd03f5256..d60d7c1d0 100644 --- a/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs +++ b/packages/csharp/ArmoniK.Api.Mock/Services/Submitter.cs @@ -28,6 +28,7 @@ namespace ArmoniK.Api.Mock.Services; public class Submitter : gRPC.V1.Submitter.Submitter.SubmitterBase { /// + [Obsolete] [Count] public override Task GetServiceConfiguration(Empty request, ServerCallContext context) @@ -37,18 +38,21 @@ public override Task GetServiceConfiguration(Empty re }); /// + [Obsolete] [Count] public override Task CancelSession(Session request, ServerCallContext context) => Task.FromResult(new Empty()); /// + [Obsolete] [Count] public override Task CancelTasks(TaskFilter request, ServerCallContext context) => Task.FromResult(new Empty()); /// + [Obsolete] [Count] public override Task CreateSession(CreateSessionRequest request, ServerCallContext context) @@ -58,6 +62,7 @@ public override Task CreateSession(CreateSessionRequest requ }); /// + [Obsolete] [Count] public override Task CreateSmallTasks(CreateSmallTaskRequest request, ServerCallContext context) @@ -69,6 +74,7 @@ public override Task CreateSmallTasks(CreateSmallTaskRequest re /// + [Obsolete] [Count] public override async Task CreateLargeTasks(IAsyncStreamReader requestStream, ServerCallContext context) @@ -85,12 +91,14 @@ public override async Task CreateLargeTasks(IAsyncStreamReader< } /// + [Obsolete] [Count] public override Task CountTasks(TaskFilter request, ServerCallContext context) => Task.FromResult(new Count()); /// + [Obsolete] [Count] public override async Task TryGetResultStream(ResultRequest request, IServerStreamWriter responseStream, @@ -105,12 +113,14 @@ public override async Task TryGetResultStream(ResultRequest r .ConfigureAwait(false); /// + [Obsolete] [Count] public override Task WaitForCompletion(WaitRequest request, ServerCallContext context) => Task.FromResult(new Count()); /// + [Obsolete] [Count] public override Task TryGetTaskOutput(TaskOutputRequest request, ServerCallContext context) @@ -130,6 +140,7 @@ public override Task WaitForAvailability(ResultRequest re }); /// + [Obsolete] [Count] public override Task GetTaskStatus(GetTaskStatusRequest request, ServerCallContext context) @@ -143,18 +154,21 @@ public override Task GetResultStatus(GetResultStatusReques => Task.FromResult(new GetResultStatusReply()); /// + [Obsolete] [Count] public override Task ListTasks(TaskFilter request, ServerCallContext context) => Task.FromResult(new TaskIdList()); /// + [Obsolete] [Count] public override Task ListSessions(SessionFilter request, ServerCallContext context) => Task.FromResult(new SessionIdList()); /// + [Obsolete] [Count] public override async Task WatchResults(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, From 1b25f99f03530b214747abfe42edf30a2cb522ee Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Tue, 28 May 2024 17:02:11 +0200 Subject: [PATCH 248/344] Add proxy options --- .../ArmoniK.Api.Client/Options/GrpcClient.cs | 19 ++++ .../Submitter/GrpcChannelFactory.cs | 97 +++++++++++++++++++ 2 files changed, 116 insertions(+) diff --git a/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs b/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs index 938b1b562..83cae164f 100644 --- a/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs +++ b/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs @@ -135,5 +135,24 @@ public bool HasClientCertificate /// If the handler is not set, the best one will be used. /// public string HttpMessageHandler { get; set; } = ""; + + /// + /// Proxy configuration. + /// If empty, the default proxy configuration is used. + /// If "none", proxy is disabled. + /// If "system", the system proxy is used + /// Otherwise, it is the URL of the proxy to use + /// + public string Proxy { get; set; } = ""; + + /// + /// Username used for proxy authentication + /// + public string ProxyUsername { get; set; } = ""; + + /// + /// Password used for proxy authentication + /// + public string ProxyPassword { get; set; } = ""; } } diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 280a91040..0fc348da9 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -134,6 +134,8 @@ public static class GrpcChannelFactory /// Whether the Server Certificate should be validated or not /// Root certificate to validate the server certificate against /// Client certificate to be used for mTLS + /// Proxy configuration to use + /// Type of the proxy used /// Which HttpMessageHandler type to use /// Optional logger /// HttpMessageHandler @@ -141,6 +143,8 @@ private static HttpMessageHandler CreateHttpMessageHandler(bool htt bool insecure, X509Certificate? caCert, X509Certificate2? clientCert, + IWebProxy? proxy, + ProxyType proxyType, HandlerType handlerType, ILogger? logger = null) { @@ -165,6 +169,22 @@ private static HttpMessageHandler CreateHttpMessageHandler(bool htt httpHandler.SslProtocols = sslProtocols; httpHandler.ServerCertificateCustomValidationCallback = validationCallback; + switch (proxyType) + { + case ProxyType.None: + httpHandler.Proxy = null; + httpHandler.UseProxy = false; + break; + case ProxyType.System: + httpHandler.Proxy = null; + httpHandler.UseProxy = true; + break; + case ProxyType.Custom: + httpHandler.Proxy = proxy; + httpHandler.UseProxy = true; + break; + } + if (clientCert is not null) { httpHandler.ClientCertificates.Add(clientCert); @@ -191,6 +211,22 @@ private static HttpMessageHandler CreateHttpMessageHandler(bool htt } } + switch (proxyType) + { + case ProxyType.None: + winHandler.Proxy = null; + winHandler.WindowsProxyUsePolicy = WindowsProxyUsePolicy.DoNotUseProxy; + break; + case ProxyType.System: + winHandler.Proxy = null; + winHandler.WindowsProxyUsePolicy = WindowsProxyUsePolicy.UseWinHttpProxy; + break; + case ProxyType.Custom: + winHandler.Proxy = proxy; + winHandler.WindowsProxyUsePolicy = WindowsProxyUsePolicy.UseCustomProxy; + break; + } + if (handlerType is HandlerType.Web) { return new GrpcWebHandler(winHandler); @@ -292,6 +328,42 @@ private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, ? GetCertificate(optionsGrpcClient) : null; + ICredentials? proxyCredentials = null; + if (!string.IsNullOrEmpty(optionsGrpcClient.ProxyUsername) || !string.IsNullOrEmpty(optionsGrpcClient.ProxyPassword)) + { + proxyCredentials = new NetworkCredential(optionsGrpcClient.ProxyUsername, + optionsGrpcClient.ProxyPassword); + } + + IWebProxy? proxy = null; + ProxyType proxyType; + + switch (optionsGrpcClient.Proxy) + { + case "": + proxyType = ProxyType.Undefined; + break; + case "none": + case "None": + logger?.LogDebug("Unsetting proxy for the gRPC channel"); + proxyType = ProxyType.None; + break; + case "system": + case "System": + logger?.LogDebug("Using system proxy for the gRPC channel"); + proxyType = ProxyType.System; + break; + default: + logger?.LogDebug("Using custom proxy for the gRPC channel: {Proxy}", + optionsGrpcClient.Proxy); + proxyType = ProxyType.Custom; + proxy = new WebProxy(optionsGrpcClient.Proxy, + false, + Array.Empty(), + proxyCredentials); + break; + } + switch (handlerType) { case HandlerType.Http: @@ -312,6 +384,8 @@ private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, optionsGrpcClient.AllowUnsafeConnection, caCert, clientCert, + proxy, + proxyType, handlerType, logger); @@ -510,6 +584,29 @@ public static X509Certificate2 GetCertificate(GrpcClient optionsGrpcClient) _ => throw new ArgumentException($"Invalid HandlerType: {handler}"), }; + private enum ProxyType + { + /// + /// No proxy configuration defined + /// + Undefined, + + /// + /// Do not use any proxy, even if the system has one configured + /// + None, + + /// + /// Use the proxy configured on the system + /// + System, + + /// + /// Use a custom proxy + /// + Custom, + } + private enum HandlerType { /// From 57fe8ce37a91dc155ddb5d0be328a3dac4dbb6c0 Mon Sep 17 00:00:00 2001 From: ngruelaneo <100275739+ngruelaneo@users.noreply.github.com> Date: Fri, 31 May 2024 15:19:19 +0200 Subject: [PATCH 249/344] ci: add package manager to resolve problem in ci (#518) Co-authored-by: Faust1 --- .github/workflows/ci.yml | 1 + package.json | 1 + packages/angular/package.json | 1 + packages/web/package.json | 1 + 4 files changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d45d0788..4ae127ebe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -191,6 +191,7 @@ jobs: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 with: fetch-depth: 0 + - run: npm install -g pnpm@9.1.4 - run: corepack enable - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: diff --git a/package.json b/package.json index 7293d91f7..3f02901a4 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "armonik.api", + "packageManager": "pnpm@9.1.4", "scripts": { "ci:publish": "zx scripts/publish.mjs", "ci:publish-edge": "zx scripts/publish-edge.mjs", diff --git a/packages/angular/package.json b/packages/angular/package.json index ea0ce626f..baae3f74b 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,7 @@ { "name": "armonik.api.angular", "private": true, + "packageManager": "pnpm@9.1.4", "scripts": { "ng": "ng", "start": "ng serve", diff --git a/packages/web/package.json b/packages/web/package.json index bb1d384ca..1fc2a1a30 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,7 @@ { "name": "@aneoconsultingfr/armonik.api", "version": "3.17.1", + "packageManager": "pnpm@9.1.4", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", From c5f3bf9a77ef92071aca3087610e4ccf1efc42b3 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Tue, 4 Jun 2024 17:47:51 +0200 Subject: [PATCH 250/344] chore: version 3.18.0 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 714f172b3..42463b46d 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.17.1", + "version": "3.18.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index bf5fc4627..4eb56f714 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.17.1) +set(version 3.18.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 96c3cd41e..0015163ae 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.17.1 - 3.17.1 + 3.18.0 + 3.18.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index ead2d2065..4473b2e5f 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.17.1 - 3.17.1 + 3.18.0 + 3.18.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index c55bbbf3c..198e1cc52 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.17.1 - 3.17.1 + 3.18.0 + 3.18.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 78a535f2d..6e450b985 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.17.1 - 3.17.1 + 3.18.0 + 3.18.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index d4699063d..0a44d4f58 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.17.1 - 3.17.1 + 3.18.0 + 3.18.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 21a9d0cc4..f15de054c 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.17.1 - 3.17.1 + 3.18.0 + 3.18.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 2a3323624..15d90661b 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.17.1 - 3.17.1 + 3.18.0 + 3.18.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 8b0bdbeeb..f226fb469 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.17.1 - 3.17.1 + 3.18.0 + 3.18.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index 1fc2a1a30..11e531885 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.17.1", + "version": "3.18.0", "packageManager": "pnpm@9.1.4", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From 1558342cecd79e6c1c8ff55ecc1b1434e1cbb4ea Mon Sep 17 00:00:00 2001 From: Hassan EL MZABI Date: Fri, 19 Apr 2024 10:52:03 +0200 Subject: [PATCH 251/344] update .gitignore file to adapt with java binding impl initial java project for grpc impl Armonik: Java client layer - v1 rename module to java CI: add java config CI : add java distribution (oracle) CI: fix working directory for java package CI: Fix LinkJs error, correct distribution format CI: rename java stage java: add javadocs and fix result client impl java: remove tests temporary java: correct project version and artifactId name java: improve task client factory using static methods --- .github/workflows/ci.yml | 20 ++ .gitignore | 12 + packages/java/pom.xml | 128 ++++++++ .../client/event/EventClientFactory.java | 32 ++ .../client/event/impl/EventClientAsync.java | 69 +++++ .../client/event/impl/EventClientSync.java | 58 ++++ .../factory/EventClientRequestFactory.java | 52 ++++ .../EventSubscriptionResponseRecord.java | 16 + .../client/event/spec/IEventClientAsync.java | 10 + .../client/event/spec/IEventClientSync.java | 10 + .../client/result/ResultClientFactory.java | 32 ++ .../client/result/impl/ResultClientAsync.java | 277 ++++++++++++++++++ .../client/result/impl/ResultClientSync.java | 88 ++++++ .../factory/ResultClientRequestFactory.java | 60 ++++ .../DeleteResultsDataResponseRecord.java | 6 + .../records/WatchResultResponseRecord.java | 8 + .../result/spec/IResultClientAsync.java | 32 ++ .../client/result/spec/IResultClientSync.java | 26 ++ .../client/session/SessionClientFactory.java | 33 +++ .../session/impl/SessionClientAsync.java | 269 +++++++++++++++++ .../session/impl/SesssionClientSync.java | 162 ++++++++++ .../util/SessionClientRequestFactory.java | 69 +++++ .../session/spec/ISessionClientAsync.java | 30 ++ .../session/spec/ISessionClientSync.java | 52 ++++ .../client/task/TaskClientFactory.java | 33 +++ .../client/task/impl/TaskClientAsync.java | 203 +++++++++++++ .../client/task/impl/TaskClientSync.java | 79 +++++ .../impl/util/TaskClientRequestFactory.java | 77 +++++ .../client/task/spec/ITaskClientAsync.java | 24 ++ .../client/task/spec/ITaskClientSync.java | 23 ++ packages/java/src/main/resources/logback.xml | 13 + .../org.mockito.plugins.MockMaker | 1 + 32 files changed, 2004 insertions(+) create mode 100644 packages/java/pom.xml create mode 100644 packages/java/src/main/java/armonik/client/event/EventClientFactory.java create mode 100644 packages/java/src/main/java/armonik/client/event/impl/EventClientAsync.java create mode 100644 packages/java/src/main/java/armonik/client/event/impl/EventClientSync.java create mode 100644 packages/java/src/main/java/armonik/client/event/impl/util/factory/EventClientRequestFactory.java create mode 100644 packages/java/src/main/java/armonik/client/event/impl/util/records/EventSubscriptionResponseRecord.java create mode 100644 packages/java/src/main/java/armonik/client/event/spec/IEventClientAsync.java create mode 100644 packages/java/src/main/java/armonik/client/event/spec/IEventClientSync.java create mode 100644 packages/java/src/main/java/armonik/client/result/ResultClientFactory.java create mode 100644 packages/java/src/main/java/armonik/client/result/impl/ResultClientAsync.java create mode 100644 packages/java/src/main/java/armonik/client/result/impl/ResultClientSync.java create mode 100644 packages/java/src/main/java/armonik/client/result/impl/util/factory/ResultClientRequestFactory.java create mode 100644 packages/java/src/main/java/armonik/client/result/impl/util/records/DeleteResultsDataResponseRecord.java create mode 100644 packages/java/src/main/java/armonik/client/result/impl/util/records/WatchResultResponseRecord.java create mode 100644 packages/java/src/main/java/armonik/client/result/spec/IResultClientAsync.java create mode 100644 packages/java/src/main/java/armonik/client/result/spec/IResultClientSync.java create mode 100644 packages/java/src/main/java/armonik/client/session/SessionClientFactory.java create mode 100644 packages/java/src/main/java/armonik/client/session/impl/SessionClientAsync.java create mode 100644 packages/java/src/main/java/armonik/client/session/impl/SesssionClientSync.java create mode 100644 packages/java/src/main/java/armonik/client/session/impl/util/SessionClientRequestFactory.java create mode 100644 packages/java/src/main/java/armonik/client/session/spec/ISessionClientAsync.java create mode 100644 packages/java/src/main/java/armonik/client/session/spec/ISessionClientSync.java create mode 100644 packages/java/src/main/java/armonik/client/task/TaskClientFactory.java create mode 100644 packages/java/src/main/java/armonik/client/task/impl/TaskClientAsync.java create mode 100644 packages/java/src/main/java/armonik/client/task/impl/TaskClientSync.java create mode 100644 packages/java/src/main/java/armonik/client/task/impl/util/TaskClientRequestFactory.java create mode 100644 packages/java/src/main/java/armonik/client/task/spec/ITaskClientAsync.java create mode 100644 packages/java/src/main/java/armonik/client/task/spec/ITaskClientSync.java create mode 100644 packages/java/src/main/resources/logback.xml create mode 100644 packages/java/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ae127ebe..c8b0a6d55 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -336,3 +336,23 @@ jobs: if-no-files-found: error path: packages/cpp/tools/packaging/*.${{ matrix.type }} name: libarmonik.${{ matrix.type }} + + build-java-packages: + name: Build Java + runs-on: ubuntu-latest + defaults: + run: + working-directory: packages/java + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + fetch-depth: 0 + - name: Set up java 17 + uses: actions/setup-java@v4 + with: + distribution: oracle + java-version: 17 + cache: maven + - name: Build the package + run: mvn clean install -DskipTests diff --git a/.gitignore b/.gitignore index 0deaa71df..19ea261d4 100644 --- a/.gitignore +++ b/.gitignore @@ -381,6 +381,7 @@ dist !packages/python !packages/angular !packages/web +!packages/java packages/web/LICENSE !.docs/content/** @@ -390,3 +391,14 @@ packages/web/LICENSE **/.idea gen + +# Maven +target/ + +# Compiled class file +*.class + +# IDE-specific files +*.iml +*.ipr +*.iws diff --git a/packages/java/pom.xml b/packages/java/pom.xml new file mode 100644 index 000000000..ecad9114c --- /dev/null +++ b/packages/java/pom.xml @@ -0,0 +1,128 @@ + + + 4.0.0 + + org.aneo + armonik-java + GRPC java binding for the Armonik orchestrator API + 0.1.0 + + + 17 + 17 + UTF-8 + 0.6.1 + 1.7.1 + ../../Protos/V1 + 2.0.12 + 1.5.5 + + + + + io.grpc + grpc-netty + 1.62.2 + + + io.grpc + grpc-protobuf + 1.62.2 + + + io.grpc + grpc-stub + 1.62.2 + + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.6.1 + + + javax.annotation + javax.annotation-api + 1.3.2 + + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + org.slf4j + slf4j-api + ${sl4j.version} + + + + org.junit.jupiter + junit-jupiter-engine + 5.10.2 + test + + + + + + + org.mockito + mockito-core + 5.11.0 + test + + + + + org.mockito + mockito-junit-jupiter + 5.11.0 + test + + + + + + + + + + kr.motd.maven + os-maven-plugin + ${os-maven-plugin.version} + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + ${protobuf-maven-plugin.version} + + ${proto.path} + + com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier} + + grpc-java + + io.grpc:protoc-gen-grpc-java:1.4.0:exe:${os.detected.classifier} + + + + + + compile + compile-custom + + + + + + + + diff --git a/packages/java/src/main/java/armonik/client/event/EventClientFactory.java b/packages/java/src/main/java/armonik/client/event/EventClientFactory.java new file mode 100644 index 000000000..5f97b345c --- /dev/null +++ b/packages/java/src/main/java/armonik/client/event/EventClientFactory.java @@ -0,0 +1,32 @@ +package armonik.client.event; + +import armonik.client.event.impl.EventClientAsync; +import armonik.client.event.impl.EventClientSync; +import armonik.client.event.spec.IEventClientAsync; +import armonik.client.event.spec.IEventClientSync; +import io.grpc.ManagedChannel; + +/** + * EventClientFactory provides static factory methods to create instances of event client implementations. + */ +public abstract class EventClientFactory { + /** + * Creates an asynchronous event client instance with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the event service + * @return an instance of {@link IEventClientAsync} representing an asynchronous event client + */ + public static IEventClientAsync createEventClientAsync(ManagedChannel managedChannel) { + return new EventClientAsync(managedChannel); + } + + /** + * Creates a synchronous event client instance with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the event service + * @return an instance of {@link IEventClientSync} representing a synchronous event client + */ + public static IEventClientSync createEventClientSync(ManagedChannel managedChannel) { + return new EventClientSync(managedChannel); + } +} diff --git a/packages/java/src/main/java/armonik/client/event/impl/EventClientAsync.java b/packages/java/src/main/java/armonik/client/event/impl/EventClientAsync.java new file mode 100644 index 000000000..5eef6e32d --- /dev/null +++ b/packages/java/src/main/java/armonik/client/event/impl/EventClientAsync.java @@ -0,0 +1,69 @@ +package armonik.client.event.impl; + +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionRequest; +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse; +import armonik.api.grpc.v1.events.EventsGrpc; +import armonik.client.event.impl.util.factory.EventClientRequestFactory; +import armonik.client.event.impl.util.records.EventSubscriptionResponseRecord; +import armonik.client.event.spec.IEventClientAsync; +import io.grpc.ManagedChannel; +import io.grpc.stub.StreamObserver; + +import java.util.List; + +/** + * EventClientAsync is an asynchronous implementation of the {@link IEventClientAsync} interface. + * It communicates with the event service using a non-blocking stub, making asynchronous calls to wait for event updates. + */ +public class EventClientAsync implements IEventClientAsync { + private final EventsGrpc.EventsStub eventsStub; + + /** + * Constructs an EventClientAsync object with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the event service + */ + public EventClientAsync(ManagedChannel managedChannel) { + eventsStub = EventsGrpc.newStub(managedChannel); + } + + + /** + * Waits for event updates for the specified session ID and result IDs, and sends responses to the provided StreamObserver. + * + * @param sessionId the ID of the session for which event updates are awaited + * @param resultIds the list of result IDs for which event updates are awaited + * @param responseObserver a StreamObserver to handle the responses, containing entry of EventSubscriptionResponseRecord + */ + @Override + public void waitForEventsUpdateBySessionId(String sessionId, List resultIds, StreamObserver responseObserver) { + StreamObserver proxyObserver = new StreamObserver<>() { + @Override + public void onNext(EventSubscriptionResponse esr) { + responseObserver + .onNext( + new EventSubscriptionResponseRecord( + sessionId, + esr.getTaskStatusUpdate(), + esr.getResultStatusUpdate(), + esr.getResultOwnerUpdate(), + esr.getNewTask(), + esr.getNewResult() + ) + ); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + EventSubscriptionRequest request = EventClientRequestFactory.CreateEventSubscriptionRequest(sessionId, resultIds); + eventsStub.getEvents(request, proxyObserver); + } +} diff --git a/packages/java/src/main/java/armonik/client/event/impl/EventClientSync.java b/packages/java/src/main/java/armonik/client/event/impl/EventClientSync.java new file mode 100644 index 000000000..c55c4fb90 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/event/impl/EventClientSync.java @@ -0,0 +1,58 @@ +package armonik.client.event.impl; + +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionRequest; +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse; +import armonik.api.grpc.v1.events.EventsGrpc; +import armonik.api.grpc.v1.events.EventsGrpc.EventsBlockingStub; +import armonik.client.event.impl.util.factory.EventClientRequestFactory; +import armonik.client.event.impl.util.records.EventSubscriptionResponseRecord; +import armonik.client.event.spec.IEventClientSync; +import com.google.common.collect.Lists; +import io.grpc.ManagedChannel; + +import java.util.List; + +/** + * EventClientSync is a synchronous implementation of the {@link IEventClientSync} interface. + * It communicates with the event service using a blocking stub, making synchronous calls to retrieve event updates. + */ +public class EventClientSync implements IEventClientSync { + + private final EventsBlockingStub eventsBlockingStub; + + + /** + * Constructs an EventClientSync object with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the event service + */ + public EventClientSync(ManagedChannel managedChannel) { + this.eventsBlockingStub = EventsGrpc.newBlockingStub(managedChannel); + } + + + /** + * Retrieves event updates for the specified session ID and result IDs. + * + * @param sessionId the session ID for which event updates are requested + * @param resultIds the list of result IDs for which event updates are requested + * @return a list containing event update responses + */ + @Override + public List getEventsUpdateBySessionId(String sessionId, List resultIds) { + EventSubscriptionRequest request = EventClientRequestFactory.CreateEventSubscriptionRequest(sessionId, resultIds); + + List subscriptionResponses = Lists.newArrayList(eventsBlockingStub.getEvents(request)); + + return subscriptionResponses.stream() + .map( + esr -> new EventSubscriptionResponseRecord( + sessionId, + esr.getTaskStatusUpdate(), + esr.getResultStatusUpdate(), + esr.getResultOwnerUpdate(), + esr.getNewTask(), + esr.getNewResult()) + ).toList(); + } +} diff --git a/packages/java/src/main/java/armonik/client/event/impl/util/factory/EventClientRequestFactory.java b/packages/java/src/main/java/armonik/client/event/impl/util/factory/EventClientRequestFactory.java new file mode 100644 index 000000000..2f493d5cf --- /dev/null +++ b/packages/java/src/main/java/armonik/client/event/impl/util/factory/EventClientRequestFactory.java @@ -0,0 +1,52 @@ +package armonik.client.event.impl.util.factory; + +import armonik.api.grpc.v1.FiltersCommon; +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionRequest; +import armonik.api.grpc.v1.results.ResultsFields; +import armonik.api.grpc.v1.results.ResultsFilters; + +import java.util.List; + +import static armonik.api.grpc.v1.events.EventsCommon.EventsEnum.EVENTS_ENUM_NEW_RESULT; +import static armonik.api.grpc.v1.events.EventsCommon.EventsEnum.EVENTS_ENUM_RESULT_STATUS_UPDATE; +import static armonik.api.grpc.v1.results.ResultsFields.ResultRawEnumField.RESULT_RAW_ENUM_FIELD_RESULT_ID; + +/** + * EventClientRequestFactory provides static methods to create event subscription requests. + * It constructs EventSubscriptionRequest objects based on provided session ID and result IDs. + */ +public class EventClientRequestFactory { + + /** + * Creates an event subscription request with the specified session ID and result IDs. + * + * @param sessionId the session ID for which event subscription is requested + * @param resultIds the list of result IDs to filter events + * @return an EventSubscriptionRequest object configured with the provided session ID and result IDs + */ + public static EventSubscriptionRequest CreateEventSubscriptionRequest(String sessionId, List resultIds){ + FiltersCommon.FilterString filterString = FiltersCommon.FilterString.newBuilder() + .setOperator(FiltersCommon.FilterStringOperator.FILTER_STRING_OPERATOR_EQUAL) + .build(); + + ResultsFields.ResultField.Builder resultField = ResultsFields.ResultField.newBuilder() + .setResultRawField(ResultsFields.ResultRawField.newBuilder().setField(RESULT_RAW_ENUM_FIELD_RESULT_ID)); + + ResultsFilters.FilterField.Builder filterFieldBuilder = ResultsFilters.FilterField.newBuilder() + .setField(resultField) + .setFilterString(filterString); + + ResultsFilters.Filters.Builder resultFiltersBuilder = ResultsFilters.Filters.newBuilder(); + for (String resultId : resultIds) { + filterFieldBuilder.setFilterString(FiltersCommon.FilterString.newBuilder().setValue(resultId).build()); + resultFiltersBuilder.addOr(ResultsFilters.FiltersAnd.newBuilder().addAnd(filterFieldBuilder).build()); + } + + return EventSubscriptionRequest.newBuilder() + .setResultsFilters(resultFiltersBuilder.build()) + .addReturnedEvents(EVENTS_ENUM_RESULT_STATUS_UPDATE) + .addReturnedEvents(EVENTS_ENUM_NEW_RESULT) + .setSessionId(sessionId) + .build(); + } +} diff --git a/packages/java/src/main/java/armonik/client/event/impl/util/records/EventSubscriptionResponseRecord.java b/packages/java/src/main/java/armonik/client/event/impl/util/records/EventSubscriptionResponseRecord.java new file mode 100644 index 000000000..29a8aab5e --- /dev/null +++ b/packages/java/src/main/java/armonik/client/event/impl/util/records/EventSubscriptionResponseRecord.java @@ -0,0 +1,16 @@ +package armonik.client.event.impl.util.records; + +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse.*; + +/** + * EventUpdateResponse represents the response containing updates for various event-related entities. + * It encapsulates changes in task status, result status, result owner, new task, and new result. + */ +public record EventSubscriptionResponseRecord(String sessionId, + TaskStatusUpdate taskStatusUpdate, + ResultStatusUpdate resultStatusUpdate, + ResultOwnerUpdate resultOwnerUpdate, + NewTask newTask, + NewResult newResult + ) { +} diff --git a/packages/java/src/main/java/armonik/client/event/spec/IEventClientAsync.java b/packages/java/src/main/java/armonik/client/event/spec/IEventClientAsync.java new file mode 100644 index 000000000..e844c1522 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/event/spec/IEventClientAsync.java @@ -0,0 +1,10 @@ +package armonik.client.event.spec; + +import armonik.client.event.impl.util.records.EventSubscriptionResponseRecord; +import io.grpc.stub.StreamObserver; + +import java.util.List; + +public interface IEventClientAsync { + void waitForEventsUpdateBySessionId(String sessionId, List resultIds, StreamObserver responseObserver); +} diff --git a/packages/java/src/main/java/armonik/client/event/spec/IEventClientSync.java b/packages/java/src/main/java/armonik/client/event/spec/IEventClientSync.java new file mode 100644 index 000000000..098103e62 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/event/spec/IEventClientSync.java @@ -0,0 +1,10 @@ +package armonik.client.event.spec; + +import armonik.client.event.impl.util.records.EventSubscriptionResponseRecord; + +import java.util.List; + +public interface IEventClientSync { + List getEventsUpdateBySessionId(String sessionId, List resultIds); + +} diff --git a/packages/java/src/main/java/armonik/client/result/ResultClientFactory.java b/packages/java/src/main/java/armonik/client/result/ResultClientFactory.java new file mode 100644 index 000000000..57e61d3f5 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/result/ResultClientFactory.java @@ -0,0 +1,32 @@ +package armonik.client.result; + +import armonik.client.result.impl.ResultClientAsync; +import armonik.client.result.impl.ResultClientSync; +import armonik.client.result.spec.IResultClientAsync; +import armonik.client.result.spec.IResultClientSync; +import io.grpc.ManagedChannel; + +/** + * ResultClientFactory provides static factory methods to create instances of result client implementations. + */ +public abstract class ResultClientFactory { + /** + * Creates a synchronous result client instance with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the result service + * @return an instance of {@link IResultClientSync} representing a synchronous result client + */ + public static IResultClientSync createResultClientSync(ManagedChannel managedChannel) { + return new ResultClientSync(managedChannel); + } + + /** + * Creates an asynchronous result client instance with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the result service + * @return an instance of {@link IResultClientAsync} representing an asynchronous result client + */ + public static IResultClientAsync createResultClientAsync(ManagedChannel managedChannel) { + return new ResultClientAsync(managedChannel); + } +} diff --git a/packages/java/src/main/java/armonik/client/result/impl/ResultClientAsync.java b/packages/java/src/main/java/armonik/client/result/impl/ResultClientAsync.java new file mode 100644 index 000000000..bab5be18a --- /dev/null +++ b/packages/java/src/main/java/armonik/client/result/impl/ResultClientAsync.java @@ -0,0 +1,277 @@ +package armonik.client.result.impl; + +import armonik.api.grpc.v1.Objects; +import armonik.api.grpc.v1.results.ResultsCommon; +import armonik.api.grpc.v1.results.ResultsCommon.*; +import armonik.api.grpc.v1.results.ResultsFilters; +import armonik.api.grpc.v1.results.ResultsGrpc; +import armonik.api.grpc.v1.results.ResultsGrpc.ResultsStub; +import armonik.client.result.impl.util.factory.ResultClientRequestFactory; +import armonik.client.result.impl.util.records.DeleteResultsDataResponseRecord; +import armonik.client.result.impl.util.records.WatchResultResponseRecord; +import armonik.client.result.spec.IResultClientAsync; +import io.grpc.ManagedChannel; +import io.grpc.stub.StreamObserver; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * ResultClientAsync is an asynchronous implementation of the {@link IResultClientAsync} interface. + * It communicates with the result service using a non-blocking stub, making asynchronous calls to perform various result-related operations. + */ +public class ResultClientAsync implements IResultClientAsync { + private final ResultsStub resultsStub; + + public ResultClientAsync(ManagedChannel managedChannel) { + this.resultsStub = ResultsGrpc.newStub(managedChannel); + } + + @Override + public StreamObserver watchResults(StreamObserver responseObserver) { + StreamObserver proxyObserver = new StreamObserver<>() { + @Override + public void onNext(WatchResultResponse watchResultResponse) { + responseObserver.onNext(new WatchResultResponseRecord(watchResultResponse.getStatus(), watchResultResponse.getResultIdsList())); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + return resultsStub.watchResults(proxyObserver); + } + + @Override + public void getServiceConfiguration(StreamObserver responseObserver) { + StreamObserver observer = new StreamObserver() { + @Override + public void onNext(ResultsServiceConfigurationResponse resultsServiceConfigurationResponse) { + responseObserver.onNext(resultsServiceConfigurationResponse.getDataChunkMaxSize()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + resultsStub.getServiceConfiguration(Objects.Empty.newBuilder().build(), observer); + } + + + @Override + public void deleteResultsData(String sessionId, List resultIds, StreamObserver responseObserver) { + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(DeleteResultsDataResponse deleteResultsDataResponse) { + responseObserver.onNext(new DeleteResultsDataResponseRecord(sessionId, deleteResultsDataResponse.getResultIdList())); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + ResultsCommon.DeleteResultsDataRequest request = ResultClientRequestFactory.createDeleteResultsDataRequest(sessionId, resultIds); + + + resultsStub.deleteResultsData(request, observer); + } + + @Override + public void downloadResultData(String sessionId, String resultId, StreamObserver responseObserver) { + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(DownloadResultDataResponse downloadResultDataResponse) { + responseObserver.onNext(downloadResultDataResponse.getDataChunk().toByteArray()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + DownloadResultDataRequest request = ResultClientRequestFactory.createDownloadResultDataRequest(sessionId, resultId); + + + resultsStub.downloadResultData(request, observer); + } + + + @Override + public StreamObserver uploadResultData(String sessionId, String resultId, String payload, StreamObserver responseObserver) { + StreamObserver proxyObserver = new StreamObserver<>() { + @Override + public void onNext(UploadResultDataResponse uploadResultDataResponse) { + responseObserver.onNext(uploadResultDataResponse.getResult()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + return resultsStub.uploadResultData(proxyObserver); + + } + + @Override + public void createResults(CreateResultsRequest request, StreamObserver> responseObserver) { + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(CreateResultsResponse createResultsResponse) { + responseObserver + .onNext( + createResultsResponse + .getResultsList() + .stream() + .collect(Collectors.toMap(ResultRaw::getName, ResultRaw::getResultId)) + ); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + resultsStub.createResults(request, observer); + } + + @Override + public void createResultsMetaData(String sessionId, List names, StreamObserver> responseObserver) { + CreateResultsMetaDataRequest request = ResultClientRequestFactory.createCreateResultsMetaDataRequest(sessionId, names); + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(CreateResultsMetaDataResponse createResultsMetaDataResponse) { + responseObserver.onNext(createResultsMetaDataResponse.getResultsList()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + resultsStub.createResultsMetaData(request, observer); + } + + @Override + public void getOwnerTaskId(String sessionId, List resultIds, StreamObserver> responseObserver) { + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(GetOwnerTaskIdResponse getOwnerTaskIdResponse) { + responseObserver.onNext(getOwnerTaskIdResponse.getResultTaskList() + .stream() + .collect(Collectors.toMap(GetOwnerTaskIdResponse.MapResultTask::getResultId, GetOwnerTaskIdResponse.MapResultTask::getTaskId))); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + GetOwnerTaskIdRequest request = ResultClientRequestFactory.createGetOwnerTaskIdRequest(sessionId, resultIds); + + + resultsStub.getOwnerTaskId(request, observer); + } + + + @Override + public void getResult(String resultId, StreamObserver responseObserver) { + StreamObserver observer = new StreamObserver() { + @Override + public void onNext(GetResultResponse getResultResponse) { + responseObserver.onNext(getResultResponse.getResult()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + GetResultRequest request = ResultClientRequestFactory.createGetResultRequest(resultId); + + resultsStub.getResult(request, observer); + } + + + @Override + public void listResults(ResultsFilters.Filters filters, int total, int page, int pageSize, ListResultsRequest.Sort sort, StreamObserver> responseObserver) { + StreamObserver observer = new StreamObserver() { + @Override + public void onNext(ListResultsResponse listResultsResponse) { + responseObserver.onNext(listResultsResponse.getResultsList()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + ListResultsRequest request = ResultClientRequestFactory.createListResultsRequest(filters, total, page, pageSize, sort); + + resultsStub.listResults(request, observer); + } +} diff --git a/packages/java/src/main/java/armonik/client/result/impl/ResultClientSync.java b/packages/java/src/main/java/armonik/client/result/impl/ResultClientSync.java new file mode 100644 index 000000000..77f5f0c4f --- /dev/null +++ b/packages/java/src/main/java/armonik/client/result/impl/ResultClientSync.java @@ -0,0 +1,88 @@ +package armonik.client.result.impl; + +import armonik.api.grpc.v1.Objects; +import armonik.api.grpc.v1.results.ResultsCommon.*; +import armonik.api.grpc.v1.results.ResultsCommon.GetOwnerTaskIdResponse.MapResultTask; +import armonik.api.grpc.v1.results.ResultsCommon.ListResultsRequest.Sort; +import armonik.api.grpc.v1.results.ResultsGrpc; +import armonik.client.result.impl.util.factory.ResultClientRequestFactory; +import armonik.client.result.impl.util.records.DeleteResultsDataResponseRecord; +import armonik.client.result.spec.IResultClientSync; +import io.grpc.ManagedChannel; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static armonik.api.grpc.v1.results.ResultsFilters.*; + +/** + * ResultClientSync is a synchronous implementation of the {@link IResultClientSync} interface. + * It communicates with the result service using a blocking stub, making synchronous calls to interact with result data. + */ +public class ResultClientSync implements IResultClientSync { + private final ResultsGrpc.ResultsBlockingStub resultsBlockingStub; + + public ResultClientSync(ManagedChannel managedChannel) { + this.resultsBlockingStub = ResultsGrpc.newBlockingStub(managedChannel); + } + + @Override + public int getServiceConfiguration() { + return resultsBlockingStub.getServiceConfiguration(Objects.Empty.newBuilder().build()).getDataChunkMaxSize(); + } + + @Override + public DeleteResultsDataResponseRecord deleteResultsData(String sessionId, List resultIds) { + DeleteResultsDataRequest request = ResultClientRequestFactory.createDeleteResultsDataRequest(sessionId, resultIds); + return new DeleteResultsDataResponseRecord(sessionId, resultsBlockingStub.deleteResultsData(request).getResultIdList()); + } + + + @Override + public List downloadResultData(String sessionId, String resultId) { + DownloadResultDataRequest request = ResultClientRequestFactory.createDownloadResultDataRequest(sessionId, resultId); + Iterator iterator = resultsBlockingStub.downloadResultData(request); + List list = new ArrayList<>(); + + iterator.forEachRemaining(list::add); + return list.stream().map(downloadResultDataResponse -> downloadResultDataResponse.getDataChunk().toByteArray()) + .toList(); + } + + @Override + public Map createResults(CreateResultsRequest request) { + return resultsBlockingStub.createResults(request).getResultsList() + .stream() + .collect(Collectors.toMap(ResultRaw::getName,ResultRaw::getResultId)); + } + + + @Override + public List createResultsMetaData(String sessionId, List names) { + CreateResultsMetaDataRequest request = ResultClientRequestFactory.createCreateResultsMetaDataRequest(sessionId, names); + return resultsBlockingStub.createResultsMetaData(request).getResultsList(); + } + + @Override + public Map getOwnerTaskId(String sessionId, List resultIds) { + GetOwnerTaskIdRequest request = ResultClientRequestFactory.createGetOwnerTaskIdRequest(sessionId, resultIds); + return resultsBlockingStub.getOwnerTaskId(request).getResultTaskList() + .stream() + .collect(Collectors.toMap(MapResultTask::getResultId, MapResultTask::getTaskId)); + } + + @Override + public ResultRaw getResult(String resultId) { + GetResultRequest request = ResultClientRequestFactory.createGetResultRequest(resultId); + return resultsBlockingStub.getResult(request).getResult(); + } + + @Override + public List listResults(Filters filters, int total, int page, int pageSize, Sort sort) { + ListResultsRequest request = ResultClientRequestFactory.createListResultsRequest(filters, total, page, pageSize, sort); + return resultsBlockingStub.listResults(request).getResultsList(); + } +} diff --git a/packages/java/src/main/java/armonik/client/result/impl/util/factory/ResultClientRequestFactory.java b/packages/java/src/main/java/armonik/client/result/impl/util/factory/ResultClientRequestFactory.java new file mode 100644 index 000000000..b3d266437 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/result/impl/util/factory/ResultClientRequestFactory.java @@ -0,0 +1,60 @@ +package armonik.client.result.impl.util.factory; + +import armonik.api.grpc.v1.results.ResultsCommon.*; +import armonik.api.grpc.v1.results.ResultsCommon.ListResultsRequest.Sort; +import armonik.api.grpc.v1.results.ResultsFilters.Filters; + +import java.util.List; + +public abstract class ResultClientRequestFactory { + + public static DeleteResultsDataRequest createDeleteResultsDataRequest(String sessionId, List resultIds) { + return DeleteResultsDataRequest.newBuilder() + .setSessionId(sessionId) + .addAllResultId(resultIds) + .build(); + } + + public static DownloadResultDataRequest createDownloadResultDataRequest(String sessionId, String resultId) { + return DownloadResultDataRequest.newBuilder() + .setSessionId(sessionId) + .setResultId(resultId) + .build(); + } + + + public static CreateResultsMetaDataRequest createCreateResultsMetaDataRequest(String sessionId, List names) { + return CreateResultsMetaDataRequest.newBuilder() + .setSessionId(sessionId) + .addAllResults(names.stream().map(name -> CreateResultsMetaDataRequest.ResultCreate.newBuilder().setName(name).build()).toList()) + .build(); + + } + + public static GetOwnerTaskIdRequest createGetOwnerTaskIdRequest(String sessionId, List resultIds) { + return GetOwnerTaskIdRequest.newBuilder() + .setSessionId(sessionId) + .addAllResultId(resultIds) + .build(); + + } + + public static GetResultRequest createGetResultRequest(String resultId) { + return GetResultRequest.newBuilder() + .setResultId(resultId) + .build(); + } + + public static ListResultsRequest createListResultsRequest(Filters filters, int total, int page, int pageSize, Sort sort) { + return ListResultsRequest.newBuilder() + .setFilters(filters) + .setSort(sort) + .setPage(page) + .setPageSize(pageSize) + .build(); + + + } + + +} diff --git a/packages/java/src/main/java/armonik/client/result/impl/util/records/DeleteResultsDataResponseRecord.java b/packages/java/src/main/java/armonik/client/result/impl/util/records/DeleteResultsDataResponseRecord.java new file mode 100644 index 000000000..b9ff6ccf0 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/result/impl/util/records/DeleteResultsDataResponseRecord.java @@ -0,0 +1,6 @@ +package armonik.client.result.impl.util.records; + +import java.util.List; + +public record DeleteResultsDataResponseRecord(String sessionId, List deletedResultIds) { +} diff --git a/packages/java/src/main/java/armonik/client/result/impl/util/records/WatchResultResponseRecord.java b/packages/java/src/main/java/armonik/client/result/impl/util/records/WatchResultResponseRecord.java new file mode 100644 index 000000000..3dddeeed7 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/result/impl/util/records/WatchResultResponseRecord.java @@ -0,0 +1,8 @@ +package armonik.client.result.impl.util.records; + +import armonik.api.grpc.v1.result_status.ResultStatusOuterClass; + +import java.util.List; + +public record WatchResultResponseRecord(ResultStatusOuterClass.ResultStatus resultStatus, List resultIds) { +} diff --git a/packages/java/src/main/java/armonik/client/result/spec/IResultClientAsync.java b/packages/java/src/main/java/armonik/client/result/spec/IResultClientAsync.java new file mode 100644 index 000000000..575f35194 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/result/spec/IResultClientAsync.java @@ -0,0 +1,32 @@ +package armonik.client.result.spec; + +import armonik.api.grpc.v1.results.ResultsCommon; +import armonik.api.grpc.v1.results.ResultsFilters; +import armonik.client.result.impl.util.records.DeleteResultsDataResponseRecord; +import armonik.client.result.impl.util.records.WatchResultResponseRecord; +import io.grpc.stub.StreamObserver; + +import java.util.List; +import java.util.Map; + +public interface IResultClientAsync { + StreamObserver watchResults(StreamObserver responseObserver); + + void getServiceConfiguration(StreamObserver responseObserver); + + void deleteResultsData(String sessionId, List resultIds, StreamObserver responseObserver); + + void downloadResultData(String sessionId, String resultId, StreamObserver responseObserver); + + StreamObserver uploadResultData(String sessionId, String resultId, String payload, StreamObserver responseObserver); + + void createResults(ResultsCommon.CreateResultsRequest request, StreamObserver> responseObserver); + + void createResultsMetaData(String sessionId, List names, StreamObserver> responseObserver); + + void getOwnerTaskId(String sessionId, List resultIds, StreamObserver> responseObserver); + + void getResult(String resultId, StreamObserver responseObserver); + + void listResults(ResultsFilters.Filters filters, int total, int page, int pageSize, ResultsCommon.ListResultsRequest.Sort sort, StreamObserver> responseObserver); +} diff --git a/packages/java/src/main/java/armonik/client/result/spec/IResultClientSync.java b/packages/java/src/main/java/armonik/client/result/spec/IResultClientSync.java new file mode 100644 index 000000000..d96638e19 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/result/spec/IResultClientSync.java @@ -0,0 +1,26 @@ +package armonik.client.result.spec; + +import armonik.api.grpc.v1.results.ResultsCommon; +import armonik.api.grpc.v1.results.ResultsFilters; +import armonik.client.result.impl.util.records.DeleteResultsDataResponseRecord; + +import java.util.List; +import java.util.Map; + +public interface IResultClientSync { + int getServiceConfiguration(); + + DeleteResultsDataResponseRecord deleteResultsData(String sessionId, List resultIds); + + List downloadResultData(String sessionId, String resultId); + + Map createResults(ResultsCommon.CreateResultsRequest request); + + List createResultsMetaData(String sessionId, List names); + + Map getOwnerTaskId(String sessionId, List resultIds); + + ResultsCommon.ResultRaw getResult(String resultId); + + List listResults(ResultsFilters.Filters filters, int total, int page, int pageSize, ResultsCommon.ListResultsRequest.Sort sort); +} diff --git a/packages/java/src/main/java/armonik/client/session/SessionClientFactory.java b/packages/java/src/main/java/armonik/client/session/SessionClientFactory.java new file mode 100644 index 000000000..e34674bb1 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/session/SessionClientFactory.java @@ -0,0 +1,33 @@ +package armonik.client.session; + +import armonik.client.session.impl.SessionClientAsync; +import armonik.client.session.impl.SesssionClientSync; +import armonik.client.session.spec.ISessionClientAsync; +import armonik.client.session.spec.ISessionClientSync; +import io.grpc.ManagedChannel; + +/** + * SessionClientFactory provides static factory methods to create instances of session client implementations. + */ +public abstract class SessionClientFactory { + + /** + * Creates an asynchronous session client instance with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the session service + * @return an instance of {@link ISessionClientAsync} representing an asynchronous session client + */ + public static ISessionClientAsync createSessionClientAsync(ManagedChannel managedChannel) { + return new SessionClientAsync(managedChannel); + } + + /** + * Creates a synchronous session client instance with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the session service + * @return an instance of {@link ISessionClientSync} representing a synchronous session client + */ + public static ISessionClientSync createSesssionClientSync(ManagedChannel managedChannel) { + return new SesssionClientSync(managedChannel); + } +} diff --git a/packages/java/src/main/java/armonik/client/session/impl/SessionClientAsync.java b/packages/java/src/main/java/armonik/client/session/impl/SessionClientAsync.java new file mode 100644 index 000000000..f3f254287 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/session/impl/SessionClientAsync.java @@ -0,0 +1,269 @@ +package armonik.client.session.impl; + +import armonik.api.grpc.v1.Objects; +import armonik.api.grpc.v1.sessions.SessionsCommon; +import armonik.api.grpc.v1.sessions.SessionsCommon.*; +import armonik.api.grpc.v1.sessions.SessionsCommon.ListSessionsRequest.Sort; +import armonik.api.grpc.v1.sessions.SessionsFilters.Filters; +import armonik.api.grpc.v1.sessions.SessionsGrpc; +import armonik.api.grpc.v1.sessions.SessionsGrpc.SessionsStub; +import armonik.client.session.impl.util.SessionClientRequestFactory; +import armonik.client.session.spec.ISessionClientAsync; +import io.grpc.ManagedChannel; +import io.grpc.stub.StreamObserver; + +import java.util.List; + +public class SessionClientAsync implements ISessionClientAsync { + private final SessionsStub sessionsStub; + + /** + * Constructs a new ArmonikSession object using the provided gRPC ManagedChannel. + * + * @param managedChannel The gRPC ManagedChannel to communicate with the Armonik service. + */ + + public SessionClientAsync(ManagedChannel managedChannel) { + sessionsStub = SessionsGrpc.newStub(managedChannel); + } + + @Override + public void createSession(Objects.TaskOptions taskOptions, List partitionIds, StreamObserver streamObserver) { + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(CreateSessionReply createSessionReply) { + streamObserver.onNext(createSessionReply.getSessionId()); + } + + @Override + public void onError(Throwable throwable) { + streamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + streamObserver.onCompleted(); + } + }; + + List partIds = partitionIds == null || partitionIds.isEmpty() ? null : partitionIds; + SessionsCommon.CreateSessionRequest request = SessionsCommon.CreateSessionRequest.newBuilder() + .setDefaultTaskOption(taskOptions) + .addAllPartitionIds(partIds) + .build(); + sessionsStub.createSession(request, observer); + } + + + @Override + public void getSession(String sessionId, StreamObserver rawStreamObserver) { + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(GetSessionResponse getSessionResponse) { + rawStreamObserver.onNext(getSessionResponse.getSession()); + } + + @Override + public void onError(Throwable throwable) { + rawStreamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + rawStreamObserver.onCompleted(); + } + }; + + GetSessionRequest request = SessionClientRequestFactory.createGetSessionRequest(sessionId); + + + sessionsStub.getSession(request, observer); + } + + @Override + public void listSessions(int page, int pageSize, Filters filter, Sort sort, StreamObserver> listStreamObserver) { + ListSessionsRequest request = SessionClientRequestFactory.createListSessionsRequest(page, pageSize, filter, sort); + StreamObserver observer = new StreamObserver() { + @Override + public void onNext(ListSessionsResponse listSessionsResponse) { + listStreamObserver.onNext(listSessionsResponse.getSessionsList()); + } + + @Override + public void onError(Throwable throwable) { + listStreamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + listStreamObserver.onCompleted(); + } + }; + sessionsStub.listSessions(request, observer); + } + + @Override + public void cancelSession(String sessionId, StreamObserver sessionRawStreamObserver) throws Exception { + CancelSessionRequest request = SessionClientRequestFactory.createCancelSessionRequest(sessionId); + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(CancelSessionResponse cancelSessionResponse) { + sessionRawStreamObserver.onNext(cancelSessionResponse.getSession()); + } + + @Override + public void onError(Throwable throwable) { + sessionRawStreamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + sessionRawStreamObserver.onCompleted(); + } + }; + sessionsStub.cancelSession(request,observer); + } + + @Override + public void pauseSession(String sessionId, StreamObserver sessionRawStreamObserver) { + PauseSessionRequest request = SessionClientRequestFactory.createPauseSessionRequest(sessionId); + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(PauseSessionResponse pauseSessionResponse) { + sessionRawStreamObserver.onNext(pauseSessionResponse.getSession()); + } + + @Override + public void onError(Throwable throwable) { + sessionRawStreamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + sessionRawStreamObserver.onCompleted(); + } + }; + sessionsStub.pauseSession(request,observer); + } + + @Override + public void resumeSession(String sessionId, StreamObserver sessionRawStreamObserver) { + ResumeSessionRequest request = SessionClientRequestFactory.createResumeSessionRequest(sessionId); + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(ResumeSessionResponse resumeSessionResponse) { + sessionRawStreamObserver.onNext(resumeSessionResponse.getSession()); + } + + @Override + public void onError(Throwable throwable) { + sessionRawStreamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + sessionRawStreamObserver.onCompleted(); + } + }; + sessionsStub.resumeSession(request,observer); + } + + @Override + public void closeSession(String sessionId, StreamObserver sessionRawStreamObserver){ + CloseSessionRequest closeSessionRequest = SessionClientRequestFactory.createCloseSessionRequest(sessionId); + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(CloseSessionResponse closeSessionResponse) { + sessionRawStreamObserver.onNext(closeSessionResponse.getSession()); + } + + @Override + public void onError(Throwable throwable) { + sessionRawStreamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + sessionRawStreamObserver.onCompleted(); + } + }; + sessionsStub.closeSession(closeSessionRequest,observer); + } + + @Override + public void purgeSession(String sessionId, StreamObserver sessionRawStreamObserver){ + PurgeSessionRequest purgeSessionRequest = SessionClientRequestFactory.createPurgeSessionRequest(sessionId); + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(PurgeSessionResponse purgeSessionResponse) { + sessionRawStreamObserver.onNext(purgeSessionResponse.getSession()); + } + + @Override + public void onError(Throwable throwable) { + sessionRawStreamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + sessionRawStreamObserver.onCompleted(); + } + }; + sessionsStub.purgeSession(purgeSessionRequest,observer); + } + + @Override + public void deleteSession(String sessionId, StreamObserver sessionRawStreamObserver){ + DeleteSessionRequest deleteSessionRequest = SessionClientRequestFactory.createDeleteSessionRequest(sessionId); + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(DeleteSessionResponse deleteSessionResponse) { + sessionRawStreamObserver.onNext(deleteSessionResponse.getSession()); + } + + @Override + public void onError(Throwable throwable) { + sessionRawStreamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + sessionRawStreamObserver.onCompleted(); + } + }; + + sessionsStub.deleteSession(deleteSessionRequest,observer); + } + + @Override + public void stopSubmissionSession(String sessionId, boolean client, boolean worker, StreamObserver sessionRawStreamObserver){ + StopSubmissionRequest request = SessionClientRequestFactory.createStopSubmissionSessionRequest(sessionId, client, worker); + + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(StopSubmissionResponse stopSubmissionResponse) { + sessionRawStreamObserver.onNext(stopSubmissionResponse.getSession()); + } + + @Override + public void onError(Throwable throwable) { + sessionRawStreamObserver.onError(throwable); + } + + @Override + public void onCompleted() { + sessionRawStreamObserver.onCompleted(); + } + }; + sessionsStub.stopSubmission(request,observer); + } + + + +} diff --git a/packages/java/src/main/java/armonik/client/session/impl/SesssionClientSync.java b/packages/java/src/main/java/armonik/client/session/impl/SesssionClientSync.java new file mode 100644 index 000000000..45f405a6d --- /dev/null +++ b/packages/java/src/main/java/armonik/client/session/impl/SesssionClientSync.java @@ -0,0 +1,162 @@ +/** + * ArmonikSession provides a client interface to interact with Armonik session management functionality. + * This class allows creating, retrieving, listing, canceling, pausing, resuming, closing, purging, deleting, + * and stopping submissions for sessions in the Armonik system. + */ + +package armonik.client.session.impl; + +import armonik.api.grpc.v1.Objects.TaskOptions; +import armonik.api.grpc.v1.sessions.SessionsCommon.*; +import armonik.api.grpc.v1.sessions.SessionsCommon.ListSessionsRequest.Sort; +import armonik.api.grpc.v1.sessions.SessionsFilters.Filters; +import armonik.api.grpc.v1.sessions.SessionsGrpc; +import armonik.client.session.impl.util.SessionClientRequestFactory; +import armonik.client.session.spec.ISessionClientSync; +import io.grpc.ManagedChannel; + +import java.util.List; + +public class SesssionClientSync implements ISessionClientSync { + private final SessionsGrpc.SessionsBlockingStub sessionsStub; + + /** + * Constructs a new ArmonikSession object using the provided gRPC ManagedChannel. + * + * @param managedChannel The gRPC ManagedChannel to communicate with the Armonik service. + */ + + public SesssionClientSync(ManagedChannel managedChannel){ + sessionsStub = SessionsGrpc.newBlockingStub(managedChannel); + } + + /** + * Creates a new session in the Armonik system with the given task options and partition IDs. + * + * @param taskOptions The task options for the session. + * @param partitionIds The list of partition IDs. + * @return The ID of the created session. + */ + @Override + public String createSession(TaskOptions taskOptions, List partitionIds) { + CreateSessionRequest request = SessionClientRequestFactory.createSessionRequest(taskOptions, partitionIds); + return sessionsStub.createSession(request).getSessionId(); + } + + + + /** + * Retrieves session information for the specified session ID. + * + * @param sessionId The ID of the session to retrieve. + * @return The session information. + */ + @Override + public SessionRaw getSession(String sessionId) { + GetSessionRequest request = SessionClientRequestFactory.createGetSessionRequest(sessionId); + return sessionsStub.getSession(request).getSession(); + } + + /** + * Lists sessions based on pagination, filters, and sorting options. + * + * @param page The page number. + * @param pageSize The size of each page. + * @param filter The filters to apply. + * @param sort The sorting options. + * @return A ListSessionsResult object containing the list of sessions and total count. + */ + @Override + public List listSessions(int page, int pageSize, Filters filter, Sort sort) { + ListSessionsRequest request = SessionClientRequestFactory.createListSessionsRequest(page, pageSize, filter, sort); + return sessionsStub.listSessions(request).getSessionsList(); + } + + /** + * Cancels the session with the specified session ID. + * + * @param sessionId The ID of the session to cancel. + * @return The updated session information after cancellation. + */ + @Override + public SessionRaw cancelSession(String sessionId) { + CancelSessionRequest request = SessionClientRequestFactory.createCancelSessionRequest(sessionId); + return sessionsStub.cancelSession(request).getSession(); + } + + /** + * Pauses the session with the specified session ID. + * + * @param sessionId The ID of the session to pause. + * @return The updated session information after pausing. + */ + @Override + public SessionRaw pauseSession(String sessionId) { + PauseSessionRequest request = SessionClientRequestFactory.createPauseSessionRequest(sessionId); + return sessionsStub.pauseSession(request).getSession(); + } + + /** + * Resumes the session with the specified session ID. + * + * @param sessionId The ID of the session to resume. + * @return The updated session information after resuming. + */ + @Override + public SessionRaw resumeSession(String sessionId) { + ResumeSessionRequest request = SessionClientRequestFactory.createResumeSessionRequest(sessionId); + return sessionsStub.resumeSession(request).getSession(); + } + + /** + * Closes the session with the specified session ID. + * + * @param sessionId The ID of the session to close. + * @return the closed session + */ + @Override + public SessionRaw closeSession(String sessionId){ + CloseSessionRequest closeSessionRequest = SessionClientRequestFactory.createCloseSessionRequest(sessionId); + return sessionsStub.closeSession(closeSessionRequest).getSession(); + } + + /** + * Purges the session with the specified session ID. + * + * @param sessionId The ID of the session to purge. + * @return The updated session information after purging. + */ + @Override + public SessionRaw purgeSession(String sessionId){ + PurgeSessionRequest purgeSessionRequest = SessionClientRequestFactory.createPurgeSessionRequest(sessionId); + return sessionsStub.purgeSession(purgeSessionRequest).getSession(); + } + + /** + * Deletes the session with the specified session ID. + * + * @param sessionId The ID of the session to delete. + * @return The updated session information after deletion. + */ + @Override + public SessionRaw deleteSession(String sessionId){ + DeleteSessionRequest deleteSessionRequest = SessionClientRequestFactory.createDeleteSessionRequest(sessionId); + return sessionsStub.deleteSession(deleteSessionRequest).getSession(); + } + + /** + * Stops submission for the session with the specified session ID. + * + * @param sessionId The ID of the session to stop submission for. + * @param client Boolean indicating whether to stop client submissions. + * @param worker Boolean indicating whether to stop worker submissions. + * @return The updated session information after stopping submissions. + */ + @Override + public SessionRaw stopSubmissionSession(String sessionId, boolean client, boolean worker){ + StopSubmissionRequest request = SessionClientRequestFactory.createStopSubmissionSessionRequest(sessionId, client, worker); + return sessionsStub.stopSubmission(request).getSession(); + } + + +} diff --git a/packages/java/src/main/java/armonik/client/session/impl/util/SessionClientRequestFactory.java b/packages/java/src/main/java/armonik/client/session/impl/util/SessionClientRequestFactory.java new file mode 100644 index 000000000..88759ea19 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/session/impl/util/SessionClientRequestFactory.java @@ -0,0 +1,69 @@ +package armonik.client.session.impl.util; + +import armonik.api.grpc.v1.Objects; +import armonik.api.grpc.v1.sessions.SessionsCommon.*; +import armonik.api.grpc.v1.sessions.SessionsCommon.ListSessionsRequest.Sort; +import armonik.api.grpc.v1.sessions.SessionsFilters; + +import java.util.List; + +public abstract class SessionClientRequestFactory { + + + public static CreateSessionRequest createSessionRequest(Objects.TaskOptions taskOptions, List partitionIds) { + List partIds = partitionIds == null || partitionIds.isEmpty() ? null : partitionIds; + return CreateSessionRequest.newBuilder() + .setDefaultTaskOption(taskOptions) + .addAllPartitionIds(partIds) + .build(); + } + + public static GetSessionRequest createGetSessionRequest(String sessionId) { + return GetSessionRequest + .newBuilder() + .setSessionId(sessionId) + .build(); + } + + public static ListSessionsRequest createListSessionsRequest(int page, int pageSize, SessionsFilters.Filters filter, Sort sort) { + return ListSessionsRequest.newBuilder() + .setPage(page) + .setPageSize(pageSize) + .setFilters(filter) + .setSort(sort) + .build(); + } + + public static CancelSessionRequest createCancelSessionRequest(String sessionId) { + return CancelSessionRequest.newBuilder().setSessionId(sessionId).build(); + } + + public static PauseSessionRequest createPauseSessionRequest(String sessionId) { + return PauseSessionRequest.newBuilder().setSessionId(sessionId).build(); + } + + public static ResumeSessionRequest createResumeSessionRequest(String sessionId) { + return ResumeSessionRequest.newBuilder().setSessionId(sessionId).build(); + } + + public static CloseSessionRequest createCloseSessionRequest(String sessionId) { + return CloseSessionRequest.newBuilder().setSessionId(sessionId).build(); + } + + public static PurgeSessionRequest createPurgeSessionRequest(String sessionId) { + return PurgeSessionRequest.newBuilder().setSessionId(sessionId).build(); + + } + + public static DeleteSessionRequest createDeleteSessionRequest(String sessionId) { + return DeleteSessionRequest.newBuilder().setSessionId(sessionId).build(); + } + + public static StopSubmissionRequest createStopSubmissionSessionRequest(String sessionId, boolean client, boolean worker) { + return StopSubmissionRequest.newBuilder() + .setSessionId(sessionId) + .setClient(client) + .setWorker(worker) + .build(); + } +} diff --git a/packages/java/src/main/java/armonik/client/session/spec/ISessionClientAsync.java b/packages/java/src/main/java/armonik/client/session/spec/ISessionClientAsync.java new file mode 100644 index 000000000..6c871222d --- /dev/null +++ b/packages/java/src/main/java/armonik/client/session/spec/ISessionClientAsync.java @@ -0,0 +1,30 @@ +package armonik.client.session.spec; + +import armonik.api.grpc.v1.Objects; +import armonik.api.grpc.v1.sessions.SessionsCommon; +import armonik.api.grpc.v1.sessions.SessionsFilters; +import io.grpc.stub.StreamObserver; + +import java.util.List; + +public interface ISessionClientAsync { + void createSession(Objects.TaskOptions taskOptions, List partitionIds, StreamObserver streamObserver); + + void getSession(String sessionId, StreamObserver rawStreamObserver); + + void listSessions(int page, int pageSize, SessionsFilters.Filters filter, SessionsCommon.ListSessionsRequest.Sort sort, StreamObserver> listStreamObserver); + + void cancelSession(String sessionId, StreamObserver sessionRawStreamObserver) throws Exception; + + void pauseSession(String sessionId, StreamObserver sessionRawStreamObserver); + + void resumeSession(String sessionId, StreamObserver sessionRawStreamObserver); + + void closeSession(String sessionId, StreamObserver sessionRawStreamObserver); + + void purgeSession(String sessionId, StreamObserver sessionRawStreamObserver); + + void deleteSession(String sessionId, StreamObserver sessionRawStreamObserver); + + void stopSubmissionSession(String sessionId, boolean client, boolean worker, StreamObserver sessionRawStreamObserver); +} diff --git a/packages/java/src/main/java/armonik/client/session/spec/ISessionClientSync.java b/packages/java/src/main/java/armonik/client/session/spec/ISessionClientSync.java new file mode 100644 index 000000000..4d6efe115 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/session/spec/ISessionClientSync.java @@ -0,0 +1,52 @@ +package armonik.client.session.spec; + +import armonik.api.grpc.v1.Objects; +import armonik.api.grpc.v1.sessions.SessionsCommon.ListSessionsRequest.Sort; +import armonik.api.grpc.v1.sessions.SessionsCommon.SessionRaw; +import armonik.api.grpc.v1.sessions.SessionsFilters.Filters; + +import java.util.List; + +public interface ISessionClientSync { + default String createSession(Objects.TaskOptions taskOptions, List partitionIds) { + throw new UnsupportedOperationException("Method not implemented"); + } + + default SessionRaw getSession(String sessionId) throws Exception { + throw new UnsupportedOperationException("Method not implemented"); + } + + default List listSessions(int page, int pageSize, Filters filter, Sort sort) throws Exception { + throw new UnsupportedOperationException("Method not implemented"); + } + + default SessionRaw cancelSession(String sessionId) throws Exception { + throw new UnsupportedOperationException("Method not implemented"); + } + + default SessionRaw pauseSession(String sessionId) throws Exception { + throw new UnsupportedOperationException("Method not implemented"); + } + + default SessionRaw resumeSession(String sessionId) throws Exception { + throw new UnsupportedOperationException("Method not implemented"); + } + + default SessionRaw closeSession(String sessionId) throws Exception { + throw new UnsupportedOperationException("Method not implemented"); + } + + default SessionRaw purgeSession(String sessionId) throws Exception { + throw new UnsupportedOperationException("Method not implemented"); + } + + default SessionRaw deleteSession(String sessionId) throws Exception { + throw new UnsupportedOperationException("Method not implemented"); + } + + default SessionRaw stopSubmissionSession(String sessionId, boolean client, boolean worker) throws Exception { + throw new UnsupportedOperationException("Method not implemented"); + } + + +} diff --git a/packages/java/src/main/java/armonik/client/task/TaskClientFactory.java b/packages/java/src/main/java/armonik/client/task/TaskClientFactory.java new file mode 100644 index 000000000..3c6e543e9 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/task/TaskClientFactory.java @@ -0,0 +1,33 @@ +package armonik.client.task; + +import armonik.client.task.impl.TaskClientAsync; +import armonik.client.task.impl.TaskClientSync; +import armonik.client.task.spec.ITaskClientAsync; +import armonik.client.task.spec.ITaskClientSync; +import io.grpc.ManagedChannel; + +/** + * TaskClientFactory provides factory methods to create instances of task client implementations. + */ +public abstract class TaskClientFactory { + + /** + * Creates a synchronous task client instance with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the task service + * @return an instance of {@link ITaskClientSync} representing a synchronous task client + */ + public static ITaskClientSync createTaskClientSync(ManagedChannel managedChannel){ + return new TaskClientSync(managedChannel); + } + + /** + * Creates an asynchronous task client instance with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the task service + * @return an instance of {@link ITaskClientAsync} representing an asynchronous task client + */ + public static ITaskClientAsync createTaskClientAsync(ManagedChannel managedChannel){ + return new TaskClientAsync(managedChannel); + } +} diff --git a/packages/java/src/main/java/armonik/client/task/impl/TaskClientAsync.java b/packages/java/src/main/java/armonik/client/task/impl/TaskClientAsync.java new file mode 100644 index 000000000..d164288d2 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/task/impl/TaskClientAsync.java @@ -0,0 +1,203 @@ +package armonik.client.task.impl; + +import armonik.api.grpc.v1.Objects.TaskOptions; +import armonik.api.grpc.v1.tasks.TasksCommon.*; +import armonik.api.grpc.v1.tasks.TasksCommon.GetResultIdsResponse.MapTaskResult; +import armonik.api.grpc.v1.tasks.TasksCommon.ListTasksRequest.Sort; +import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksRequest.TaskCreation; +import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksResponse.TaskInfo; +import armonik.api.grpc.v1.tasks.TasksFilters.Filters; +import armonik.api.grpc.v1.tasks.TasksGrpc; +import armonik.api.grpc.v1.tasks.TasksGrpc.TasksStub; +import armonik.client.task.impl.util.TaskClientRequestFactory; +import armonik.client.task.spec.ITaskClientAsync; +import io.grpc.ManagedChannel; +import io.grpc.stub.StreamObserver; + +import java.util.List; + +/** + * TaskClientAsync is an asynchronous implementation of the {@link ITaskClientAsync} interface. + * It communicates with the task service using a non-blocking stub, making asynchronous calls to perform various task-related operations. + */ +public class TaskClientAsync implements ITaskClientAsync { + private final TasksStub taskStub; + + + /** + * Constructs a TaskClientAsync object with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the task service + */ + public TaskClientAsync(ManagedChannel managedChannel) { + this.taskStub = TasksGrpc.newStub(managedChannel); + } + + @Override + public void submitTasks(String sessionId, List taskCreations, TaskOptions taskOptions, StreamObserver> responseObserver) { + SubmitTasksRequest request = TaskClientRequestFactory.createSubmitTasksRequest(sessionId, taskCreations, taskOptions); + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(SubmitTasksResponse submitTasksResponse) { + responseObserver.onNext(submitTasksResponse.getTaskInfosList()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + taskStub.submitTasks(request, observer); + } + + @Override + public void countTasksByStatus(Filters filters, StreamObserver responseObserver) { + CountTasksByStatusRequest request = TaskClientRequestFactory.createCountTasksByStatusRequest(filters); + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(CountTasksByStatusResponse countTasksByStatusResponse) { + responseObserver.onNext(countTasksByStatusResponse); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + + taskStub.countTasksByStatus(request, observer); + } + + @Override + public void getResultIds(List tasksIds, StreamObserver> responseObserver) { + GetResultIdsRequest request = TaskClientRequestFactory.createGetResultIdsRequest(tasksIds); + + StreamObserver observer = new StreamObserver() { + @Override + public void onNext(GetResultIdsResponse getResultIdsResponse) { + responseObserver.onNext(getResultIdsResponse.getTaskResultsList()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + taskStub.getResultIds(request, observer); + } + + @Override + public void cancelTasks(List tasksIds, StreamObserver> responseObserver) { + CancelTasksRequest request = TaskClientRequestFactory.createCancelTasksRequest(tasksIds); + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(CancelTasksResponse cancelTasksResponse) { + responseObserver.onNext(cancelTasksResponse.getTasksList()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + taskStub.cancelTasks(request, observer); + } + + @Override + public void getTask(String taskId, StreamObserver responseObserver) throws NoSuchMethodException { + GetTaskRequest request = TaskClientRequestFactory.createGetTaskRequest(taskId); + + StreamObserver observer = new StreamObserver<>() { + + @Override + public void onNext(GetTaskResponse getTaskResponse) { + responseObserver.onNext(getTaskResponse.getTask()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + taskStub.getTask(request, observer); + } + + @Override + public void listTasksDetailed(int page, int pageSize, Filters filters, Sort sort, StreamObserver> responseObserver) { + + ListTasksRequest request = TaskClientRequestFactory.createListTasksDetailedRequest(page, pageSize, filters, sort); + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(ListTasksDetailedResponse listTasksDetailedResponse) { + responseObserver.onNext(listTasksDetailedResponse.getTasksList()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + taskStub.listTasksDetailed(request, observer); + } + + @Override + public void listTasks(int page, int pageSize, Filters filters, Sort sort, StreamObserver> responseObserver) { + ListTasksRequest request = TaskClientRequestFactory.createListTasksSummaryRequest(page, pageSize, filters, sort); + + StreamObserver observer = new StreamObserver<>() { + @Override + public void onNext(ListTasksResponse listTasksResponse) { + responseObserver.onNext(listTasksResponse.getTasksList()); + } + + @Override + public void onError(Throwable throwable) { + responseObserver.onError(throwable); + } + + @Override + public void onCompleted() { + responseObserver.onCompleted(); + } + }; + + + taskStub.listTasks(request, observer); + } +} diff --git a/packages/java/src/main/java/armonik/client/task/impl/TaskClientSync.java b/packages/java/src/main/java/armonik/client/task/impl/TaskClientSync.java new file mode 100644 index 000000000..da51a5b1a --- /dev/null +++ b/packages/java/src/main/java/armonik/client/task/impl/TaskClientSync.java @@ -0,0 +1,79 @@ +package armonik.client.task.impl; + +import armonik.api.grpc.v1.Objects.StatusCount; +import armonik.api.grpc.v1.Objects.TaskOptions; +import armonik.api.grpc.v1.tasks.TasksCommon.*; +import armonik.api.grpc.v1.tasks.TasksCommon.ListTasksRequest.Sort; +import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksRequest.TaskCreation; +import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksResponse.TaskInfo; +import armonik.api.grpc.v1.tasks.TasksFilters.Filters; +import armonik.api.grpc.v1.tasks.TasksGrpc; +import armonik.api.grpc.v1.tasks.TasksGrpc.TasksBlockingStub; +import armonik.client.task.impl.util.TaskClientRequestFactory; +import armonik.client.task.spec.ITaskClientSync; +import io.grpc.ManagedChannel; + +import java.util.List; + +import static armonik.api.grpc.v1.tasks.TasksCommon.GetResultIdsResponse.MapTaskResult; + +/** + * TaskClientSync is a synchronous implementation of the {@link ITaskClientSync} interface. + * It communicates with the task service using a blocking stub, making synchronous calls to perform various task-related operations. + */ +public class TaskClientSync implements ITaskClientSync { + private final TasksBlockingStub taskStub; + + + /** + * Constructs a TaskClientSync object with the provided managed channel. + * + * @param managedChannel the managed channel used for communication with the task service + */ + public TaskClientSync(ManagedChannel managedChannel) { + this.taskStub = TasksGrpc.newBlockingStub(managedChannel); + } + + @Override + public List listTasks(int page, int pageSize, Filters filters, Sort sort) { + ListTasksRequest request = TaskClientRequestFactory.createListTasksSummaryRequest(page, pageSize, filters, sort); + return taskStub.listTasks(request).getTasksList(); + } + + @Override + public List listTasksDetailed(int page, int pageSize, Filters filters, Sort sort) { + ListTasksRequest request = TaskClientRequestFactory.createListTasksDetailedRequest(page, pageSize, filters, sort); + return taskStub.listTasksDetailed(request).getTasksList(); + } + + @Override + public TaskDetailed getTask(String taskId) { + GetTaskRequest request = TaskClientRequestFactory.createGetTaskRequest(taskId); + return taskStub.getTask(request).getTask(); + } + + @Override + public List cancelTasks(List tasksIds) { + CancelTasksRequest request = TaskClientRequestFactory.createCancelTasksRequest(tasksIds); + return taskStub.cancelTasks(request).getTasksList(); + } + + + @Override + public List getResultIds(List tasksIds) { + GetResultIdsRequest request = TaskClientRequestFactory.createGetResultIdsRequest(tasksIds); + return taskStub.getResultIds(request).getTaskResultsList(); + } + + @Override + public List countTasksByStatus(Filters filters) { + CountTasksByStatusRequest request = TaskClientRequestFactory.createCountTasksByStatusRequest(filters); + return taskStub.countTasksByStatus(request).getStatusList(); + } + + @Override + public List submitTasks(String sessionId, List taskCreations, TaskOptions taskOptions) { + SubmitTasksRequest request = TaskClientRequestFactory.createSubmitTasksRequest(sessionId, taskCreations, taskOptions); + return taskStub.submitTasks(request).getTaskInfosList(); + } +} diff --git a/packages/java/src/main/java/armonik/client/task/impl/util/TaskClientRequestFactory.java b/packages/java/src/main/java/armonik/client/task/impl/util/TaskClientRequestFactory.java new file mode 100644 index 000000000..14e16a8a0 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/task/impl/util/TaskClientRequestFactory.java @@ -0,0 +1,77 @@ +package armonik.client.task.impl.util; + +import armonik.api.grpc.v1.Objects.TaskOptions; +import armonik.api.grpc.v1.tasks.TasksCommon; +import armonik.api.grpc.v1.tasks.TasksCommon.*; +import armonik.api.grpc.v1.tasks.TasksCommon.ListTasksRequest.Sort; +import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksRequest.TaskCreation; +import armonik.api.grpc.v1.tasks.TasksFilters.Filters; + +import java.util.List; + +import static armonik.api.grpc.v1.Objects.TaskOptions.getDefaultInstance; + +public abstract class TaskClientRequestFactory { + public static ListTasksRequest createListTasksSummaryRequest(int page, int pageSize, Filters filters, Sort sort) { + return ListTasksRequest.newBuilder() + .setPage(page) + .setPageSize(pageSize) + .setFilters(filters) + .setSort(sort) + .build(); + } + + public static ListTasksRequest createListTasksDetailedRequest(int page, int pageSize, Filters filters, Sort sort) { + return TasksCommon.ListTasksRequest.newBuilder() + .setSort(sort) + .setPageSize(page) + .setPageSize(pageSize) + .setFilters(filters) + .build(); + } + + public static GetTaskRequest createGetTaskRequest(String taskId) { + return GetTaskRequest.newBuilder() + .setTaskId(taskId) + .build(); + } + + public static CancelTasksRequest createCancelTasksRequest(List tasksIds) { + return CancelTasksRequest.newBuilder() + .addAllTaskIds(tasksIds) + .build(); + } + + public static GetResultIdsRequest createGetResultIdsRequest(List tasksIds) { + return GetResultIdsRequest.newBuilder() + .addAllTaskId(tasksIds) + .build(); + + } + + public static CountTasksByStatusRequest createCountTasksByStatusRequest(Filters filters) { + return CountTasksByStatusRequest.newBuilder() + .setFilters(filters) + .build(); + } + + public static SubmitTasksRequest createSubmitTasksRequest(String sessionId, List taskCreations, TaskOptions taskOptions) { + SubmitTasksRequest.Builder requestBuilder = SubmitTasksRequest.newBuilder(); + + requestBuilder.setSessionId(sessionId); + + if (!taskOptions.equals(getDefaultInstance())) { + requestBuilder.setTaskOptions(taskOptions); + } + taskCreations.forEach(taskCreation -> { + requestBuilder + .addTaskCreationsBuilder() + .setPayloadId(taskCreation.getPayloadId()) + .addAllDataDependencies(taskCreation.getDataDependenciesList()) + .addAllExpectedOutputKeys(taskCreation.getExpectedOutputKeysList()) + .setTaskOptions(!taskCreation.getTaskOptions().equals(getDefaultInstance()) ? taskCreation.getTaskOptions() : getDefaultInstance()); + }); + + return requestBuilder.build(); + } +} diff --git a/packages/java/src/main/java/armonik/client/task/spec/ITaskClientAsync.java b/packages/java/src/main/java/armonik/client/task/spec/ITaskClientAsync.java new file mode 100644 index 000000000..b7544581b --- /dev/null +++ b/packages/java/src/main/java/armonik/client/task/spec/ITaskClientAsync.java @@ -0,0 +1,24 @@ +package armonik.client.task.spec; + +import armonik.api.grpc.v1.Objects; +import armonik.api.grpc.v1.tasks.TasksCommon; +import armonik.api.grpc.v1.tasks.TasksFilters; +import io.grpc.stub.StreamObserver; + +import java.util.List; + +public interface ITaskClientAsync { + void submitTasks(String sessionId, List taskCreations, Objects.TaskOptions taskOptions, StreamObserver> responseObserver); + + void countTasksByStatus(TasksFilters.Filters filters, StreamObserver responseObserver); + + void getResultIds(List tasksIds, StreamObserver> responseObserver); + + void cancelTasks(List tasksIds, StreamObserver> responseObserver); + + void getTask(String taskId, StreamObserver responseObserver) throws NoSuchMethodException; + + void listTasksDetailed(int page, int pageSize, TasksFilters.Filters filters, TasksCommon.ListTasksRequest.Sort sort, StreamObserver> responseObserver) throws NoSuchMethodException; + + void listTasks(int page, int pageSize, TasksFilters.Filters filters, TasksCommon.ListTasksRequest.Sort sort, StreamObserver> responseObserver) throws NoSuchMethodException; +} diff --git a/packages/java/src/main/java/armonik/client/task/spec/ITaskClientSync.java b/packages/java/src/main/java/armonik/client/task/spec/ITaskClientSync.java new file mode 100644 index 000000000..d4ed2d13e --- /dev/null +++ b/packages/java/src/main/java/armonik/client/task/spec/ITaskClientSync.java @@ -0,0 +1,23 @@ +package armonik.client.task.spec; + +import armonik.api.grpc.v1.Objects; +import armonik.api.grpc.v1.tasks.TasksCommon; +import armonik.api.grpc.v1.tasks.TasksFilters; + +import java.util.List; + +public interface ITaskClientSync { + List listTasks(int page, int pageSize, TasksFilters.Filters filters, TasksCommon.ListTasksRequest.Sort sort); + + List listTasksDetailed(int page, int pageSize, TasksFilters.Filters filters, TasksCommon.ListTasksRequest.Sort sort); + + TasksCommon.TaskDetailed getTask(String taskId); + + List cancelTasks(List tasksIds); + + List getResultIds(List tasksIds); + + List countTasksByStatus(TasksFilters.Filters filters); + + List submitTasks(String sessionId, List taskCreations, Objects.TaskOptions taskOptions); +} diff --git a/packages/java/src/main/resources/logback.xml b/packages/java/src/main/resources/logback.xml new file mode 100644 index 000000000..0ec161833 --- /dev/null +++ b/packages/java/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + diff --git a/packages/java/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/packages/java/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 000000000..1f0955d45 --- /dev/null +++ b/packages/java/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline From a5fd6b16dea2fe578e958425f957b16c8a71f230 Mon Sep 17 00:00:00 2001 From: Hassan EL MZABI Date: Mon, 13 May 2024 14:56:23 +0200 Subject: [PATCH 252/344] java: final api client - preview. v1 add example project for java api delete java example add java example projectr fix: update client remove worker incomplete code, example and function that hides builder usage remove function that hides builder usage remove example changing end of lines remove extra code remove extra code --- packages/java/pom.xml | 9 + .../armonik/client/event/EventClient.java | 185 ++++++++++++ .../client/event/EventClientFactory.java | 32 -- .../client/event/impl/EventClientAsync.java | 69 ----- .../client/event/impl/EventClientSync.java | 58 ---- .../factory/EventClientRequestFactory.java | 52 ---- .../EventSubscriptionResponseRecord.java | 16 - .../client/event/spec/IEventClientAsync.java | 10 - .../client/event/spec/IEventClientSync.java | 10 - .../EventSubscriptionResponseRecord.java | 22 ++ .../armonik/client/result/ResultClient.java | 158 ++++++++++ .../client/result/ResultClientFactory.java | 32 -- .../client/result/impl/ResultClientAsync.java | 277 ------------------ .../client/result/impl/ResultClientSync.java | 88 ------ .../factory/ResultClientRequestFactory.java | 60 ---- .../DeleteResultsDataResponseRecord.java | 6 - .../records/WatchResultResponseRecord.java | 8 - .../result/spec/IResultClientAsync.java | 32 -- .../client/result/spec/IResultClientSync.java | 26 -- .../client/session/SessionClientFactory.java | 33 --- .../session/impl/SessionClientAsync.java | 269 ----------------- .../session/impl/SesssionClientSync.java | 162 ---------- .../util/SessionClientRequestFactory.java | 69 ----- .../session/spec/ISessionClientAsync.java | 30 -- .../session/spec/ISessionClientSync.java | 52 ---- .../client/task/TaskClientFactory.java | 33 --- .../client/task/impl/TaskClientAsync.java | 203 ------------- .../client/task/impl/TaskClientSync.java | 79 ----- .../impl/util/TaskClientRequestFactory.java | 77 ----- .../client/task/spec/ITaskClientAsync.java | 24 -- .../client/task/spec/ITaskClientSync.java | 23 -- .../org.mockito.plugins.MockMaker | 1 - 32 files changed, 374 insertions(+), 1831 deletions(-) create mode 100644 packages/java/src/main/java/armonik/client/event/EventClient.java delete mode 100644 packages/java/src/main/java/armonik/client/event/EventClientFactory.java delete mode 100644 packages/java/src/main/java/armonik/client/event/impl/EventClientAsync.java delete mode 100644 packages/java/src/main/java/armonik/client/event/impl/EventClientSync.java delete mode 100644 packages/java/src/main/java/armonik/client/event/impl/util/factory/EventClientRequestFactory.java delete mode 100644 packages/java/src/main/java/armonik/client/event/impl/util/records/EventSubscriptionResponseRecord.java delete mode 100644 packages/java/src/main/java/armonik/client/event/spec/IEventClientAsync.java delete mode 100644 packages/java/src/main/java/armonik/client/event/spec/IEventClientSync.java create mode 100644 packages/java/src/main/java/armonik/client/event/util/records/EventSubscriptionResponseRecord.java create mode 100644 packages/java/src/main/java/armonik/client/result/ResultClient.java delete mode 100644 packages/java/src/main/java/armonik/client/result/ResultClientFactory.java delete mode 100644 packages/java/src/main/java/armonik/client/result/impl/ResultClientAsync.java delete mode 100644 packages/java/src/main/java/armonik/client/result/impl/ResultClientSync.java delete mode 100644 packages/java/src/main/java/armonik/client/result/impl/util/factory/ResultClientRequestFactory.java delete mode 100644 packages/java/src/main/java/armonik/client/result/impl/util/records/DeleteResultsDataResponseRecord.java delete mode 100644 packages/java/src/main/java/armonik/client/result/impl/util/records/WatchResultResponseRecord.java delete mode 100644 packages/java/src/main/java/armonik/client/result/spec/IResultClientAsync.java delete mode 100644 packages/java/src/main/java/armonik/client/result/spec/IResultClientSync.java delete mode 100644 packages/java/src/main/java/armonik/client/session/SessionClientFactory.java delete mode 100644 packages/java/src/main/java/armonik/client/session/impl/SessionClientAsync.java delete mode 100644 packages/java/src/main/java/armonik/client/session/impl/SesssionClientSync.java delete mode 100644 packages/java/src/main/java/armonik/client/session/impl/util/SessionClientRequestFactory.java delete mode 100644 packages/java/src/main/java/armonik/client/session/spec/ISessionClientAsync.java delete mode 100644 packages/java/src/main/java/armonik/client/session/spec/ISessionClientSync.java delete mode 100644 packages/java/src/main/java/armonik/client/task/TaskClientFactory.java delete mode 100644 packages/java/src/main/java/armonik/client/task/impl/TaskClientAsync.java delete mode 100644 packages/java/src/main/java/armonik/client/task/impl/TaskClientSync.java delete mode 100644 packages/java/src/main/java/armonik/client/task/impl/util/TaskClientRequestFactory.java delete mode 100644 packages/java/src/main/java/armonik/client/task/spec/ITaskClientAsync.java delete mode 100644 packages/java/src/main/java/armonik/client/task/spec/ITaskClientSync.java delete mode 100644 packages/java/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/packages/java/pom.xml b/packages/java/pom.xml index ecad9114c..45c41e740 100644 --- a/packages/java/pom.xml +++ b/packages/java/pom.xml @@ -26,6 +26,15 @@ grpc-netty 1.62.2 + + + + io.projectreactor + reactor-core + 3.6.5 + + + io.grpc grpc-protobuf diff --git a/packages/java/src/main/java/armonik/client/event/EventClient.java b/packages/java/src/main/java/armonik/client/event/EventClient.java new file mode 100644 index 000000000..c2c957e43 --- /dev/null +++ b/packages/java/src/main/java/armonik/client/event/EventClient.java @@ -0,0 +1,185 @@ +package armonik.client.event; + +import static armonik.api.grpc.v1.events.EventsCommon.EventsEnum.EVENTS_ENUM_NEW_RESULT; +import static armonik.api.grpc.v1.events.EventsCommon.EventsEnum.EVENTS_ENUM_RESULT_STATUS_UPDATE; +import static armonik.api.grpc.v1.results.ResultsFields.ResultRawEnumField.RESULT_RAW_ENUM_FIELD_RESULT_ID; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import armonik.api.grpc.v1.FiltersCommon; +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionRequest; +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse; +import armonik.api.grpc.v1.events.EventsGrpc; +import armonik.api.grpc.v1.events.EventsGrpc.EventsBlockingStub; +import armonik.api.grpc.v1.results.ResultsFields; +import armonik.api.grpc.v1.results.ResultsFilters; +import armonik.client.event.util.records.EventSubscriptionResponseRecord; +import io.grpc.ManagedChannel; +import io.grpc.stub.StreamObserver; + +/** + * EventClient is a client for interacting with event-related functionalities. + * It communicates with a gRPC server using a blocking stub to retrieve events. + */ +public class EventClient { + /** The blocking and nonblocking stub for communicating with the gRPC server. */ + private final EventsBlockingStub eventsBlockingStub; + private final EventsGrpc.EventsStub eventsStub; + + /** + * Constructs a new EventClient with the specified managed channel. + * + * @param managedChannel the managed channel used for communication with the + * server + */ + public EventClient(ManagedChannel managedChannel) { + eventsBlockingStub = EventsGrpc.newBlockingStub(managedChannel); + eventsStub = EventsGrpc.newStub(managedChannel); + } + + /** + * Retrieves a list of event subscription response records for the given session + * ID and result IDs. + * + * @param sessionId the session ID for which events are requested + * @param resultIds the list of result IDs for which events are requested + * @return a list of EventSubscriptionResponseRecord objects representing the + * events + */ + public List getEvents(String sessionId, List resultIds) { + EventSubscriptionRequest request = CreateEventSubscriptionRequest(sessionId, resultIds); + return mapToRecord(sessionId, request, resultIds); + } + + /** + * Maps the received event subscription response to + * EventSubscriptionResponseRecord objects. + * + * @param sessionId the session ID for which events are being mapped + * @param request the event subscription request + * @return a list of EventSubscriptionResponseRecord objects representing the + * events + */ + private List mapToRecord(String sessionId, EventSubscriptionRequest request, + List resultIds) { + List responseRecords = new ArrayList<>(); + Iterator events = eventsBlockingStub.getEvents(request); + Set resultsExpected = new HashSet<>(resultIds); + + while (events.hasNext()) { + var esr = events.next(); + resultsExpected.remove(esr.getNewResult().getResultId()); + responseRecords + .add(new EventSubscriptionResponseRecord(sessionId, + esr.getTaskStatusUpdate(), + esr.getResultStatusUpdate(), + esr.getResultOwnerUpdate(), + esr.getNewTask(), + esr.getNewResult())); + if (resultsExpected.isEmpty()) { + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + System.out.println("Thread was interrupted while sleeping"); + } + break; + } + } + return responseRecords; + } + + /** + * Retrieves a list of event subscription response records for the given session + * asynchrone + * ID and result IDs. + * + * @param sessionId the session ID for which events are requested + * @param resultIds the list of result IDs for which events are requested + * @return a list of EventSubscriptionResponseRecord objects representing the + * events + * @throws InterruptedException + */ + public List getEventResponseRecords(String sessionId, List resultIds) + throws InterruptedException { + + EventSubscriptionRequest request = CreateEventSubscriptionRequest(sessionId, resultIds); + List responseRecords = new ArrayList<>(); + CountDownLatch finishLatch = new CountDownLatch(1); + + StreamObserver responseObserver = new StreamObserver() { + + @Override + public void onNext(EventSubscriptionResponse esr) { + responseRecords.add(new EventSubscriptionResponseRecord( + sessionId, + esr.getTaskStatusUpdate(), + esr.getResultStatusUpdate(), + esr.getResultOwnerUpdate(), + esr.getNewTask(), + esr.getNewResult())); + } + + @Override + public void onError(Throwable t) { + t.printStackTrace(); + finishLatch.countDown(); + } + + @Override + public void onCompleted() { + System.out.println("Stream completed"); + finishLatch.countDown(); + } + }; + + eventsStub.getEvents(request, responseObserver); + + // Wait for the response observer to finish + if (!finishLatch.await(1, TimeUnit.MINUTES)) { + System.out.println("Request not completed within the timeout."); + } + + return responseRecords; + } + + /** + * Creates an event subscription request with the specified session ID and + * result IDs. + * + * @param sessionId the session ID for which event subscription is requested + * @param resultIds the list of result IDs to filter events + * @return an EventSubscriptionRequest object configured with the provided + * session ID and result IDs + */ + public static EventSubscriptionRequest CreateEventSubscriptionRequest(String sessionId, List resultIds) { + FiltersCommon.FilterString filterString = FiltersCommon.FilterString.newBuilder() + .setOperator(FiltersCommon.FilterStringOperator.FILTER_STRING_OPERATOR_EQUAL) + .build(); + + ResultsFields.ResultField.Builder resultField = ResultsFields.ResultField.newBuilder() + .setResultRawField(ResultsFields.ResultRawField.newBuilder().setField(RESULT_RAW_ENUM_FIELD_RESULT_ID)); + + ResultsFilters.FilterField.Builder filterFieldBuilder = ResultsFilters.FilterField.newBuilder() + .setField(resultField) + .setFilterString(filterString); + + ResultsFilters.Filters.Builder resultFiltersBuilder = ResultsFilters.Filters.newBuilder(); + for (String resultId : resultIds) { + filterFieldBuilder.setFilterString(FiltersCommon.FilterString.newBuilder().setValue(resultId).build()); + resultFiltersBuilder.addOr(ResultsFilters.FiltersAnd.newBuilder().addAnd(filterFieldBuilder).build()); + } + + return EventSubscriptionRequest.newBuilder() + .setResultsFilters(resultFiltersBuilder.build()) + .addReturnedEvents(EVENTS_ENUM_RESULT_STATUS_UPDATE) + .addReturnedEvents(EVENTS_ENUM_NEW_RESULT) + .setSessionId(sessionId) + .build(); + } +} diff --git a/packages/java/src/main/java/armonik/client/event/EventClientFactory.java b/packages/java/src/main/java/armonik/client/event/EventClientFactory.java deleted file mode 100644 index 5f97b345c..000000000 --- a/packages/java/src/main/java/armonik/client/event/EventClientFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -package armonik.client.event; - -import armonik.client.event.impl.EventClientAsync; -import armonik.client.event.impl.EventClientSync; -import armonik.client.event.spec.IEventClientAsync; -import armonik.client.event.spec.IEventClientSync; -import io.grpc.ManagedChannel; - -/** - * EventClientFactory provides static factory methods to create instances of event client implementations. - */ -public abstract class EventClientFactory { - /** - * Creates an asynchronous event client instance with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the event service - * @return an instance of {@link IEventClientAsync} representing an asynchronous event client - */ - public static IEventClientAsync createEventClientAsync(ManagedChannel managedChannel) { - return new EventClientAsync(managedChannel); - } - - /** - * Creates a synchronous event client instance with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the event service - * @return an instance of {@link IEventClientSync} representing a synchronous event client - */ - public static IEventClientSync createEventClientSync(ManagedChannel managedChannel) { - return new EventClientSync(managedChannel); - } -} diff --git a/packages/java/src/main/java/armonik/client/event/impl/EventClientAsync.java b/packages/java/src/main/java/armonik/client/event/impl/EventClientAsync.java deleted file mode 100644 index 5eef6e32d..000000000 --- a/packages/java/src/main/java/armonik/client/event/impl/EventClientAsync.java +++ /dev/null @@ -1,69 +0,0 @@ -package armonik.client.event.impl; - -import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionRequest; -import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse; -import armonik.api.grpc.v1.events.EventsGrpc; -import armonik.client.event.impl.util.factory.EventClientRequestFactory; -import armonik.client.event.impl.util.records.EventSubscriptionResponseRecord; -import armonik.client.event.spec.IEventClientAsync; -import io.grpc.ManagedChannel; -import io.grpc.stub.StreamObserver; - -import java.util.List; - -/** - * EventClientAsync is an asynchronous implementation of the {@link IEventClientAsync} interface. - * It communicates with the event service using a non-blocking stub, making asynchronous calls to wait for event updates. - */ -public class EventClientAsync implements IEventClientAsync { - private final EventsGrpc.EventsStub eventsStub; - - /** - * Constructs an EventClientAsync object with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the event service - */ - public EventClientAsync(ManagedChannel managedChannel) { - eventsStub = EventsGrpc.newStub(managedChannel); - } - - - /** - * Waits for event updates for the specified session ID and result IDs, and sends responses to the provided StreamObserver. - * - * @param sessionId the ID of the session for which event updates are awaited - * @param resultIds the list of result IDs for which event updates are awaited - * @param responseObserver a StreamObserver to handle the responses, containing entry of EventSubscriptionResponseRecord - */ - @Override - public void waitForEventsUpdateBySessionId(String sessionId, List resultIds, StreamObserver responseObserver) { - StreamObserver proxyObserver = new StreamObserver<>() { - @Override - public void onNext(EventSubscriptionResponse esr) { - responseObserver - .onNext( - new EventSubscriptionResponseRecord( - sessionId, - esr.getTaskStatusUpdate(), - esr.getResultStatusUpdate(), - esr.getResultOwnerUpdate(), - esr.getNewTask(), - esr.getNewResult() - ) - ); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - EventSubscriptionRequest request = EventClientRequestFactory.CreateEventSubscriptionRequest(sessionId, resultIds); - eventsStub.getEvents(request, proxyObserver); - } -} diff --git a/packages/java/src/main/java/armonik/client/event/impl/EventClientSync.java b/packages/java/src/main/java/armonik/client/event/impl/EventClientSync.java deleted file mode 100644 index c55c4fb90..000000000 --- a/packages/java/src/main/java/armonik/client/event/impl/EventClientSync.java +++ /dev/null @@ -1,58 +0,0 @@ -package armonik.client.event.impl; - -import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionRequest; -import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse; -import armonik.api.grpc.v1.events.EventsGrpc; -import armonik.api.grpc.v1.events.EventsGrpc.EventsBlockingStub; -import armonik.client.event.impl.util.factory.EventClientRequestFactory; -import armonik.client.event.impl.util.records.EventSubscriptionResponseRecord; -import armonik.client.event.spec.IEventClientSync; -import com.google.common.collect.Lists; -import io.grpc.ManagedChannel; - -import java.util.List; - -/** - * EventClientSync is a synchronous implementation of the {@link IEventClientSync} interface. - * It communicates with the event service using a blocking stub, making synchronous calls to retrieve event updates. - */ -public class EventClientSync implements IEventClientSync { - - private final EventsBlockingStub eventsBlockingStub; - - - /** - * Constructs an EventClientSync object with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the event service - */ - public EventClientSync(ManagedChannel managedChannel) { - this.eventsBlockingStub = EventsGrpc.newBlockingStub(managedChannel); - } - - - /** - * Retrieves event updates for the specified session ID and result IDs. - * - * @param sessionId the session ID for which event updates are requested - * @param resultIds the list of result IDs for which event updates are requested - * @return a list containing event update responses - */ - @Override - public List getEventsUpdateBySessionId(String sessionId, List resultIds) { - EventSubscriptionRequest request = EventClientRequestFactory.CreateEventSubscriptionRequest(sessionId, resultIds); - - List subscriptionResponses = Lists.newArrayList(eventsBlockingStub.getEvents(request)); - - return subscriptionResponses.stream() - .map( - esr -> new EventSubscriptionResponseRecord( - sessionId, - esr.getTaskStatusUpdate(), - esr.getResultStatusUpdate(), - esr.getResultOwnerUpdate(), - esr.getNewTask(), - esr.getNewResult()) - ).toList(); - } -} diff --git a/packages/java/src/main/java/armonik/client/event/impl/util/factory/EventClientRequestFactory.java b/packages/java/src/main/java/armonik/client/event/impl/util/factory/EventClientRequestFactory.java deleted file mode 100644 index 2f493d5cf..000000000 --- a/packages/java/src/main/java/armonik/client/event/impl/util/factory/EventClientRequestFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -package armonik.client.event.impl.util.factory; - -import armonik.api.grpc.v1.FiltersCommon; -import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionRequest; -import armonik.api.grpc.v1.results.ResultsFields; -import armonik.api.grpc.v1.results.ResultsFilters; - -import java.util.List; - -import static armonik.api.grpc.v1.events.EventsCommon.EventsEnum.EVENTS_ENUM_NEW_RESULT; -import static armonik.api.grpc.v1.events.EventsCommon.EventsEnum.EVENTS_ENUM_RESULT_STATUS_UPDATE; -import static armonik.api.grpc.v1.results.ResultsFields.ResultRawEnumField.RESULT_RAW_ENUM_FIELD_RESULT_ID; - -/** - * EventClientRequestFactory provides static methods to create event subscription requests. - * It constructs EventSubscriptionRequest objects based on provided session ID and result IDs. - */ -public class EventClientRequestFactory { - - /** - * Creates an event subscription request with the specified session ID and result IDs. - * - * @param sessionId the session ID for which event subscription is requested - * @param resultIds the list of result IDs to filter events - * @return an EventSubscriptionRequest object configured with the provided session ID and result IDs - */ - public static EventSubscriptionRequest CreateEventSubscriptionRequest(String sessionId, List resultIds){ - FiltersCommon.FilterString filterString = FiltersCommon.FilterString.newBuilder() - .setOperator(FiltersCommon.FilterStringOperator.FILTER_STRING_OPERATOR_EQUAL) - .build(); - - ResultsFields.ResultField.Builder resultField = ResultsFields.ResultField.newBuilder() - .setResultRawField(ResultsFields.ResultRawField.newBuilder().setField(RESULT_RAW_ENUM_FIELD_RESULT_ID)); - - ResultsFilters.FilterField.Builder filterFieldBuilder = ResultsFilters.FilterField.newBuilder() - .setField(resultField) - .setFilterString(filterString); - - ResultsFilters.Filters.Builder resultFiltersBuilder = ResultsFilters.Filters.newBuilder(); - for (String resultId : resultIds) { - filterFieldBuilder.setFilterString(FiltersCommon.FilterString.newBuilder().setValue(resultId).build()); - resultFiltersBuilder.addOr(ResultsFilters.FiltersAnd.newBuilder().addAnd(filterFieldBuilder).build()); - } - - return EventSubscriptionRequest.newBuilder() - .setResultsFilters(resultFiltersBuilder.build()) - .addReturnedEvents(EVENTS_ENUM_RESULT_STATUS_UPDATE) - .addReturnedEvents(EVENTS_ENUM_NEW_RESULT) - .setSessionId(sessionId) - .build(); - } -} diff --git a/packages/java/src/main/java/armonik/client/event/impl/util/records/EventSubscriptionResponseRecord.java b/packages/java/src/main/java/armonik/client/event/impl/util/records/EventSubscriptionResponseRecord.java deleted file mode 100644 index 29a8aab5e..000000000 --- a/packages/java/src/main/java/armonik/client/event/impl/util/records/EventSubscriptionResponseRecord.java +++ /dev/null @@ -1,16 +0,0 @@ -package armonik.client.event.impl.util.records; - -import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse.*; - -/** - * EventUpdateResponse represents the response containing updates for various event-related entities. - * It encapsulates changes in task status, result status, result owner, new task, and new result. - */ -public record EventSubscriptionResponseRecord(String sessionId, - TaskStatusUpdate taskStatusUpdate, - ResultStatusUpdate resultStatusUpdate, - ResultOwnerUpdate resultOwnerUpdate, - NewTask newTask, - NewResult newResult - ) { -} diff --git a/packages/java/src/main/java/armonik/client/event/spec/IEventClientAsync.java b/packages/java/src/main/java/armonik/client/event/spec/IEventClientAsync.java deleted file mode 100644 index e844c1522..000000000 --- a/packages/java/src/main/java/armonik/client/event/spec/IEventClientAsync.java +++ /dev/null @@ -1,10 +0,0 @@ -package armonik.client.event.spec; - -import armonik.client.event.impl.util.records.EventSubscriptionResponseRecord; -import io.grpc.stub.StreamObserver; - -import java.util.List; - -public interface IEventClientAsync { - void waitForEventsUpdateBySessionId(String sessionId, List resultIds, StreamObserver responseObserver); -} diff --git a/packages/java/src/main/java/armonik/client/event/spec/IEventClientSync.java b/packages/java/src/main/java/armonik/client/event/spec/IEventClientSync.java deleted file mode 100644 index 098103e62..000000000 --- a/packages/java/src/main/java/armonik/client/event/spec/IEventClientSync.java +++ /dev/null @@ -1,10 +0,0 @@ -package armonik.client.event.spec; - -import armonik.client.event.impl.util.records.EventSubscriptionResponseRecord; - -import java.util.List; - -public interface IEventClientSync { - List getEventsUpdateBySessionId(String sessionId, List resultIds); - -} diff --git a/packages/java/src/main/java/armonik/client/event/util/records/EventSubscriptionResponseRecord.java b/packages/java/src/main/java/armonik/client/event/util/records/EventSubscriptionResponseRecord.java new file mode 100644 index 000000000..0cead396d --- /dev/null +++ b/packages/java/src/main/java/armonik/client/event/util/records/EventSubscriptionResponseRecord.java @@ -0,0 +1,22 @@ +package armonik.client.event.util.records; + +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse.NewResult; +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse.NewTask; +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse.ResultOwnerUpdate; +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse.ResultStatusUpdate; +import armonik.api.grpc.v1.events.EventsCommon.EventSubscriptionResponse.TaskStatusUpdate; + +/** + * EventSubscriptionResponseRecord represents a record containing subscription + * response details for an event. + * It encapsulates various attributes related to event subscription, such as + * session ID, task status update, + * result status update, result owner update, new task, and new result. + */ +public record EventSubscriptionResponseRecord(String sessionId, + TaskStatusUpdate taskStatusUpdate, + ResultStatusUpdate resultStatusUpdate, + ResultOwnerUpdate resultOwnerUpdate, + NewTask newTask, + NewResult newResult) { +} diff --git a/packages/java/src/main/java/armonik/client/result/ResultClient.java b/packages/java/src/main/java/armonik/client/result/ResultClient.java new file mode 100644 index 000000000..eb401344e --- /dev/null +++ b/packages/java/src/main/java/armonik/client/result/ResultClient.java @@ -0,0 +1,158 @@ +package armonik.client.result; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.google.protobuf.ByteString; + +import armonik.api.grpc.v1.Objects; +import armonik.api.grpc.v1.results.ResultsCommon.CreateResultsMetaDataRequest; +import armonik.api.grpc.v1.results.ResultsCommon.CreateResultsRequest; +import armonik.api.grpc.v1.results.ResultsCommon.DownloadResultDataRequest; +import armonik.api.grpc.v1.results.ResultsCommon.DownloadResultDataResponse; +import armonik.api.grpc.v1.results.ResultsCommon.GetOwnerTaskIdRequest; +import armonik.api.grpc.v1.results.ResultsCommon.GetOwnerTaskIdResponse.MapResultTask; +import armonik.api.grpc.v1.results.ResultsCommon.GetResultRequest; +import armonik.api.grpc.v1.results.ResultsCommon.ListResultsRequest; +import armonik.api.grpc.v1.results.ResultsCommon.ListResultsRequest.Sort; +import armonik.api.grpc.v1.results.ResultsCommon.ResultRaw; +import armonik.api.grpc.v1.results.ResultsFilters.Filters; +import armonik.api.grpc.v1.results.ResultsGrpc; +import io.grpc.ManagedChannel; + +/** + * ResultClient provides methods for interacting with result-related + * functionalities. + * It communicates with a gRPC server using a blocking stub to perform various + * operations on results. + */ +public class ResultClient { + /** The blocking stub for communicating with the gRPC server. */ + private final ResultsGrpc.ResultsBlockingStub resultsBlockingStub; + + /** + * Constructs a new ResultClient with the specified managed channel. + * + * @param managedChannel the managed channel used for communication with the + * server + */ + public ResultClient(ManagedChannel managedChannel) { + this.resultsBlockingStub = ResultsGrpc.newBlockingStub(managedChannel); + } + + /** + * Retrieves the service configuration data chunk max size from the server. + * + * @return the service configuration data chunk max size + */ + public int getServiceConfiguration() { + return resultsBlockingStub.getServiceConfiguration(Objects.Empty.newBuilder().build()).getDataChunkMaxSize(); + } + + /** + * Downloads result data for the specified session ID and result ID. + * + * @param sessionId the session ID associated with the result to download + * @param resultId the result ID to download + * @return a list of byte arrays representing the downloaded data chunks + */ + public List downloadResultData(String sessionId, String resultId) { + DownloadResultDataRequest request = DownloadResultDataRequest.newBuilder() + .setSessionId(sessionId) + .setResultId(resultId) + .build(); + Iterator iterator = resultsBlockingStub.downloadResultData(request); + List list = new ArrayList<>(); + + iterator.forEachRemaining(list::add); + + return list.stream() + .map(DownloadResultDataResponse::getDataChunk) + .map(ByteString::toByteArray) + .toList(); + } + + /** + * Creates results based on the specified request. + * + * @param request the request containing the data to create results + * @return a list of ResultRaw objects representing the created results + */ + public List createResults(CreateResultsRequest request) { + return resultsBlockingStub.createResults(request).getResultsList(); + + } + + /** + * Creates metadata for results associated with the specified session ID and + * names. + * + * @param sessionId the session ID for which metadata is being created + * @param names the list of names for the results + * @return a list of ResultRaw objects representing the created metadata + */ + public List createResultsMetaData(String sessionId, List names) { + CreateResultsMetaDataRequest request = CreateResultsMetaDataRequest.newBuilder() + .setSessionId(sessionId) + .addAllResults(names.stream() + .map(name -> CreateResultsMetaDataRequest.ResultCreate.newBuilder().setName(name).build()).toList()) + .build(); + + return resultsBlockingStub.createResultsMetaData(request).getResultsList(); + } + + /** + * Retrieves a map of result IDs to task IDs for the specified session ID and + * result IDs. + * + * @param sessionId the session ID associated with the results + * @param resultIds the list of result IDs for which task IDs are requested + * @return a map where result IDs are mapped to their corresponding task IDs + */ + public Map getOwnerTaskId(String sessionId, List resultIds) { + GetOwnerTaskIdRequest request = GetOwnerTaskIdRequest.newBuilder() + .setSessionId(sessionId) + .addAllResultId(resultIds) + .build(); + return resultsBlockingStub.getOwnerTaskId(request).getResultTaskList() + .stream() + .collect(Collectors.toMap(MapResultTask::getResultId, MapResultTask::getTaskId)); + } + + /** + * Retrieves the result with the specified result ID. + * + * @param resultId the ID of the result to retrieve + * @return the ResultRaw object representing the retrieved result + */ + public ResultRaw getResult(String resultId) { + GetResultRequest request = GetResultRequest.newBuilder() + .setResultId(resultId) + .build(); + return resultsBlockingStub.getResult(request).getResult(); + } + + /** + * Lists results based on the specified filters, total count, pagination + * parameters, and sorting criteria. + * + * @param filters the filters to apply to the result list + * @param total the total count of results + * @param page the page number of the results to retrieve + * @param pageSize the size of each page of results + * @param sort the sorting criteria for the results + * @return a list of ResultRaw objects representing the retrieved results + */ + public List listResults(Filters filters, int total, int page, int pageSize, Sort sort) { + ListResultsRequest request = ListResultsRequest.newBuilder() + .setFilters(filters) + .setSort(sort) + .setPage(page) + .setPageSize(pageSize) + .build(); + return resultsBlockingStub.listResults(request).getResultsList(); + } +} diff --git a/packages/java/src/main/java/armonik/client/result/ResultClientFactory.java b/packages/java/src/main/java/armonik/client/result/ResultClientFactory.java deleted file mode 100644 index 57e61d3f5..000000000 --- a/packages/java/src/main/java/armonik/client/result/ResultClientFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -package armonik.client.result; - -import armonik.client.result.impl.ResultClientAsync; -import armonik.client.result.impl.ResultClientSync; -import armonik.client.result.spec.IResultClientAsync; -import armonik.client.result.spec.IResultClientSync; -import io.grpc.ManagedChannel; - -/** - * ResultClientFactory provides static factory methods to create instances of result client implementations. - */ -public abstract class ResultClientFactory { - /** - * Creates a synchronous result client instance with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the result service - * @return an instance of {@link IResultClientSync} representing a synchronous result client - */ - public static IResultClientSync createResultClientSync(ManagedChannel managedChannel) { - return new ResultClientSync(managedChannel); - } - - /** - * Creates an asynchronous result client instance with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the result service - * @return an instance of {@link IResultClientAsync} representing an asynchronous result client - */ - public static IResultClientAsync createResultClientAsync(ManagedChannel managedChannel) { - return new ResultClientAsync(managedChannel); - } -} diff --git a/packages/java/src/main/java/armonik/client/result/impl/ResultClientAsync.java b/packages/java/src/main/java/armonik/client/result/impl/ResultClientAsync.java deleted file mode 100644 index bab5be18a..000000000 --- a/packages/java/src/main/java/armonik/client/result/impl/ResultClientAsync.java +++ /dev/null @@ -1,277 +0,0 @@ -package armonik.client.result.impl; - -import armonik.api.grpc.v1.Objects; -import armonik.api.grpc.v1.results.ResultsCommon; -import armonik.api.grpc.v1.results.ResultsCommon.*; -import armonik.api.grpc.v1.results.ResultsFilters; -import armonik.api.grpc.v1.results.ResultsGrpc; -import armonik.api.grpc.v1.results.ResultsGrpc.ResultsStub; -import armonik.client.result.impl.util.factory.ResultClientRequestFactory; -import armonik.client.result.impl.util.records.DeleteResultsDataResponseRecord; -import armonik.client.result.impl.util.records.WatchResultResponseRecord; -import armonik.client.result.spec.IResultClientAsync; -import io.grpc.ManagedChannel; -import io.grpc.stub.StreamObserver; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * ResultClientAsync is an asynchronous implementation of the {@link IResultClientAsync} interface. - * It communicates with the result service using a non-blocking stub, making asynchronous calls to perform various result-related operations. - */ -public class ResultClientAsync implements IResultClientAsync { - private final ResultsStub resultsStub; - - public ResultClientAsync(ManagedChannel managedChannel) { - this.resultsStub = ResultsGrpc.newStub(managedChannel); - } - - @Override - public StreamObserver watchResults(StreamObserver responseObserver) { - StreamObserver proxyObserver = new StreamObserver<>() { - @Override - public void onNext(WatchResultResponse watchResultResponse) { - responseObserver.onNext(new WatchResultResponseRecord(watchResultResponse.getStatus(), watchResultResponse.getResultIdsList())); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - return resultsStub.watchResults(proxyObserver); - } - - @Override - public void getServiceConfiguration(StreamObserver responseObserver) { - StreamObserver observer = new StreamObserver() { - @Override - public void onNext(ResultsServiceConfigurationResponse resultsServiceConfigurationResponse) { - responseObserver.onNext(resultsServiceConfigurationResponse.getDataChunkMaxSize()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - resultsStub.getServiceConfiguration(Objects.Empty.newBuilder().build(), observer); - } - - - @Override - public void deleteResultsData(String sessionId, List resultIds, StreamObserver responseObserver) { - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(DeleteResultsDataResponse deleteResultsDataResponse) { - responseObserver.onNext(new DeleteResultsDataResponseRecord(sessionId, deleteResultsDataResponse.getResultIdList())); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - ResultsCommon.DeleteResultsDataRequest request = ResultClientRequestFactory.createDeleteResultsDataRequest(sessionId, resultIds); - - - resultsStub.deleteResultsData(request, observer); - } - - @Override - public void downloadResultData(String sessionId, String resultId, StreamObserver responseObserver) { - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(DownloadResultDataResponse downloadResultDataResponse) { - responseObserver.onNext(downloadResultDataResponse.getDataChunk().toByteArray()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - DownloadResultDataRequest request = ResultClientRequestFactory.createDownloadResultDataRequest(sessionId, resultId); - - - resultsStub.downloadResultData(request, observer); - } - - - @Override - public StreamObserver uploadResultData(String sessionId, String resultId, String payload, StreamObserver responseObserver) { - StreamObserver proxyObserver = new StreamObserver<>() { - @Override - public void onNext(UploadResultDataResponse uploadResultDataResponse) { - responseObserver.onNext(uploadResultDataResponse.getResult()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - return resultsStub.uploadResultData(proxyObserver); - - } - - @Override - public void createResults(CreateResultsRequest request, StreamObserver> responseObserver) { - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(CreateResultsResponse createResultsResponse) { - responseObserver - .onNext( - createResultsResponse - .getResultsList() - .stream() - .collect(Collectors.toMap(ResultRaw::getName, ResultRaw::getResultId)) - ); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - resultsStub.createResults(request, observer); - } - - @Override - public void createResultsMetaData(String sessionId, List names, StreamObserver> responseObserver) { - CreateResultsMetaDataRequest request = ResultClientRequestFactory.createCreateResultsMetaDataRequest(sessionId, names); - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(CreateResultsMetaDataResponse createResultsMetaDataResponse) { - responseObserver.onNext(createResultsMetaDataResponse.getResultsList()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - resultsStub.createResultsMetaData(request, observer); - } - - @Override - public void getOwnerTaskId(String sessionId, List resultIds, StreamObserver> responseObserver) { - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(GetOwnerTaskIdResponse getOwnerTaskIdResponse) { - responseObserver.onNext(getOwnerTaskIdResponse.getResultTaskList() - .stream() - .collect(Collectors.toMap(GetOwnerTaskIdResponse.MapResultTask::getResultId, GetOwnerTaskIdResponse.MapResultTask::getTaskId))); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - GetOwnerTaskIdRequest request = ResultClientRequestFactory.createGetOwnerTaskIdRequest(sessionId, resultIds); - - - resultsStub.getOwnerTaskId(request, observer); - } - - - @Override - public void getResult(String resultId, StreamObserver responseObserver) { - StreamObserver observer = new StreamObserver() { - @Override - public void onNext(GetResultResponse getResultResponse) { - responseObserver.onNext(getResultResponse.getResult()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - GetResultRequest request = ResultClientRequestFactory.createGetResultRequest(resultId); - - resultsStub.getResult(request, observer); - } - - - @Override - public void listResults(ResultsFilters.Filters filters, int total, int page, int pageSize, ListResultsRequest.Sort sort, StreamObserver> responseObserver) { - StreamObserver observer = new StreamObserver() { - @Override - public void onNext(ListResultsResponse listResultsResponse) { - responseObserver.onNext(listResultsResponse.getResultsList()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - ListResultsRequest request = ResultClientRequestFactory.createListResultsRequest(filters, total, page, pageSize, sort); - - resultsStub.listResults(request, observer); - } -} diff --git a/packages/java/src/main/java/armonik/client/result/impl/ResultClientSync.java b/packages/java/src/main/java/armonik/client/result/impl/ResultClientSync.java deleted file mode 100644 index 77f5f0c4f..000000000 --- a/packages/java/src/main/java/armonik/client/result/impl/ResultClientSync.java +++ /dev/null @@ -1,88 +0,0 @@ -package armonik.client.result.impl; - -import armonik.api.grpc.v1.Objects; -import armonik.api.grpc.v1.results.ResultsCommon.*; -import armonik.api.grpc.v1.results.ResultsCommon.GetOwnerTaskIdResponse.MapResultTask; -import armonik.api.grpc.v1.results.ResultsCommon.ListResultsRequest.Sort; -import armonik.api.grpc.v1.results.ResultsGrpc; -import armonik.client.result.impl.util.factory.ResultClientRequestFactory; -import armonik.client.result.impl.util.records.DeleteResultsDataResponseRecord; -import armonik.client.result.spec.IResultClientSync; -import io.grpc.ManagedChannel; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static armonik.api.grpc.v1.results.ResultsFilters.*; - -/** - * ResultClientSync is a synchronous implementation of the {@link IResultClientSync} interface. - * It communicates with the result service using a blocking stub, making synchronous calls to interact with result data. - */ -public class ResultClientSync implements IResultClientSync { - private final ResultsGrpc.ResultsBlockingStub resultsBlockingStub; - - public ResultClientSync(ManagedChannel managedChannel) { - this.resultsBlockingStub = ResultsGrpc.newBlockingStub(managedChannel); - } - - @Override - public int getServiceConfiguration() { - return resultsBlockingStub.getServiceConfiguration(Objects.Empty.newBuilder().build()).getDataChunkMaxSize(); - } - - @Override - public DeleteResultsDataResponseRecord deleteResultsData(String sessionId, List resultIds) { - DeleteResultsDataRequest request = ResultClientRequestFactory.createDeleteResultsDataRequest(sessionId, resultIds); - return new DeleteResultsDataResponseRecord(sessionId, resultsBlockingStub.deleteResultsData(request).getResultIdList()); - } - - - @Override - public List downloadResultData(String sessionId, String resultId) { - DownloadResultDataRequest request = ResultClientRequestFactory.createDownloadResultDataRequest(sessionId, resultId); - Iterator iterator = resultsBlockingStub.downloadResultData(request); - List list = new ArrayList<>(); - - iterator.forEachRemaining(list::add); - return list.stream().map(downloadResultDataResponse -> downloadResultDataResponse.getDataChunk().toByteArray()) - .toList(); - } - - @Override - public Map createResults(CreateResultsRequest request) { - return resultsBlockingStub.createResults(request).getResultsList() - .stream() - .collect(Collectors.toMap(ResultRaw::getName,ResultRaw::getResultId)); - } - - - @Override - public List createResultsMetaData(String sessionId, List names) { - CreateResultsMetaDataRequest request = ResultClientRequestFactory.createCreateResultsMetaDataRequest(sessionId, names); - return resultsBlockingStub.createResultsMetaData(request).getResultsList(); - } - - @Override - public Map getOwnerTaskId(String sessionId, List resultIds) { - GetOwnerTaskIdRequest request = ResultClientRequestFactory.createGetOwnerTaskIdRequest(sessionId, resultIds); - return resultsBlockingStub.getOwnerTaskId(request).getResultTaskList() - .stream() - .collect(Collectors.toMap(MapResultTask::getResultId, MapResultTask::getTaskId)); - } - - @Override - public ResultRaw getResult(String resultId) { - GetResultRequest request = ResultClientRequestFactory.createGetResultRequest(resultId); - return resultsBlockingStub.getResult(request).getResult(); - } - - @Override - public List listResults(Filters filters, int total, int page, int pageSize, Sort sort) { - ListResultsRequest request = ResultClientRequestFactory.createListResultsRequest(filters, total, page, pageSize, sort); - return resultsBlockingStub.listResults(request).getResultsList(); - } -} diff --git a/packages/java/src/main/java/armonik/client/result/impl/util/factory/ResultClientRequestFactory.java b/packages/java/src/main/java/armonik/client/result/impl/util/factory/ResultClientRequestFactory.java deleted file mode 100644 index b3d266437..000000000 --- a/packages/java/src/main/java/armonik/client/result/impl/util/factory/ResultClientRequestFactory.java +++ /dev/null @@ -1,60 +0,0 @@ -package armonik.client.result.impl.util.factory; - -import armonik.api.grpc.v1.results.ResultsCommon.*; -import armonik.api.grpc.v1.results.ResultsCommon.ListResultsRequest.Sort; -import armonik.api.grpc.v1.results.ResultsFilters.Filters; - -import java.util.List; - -public abstract class ResultClientRequestFactory { - - public static DeleteResultsDataRequest createDeleteResultsDataRequest(String sessionId, List resultIds) { - return DeleteResultsDataRequest.newBuilder() - .setSessionId(sessionId) - .addAllResultId(resultIds) - .build(); - } - - public static DownloadResultDataRequest createDownloadResultDataRequest(String sessionId, String resultId) { - return DownloadResultDataRequest.newBuilder() - .setSessionId(sessionId) - .setResultId(resultId) - .build(); - } - - - public static CreateResultsMetaDataRequest createCreateResultsMetaDataRequest(String sessionId, List names) { - return CreateResultsMetaDataRequest.newBuilder() - .setSessionId(sessionId) - .addAllResults(names.stream().map(name -> CreateResultsMetaDataRequest.ResultCreate.newBuilder().setName(name).build()).toList()) - .build(); - - } - - public static GetOwnerTaskIdRequest createGetOwnerTaskIdRequest(String sessionId, List resultIds) { - return GetOwnerTaskIdRequest.newBuilder() - .setSessionId(sessionId) - .addAllResultId(resultIds) - .build(); - - } - - public static GetResultRequest createGetResultRequest(String resultId) { - return GetResultRequest.newBuilder() - .setResultId(resultId) - .build(); - } - - public static ListResultsRequest createListResultsRequest(Filters filters, int total, int page, int pageSize, Sort sort) { - return ListResultsRequest.newBuilder() - .setFilters(filters) - .setSort(sort) - .setPage(page) - .setPageSize(pageSize) - .build(); - - - } - - -} diff --git a/packages/java/src/main/java/armonik/client/result/impl/util/records/DeleteResultsDataResponseRecord.java b/packages/java/src/main/java/armonik/client/result/impl/util/records/DeleteResultsDataResponseRecord.java deleted file mode 100644 index b9ff6ccf0..000000000 --- a/packages/java/src/main/java/armonik/client/result/impl/util/records/DeleteResultsDataResponseRecord.java +++ /dev/null @@ -1,6 +0,0 @@ -package armonik.client.result.impl.util.records; - -import java.util.List; - -public record DeleteResultsDataResponseRecord(String sessionId, List deletedResultIds) { -} diff --git a/packages/java/src/main/java/armonik/client/result/impl/util/records/WatchResultResponseRecord.java b/packages/java/src/main/java/armonik/client/result/impl/util/records/WatchResultResponseRecord.java deleted file mode 100644 index 3dddeeed7..000000000 --- a/packages/java/src/main/java/armonik/client/result/impl/util/records/WatchResultResponseRecord.java +++ /dev/null @@ -1,8 +0,0 @@ -package armonik.client.result.impl.util.records; - -import armonik.api.grpc.v1.result_status.ResultStatusOuterClass; - -import java.util.List; - -public record WatchResultResponseRecord(ResultStatusOuterClass.ResultStatus resultStatus, List resultIds) { -} diff --git a/packages/java/src/main/java/armonik/client/result/spec/IResultClientAsync.java b/packages/java/src/main/java/armonik/client/result/spec/IResultClientAsync.java deleted file mode 100644 index 575f35194..000000000 --- a/packages/java/src/main/java/armonik/client/result/spec/IResultClientAsync.java +++ /dev/null @@ -1,32 +0,0 @@ -package armonik.client.result.spec; - -import armonik.api.grpc.v1.results.ResultsCommon; -import armonik.api.grpc.v1.results.ResultsFilters; -import armonik.client.result.impl.util.records.DeleteResultsDataResponseRecord; -import armonik.client.result.impl.util.records.WatchResultResponseRecord; -import io.grpc.stub.StreamObserver; - -import java.util.List; -import java.util.Map; - -public interface IResultClientAsync { - StreamObserver watchResults(StreamObserver responseObserver); - - void getServiceConfiguration(StreamObserver responseObserver); - - void deleteResultsData(String sessionId, List resultIds, StreamObserver responseObserver); - - void downloadResultData(String sessionId, String resultId, StreamObserver responseObserver); - - StreamObserver uploadResultData(String sessionId, String resultId, String payload, StreamObserver responseObserver); - - void createResults(ResultsCommon.CreateResultsRequest request, StreamObserver> responseObserver); - - void createResultsMetaData(String sessionId, List names, StreamObserver> responseObserver); - - void getOwnerTaskId(String sessionId, List resultIds, StreamObserver> responseObserver); - - void getResult(String resultId, StreamObserver responseObserver); - - void listResults(ResultsFilters.Filters filters, int total, int page, int pageSize, ResultsCommon.ListResultsRequest.Sort sort, StreamObserver> responseObserver); -} diff --git a/packages/java/src/main/java/armonik/client/result/spec/IResultClientSync.java b/packages/java/src/main/java/armonik/client/result/spec/IResultClientSync.java deleted file mode 100644 index d96638e19..000000000 --- a/packages/java/src/main/java/armonik/client/result/spec/IResultClientSync.java +++ /dev/null @@ -1,26 +0,0 @@ -package armonik.client.result.spec; - -import armonik.api.grpc.v1.results.ResultsCommon; -import armonik.api.grpc.v1.results.ResultsFilters; -import armonik.client.result.impl.util.records.DeleteResultsDataResponseRecord; - -import java.util.List; -import java.util.Map; - -public interface IResultClientSync { - int getServiceConfiguration(); - - DeleteResultsDataResponseRecord deleteResultsData(String sessionId, List resultIds); - - List downloadResultData(String sessionId, String resultId); - - Map createResults(ResultsCommon.CreateResultsRequest request); - - List createResultsMetaData(String sessionId, List names); - - Map getOwnerTaskId(String sessionId, List resultIds); - - ResultsCommon.ResultRaw getResult(String resultId); - - List listResults(ResultsFilters.Filters filters, int total, int page, int pageSize, ResultsCommon.ListResultsRequest.Sort sort); -} diff --git a/packages/java/src/main/java/armonik/client/session/SessionClientFactory.java b/packages/java/src/main/java/armonik/client/session/SessionClientFactory.java deleted file mode 100644 index e34674bb1..000000000 --- a/packages/java/src/main/java/armonik/client/session/SessionClientFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -package armonik.client.session; - -import armonik.client.session.impl.SessionClientAsync; -import armonik.client.session.impl.SesssionClientSync; -import armonik.client.session.spec.ISessionClientAsync; -import armonik.client.session.spec.ISessionClientSync; -import io.grpc.ManagedChannel; - -/** - * SessionClientFactory provides static factory methods to create instances of session client implementations. - */ -public abstract class SessionClientFactory { - - /** - * Creates an asynchronous session client instance with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the session service - * @return an instance of {@link ISessionClientAsync} representing an asynchronous session client - */ - public static ISessionClientAsync createSessionClientAsync(ManagedChannel managedChannel) { - return new SessionClientAsync(managedChannel); - } - - /** - * Creates a synchronous session client instance with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the session service - * @return an instance of {@link ISessionClientSync} representing a synchronous session client - */ - public static ISessionClientSync createSesssionClientSync(ManagedChannel managedChannel) { - return new SesssionClientSync(managedChannel); - } -} diff --git a/packages/java/src/main/java/armonik/client/session/impl/SessionClientAsync.java b/packages/java/src/main/java/armonik/client/session/impl/SessionClientAsync.java deleted file mode 100644 index f3f254287..000000000 --- a/packages/java/src/main/java/armonik/client/session/impl/SessionClientAsync.java +++ /dev/null @@ -1,269 +0,0 @@ -package armonik.client.session.impl; - -import armonik.api.grpc.v1.Objects; -import armonik.api.grpc.v1.sessions.SessionsCommon; -import armonik.api.grpc.v1.sessions.SessionsCommon.*; -import armonik.api.grpc.v1.sessions.SessionsCommon.ListSessionsRequest.Sort; -import armonik.api.grpc.v1.sessions.SessionsFilters.Filters; -import armonik.api.grpc.v1.sessions.SessionsGrpc; -import armonik.api.grpc.v1.sessions.SessionsGrpc.SessionsStub; -import armonik.client.session.impl.util.SessionClientRequestFactory; -import armonik.client.session.spec.ISessionClientAsync; -import io.grpc.ManagedChannel; -import io.grpc.stub.StreamObserver; - -import java.util.List; - -public class SessionClientAsync implements ISessionClientAsync { - private final SessionsStub sessionsStub; - - /** - * Constructs a new ArmonikSession object using the provided gRPC ManagedChannel. - * - * @param managedChannel The gRPC ManagedChannel to communicate with the Armonik service. - */ - - public SessionClientAsync(ManagedChannel managedChannel) { - sessionsStub = SessionsGrpc.newStub(managedChannel); - } - - @Override - public void createSession(Objects.TaskOptions taskOptions, List partitionIds, StreamObserver streamObserver) { - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(CreateSessionReply createSessionReply) { - streamObserver.onNext(createSessionReply.getSessionId()); - } - - @Override - public void onError(Throwable throwable) { - streamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - streamObserver.onCompleted(); - } - }; - - List partIds = partitionIds == null || partitionIds.isEmpty() ? null : partitionIds; - SessionsCommon.CreateSessionRequest request = SessionsCommon.CreateSessionRequest.newBuilder() - .setDefaultTaskOption(taskOptions) - .addAllPartitionIds(partIds) - .build(); - sessionsStub.createSession(request, observer); - } - - - @Override - public void getSession(String sessionId, StreamObserver rawStreamObserver) { - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(GetSessionResponse getSessionResponse) { - rawStreamObserver.onNext(getSessionResponse.getSession()); - } - - @Override - public void onError(Throwable throwable) { - rawStreamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - rawStreamObserver.onCompleted(); - } - }; - - GetSessionRequest request = SessionClientRequestFactory.createGetSessionRequest(sessionId); - - - sessionsStub.getSession(request, observer); - } - - @Override - public void listSessions(int page, int pageSize, Filters filter, Sort sort, StreamObserver> listStreamObserver) { - ListSessionsRequest request = SessionClientRequestFactory.createListSessionsRequest(page, pageSize, filter, sort); - StreamObserver observer = new StreamObserver() { - @Override - public void onNext(ListSessionsResponse listSessionsResponse) { - listStreamObserver.onNext(listSessionsResponse.getSessionsList()); - } - - @Override - public void onError(Throwable throwable) { - listStreamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - listStreamObserver.onCompleted(); - } - }; - sessionsStub.listSessions(request, observer); - } - - @Override - public void cancelSession(String sessionId, StreamObserver sessionRawStreamObserver) throws Exception { - CancelSessionRequest request = SessionClientRequestFactory.createCancelSessionRequest(sessionId); - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(CancelSessionResponse cancelSessionResponse) { - sessionRawStreamObserver.onNext(cancelSessionResponse.getSession()); - } - - @Override - public void onError(Throwable throwable) { - sessionRawStreamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - sessionRawStreamObserver.onCompleted(); - } - }; - sessionsStub.cancelSession(request,observer); - } - - @Override - public void pauseSession(String sessionId, StreamObserver sessionRawStreamObserver) { - PauseSessionRequest request = SessionClientRequestFactory.createPauseSessionRequest(sessionId); - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(PauseSessionResponse pauseSessionResponse) { - sessionRawStreamObserver.onNext(pauseSessionResponse.getSession()); - } - - @Override - public void onError(Throwable throwable) { - sessionRawStreamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - sessionRawStreamObserver.onCompleted(); - } - }; - sessionsStub.pauseSession(request,observer); - } - - @Override - public void resumeSession(String sessionId, StreamObserver sessionRawStreamObserver) { - ResumeSessionRequest request = SessionClientRequestFactory.createResumeSessionRequest(sessionId); - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(ResumeSessionResponse resumeSessionResponse) { - sessionRawStreamObserver.onNext(resumeSessionResponse.getSession()); - } - - @Override - public void onError(Throwable throwable) { - sessionRawStreamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - sessionRawStreamObserver.onCompleted(); - } - }; - sessionsStub.resumeSession(request,observer); - } - - @Override - public void closeSession(String sessionId, StreamObserver sessionRawStreamObserver){ - CloseSessionRequest closeSessionRequest = SessionClientRequestFactory.createCloseSessionRequest(sessionId); - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(CloseSessionResponse closeSessionResponse) { - sessionRawStreamObserver.onNext(closeSessionResponse.getSession()); - } - - @Override - public void onError(Throwable throwable) { - sessionRawStreamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - sessionRawStreamObserver.onCompleted(); - } - }; - sessionsStub.closeSession(closeSessionRequest,observer); - } - - @Override - public void purgeSession(String sessionId, StreamObserver sessionRawStreamObserver){ - PurgeSessionRequest purgeSessionRequest = SessionClientRequestFactory.createPurgeSessionRequest(sessionId); - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(PurgeSessionResponse purgeSessionResponse) { - sessionRawStreamObserver.onNext(purgeSessionResponse.getSession()); - } - - @Override - public void onError(Throwable throwable) { - sessionRawStreamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - sessionRawStreamObserver.onCompleted(); - } - }; - sessionsStub.purgeSession(purgeSessionRequest,observer); - } - - @Override - public void deleteSession(String sessionId, StreamObserver sessionRawStreamObserver){ - DeleteSessionRequest deleteSessionRequest = SessionClientRequestFactory.createDeleteSessionRequest(sessionId); - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(DeleteSessionResponse deleteSessionResponse) { - sessionRawStreamObserver.onNext(deleteSessionResponse.getSession()); - } - - @Override - public void onError(Throwable throwable) { - sessionRawStreamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - sessionRawStreamObserver.onCompleted(); - } - }; - - sessionsStub.deleteSession(deleteSessionRequest,observer); - } - - @Override - public void stopSubmissionSession(String sessionId, boolean client, boolean worker, StreamObserver sessionRawStreamObserver){ - StopSubmissionRequest request = SessionClientRequestFactory.createStopSubmissionSessionRequest(sessionId, client, worker); - - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(StopSubmissionResponse stopSubmissionResponse) { - sessionRawStreamObserver.onNext(stopSubmissionResponse.getSession()); - } - - @Override - public void onError(Throwable throwable) { - sessionRawStreamObserver.onError(throwable); - } - - @Override - public void onCompleted() { - sessionRawStreamObserver.onCompleted(); - } - }; - sessionsStub.stopSubmission(request,observer); - } - - - -} diff --git a/packages/java/src/main/java/armonik/client/session/impl/SesssionClientSync.java b/packages/java/src/main/java/armonik/client/session/impl/SesssionClientSync.java deleted file mode 100644 index 45f405a6d..000000000 --- a/packages/java/src/main/java/armonik/client/session/impl/SesssionClientSync.java +++ /dev/null @@ -1,162 +0,0 @@ -/** - * ArmonikSession provides a client interface to interact with Armonik session management functionality. - * This class allows creating, retrieving, listing, canceling, pausing, resuming, closing, purging, deleting, - * and stopping submissions for sessions in the Armonik system. - */ - -package armonik.client.session.impl; - -import armonik.api.grpc.v1.Objects.TaskOptions; -import armonik.api.grpc.v1.sessions.SessionsCommon.*; -import armonik.api.grpc.v1.sessions.SessionsCommon.ListSessionsRequest.Sort; -import armonik.api.grpc.v1.sessions.SessionsFilters.Filters; -import armonik.api.grpc.v1.sessions.SessionsGrpc; -import armonik.client.session.impl.util.SessionClientRequestFactory; -import armonik.client.session.spec.ISessionClientSync; -import io.grpc.ManagedChannel; - -import java.util.List; - -public class SesssionClientSync implements ISessionClientSync { - private final SessionsGrpc.SessionsBlockingStub sessionsStub; - - /** - * Constructs a new ArmonikSession object using the provided gRPC ManagedChannel. - * - * @param managedChannel The gRPC ManagedChannel to communicate with the Armonik service. - */ - - public SesssionClientSync(ManagedChannel managedChannel){ - sessionsStub = SessionsGrpc.newBlockingStub(managedChannel); - } - - /** - * Creates a new session in the Armonik system with the given task options and partition IDs. - * - * @param taskOptions The task options for the session. - * @param partitionIds The list of partition IDs. - * @return The ID of the created session. - */ - @Override - public String createSession(TaskOptions taskOptions, List partitionIds) { - CreateSessionRequest request = SessionClientRequestFactory.createSessionRequest(taskOptions, partitionIds); - return sessionsStub.createSession(request).getSessionId(); - } - - - - /** - * Retrieves session information for the specified session ID. - * - * @param sessionId The ID of the session to retrieve. - * @return The session information. - */ - @Override - public SessionRaw getSession(String sessionId) { - GetSessionRequest request = SessionClientRequestFactory.createGetSessionRequest(sessionId); - return sessionsStub.getSession(request).getSession(); - } - - /** - * Lists sessions based on pagination, filters, and sorting options. - * - * @param page The page number. - * @param pageSize The size of each page. - * @param filter The filters to apply. - * @param sort The sorting options. - * @return A ListSessionsResult object containing the list of sessions and total count. - */ - @Override - public List listSessions(int page, int pageSize, Filters filter, Sort sort) { - ListSessionsRequest request = SessionClientRequestFactory.createListSessionsRequest(page, pageSize, filter, sort); - return sessionsStub.listSessions(request).getSessionsList(); - } - - /** - * Cancels the session with the specified session ID. - * - * @param sessionId The ID of the session to cancel. - * @return The updated session information after cancellation. - */ - @Override - public SessionRaw cancelSession(String sessionId) { - CancelSessionRequest request = SessionClientRequestFactory.createCancelSessionRequest(sessionId); - return sessionsStub.cancelSession(request).getSession(); - } - - /** - * Pauses the session with the specified session ID. - * - * @param sessionId The ID of the session to pause. - * @return The updated session information after pausing. - */ - @Override - public SessionRaw pauseSession(String sessionId) { - PauseSessionRequest request = SessionClientRequestFactory.createPauseSessionRequest(sessionId); - return sessionsStub.pauseSession(request).getSession(); - } - - /** - * Resumes the session with the specified session ID. - * - * @param sessionId The ID of the session to resume. - * @return The updated session information after resuming. - */ - @Override - public SessionRaw resumeSession(String sessionId) { - ResumeSessionRequest request = SessionClientRequestFactory.createResumeSessionRequest(sessionId); - return sessionsStub.resumeSession(request).getSession(); - } - - /** - * Closes the session with the specified session ID. - * - * @param sessionId The ID of the session to close. - * @return the closed session - */ - @Override - public SessionRaw closeSession(String sessionId){ - CloseSessionRequest closeSessionRequest = SessionClientRequestFactory.createCloseSessionRequest(sessionId); - return sessionsStub.closeSession(closeSessionRequest).getSession(); - } - - /** - * Purges the session with the specified session ID. - * - * @param sessionId The ID of the session to purge. - * @return The updated session information after purging. - */ - @Override - public SessionRaw purgeSession(String sessionId){ - PurgeSessionRequest purgeSessionRequest = SessionClientRequestFactory.createPurgeSessionRequest(sessionId); - return sessionsStub.purgeSession(purgeSessionRequest).getSession(); - } - - /** - * Deletes the session with the specified session ID. - * - * @param sessionId The ID of the session to delete. - * @return The updated session information after deletion. - */ - @Override - public SessionRaw deleteSession(String sessionId){ - DeleteSessionRequest deleteSessionRequest = SessionClientRequestFactory.createDeleteSessionRequest(sessionId); - return sessionsStub.deleteSession(deleteSessionRequest).getSession(); - } - - /** - * Stops submission for the session with the specified session ID. - * - * @param sessionId The ID of the session to stop submission for. - * @param client Boolean indicating whether to stop client submissions. - * @param worker Boolean indicating whether to stop worker submissions. - * @return The updated session information after stopping submissions. - */ - @Override - public SessionRaw stopSubmissionSession(String sessionId, boolean client, boolean worker){ - StopSubmissionRequest request = SessionClientRequestFactory.createStopSubmissionSessionRequest(sessionId, client, worker); - return sessionsStub.stopSubmission(request).getSession(); - } - - -} diff --git a/packages/java/src/main/java/armonik/client/session/impl/util/SessionClientRequestFactory.java b/packages/java/src/main/java/armonik/client/session/impl/util/SessionClientRequestFactory.java deleted file mode 100644 index 88759ea19..000000000 --- a/packages/java/src/main/java/armonik/client/session/impl/util/SessionClientRequestFactory.java +++ /dev/null @@ -1,69 +0,0 @@ -package armonik.client.session.impl.util; - -import armonik.api.grpc.v1.Objects; -import armonik.api.grpc.v1.sessions.SessionsCommon.*; -import armonik.api.grpc.v1.sessions.SessionsCommon.ListSessionsRequest.Sort; -import armonik.api.grpc.v1.sessions.SessionsFilters; - -import java.util.List; - -public abstract class SessionClientRequestFactory { - - - public static CreateSessionRequest createSessionRequest(Objects.TaskOptions taskOptions, List partitionIds) { - List partIds = partitionIds == null || partitionIds.isEmpty() ? null : partitionIds; - return CreateSessionRequest.newBuilder() - .setDefaultTaskOption(taskOptions) - .addAllPartitionIds(partIds) - .build(); - } - - public static GetSessionRequest createGetSessionRequest(String sessionId) { - return GetSessionRequest - .newBuilder() - .setSessionId(sessionId) - .build(); - } - - public static ListSessionsRequest createListSessionsRequest(int page, int pageSize, SessionsFilters.Filters filter, Sort sort) { - return ListSessionsRequest.newBuilder() - .setPage(page) - .setPageSize(pageSize) - .setFilters(filter) - .setSort(sort) - .build(); - } - - public static CancelSessionRequest createCancelSessionRequest(String sessionId) { - return CancelSessionRequest.newBuilder().setSessionId(sessionId).build(); - } - - public static PauseSessionRequest createPauseSessionRequest(String sessionId) { - return PauseSessionRequest.newBuilder().setSessionId(sessionId).build(); - } - - public static ResumeSessionRequest createResumeSessionRequest(String sessionId) { - return ResumeSessionRequest.newBuilder().setSessionId(sessionId).build(); - } - - public static CloseSessionRequest createCloseSessionRequest(String sessionId) { - return CloseSessionRequest.newBuilder().setSessionId(sessionId).build(); - } - - public static PurgeSessionRequest createPurgeSessionRequest(String sessionId) { - return PurgeSessionRequest.newBuilder().setSessionId(sessionId).build(); - - } - - public static DeleteSessionRequest createDeleteSessionRequest(String sessionId) { - return DeleteSessionRequest.newBuilder().setSessionId(sessionId).build(); - } - - public static StopSubmissionRequest createStopSubmissionSessionRequest(String sessionId, boolean client, boolean worker) { - return StopSubmissionRequest.newBuilder() - .setSessionId(sessionId) - .setClient(client) - .setWorker(worker) - .build(); - } -} diff --git a/packages/java/src/main/java/armonik/client/session/spec/ISessionClientAsync.java b/packages/java/src/main/java/armonik/client/session/spec/ISessionClientAsync.java deleted file mode 100644 index 6c871222d..000000000 --- a/packages/java/src/main/java/armonik/client/session/spec/ISessionClientAsync.java +++ /dev/null @@ -1,30 +0,0 @@ -package armonik.client.session.spec; - -import armonik.api.grpc.v1.Objects; -import armonik.api.grpc.v1.sessions.SessionsCommon; -import armonik.api.grpc.v1.sessions.SessionsFilters; -import io.grpc.stub.StreamObserver; - -import java.util.List; - -public interface ISessionClientAsync { - void createSession(Objects.TaskOptions taskOptions, List partitionIds, StreamObserver streamObserver); - - void getSession(String sessionId, StreamObserver rawStreamObserver); - - void listSessions(int page, int pageSize, SessionsFilters.Filters filter, SessionsCommon.ListSessionsRequest.Sort sort, StreamObserver> listStreamObserver); - - void cancelSession(String sessionId, StreamObserver sessionRawStreamObserver) throws Exception; - - void pauseSession(String sessionId, StreamObserver sessionRawStreamObserver); - - void resumeSession(String sessionId, StreamObserver sessionRawStreamObserver); - - void closeSession(String sessionId, StreamObserver sessionRawStreamObserver); - - void purgeSession(String sessionId, StreamObserver sessionRawStreamObserver); - - void deleteSession(String sessionId, StreamObserver sessionRawStreamObserver); - - void stopSubmissionSession(String sessionId, boolean client, boolean worker, StreamObserver sessionRawStreamObserver); -} diff --git a/packages/java/src/main/java/armonik/client/session/spec/ISessionClientSync.java b/packages/java/src/main/java/armonik/client/session/spec/ISessionClientSync.java deleted file mode 100644 index 4d6efe115..000000000 --- a/packages/java/src/main/java/armonik/client/session/spec/ISessionClientSync.java +++ /dev/null @@ -1,52 +0,0 @@ -package armonik.client.session.spec; - -import armonik.api.grpc.v1.Objects; -import armonik.api.grpc.v1.sessions.SessionsCommon.ListSessionsRequest.Sort; -import armonik.api.grpc.v1.sessions.SessionsCommon.SessionRaw; -import armonik.api.grpc.v1.sessions.SessionsFilters.Filters; - -import java.util.List; - -public interface ISessionClientSync { - default String createSession(Objects.TaskOptions taskOptions, List partitionIds) { - throw new UnsupportedOperationException("Method not implemented"); - } - - default SessionRaw getSession(String sessionId) throws Exception { - throw new UnsupportedOperationException("Method not implemented"); - } - - default List listSessions(int page, int pageSize, Filters filter, Sort sort) throws Exception { - throw new UnsupportedOperationException("Method not implemented"); - } - - default SessionRaw cancelSession(String sessionId) throws Exception { - throw new UnsupportedOperationException("Method not implemented"); - } - - default SessionRaw pauseSession(String sessionId) throws Exception { - throw new UnsupportedOperationException("Method not implemented"); - } - - default SessionRaw resumeSession(String sessionId) throws Exception { - throw new UnsupportedOperationException("Method not implemented"); - } - - default SessionRaw closeSession(String sessionId) throws Exception { - throw new UnsupportedOperationException("Method not implemented"); - } - - default SessionRaw purgeSession(String sessionId) throws Exception { - throw new UnsupportedOperationException("Method not implemented"); - } - - default SessionRaw deleteSession(String sessionId) throws Exception { - throw new UnsupportedOperationException("Method not implemented"); - } - - default SessionRaw stopSubmissionSession(String sessionId, boolean client, boolean worker) throws Exception { - throw new UnsupportedOperationException("Method not implemented"); - } - - -} diff --git a/packages/java/src/main/java/armonik/client/task/TaskClientFactory.java b/packages/java/src/main/java/armonik/client/task/TaskClientFactory.java deleted file mode 100644 index 3c6e543e9..000000000 --- a/packages/java/src/main/java/armonik/client/task/TaskClientFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -package armonik.client.task; - -import armonik.client.task.impl.TaskClientAsync; -import armonik.client.task.impl.TaskClientSync; -import armonik.client.task.spec.ITaskClientAsync; -import armonik.client.task.spec.ITaskClientSync; -import io.grpc.ManagedChannel; - -/** - * TaskClientFactory provides factory methods to create instances of task client implementations. - */ -public abstract class TaskClientFactory { - - /** - * Creates a synchronous task client instance with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the task service - * @return an instance of {@link ITaskClientSync} representing a synchronous task client - */ - public static ITaskClientSync createTaskClientSync(ManagedChannel managedChannel){ - return new TaskClientSync(managedChannel); - } - - /** - * Creates an asynchronous task client instance with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the task service - * @return an instance of {@link ITaskClientAsync} representing an asynchronous task client - */ - public static ITaskClientAsync createTaskClientAsync(ManagedChannel managedChannel){ - return new TaskClientAsync(managedChannel); - } -} diff --git a/packages/java/src/main/java/armonik/client/task/impl/TaskClientAsync.java b/packages/java/src/main/java/armonik/client/task/impl/TaskClientAsync.java deleted file mode 100644 index d164288d2..000000000 --- a/packages/java/src/main/java/armonik/client/task/impl/TaskClientAsync.java +++ /dev/null @@ -1,203 +0,0 @@ -package armonik.client.task.impl; - -import armonik.api.grpc.v1.Objects.TaskOptions; -import armonik.api.grpc.v1.tasks.TasksCommon.*; -import armonik.api.grpc.v1.tasks.TasksCommon.GetResultIdsResponse.MapTaskResult; -import armonik.api.grpc.v1.tasks.TasksCommon.ListTasksRequest.Sort; -import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksRequest.TaskCreation; -import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksResponse.TaskInfo; -import armonik.api.grpc.v1.tasks.TasksFilters.Filters; -import armonik.api.grpc.v1.tasks.TasksGrpc; -import armonik.api.grpc.v1.tasks.TasksGrpc.TasksStub; -import armonik.client.task.impl.util.TaskClientRequestFactory; -import armonik.client.task.spec.ITaskClientAsync; -import io.grpc.ManagedChannel; -import io.grpc.stub.StreamObserver; - -import java.util.List; - -/** - * TaskClientAsync is an asynchronous implementation of the {@link ITaskClientAsync} interface. - * It communicates with the task service using a non-blocking stub, making asynchronous calls to perform various task-related operations. - */ -public class TaskClientAsync implements ITaskClientAsync { - private final TasksStub taskStub; - - - /** - * Constructs a TaskClientAsync object with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the task service - */ - public TaskClientAsync(ManagedChannel managedChannel) { - this.taskStub = TasksGrpc.newStub(managedChannel); - } - - @Override - public void submitTasks(String sessionId, List taskCreations, TaskOptions taskOptions, StreamObserver> responseObserver) { - SubmitTasksRequest request = TaskClientRequestFactory.createSubmitTasksRequest(sessionId, taskCreations, taskOptions); - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(SubmitTasksResponse submitTasksResponse) { - responseObserver.onNext(submitTasksResponse.getTaskInfosList()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - taskStub.submitTasks(request, observer); - } - - @Override - public void countTasksByStatus(Filters filters, StreamObserver responseObserver) { - CountTasksByStatusRequest request = TaskClientRequestFactory.createCountTasksByStatusRequest(filters); - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(CountTasksByStatusResponse countTasksByStatusResponse) { - responseObserver.onNext(countTasksByStatusResponse); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - - taskStub.countTasksByStatus(request, observer); - } - - @Override - public void getResultIds(List tasksIds, StreamObserver> responseObserver) { - GetResultIdsRequest request = TaskClientRequestFactory.createGetResultIdsRequest(tasksIds); - - StreamObserver observer = new StreamObserver() { - @Override - public void onNext(GetResultIdsResponse getResultIdsResponse) { - responseObserver.onNext(getResultIdsResponse.getTaskResultsList()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - taskStub.getResultIds(request, observer); - } - - @Override - public void cancelTasks(List tasksIds, StreamObserver> responseObserver) { - CancelTasksRequest request = TaskClientRequestFactory.createCancelTasksRequest(tasksIds); - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(CancelTasksResponse cancelTasksResponse) { - responseObserver.onNext(cancelTasksResponse.getTasksList()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - taskStub.cancelTasks(request, observer); - } - - @Override - public void getTask(String taskId, StreamObserver responseObserver) throws NoSuchMethodException { - GetTaskRequest request = TaskClientRequestFactory.createGetTaskRequest(taskId); - - StreamObserver observer = new StreamObserver<>() { - - @Override - public void onNext(GetTaskResponse getTaskResponse) { - responseObserver.onNext(getTaskResponse.getTask()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - taskStub.getTask(request, observer); - } - - @Override - public void listTasksDetailed(int page, int pageSize, Filters filters, Sort sort, StreamObserver> responseObserver) { - - ListTasksRequest request = TaskClientRequestFactory.createListTasksDetailedRequest(page, pageSize, filters, sort); - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(ListTasksDetailedResponse listTasksDetailedResponse) { - responseObserver.onNext(listTasksDetailedResponse.getTasksList()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - taskStub.listTasksDetailed(request, observer); - } - - @Override - public void listTasks(int page, int pageSize, Filters filters, Sort sort, StreamObserver> responseObserver) { - ListTasksRequest request = TaskClientRequestFactory.createListTasksSummaryRequest(page, pageSize, filters, sort); - - StreamObserver observer = new StreamObserver<>() { - @Override - public void onNext(ListTasksResponse listTasksResponse) { - responseObserver.onNext(listTasksResponse.getTasksList()); - } - - @Override - public void onError(Throwable throwable) { - responseObserver.onError(throwable); - } - - @Override - public void onCompleted() { - responseObserver.onCompleted(); - } - }; - - - taskStub.listTasks(request, observer); - } -} diff --git a/packages/java/src/main/java/armonik/client/task/impl/TaskClientSync.java b/packages/java/src/main/java/armonik/client/task/impl/TaskClientSync.java deleted file mode 100644 index da51a5b1a..000000000 --- a/packages/java/src/main/java/armonik/client/task/impl/TaskClientSync.java +++ /dev/null @@ -1,79 +0,0 @@ -package armonik.client.task.impl; - -import armonik.api.grpc.v1.Objects.StatusCount; -import armonik.api.grpc.v1.Objects.TaskOptions; -import armonik.api.grpc.v1.tasks.TasksCommon.*; -import armonik.api.grpc.v1.tasks.TasksCommon.ListTasksRequest.Sort; -import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksRequest.TaskCreation; -import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksResponse.TaskInfo; -import armonik.api.grpc.v1.tasks.TasksFilters.Filters; -import armonik.api.grpc.v1.tasks.TasksGrpc; -import armonik.api.grpc.v1.tasks.TasksGrpc.TasksBlockingStub; -import armonik.client.task.impl.util.TaskClientRequestFactory; -import armonik.client.task.spec.ITaskClientSync; -import io.grpc.ManagedChannel; - -import java.util.List; - -import static armonik.api.grpc.v1.tasks.TasksCommon.GetResultIdsResponse.MapTaskResult; - -/** - * TaskClientSync is a synchronous implementation of the {@link ITaskClientSync} interface. - * It communicates with the task service using a blocking stub, making synchronous calls to perform various task-related operations. - */ -public class TaskClientSync implements ITaskClientSync { - private final TasksBlockingStub taskStub; - - - /** - * Constructs a TaskClientSync object with the provided managed channel. - * - * @param managedChannel the managed channel used for communication with the task service - */ - public TaskClientSync(ManagedChannel managedChannel) { - this.taskStub = TasksGrpc.newBlockingStub(managedChannel); - } - - @Override - public List listTasks(int page, int pageSize, Filters filters, Sort sort) { - ListTasksRequest request = TaskClientRequestFactory.createListTasksSummaryRequest(page, pageSize, filters, sort); - return taskStub.listTasks(request).getTasksList(); - } - - @Override - public List listTasksDetailed(int page, int pageSize, Filters filters, Sort sort) { - ListTasksRequest request = TaskClientRequestFactory.createListTasksDetailedRequest(page, pageSize, filters, sort); - return taskStub.listTasksDetailed(request).getTasksList(); - } - - @Override - public TaskDetailed getTask(String taskId) { - GetTaskRequest request = TaskClientRequestFactory.createGetTaskRequest(taskId); - return taskStub.getTask(request).getTask(); - } - - @Override - public List cancelTasks(List tasksIds) { - CancelTasksRequest request = TaskClientRequestFactory.createCancelTasksRequest(tasksIds); - return taskStub.cancelTasks(request).getTasksList(); - } - - - @Override - public List getResultIds(List tasksIds) { - GetResultIdsRequest request = TaskClientRequestFactory.createGetResultIdsRequest(tasksIds); - return taskStub.getResultIds(request).getTaskResultsList(); - } - - @Override - public List countTasksByStatus(Filters filters) { - CountTasksByStatusRequest request = TaskClientRequestFactory.createCountTasksByStatusRequest(filters); - return taskStub.countTasksByStatus(request).getStatusList(); - } - - @Override - public List submitTasks(String sessionId, List taskCreations, TaskOptions taskOptions) { - SubmitTasksRequest request = TaskClientRequestFactory.createSubmitTasksRequest(sessionId, taskCreations, taskOptions); - return taskStub.submitTasks(request).getTaskInfosList(); - } -} diff --git a/packages/java/src/main/java/armonik/client/task/impl/util/TaskClientRequestFactory.java b/packages/java/src/main/java/armonik/client/task/impl/util/TaskClientRequestFactory.java deleted file mode 100644 index 14e16a8a0..000000000 --- a/packages/java/src/main/java/armonik/client/task/impl/util/TaskClientRequestFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -package armonik.client.task.impl.util; - -import armonik.api.grpc.v1.Objects.TaskOptions; -import armonik.api.grpc.v1.tasks.TasksCommon; -import armonik.api.grpc.v1.tasks.TasksCommon.*; -import armonik.api.grpc.v1.tasks.TasksCommon.ListTasksRequest.Sort; -import armonik.api.grpc.v1.tasks.TasksCommon.SubmitTasksRequest.TaskCreation; -import armonik.api.grpc.v1.tasks.TasksFilters.Filters; - -import java.util.List; - -import static armonik.api.grpc.v1.Objects.TaskOptions.getDefaultInstance; - -public abstract class TaskClientRequestFactory { - public static ListTasksRequest createListTasksSummaryRequest(int page, int pageSize, Filters filters, Sort sort) { - return ListTasksRequest.newBuilder() - .setPage(page) - .setPageSize(pageSize) - .setFilters(filters) - .setSort(sort) - .build(); - } - - public static ListTasksRequest createListTasksDetailedRequest(int page, int pageSize, Filters filters, Sort sort) { - return TasksCommon.ListTasksRequest.newBuilder() - .setSort(sort) - .setPageSize(page) - .setPageSize(pageSize) - .setFilters(filters) - .build(); - } - - public static GetTaskRequest createGetTaskRequest(String taskId) { - return GetTaskRequest.newBuilder() - .setTaskId(taskId) - .build(); - } - - public static CancelTasksRequest createCancelTasksRequest(List tasksIds) { - return CancelTasksRequest.newBuilder() - .addAllTaskIds(tasksIds) - .build(); - } - - public static GetResultIdsRequest createGetResultIdsRequest(List tasksIds) { - return GetResultIdsRequest.newBuilder() - .addAllTaskId(tasksIds) - .build(); - - } - - public static CountTasksByStatusRequest createCountTasksByStatusRequest(Filters filters) { - return CountTasksByStatusRequest.newBuilder() - .setFilters(filters) - .build(); - } - - public static SubmitTasksRequest createSubmitTasksRequest(String sessionId, List taskCreations, TaskOptions taskOptions) { - SubmitTasksRequest.Builder requestBuilder = SubmitTasksRequest.newBuilder(); - - requestBuilder.setSessionId(sessionId); - - if (!taskOptions.equals(getDefaultInstance())) { - requestBuilder.setTaskOptions(taskOptions); - } - taskCreations.forEach(taskCreation -> { - requestBuilder - .addTaskCreationsBuilder() - .setPayloadId(taskCreation.getPayloadId()) - .addAllDataDependencies(taskCreation.getDataDependenciesList()) - .addAllExpectedOutputKeys(taskCreation.getExpectedOutputKeysList()) - .setTaskOptions(!taskCreation.getTaskOptions().equals(getDefaultInstance()) ? taskCreation.getTaskOptions() : getDefaultInstance()); - }); - - return requestBuilder.build(); - } -} diff --git a/packages/java/src/main/java/armonik/client/task/spec/ITaskClientAsync.java b/packages/java/src/main/java/armonik/client/task/spec/ITaskClientAsync.java deleted file mode 100644 index b7544581b..000000000 --- a/packages/java/src/main/java/armonik/client/task/spec/ITaskClientAsync.java +++ /dev/null @@ -1,24 +0,0 @@ -package armonik.client.task.spec; - -import armonik.api.grpc.v1.Objects; -import armonik.api.grpc.v1.tasks.TasksCommon; -import armonik.api.grpc.v1.tasks.TasksFilters; -import io.grpc.stub.StreamObserver; - -import java.util.List; - -public interface ITaskClientAsync { - void submitTasks(String sessionId, List taskCreations, Objects.TaskOptions taskOptions, StreamObserver> responseObserver); - - void countTasksByStatus(TasksFilters.Filters filters, StreamObserver responseObserver); - - void getResultIds(List tasksIds, StreamObserver> responseObserver); - - void cancelTasks(List tasksIds, StreamObserver> responseObserver); - - void getTask(String taskId, StreamObserver responseObserver) throws NoSuchMethodException; - - void listTasksDetailed(int page, int pageSize, TasksFilters.Filters filters, TasksCommon.ListTasksRequest.Sort sort, StreamObserver> responseObserver) throws NoSuchMethodException; - - void listTasks(int page, int pageSize, TasksFilters.Filters filters, TasksCommon.ListTasksRequest.Sort sort, StreamObserver> responseObserver) throws NoSuchMethodException; -} diff --git a/packages/java/src/main/java/armonik/client/task/spec/ITaskClientSync.java b/packages/java/src/main/java/armonik/client/task/spec/ITaskClientSync.java deleted file mode 100644 index d4ed2d13e..000000000 --- a/packages/java/src/main/java/armonik/client/task/spec/ITaskClientSync.java +++ /dev/null @@ -1,23 +0,0 @@ -package armonik.client.task.spec; - -import armonik.api.grpc.v1.Objects; -import armonik.api.grpc.v1.tasks.TasksCommon; -import armonik.api.grpc.v1.tasks.TasksFilters; - -import java.util.List; - -public interface ITaskClientSync { - List listTasks(int page, int pageSize, TasksFilters.Filters filters, TasksCommon.ListTasksRequest.Sort sort); - - List listTasksDetailed(int page, int pageSize, TasksFilters.Filters filters, TasksCommon.ListTasksRequest.Sort sort); - - TasksCommon.TaskDetailed getTask(String taskId); - - List cancelTasks(List tasksIds); - - List getResultIds(List tasksIds); - - List countTasksByStatus(TasksFilters.Filters filters); - - List submitTasks(String sessionId, List taskCreations, Objects.TaskOptions taskOptions); -} diff --git a/packages/java/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/packages/java/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker deleted file mode 100644 index 1f0955d45..000000000 --- a/packages/java/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ /dev/null @@ -1 +0,0 @@ -mock-maker-inline From cd672a906764f34f4824fb8b4cc52c196587cab3 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur <103190315+dbrasseur-aneo@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:23:59 +0200 Subject: [PATCH 253/344] fix proxy setup location for http client handler --- .../Submitter/GrpcChannelFactory.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 0fc348da9..da3828806 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -161,13 +161,6 @@ private static HttpMessageHandler CreateHttpMessageHandler(bool htt if (handlerType is HandlerType.Http) { var httpHandler = new HttpClientHandler(); - if (!https) - { - return httpHandler; - } - - httpHandler.SslProtocols = sslProtocols; - httpHandler.ServerCertificateCustomValidationCallback = validationCallback; switch (proxyType) { @@ -185,6 +178,14 @@ private static HttpMessageHandler CreateHttpMessageHandler(bool htt break; } + if (!https) + { + return httpHandler; + } + + httpHandler.SslProtocols = sslProtocols; + httpHandler.ServerCertificateCustomValidationCallback = validationCallback; + if (clientCert is not null) { httpHandler.ClientCertificates.Add(clientCert); From 26774eab3e376fba641aa13c170f3c0819063aac Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 24 Jun 2024 09:27:51 +0200 Subject: [PATCH 254/344] Add ReusePorts option --- packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs | 5 +++++ .../ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs b/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs index 83cae164f..5bef708fd 100644 --- a/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs +++ b/packages/csharp/ArmoniK.Api.Client/Options/GrpcClient.cs @@ -154,5 +154,10 @@ public bool HasClientCertificate /// Password used for proxy authentication /// public string ProxyPassword { get; set; } = ""; + + /// + /// Enable the option SO_REUSE_UNICASTPORT upon socket opening to limit port exhaustion + /// + public bool ReusePorts { get; set; } = true; } } diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index da3828806..e9b4f2f6e 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -274,6 +274,11 @@ private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, throw new InvalidOperationException($"{nameof(optionsGrpcClient.Endpoint)} should not be null or empty"); } + if (optionsGrpcClient.ReusePorts) + { + ServicePointManager.ReusePort = true; + } + var serviceConfig = new ServiceConfig { MethodConfigs = From c18944feeefc84ca7e4106836793eeb62537b63d Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Mon, 24 Jun 2024 09:39:37 +0200 Subject: [PATCH 255/344] Add log for connection close --- .../Submitter/GrpcChannelFactory.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index e9b4f2f6e..24b7515af 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -394,6 +394,8 @@ private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, proxyType, handlerType, logger); + httpHandler = new Handler(httpHandler, + logger); // Warn that RequestTimeout is not supported. // If required, it could be easily implemented with a DelegatingHandler and a cancellationToken delayed cancellation @@ -630,5 +632,30 @@ private enum HandlerType /// Web, } + + private class Handler : DelegatingHandler + { + private readonly ILogger? logger_; + + internal Handler(HttpMessageHandler inner, + ILogger? logger) + : base(inner) + => logger_ = logger; + + protected override async Task SendAsync(HttpRequestMessage request, + CancellationToken cancellationToken) + { + var response = await base.SendAsync(request, + cancellationToken) + .ConfigureAwait(false); + + if (response.Headers.ConnectionClose is true) + { + logger_?.LogInformation("Connection closing has been requested, performance degradation is expected"); + } + + return response; + } + } } } From 318063b6d07968ad97989971d07962442a570005 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Tue, 25 Jun 2024 10:21:08 +0200 Subject: [PATCH 256/344] chore: create version 3.18.1 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 42463b46d..91b93b682 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.18.0", + "version": "3.18.1", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 4eb56f714..74d40189e 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.18.0) +set(version 3.18.1) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 0015163ae..700ee6efe 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.18.0 - 3.18.0 + 3.18.1 + 3.18.1 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 4473b2e5f..7536c351c 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.18.0 - 3.18.0 + 3.18.1 + 3.18.1 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index 198e1cc52..4749eda7e 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.18.0 - 3.18.0 + 3.18.1 + 3.18.1 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 6e450b985..3114f5918 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.18.0 - 3.18.0 + 3.18.1 + 3.18.1 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index 0a44d4f58..4754a5968 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.18.0 - 3.18.0 + 3.18.1 + 3.18.1 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index f15de054c..766ff11ed 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.18.0 - 3.18.0 + 3.18.1 + 3.18.1 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 15d90661b..1c217aa0c 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.18.0 - 3.18.0 + 3.18.1 + 3.18.1 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index f226fb469..022cdc752 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.18.0 - 3.18.0 + 3.18.1 + 3.18.1 True True diff --git a/packages/web/package.json b/packages/web/package.json index 11e531885..afa1f8fe8 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.18.0", + "version": "3.18.1", "packageManager": "pnpm@9.1.4", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From a5037772ae7ad6be5091eb3ba65f68eaf90f1469 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Thu, 4 Jul 2024 12:26:39 +0200 Subject: [PATCH 257/344] Fixed cpp rpm build --- packages/cpp/tools/packaging/ubi7.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cpp/tools/packaging/ubi7.Dockerfile b/packages/cpp/tools/packaging/ubi7.Dockerfile index a185637cd..5baca5610 100644 --- a/packages/cpp/tools/packaging/ubi7.Dockerfile +++ b/packages/cpp/tools/packaging/ubi7.Dockerfile @@ -1,4 +1,4 @@ -FROM dockerhubaneo/armonikworker-base:ubi7.9-0.0.1 +FROM dockerhubaneo/armonikworker-base:ubi7.9-0.0.2 USER root # Update the PATH environment variable to include the gRPC libraries and binaries From c03a5eb61e2880e9feeb4aa03452c10d9f679efc Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Tue, 16 Jul 2024 10:28:40 +0200 Subject: [PATCH 258/344] Fixed typos in proto doc --- Protos/V1/tasks_common.proto | 16 ++++++++-------- Protos/V1/tasks_fields.proto | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Protos/V1/tasks_common.proto b/Protos/V1/tasks_common.proto index 0caf684d1..b0573939d 100644 --- a/Protos/V1/tasks_common.proto +++ b/Protos/V1/tasks_common.proto @@ -25,7 +25,7 @@ message TaskDetailed { string session_id = 2; /** The session ID. A task have only one related session but a session have many tasks. */ string owner_pod_id = 3; /** The owner pod ID. */ - string initial_task_id = 22; /** The initial task ID. Set when a task is submitted independantly of retries. */ + string initial_task_id = 22; /** The initial task ID. Set when a task is submitted independently of retries. */ repeated string parent_task_ids = 4; /** The parent task IDs. A tasks can be a child of another task. */ repeated string data_dependencies = 5; /** The data dependencies. A task have data dependencies. */ repeated string expected_output_ids = 6; /** The expected output IDs. A task have expected output IDs. */ @@ -40,7 +40,7 @@ message TaskDetailed { google.protobuf.Timestamp submitted_at = 12; /** The task submission date. */ google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ - google.protobuf.Timestamp fetched_at = 25; /** Task data retrevial end date. */ + google.protobuf.Timestamp fetched_at = 25; /** Task data retrieval end date. */ google.protobuf.Timestamp started_at = 13; /** The task start date. */ google.protobuf.Timestamp processed_at = 24; /** The end of task processing date. */ google.protobuf.Timestamp ended_at = 14; /** The task end date. Also used when task failed. */ @@ -74,7 +74,7 @@ message TaskSummary { string session_id = 2; /** The session ID. A task have only one related session but a session have many tasks. */ string owner_pod_id = 10; /** The owner pod ID. */ - string initial_task_id = 22; /** The initial task ID. Set when a task is submitted independantly of retries. */ + string initial_task_id = 22; /** The initial task ID. Set when a task is submitted independently of retries. */ int64 count_parent_task_ids = 21; /** Count the parent task IDs. A tasks can be a child of another task. */ int64 count_data_dependencies = 11; /** Count the data dependencies. A task have data dependencies. */ int64 count_expected_output_ids = 13; /** Count the expected output IDs. A task have expected output IDs. */ @@ -89,7 +89,7 @@ message TaskSummary { google.protobuf.Timestamp submitted_at = 12; /** The task submission date. */ google.protobuf.Timestamp received_at = 18; /** When the task is received by the agent. */ google.protobuf.Timestamp acquired_at = 19; /** When the task is acquired by the agent. */ - google.protobuf.Timestamp fetched_at = 25; /** Task data retrevial end date. */ + google.protobuf.Timestamp fetched_at = 25; /** Task data retrieval end date. */ google.protobuf.Timestamp started_at = 6; /** The task start date. */ google.protobuf.Timestamp processed_at = 23; /** The end of task processing date. */ google.protobuf.Timestamp ended_at = 7; /** The task end date. Also used when task failed. */ @@ -136,7 +136,7 @@ message ListTasksRequest { * Response to list tasks. * * Use pagination, filtering and sorting from the request. - * Return a list of formated tasks. + * Return a list of formatted tasks. */ message ListTasksResponse { repeated TaskSummary tasks = 1; /** The list of tasks. */ @@ -150,7 +150,7 @@ message ListTasksResponse { * Response to list tasks. * * Use pagination, filtering and sorting from the request. - * Return a list of formated tasks. + * Return a list of formatted tasks. */ message ListTasksDetailedResponse { repeated TaskDetailed tasks = 1; /** The list of tasks. */ @@ -225,7 +225,7 @@ message CountTasksByStatusRequest { * Response to get count from tasks by status */ message CountTasksByStatusResponse { - repeated StatusCount status = 1; /** Number of tasks by status. Expected to have only 1 objct by tasks status. */ + repeated StatusCount status = 1; /** Number of tasks by status. Expected to have only 1 object by tasks status. */ } /** @@ -236,7 +236,7 @@ message SubmitTasksRequest { repeated string expected_output_keys = 1; /** Unique ID of the results that will be produced by the task. Results should be created using ResultsService. */ repeated string data_dependencies = 2; /** Unique ID of the results that will be used as datadependencies. Results should be created using ResultsService. */ string payload_id = 3; /** Unique ID of the result that will be used as payload. Result should created using ResultsService. */ - TaskOptions task_options = 4; /** Optionnal task options. */ + TaskOptions task_options = 4; /** Optional task options. */ } string session_id = 1; /** The session ID. */ diff --git a/Protos/V1/tasks_fields.proto b/Protos/V1/tasks_fields.proto index 300c14432..50f7fe201 100644 --- a/Protos/V1/tasks_fields.proto +++ b/Protos/V1/tasks_fields.proto @@ -12,7 +12,7 @@ enum TaskSummaryEnumField { TASK_SUMMARY_ENUM_FIELD_TASK_ID = 16; /** The task ID. */ TASK_SUMMARY_ENUM_FIELD_SESSION_ID = 1; /** The session ID. */ TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID = 9; /** The owner pod ID. */ - TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID = 10; /** The initial task ID. Set when a task is submitted independantly of retries. */ + TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID = 10; /** The initial task ID. Set when a task is submitted independently of retries. */ TASK_SUMMARY_ENUM_FIELD_STATUS = 2; /** The task status. */ TASK_SUMMARY_ENUM_FIELD_CREATED_AT = 3; /** The task creation date. */ TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT = 11; /** The task submission date. */ From 972917486e688470727d6c025d4a7ce0a54bd692 Mon Sep 17 00:00:00 2001 From: lemaitre-aneo Date: Tue, 16 Jul 2024 10:29:13 +0200 Subject: [PATCH 259/344] Add payload ID to proto --- Protos/V1/tasks_common.proto | 4 ++++ Protos/V1/tasks_fields.proto | 1 + 2 files changed, 5 insertions(+) diff --git a/Protos/V1/tasks_common.proto b/Protos/V1/tasks_common.proto index b0573939d..692f3a405 100644 --- a/Protos/V1/tasks_common.proto +++ b/Protos/V1/tasks_common.proto @@ -50,6 +50,8 @@ message TaskDetailed { google.protobuf.Duration processing_to_end_duration = 21; /** The task calculated duration. Between the start date and the end date. */ google.protobuf.Duration received_to_end_duration = 23; /** The task calculated duration. Between the received date and the end date. */ + string payload_id = 26; /** The ID of the Result that is used as a payload for this task. */ + /** * Represents the task output. */ @@ -99,6 +101,8 @@ message TaskSummary { google.protobuf.Duration processing_to_end_duration = 16; /** The task calculated duration. Between the start date and the end date. */ google.protobuf.Duration received_to_end_duration = 24; /** The task calculated duration. Between the received date and the end date. */ + string payload_id = 26; /** The ID of the Result that is used as a payload for this task. */ + string error = 8; /** The error message. Only set if task have failed. */ string pod_hostname = 17; /** The hostname of the container running the task. */ } diff --git a/Protos/V1/tasks_fields.proto b/Protos/V1/tasks_fields.proto index 50f7fe201..7e2dd6e6b 100644 --- a/Protos/V1/tasks_fields.proto +++ b/Protos/V1/tasks_fields.proto @@ -28,6 +28,7 @@ enum TaskSummaryEnumField { TASK_SUMMARY_ENUM_FIELD_PROCESSED_AT = 17; /** When the task is processed by the agent. */ TASK_SUMMARY_ENUM_FIELD_ERROR = 8; /** The error message. Only set if task have failed. */ TASK_SUMMARY_ENUM_FIELD_FETCHED_AT = 19; /** When task data are fetched by the agent. */ + TASK_SUMMARY_ENUM_FIELD_PAYLOAD_ID = 20; /** The ID of the Result that is used as a payload for this task. */ } /** From 2d745da531f48353bd29dd19acb4f01dc3d0d8c1 Mon Sep 17 00:00:00 2001 From: Florian Lemaitre Date: Thu, 18 Jul 2024 23:16:47 +0200 Subject: [PATCH 260/344] Add LoggerFactory to ChannelFactory --- .../Submitter/GrpcChannelFactory.cs | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs index 24b7515af..d99dda2bd 100644 --- a/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs +++ b/packages/csharp/ArmoniK.Api.Client/Submitter/GrpcChannelFactory.cs @@ -1,6 +1,6 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2023. All rights reserved. +// Copyright (C) ANEO, 2021-2024. All rights reserved. // W. Kirschenmann // J. Gurhem // D. Dubuc @@ -261,13 +261,15 @@ private static SslProtocols GetSslProtocols() /// Options for the creation of the channel /// Which HttpMessageHandler type to use /// Optional logger + /// Optional loggerFactory /// /// The initialized GrpcChannel /// /// Endpoint passed through options is missing - private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, - HandlerType handlerType, - ILogger? logger) + private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, + HandlerType handlerType, + ILogger? logger, + ILoggerFactory? loggerFactory) { if (string.IsNullOrEmpty(optionsGrpcClient.Endpoint)) { @@ -417,6 +419,7 @@ private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, Credentials = credentials, DisposeHttpClient = true, ServiceConfig = serviceConfig, + LoggerFactory = loggerFactory, }; if (handlerType is HandlerType.Web) @@ -439,6 +442,7 @@ private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, /// /// Options for the creation of the channel /// Optional logger + /// Optional loggerFactory /// Cancellation token /// /// The initialized GrpcChannel @@ -446,22 +450,27 @@ private static GrpcChannel CreateChannelInternal(GrpcClient optionsGrpcClient, /// Endpoint passed through options is missing public static Task CreateChannelAsync(GrpcClient optionsGrpcClient, ILogger? logger = null, + ILoggerFactory? loggerFactory = null, CancellationToken cancellationToken = default) => Task.FromResult(CreateChannel(optionsGrpcClient, - logger)); + logger, + loggerFactory)); /// /// Creates the GrpcChannel /// /// Options for the creation of the channel /// Optional logger + /// Optional loggerFactory /// /// The initialized GrpcChannel /// /// Endpoint passed through options is missing - public static GrpcChannel CreateChannel(GrpcClient optionsGrpcClient, - ILogger? logger = null) + public static GrpcChannel CreateChannel(GrpcClient optionsGrpcClient, + ILogger? logger = null, + ILoggerFactory? loggerFactory = null) { + logger ??= loggerFactory?.CreateLogger(); if (!string.IsNullOrEmpty(optionsGrpcClient.OverrideTargetName)) { logger?.LogWarning("OverrideTargetName is not supported"); @@ -472,7 +481,8 @@ public static GrpcChannel CreateChannel(GrpcClient optionsGrpcClient, { return CreateChannelInternal(optionsGrpcClient, handlerType, - logger); + logger, + loggerFactory); } // If dotnet core (>= Net 5), we can use HttpClientHandler @@ -480,7 +490,8 @@ public static GrpcChannel CreateChannel(GrpcClient optionsGrpcClient, { return CreateChannelInternal(optionsGrpcClient, HandlerType.Http, - logger); + logger, + loggerFactory); } // If dotnet framework, we can use a plain WinHttpHandler. @@ -489,7 +500,8 @@ public static GrpcChannel CreateChannel(GrpcClient optionsGrpcClient, { return CreateChannelInternal(optionsGrpcClient, HandlerType.Win, - logger); + logger, + loggerFactory); } catch (InvalidOperationException e) { @@ -499,7 +511,8 @@ public static GrpcChannel CreateChannel(GrpcClient optionsGrpcClient, "Falling back to gRPC Web that does not fully support gRPC streams"); return CreateChannelInternal(optionsGrpcClient, HandlerType.Web, - logger); + logger, + loggerFactory); } } From 625c5a12414b9d5fab78f554b26b077ac401524c Mon Sep 17 00:00:00 2001 From: Florian Lemaitre Date: Thu, 18 Jul 2024 23:33:03 +0200 Subject: [PATCH 261/344] Add workaround for connectivity issue --- .../ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs b/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs index 956389813..4a6ae85aa 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs +++ b/packages/csharp/ArmoniK.Api.Common.Channel/Utils/GrpcChannelProvider.cs @@ -1,6 +1,6 @@ // This file is part of the ArmoniK project // -// Copyright (C) ANEO, 2021-2022. All rights reserved. +// Copyright (C) ANEO, 2021-2024. All rights reserved. // W. Kirschenmann // J. Gurhem // D. Dubuc @@ -91,6 +91,10 @@ private ChannelBase BuildUnixSocketGrpcChannel(string address, var udsEndPoint = new UnixDomainSocketEndPoint(address); + // Workaround for connectivity issue: https://github.com/grpc/grpc-dotnet/issues/2361#issuecomment-1895791020 + AppContext.SetSwitch("System.Net.SocketsHttpHandler.Http2FlowControl.DisableDynamicWindowSizing", + true); + var socketsHttpHandler = new SocketsHttpHandler { ConnectCallback = async (_, From 018bb930d3736432d1e2449c22aba3fbf09314d8 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 19 Jul 2024 10:36:27 +0200 Subject: [PATCH 262/344] Added payload id in python package --- packages/python/src/armonik/common/objects.py | 4 ++++ packages/python/tests/test_tasks.py | 1 + 2 files changed, 5 insertions(+) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index ead6d712e..4bac86ce0 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -130,6 +130,8 @@ class Task: pod_hostname: Optional[str] = None + payload_id: Optional[str] = None + def refresh(self, task_client) -> None: """Refresh the fields of this task object by using the given task client @@ -167,6 +169,7 @@ def refresh(self, task_client) -> None: self.output = result.output self.pod_hostname = result.pod_hostname + self.payload_id = result.payload_id self.is_init = True @classmethod @@ -197,6 +200,7 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": received_to_end_duration=duration_to_timedelta(task_raw.received_to_end_duration), output=Output(error=(task_raw.output.error if not task_raw.output.success else None)), pod_hostname=task_raw.pod_hostname, + payload_id=task_raw.payload_id, ) diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py index cbfbe4404..8ed993c9d 100644 --- a/packages/python/tests/test_tasks.py +++ b/packages/python/tests/test_tasks.py @@ -43,6 +43,7 @@ class TestArmoniKTasks: received_to_end_duration=datetime.timedelta(0), output=Output(error=""), pod_hostname="", + payload_id="", ) def test_get_task(self): From 676e6d37498b6d32b3af27bff295731fbc748742 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Fri, 19 Jul 2024 10:26:43 +0200 Subject: [PATCH 263/344] chore: create version 3.19.0 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 91b93b682..d442a0b7d 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.18.1", + "version": "3.19.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 74d40189e..3afd2550c 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.18.1) +set(version 3.19.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 700ee6efe..02978a8a6 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.18.1 - 3.18.1 + 3.19.0 + 3.19.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 7536c351c..8694416de 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.18.1 - 3.18.1 + 3.19.0 + 3.19.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index 4749eda7e..e4ceb467f 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.18.1 - 3.18.1 + 3.19.0 + 3.19.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 3114f5918..62f5fb2ec 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.18.1 - 3.18.1 + 3.19.0 + 3.19.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index 4754a5968..fbfd2f30f 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.18.1 - 3.18.1 + 3.19.0 + 3.19.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 766ff11ed..53eec4677 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.18.1 - 3.18.1 + 3.19.0 + 3.19.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 1c217aa0c..63cf58c90 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.18.1 - 3.18.1 + 3.19.0 + 3.19.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 022cdc752..960ed6f7c 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.18.1 - 3.18.1 + 3.19.0 + 3.19.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index afa1f8fe8..a82a54414 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.18.1", + "version": "3.19.0", "packageManager": "pnpm@9.1.4", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From dabeb4f7dfe8cee20bbc9f4f0be013a7a3ff3838 Mon Sep 17 00:00:00 2001 From: sboukhetta Date: Tue, 6 Aug 2024 12:52:25 +0200 Subject: [PATCH 264/344] ci: add java package --- .github/workflows/publish-edge.yml | 22 ++++++++++++++++++++++ .github/workflows/release.yml | 21 +++++++++++++++++++++ packages/java/pom.xml | 10 ++++++++-- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index ebbcc9ec0..c7c734a96 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -250,3 +250,25 @@ jobs: path: packages/cpp/tools/packaging/*.${{ matrix.type }} name: libarmonik.${{ matrix.type }} # TODO Upload to a more permanent storage + + release-java-package: + needs: [version] + runs-on: ubuntu-latest + defaults: + run: + working-directory: packages/java + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - name: Set up Maven Central Repository + uses: actions/setup-java@v4 + with: + java-version: '11' + distribution: 'temurin' + server-id: ossrh + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD + - name: Publish package + run: mvn --batch-mode deploy -Dversion=${{ needs.version.outputs.version }} + env: + MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b41e31fb0..79532655a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -206,6 +206,27 @@ jobs: run: | gh release upload ${{ github.ref_name }} packages/cpp/tools/packaging/*.${{ matrix.type }} + release-java-package: + needs: [verify-versions] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - name: Set up Maven Central Repository + uses: actions/setup-java@v4 + with: + java-version: '11' + distribution: 'temurin' + server-id: ossrh + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD + - name: Publish package + run: | + cd packages/java + mvn --batch-mode deploy + env: + MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + update-changelog: needs: [verify-versions] runs-on: ubuntu-latest diff --git a/packages/java/pom.xml b/packages/java/pom.xml index 45c41e740..4acae7462 100644 --- a/packages/java/pom.xml +++ b/packages/java/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.aneo + fr.aneo armonik-java GRPC java binding for the Armonik orchestrator API 0.1.0 @@ -133,5 +133,11 @@ - + + + ossrh + Central Repository OSSRH + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + From 3df13189e9f11f105ab400c102cdf2acc9fb2b47 Mon Sep 17 00:00:00 2001 From: sboukhetta Date: Tue, 6 Aug 2024 13:14:44 +0200 Subject: [PATCH 265/344] ci: update java version --- .github/workflows/publish-edge.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index c7c734a96..2e1890830 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -262,7 +262,7 @@ jobs: - name: Set up Maven Central Repository uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '17' distribution: 'temurin' server-id: ossrh server-username: MAVEN_USERNAME diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 79532655a..0aaada457 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -214,7 +214,7 @@ jobs: - name: Set up Maven Central Repository uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '17' distribution: 'temurin' server-id: ossrh server-username: MAVEN_USERNAME From c36f4f0fca6ec21187fd5b21372606c968d86d4f Mon Sep 17 00:00:00 2001 From: sboukhetta Date: Wed, 7 Aug 2024 16:21:19 +0200 Subject: [PATCH 266/344] ci: use central unstead of ossrh --- .github/workflows/publish-edge.yml | 2 +- .github/workflows/release.yml | 4 ++-- packages/java/pom.xml | 13 +++++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index 2e1890830..5a0d0310a 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -264,7 +264,7 @@ jobs: with: java-version: '17' distribution: 'temurin' - server-id: ossrh + server-id: central server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD - name: Publish package diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0aaada457..c6cf81ca0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -216,13 +216,13 @@ jobs: with: java-version: '17' distribution: 'temurin' - server-id: ossrh + server-id: central server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD - name: Publish package run: | cd packages/java - mvn --batch-mode deploy + mvn --batch-mode deploy -DskipTests env: MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} diff --git a/packages/java/pom.xml b/packages/java/pom.xml index 4acae7462..4cf6e1cf2 100644 --- a/packages/java/pom.xml +++ b/packages/java/pom.xml @@ -131,13 +131,22 @@ + + org.sonatype.central + central-publishing-maven-plugin + 0.5.0 + true + + central + + - + From 772914af5686c0de9bbd639cc5557a2404d2e890 Mon Sep 17 00:00:00 2001 From: sboukhetta Date: Fri, 9 Aug 2024 11:10:16 +0200 Subject: [PATCH 267/344] ci: Add gpg signing key to java release --- .github/workflows/publish-edge.yml | 3 ++ .github/workflows/release.yml | 3 ++ packages/java/pom.xml | 55 +++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index 5a0d0310a..fc32ae550 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -267,8 +267,11 @@ jobs: server-id: central server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD + gpg-private-key: ${{ secrets.GPG_SIGNING_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Publish package run: mvn --batch-mode deploy -Dversion=${{ needs.version.outputs.version }} env: MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_SIGNING_KEY_PASSWORD }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c6cf81ca0..f2ba0a0f3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -219,6 +219,8 @@ jobs: server-id: central server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD + gpg-private-key: ${{ secrets.GPG_SIGNING_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Publish package run: | cd packages/java @@ -226,6 +228,7 @@ jobs: env: MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_SIGNING_KEY_PASSWORD }} update-changelog: needs: [verify-versions] diff --git a/packages/java/pom.xml b/packages/java/pom.xml index 4cf6e1cf2..7ee249403 100644 --- a/packages/java/pom.xml +++ b/packages/java/pom.xml @@ -137,9 +137,62 @@ 0.5.0 true - central + central + true + true + + org.apache.maven.plugins + maven-source-plugin + 3.3.0 + + + attach-sources + verify + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + + attach-javadoc + + jar + + + + + java + none + + + + org.apache.maven.plugins + maven-gpg-plugin + 3.1.0 + + + sign-artifacts + verify + + sign + + + + + + --pinentry-mode + loopback + + + From 9722416caceb21326b6220b81b97bc6354b303bf Mon Sep 17 00:00:00 2001 From: sboukhetta Date: Mon, 12 Aug 2024 15:04:00 +0200 Subject: [PATCH 272/344] java: Add Hassan to Developers --- packages/java/pom.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/java/pom.xml b/packages/java/pom.xml index 5ca9ef8a4..226727f62 100644 --- a/packages/java/pom.xml +++ b/packages/java/pom.xml @@ -13,10 +13,14 @@ https://github.com/aneoconsulting/ArmoniK.Api - + Junior DONGO jdongo@aneo.fr + + Hassan EL-MZABI + elmzabi.hassan18@gmail.com + Salah Eddine BOUKHETTA sboukhetta@aneo.fr From 78f5ab2bbb0862c57fe6c85848a72444228f77da Mon Sep 17 00:00:00 2001 From: sboukhetta Date: Mon, 12 Aug 2024 15:53:38 +0200 Subject: [PATCH 273/344] ci: update java release to use the right version --- .github/workflows/publish-edge.yml | 3 +-- packages/java/pom.xml | 7 ++++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index 2afc91c8f..717240725 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -253,7 +253,6 @@ jobs: release-java-package: needs: [version] - if: github.ref == 'refs/heads/main' name: Release Java Package runs-on: ubuntu-latest defaults: @@ -272,7 +271,7 @@ jobs: gpg-private-key: ${{ secrets.GPG_SIGNING_KEY }} gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Publish package - run: mvn --batch-mode deploy -Dversion=${{ needs.version.outputs.version }} + run: mvn --batch-mode deploy versions:set -DnewVersion=${{ needs.version.outputs.version }} env: MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} diff --git a/packages/java/pom.xml b/packages/java/pom.xml index 226727f62..9508a3dde 100644 --- a/packages/java/pom.xml +++ b/packages/java/pom.xml @@ -7,7 +7,7 @@ fr.aneo armonik-java GRPC java binding for the Armonik orchestrator API - 0.1.0 + 3.19.0 armonik-java https://github.com/aneoconsulting/ArmoniK.Api @@ -164,6 +164,11 @@ + + org.codehaus.mojo + versions-maven-plugin + 2.17.1 + org.sonatype.central central-publishing-maven-plugin From db2a4c43ca5a5529ffff5566453d8f05aacd27f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Mon, 19 Aug 2024 17:49:43 +0200 Subject: [PATCH 274/344] perf: improve wait for results performances by reducing the size of the request and making multiple at the same time --- .../ArmoniK.Api.Client/EventsClientExt.cs | 165 +++++++++++------- 1 file changed, 100 insertions(+), 65 deletions(-) diff --git a/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs index 367675bfa..7629911b6 100644 --- a/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs +++ b/packages/csharp/ArmoniK.Api.Client/EventsClientExt.cs @@ -32,6 +32,7 @@ using ArmoniK.Api.gRPC.V1; using ArmoniK.Api.gRPC.V1.Events; using ArmoniK.Api.gRPC.V1.Results; +using ArmoniK.Utils; using Grpc.Core; @@ -68,87 +69,121 @@ private static FiltersAnd ResultsFilter(string resultId) }, }; + + /// + /// Wait until the given results are completed + /// + /// gRPC result client + /// The session ID in which the results are located + /// A collection of results to wait for + /// Token used to cancel the execution of the method + /// if a result is aborted + [PublicAPI] + [Obsolete("Use the overload with the bucket size and the parallelism")] + public static Task WaitForResultsAsync(this Events.EventsClient client, + string sessionId, + ICollection resultIds, + CancellationToken cancellationToken = default) + => client.WaitForResultsAsync(sessionId, + resultIds, + 100, + 1, + cancellationToken); + + /// /// Wait until the given results are completed /// /// gRPC result client /// The session ID in which the results are located /// A collection of results to wait for + /// Number of parallel threads to use. One bucket per thread. + /// Number of results Id to use to create the request to the event API /// Token used to cancel the execution of the method /// if a result is aborted [PublicAPI] public static async Task WaitForResultsAsync(this Events.EventsClient client, string sessionId, ICollection resultIds, - CancellationToken cancellationToken) - { - var resultsNotFound = new HashSet(resultIds); - while (resultsNotFound.Any()) - { - using var streamingCall = client.GetEvents(new EventSubscriptionRequest + int bucket_size = 100, + int parallelism = 1, + CancellationToken cancellationToken = default) + => await resultIds.ToChunks(bucket_size) + .ParallelForEach(new ParallelTaskOptions + { + ParallelismLimit = parallelism, + }, + async results => + { + var resultsNotFound = new HashSet(results); + while (resultsNotFound.Any()) + { + using var streamingCall = client.GetEvents(new EventSubscriptionRequest + { + SessionId = sessionId, + ReturnedEvents = + { + EventsEnum.ResultStatusUpdate, + EventsEnum.NewResult, + }, + ResultsFilters = new Filters + { + Or = + { + resultsNotFound.Select(ResultsFilter), + }, + }, + }, + cancellationToken: cancellationToken); + try + { + while (await streamingCall.ResponseStream.MoveNext(cancellationToken)) + { + var resp = streamingCall.ResponseStream.Current; + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.ResultStatusUpdate && + resultsNotFound.Contains(resp.ResultStatusUpdate.ResultId)) + { + if (resp.ResultStatusUpdate.Status == ResultStatus.Completed) { - SessionId = sessionId, - ReturnedEvents = + resultsNotFound.Remove(resp.ResultStatusUpdate.ResultId); + if (!resultsNotFound.Any()) { - EventsEnum.ResultStatusUpdate, - EventsEnum.NewResult, - }, - ResultsFilters = new Filters - { - Or = - { - resultsNotFound.Select(ResultsFilter), - }, - }, - }, - cancellationToken: cancellationToken); - try - { - while (await streamingCall.ResponseStream.MoveNext(cancellationToken)) - { - var resp = streamingCall.ResponseStream.Current; - if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.ResultStatusUpdate && resultsNotFound.Contains(resp.ResultStatusUpdate.ResultId)) - { - if (resp.ResultStatusUpdate.Status == ResultStatus.Completed) - { - resultsNotFound.Remove(resp.ResultStatusUpdate.ResultId); - if (!resultsNotFound.Any()) - { - break; - } - } + break; + } + } - if (resp.ResultStatusUpdate.Status == ResultStatus.Aborted) - { - throw new ResultAbortedException($"Result {resp.ResultStatusUpdate.ResultId} has been aborted"); - } - } + if (resp.ResultStatusUpdate.Status == ResultStatus.Aborted) + { + throw new ResultAbortedException($"Result {resp.ResultStatusUpdate.ResultId} has been aborted"); + } + } - if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.NewResult && resultsNotFound.Contains(resp.NewResult.ResultId)) - { - if (resp.NewResult.Status == ResultStatus.Completed) - { - resultsNotFound.Remove(resp.NewResult.ResultId); - if (!resultsNotFound.Any()) - { - break; - } - } + if (resp.UpdateCase == EventSubscriptionResponse.UpdateOneofCase.NewResult && + resultsNotFound.Contains(resp.NewResult.ResultId)) + { + if (resp.NewResult.Status == ResultStatus.Completed) + { + resultsNotFound.Remove(resp.NewResult.ResultId); + if (!resultsNotFound.Any()) + { + break; + } + } - if (resp.NewResult.Status == ResultStatus.Aborted) - { - throw new ResultAbortedException($"Result {resp.NewResult.ResultId} has been aborted"); - } - } - } - } - catch (OperationCanceledException) - { - } - catch (RpcException) - { - } - } - } + if (resp.NewResult.Status == ResultStatus.Aborted) + { + throw new ResultAbortedException($"Result {resp.NewResult.ResultId} has been aborted"); + } + } + } + } + catch (OperationCanceledException) + { + } + catch (RpcException) + { + } + } + }); } } From cbd595fa19366e05c725f4f482b8b3454bc82cea Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 19 Aug 2024 15:11:14 +0200 Subject: [PATCH 275/344] FilterV2 --- packages/python/proto2python.sh | 3 +- packages/python/pyproject.toml | 4 +- packages/python/src/armonik/client/events.py | 2 +- .../python/src/armonik/client/partitions.py | 35 +- packages/python/src/armonik/client/results.py | 42 +- .../python/src/armonik/client/sessions.py | 45 +- packages/python/src/armonik/client/tasks.py | 274 +---- .../python/src/armonik/common/__init__.py | 6 +- packages/python/src/armonik/common/filter.py | 611 ---------- .../src/armonik/common/filter/__init__.py | 56 + .../armonik/common/filter/_filter_field.py | 378 ++++++ .../armonik/common/filter/_message_types.py | 62 + .../src/armonik/common/filter/filter.py | 1042 +++++++++++++++++ packages/python/src/armonik/common/objects.py | 382 +++++- packages/python/tests/__init__.py | 0 packages/python/tests/conftest.py | 43 +- packages/python/tests/test_filters.py | 200 +++- 17 files changed, 2126 insertions(+), 1059 deletions(-) delete mode 100644 packages/python/src/armonik/common/filter.py create mode 100644 packages/python/src/armonik/common/filter/__init__.py create mode 100644 packages/python/src/armonik/common/filter/_filter_field.py create mode 100644 packages/python/src/armonik/common/filter/_message_types.py create mode 100644 packages/python/src/armonik/common/filter/filter.py create mode 100644 packages/python/tests/__init__.py diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh index 9b2aa93cf..bc00d0068 100755 --- a/packages/python/proto2python.sh +++ b/packages/python/proto2python.sh @@ -32,7 +32,7 @@ mkdir -p $ARMONIK_WORKER $ARMONIK_CLIENT $ARMONIK_COMMON $PACKAGE_PATH python -m venv $PYTHON_VENV source $PYTHON_VENV/bin/activate python -m pip install uv -python -m uv pip install build grpcio grpcio-tools setuptools_scm[toml] +python -m uv pip install build "grpcio==1.62.3" "grpcio-tools==1.62.3" setuptools_scm[toml] "setuptools>=61" deprecation unset proto_files for proto in ${armonik_worker_files[@]}; do @@ -61,6 +61,7 @@ python -m grpc_tools.protoc -I $PROTO_PATH --proto_path=$PROTO_PATH \ touch $ARMONIK_WORKER/__init__.py touch $ARMONIK_CLIENT/__init__.py touch $ARMONIK_COMMON/__init__.py +touch $GENERATED_PATH/__init__.py # Need to fix the relative import python fix_imports.py $GENERATED_PATH diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 437dde4b0..d860a9202 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -15,8 +15,8 @@ classifiers = [ "Programming Language :: Python :: 3", ] dependencies = [ - "grpcio", - "grpcio-tools", + "grpcio==1.62.3", + "grpcio-tools==1.62.3", "deprecation" ] [project.urls] diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index 5cc8c6ba7..bb7407393 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -5,7 +5,6 @@ from .results import ArmoniKResults from ..common import ( EventTypes, - Filter, NewTaskEvent, NewResultEvent, ResultOwnerUpdateEvent, @@ -15,6 +14,7 @@ Event, ) from .results import ResultFieldFilter +from ..common.filter import Filter from ..protogen.client.events_service_pb2_grpc import EventsStub from ..protogen.common.events_common_pb2 import EventSubscriptionRequest from ..protogen.common.results_filters_pb2 import Filters as rawResultFilters diff --git a/packages/python/src/armonik/client/partitions.py b/packages/python/src/armonik/client/partitions.py index a80d65eb5..f40857124 100644 --- a/packages/python/src/armonik/client/partitions.py +++ b/packages/python/src/armonik/client/partitions.py @@ -1,9 +1,11 @@ from typing import List, Tuple, cast, Optional +import deprecation from grpc import Channel +from .. import __version__ from ..common import Direction, Partition -from ..common.filter import Filter, NumberFilter +from ..common.filter import Filter, PartitionFilter from ..protogen.client.partitions_service_pb2_grpc import PartitionsStub from ..protogen.common.partitions_common_pb2 import ( GetPartitionRequest, @@ -11,31 +13,14 @@ ListPartitionsResponse, ) from ..protogen.common.partitions_fields_pb2 import ( - PARTITION_RAW_ENUM_FIELD_PRIORITY, PartitionField, - PartitionRawField, -) -from ..protogen.common.partitions_filters_pb2 import ( - FilterField as rawFilterField, -) -from ..protogen.common.partitions_filters_pb2 import ( - Filters as rawFilters, -) -from ..protogen.common.partitions_filters_pb2 import ( - FiltersAnd as rawFiltersAnd, ) from ..protogen.common.sort_direction_pb2 import SortDirection +@deprecation.deprecated("3.19.0", None, __version__, "Use Partition. instead") class PartitionFieldFilter: - PRIORITY = NumberFilter( - PartitionField( - partition_raw_field=PartitionRawField(field=PARTITION_RAW_ENUM_FIELD_PRIORITY) - ), - rawFilters, - rawFiltersAnd, - rawFilterField, - ) + PRIORITY = Partition.priority class ArmoniKPartitions: @@ -52,7 +37,7 @@ def list_partitions( partition_filter: Optional[Filter] = None, page: int = 0, page_size: int = 1000, - sort_field: Filter = PartitionFieldFilter.PRIORITY, + sort_field: Filter = Partition.priority, sort_direction: SortDirection = Direction.ASC, ) -> Tuple[int, List[Partition]]: """List partitions based on a filter. @@ -72,9 +57,11 @@ def list_partitions( request = ListPartitionsRequest( page=page, page_size=page_size, - filters=cast(rawFilters, partition_filter.to_disjunction().to_message()) - if partition_filter - else rawFilters(), + filters=( + PartitionFilter().to_message() + if partition_filter is None + else partition_filter.to_message() + ), sort=ListPartitionsRequest.Sort( field=cast(PartitionField, sort_field.field), direction=sort_direction ), diff --git a/packages/python/src/armonik/client/results.py b/packages/python/src/armonik/client/results.py index a2da2526d..788b0e8e7 100644 --- a/packages/python/src/armonik/client/results.py +++ b/packages/python/src/armonik/client/results.py @@ -5,8 +5,9 @@ from deprecation import deprecated from grpc import Channel +from .. import __version__ from ..common import Direction, Result -from ..common.filter import Filter, StatusFilter, StringFilter +from ..common.filter import Filter, ResultFilter from ..common.helpers import batched from ..protogen.client.results_service_pb2_grpc import ResultsStub from ..protogen.common.objects_pb2 import Empty @@ -27,40 +28,15 @@ UploadResultDataRequest, ) from ..protogen.common.results_fields_pb2 import ( - RESULT_RAW_ENUM_FIELD_RESULT_ID, - RESULT_RAW_ENUM_FIELD_STATUS, ResultField, - ResultRawField, -) -from ..protogen.common.results_filters_pb2 import ( - FilterField as rawFilterField, -) -from ..protogen.common.results_filters_pb2 import ( - Filters as rawFilters, -) -from ..protogen.common.results_filters_pb2 import ( - FiltersAnd as rawFilterAnd, -) -from ..protogen.common.results_filters_pb2 import ( - FilterStatus as rawFilterStatus, ) from ..protogen.common.sort_direction_pb2 import SortDirection +@deprecated("3.19.0", None, __version__, "Use Result. instead") class ResultFieldFilter: - STATUS = StatusFilter( - ResultField(result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_STATUS)), - rawFilters, - rawFilterAnd, - rawFilterField, - rawFilterStatus, - ) - RESULT_ID = StringFilter( - ResultField(result_raw_field=ResultRawField(field=RESULT_RAW_ENUM_FIELD_RESULT_ID)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) + STATUS = Result.status + RESULT_ID = Result.result_id class ArmoniKResults: @@ -95,7 +71,7 @@ def list_results( result_filter: Optional[Filter] = None, page: int = 0, page_size: int = 1000, - sort_field: Filter = ResultFieldFilter.STATUS, + sort_field: Filter = Result.status, sort_direction: SortDirection = Direction.ASC, ) -> Tuple[int, List[Result]]: """List results based on a filter. @@ -114,9 +90,9 @@ def list_results( request: ListResultsRequest = ListResultsRequest( page=page, page_size=page_size, - filters=cast(rawFilters, result_filter.to_disjunction().to_message()) - if result_filter - else rawFilters(), + filters=( + ResultFilter().to_message() if result_filter is None else result_filter.to_message() + ), sort=ListResultsRequest.Sort( field=cast(ResultField, sort_field.field), direction=sort_direction ), diff --git a/packages/python/src/armonik/client/sessions.py b/packages/python/src/armonik/client/sessions.py index 8d170717a..7138c1f8e 100644 --- a/packages/python/src/armonik/client/sessions.py +++ b/packages/python/src/armonik/client/sessions.py @@ -2,10 +2,12 @@ from typing import List, Optional, Tuple, cast +from deprecation import deprecated from grpc import Channel +from .. import __version__ from ..common import Direction, Session, TaskOptions -from ..common.filter import Filter, StatusFilter, StringFilter +from ..common.filter import Filter, StringFilter, SessionFilter from ..protogen.client.sessions_service_pb2_grpc import SessionsStub from ..protogen.common.sessions_common_pb2 import ( CancelSessionRequest, @@ -29,38 +31,18 @@ ListSessionsResponse, ) from ..protogen.common.sessions_fields_pb2 import ( - SESSION_RAW_ENUM_FIELD_STATUS, SessionField, - SessionRawField, - TaskOptionGenericField, -) -from ..protogen.common.sessions_filters_pb2 import ( - FilterField as rawFilterField, -) -from ..protogen.common.sessions_filters_pb2 import ( - Filters as rawFilters, -) -from ..protogen.common.sessions_filters_pb2 import ( - FiltersAnd as rawFilterAnd, -) -from ..protogen.common.sessions_filters_pb2 import ( - FilterStatus as rawFilterStatus, ) from ..protogen.common.sort_direction_pb2 import SortDirection +@deprecated("3.19.0", None, __version__, "Use Session. instead") class SessionFieldFilter: """ Enumeration of the available filters """ - STATUS = StatusFilter( - SessionField(session_raw_field=SessionRawField(field=SESSION_RAW_ENUM_FIELD_STATUS)), - rawFilters, - rawFilterAnd, - rawFilterField, - rawFilterStatus, - ) + STATUS = Session.status @staticmethod def task_options_key(option_key: str) -> StringFilter: @@ -72,12 +54,7 @@ def task_options_key(option_key: str) -> StringFilter: Returns: Corresponding filter """ - return StringFilter( - SessionField(task_option_generic_field=TaskOptionGenericField(field=option_key)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) + return Session.options[option_key] class ArmoniKSessions: @@ -130,7 +107,7 @@ def list_sessions( session_filter: Optional[Filter] = None, page: int = 0, page_size: int = 1000, - sort_field: Filter = SessionFieldFilter.STATUS, + sort_field: Filter = Session.status, sort_direction: SortDirection = Direction.ASC, ) -> Tuple[int, List[Session]]: """ @@ -151,9 +128,11 @@ def list_sessions( request = ListSessionsRequest( page=page, page_size=page_size, - filters=cast(rawFilters, session_filter.to_disjunction().to_message()) - if session_filter - else rawFilters(), + filters=( + SessionFilter().to_message() + if session_filter is None + else session_filter.to_message() + ), sort=ListSessionsRequest.Sort( field=cast(SessionField, sort_field.field), direction=sort_direction ), diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index e945d8f38..647e99fb0 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -1,18 +1,13 @@ from __future__ import annotations -from typing import Dict, List, Optional, Tuple, cast +from typing import Dict, List, Optional, Tuple +from deprecation import deprecated from grpc import Channel +from .. import __version__ from ..common import Direction, Task, TaskDefinition, TaskOptions, TaskStatus -from ..common.filter import ( - DateFilter, - DurationFilter, - Filter, - NumberFilter, - StatusFilter, - StringFilter, -) +from ..common.filter import Filter, StringFilter, TaskFilter from ..common.helpers import batched from ..protogen.client.tasks_service_pb2_grpc import TasksStub from ..protogen.common.sort_direction_pb2 import SortDirection @@ -29,224 +24,40 @@ ListTasksResponse, SubmitTasksRequest, ) -from ..protogen.common.tasks_fields_pb2 import ( - TASK_OPTION_ENUM_FIELD_APPLICATION_NAME, - TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE, - TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE, - TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, - TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, - TASK_OPTION_ENUM_FIELD_MAX_DURATION, - TASK_OPTION_ENUM_FIELD_MAX_RETRIES, - TASK_OPTION_ENUM_FIELD_PARTITION_ID, - TASK_OPTION_ENUM_FIELD_PRIORITY, - TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT, - TASK_SUMMARY_ENUM_FIELD_CREATED_AT, - TASK_SUMMARY_ENUM_FIELD_CREATION_TO_END_DURATION, - TASK_SUMMARY_ENUM_FIELD_ENDED_AT, - TASK_SUMMARY_ENUM_FIELD_ERROR, - TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID, - TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID, - TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME, - TASK_SUMMARY_ENUM_FIELD_POD_TTL, - TASK_SUMMARY_ENUM_FIELD_PROCESSING_TO_END_DURATION, - TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT, - TASK_SUMMARY_ENUM_FIELD_SESSION_ID, - TASK_SUMMARY_ENUM_FIELD_STARTED_AT, - TASK_SUMMARY_ENUM_FIELD_STATUS, - TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT, - TASK_SUMMARY_ENUM_FIELD_TASK_ID, - TaskField, - TaskOptionField, - TaskOptionGenericField, - TaskSummaryField, -) -from ..protogen.common.tasks_filters_pb2 import ( - FilterField as rawFilterField, -) -from ..protogen.common.tasks_filters_pb2 import ( - Filters as rawFilters, -) -from ..protogen.common.tasks_filters_pb2 import ( - FiltersAnd as rawFilterAnd, -) -from ..protogen.common.tasks_filters_pb2 import ( - FilterStatus as rawFilterStatus, -) +@deprecated("3.19.0", None, __version__, "Use Task. instead") class TaskFieldFilter: """ Enumeration of the available filters """ - TASK_ID = StringFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_TASK_ID)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - SESSION_ID = StringFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SESSION_ID)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - OWNER_POD_ID = StringFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - INITIAL_TASK_ID = StringFilter( - TaskField( - task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID) - ), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - STATUS = StatusFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STATUS)), - rawFilters, - rawFilterAnd, - rawFilterField, - rawFilterStatus, - ) - CREATED_AT = DateFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_CREATED_AT)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - SUBMITTED_AT = DateFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - STARTED_AT = DateFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_STARTED_AT)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - ENDED_AT = DateFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ENDED_AT)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - CREATION_TO_END_DURATION = DurationFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_CREATION_TO_END_DURATION - ) - ), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - PROCESSING_TO_END_DURATION = DurationFilter( - TaskField( - task_summary_field=TaskSummaryField( - field=TASK_SUMMARY_ENUM_FIELD_PROCESSING_TO_END_DURATION - ) - ), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - POD_TTL = DateFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_TTL)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - POD_HOSTNAME = StringFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - RECEIVED_AT = DateFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - ACQUIRED_AT = DateFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - ERROR = StringFilter( - TaskField(task_summary_field=TaskSummaryField(field=TASK_SUMMARY_ENUM_FIELD_ERROR)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - - MAX_DURATION = DurationFilter( - TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_DURATION)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - MAX_RETRIES = NumberFilter( - TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_MAX_RETRIES)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - PRIORITY = NumberFilter( - TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PRIORITY)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - PARTITION_ID = StringFilter( - TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_PARTITION_ID)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - APPLICATION_NAME = StringFilter( - TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAME)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - APPLICATION_VERSION = StringFilter( - TaskField( - task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION) - ), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - APPLICATION_NAMESPACE = StringFilter( - TaskField( - task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE) - ), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - APPLICATION_SERVICE = StringFilter( - TaskField( - task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE) - ), - rawFilters, - rawFilterAnd, - rawFilterField, - ) - ENGINE_TYPE = StringFilter( - TaskField(task_option_field=TaskOptionField(field=TASK_OPTION_ENUM_FIELD_ENGINE_TYPE)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) + TASK_ID = Task.id + SESSION_ID = Task.session_id + OWNER_POD_ID = Task.owner_pod_id + INITIAL_TASK_ID = Task.initial_task_id + STATUS = Task.status + CREATED_AT = Task.created_at + SUBMITTED_AT = Task.submitted_at + STARTED_AT = Task.started_at + ENDED_AT = Task.ended_at + CREATION_TO_END_DURATION = Task.creation_to_end_duration + PROCESSING_TO_END_DURATION = Task.processing_to_end_duration + POD_TTL = Task.pod_ttl + POD_HOSTNAME = Task.pod_hostname + RECEIVED_AT = Task.received_at + ACQUIRED_AT = Task.acquired_at + ERROR = Task.output.error + + MAX_DURATION = Task.options.max_duration + MAX_RETRIES = Task.options.max_retries + PRIORITY = Task.options.priority + PARTITION_ID = Task.options.partition_id + APPLICATION_NAME = Task.options.application_name + APPLICATION_VERSION = Task.options.application_version + APPLICATION_NAMESPACE = Task.options.application_namespace + APPLICATION_SERVICE = Task.options.application_service + ENGINE_TYPE = Task.options.engine_type @staticmethod def task_options_key(option_key: str) -> StringFilter: @@ -258,12 +69,7 @@ def task_options_key(option_key: str) -> StringFilter: Returns: Corresponding filter """ - return StringFilter( - TaskField(task_option_generic_field=TaskOptionGenericField(field=option_key)), - rawFilters, - rawFilterAnd, - rawFilterField, - ) + return Task.options[option_key] class ArmoniKTasks: @@ -293,7 +99,7 @@ def list_tasks( with_errors: bool = False, page: int = 0, page_size: int = 1000, - sort_field: Filter = TaskFieldFilter.TASK_ID, + sort_field: Filter = Task.id, sort_direction: SortDirection = Direction.ASC, detailed: bool = True, ) -> Tuple[int, List[Task]]: @@ -318,12 +124,10 @@ def list_tasks( request = ListTasksRequest( page=page, page_size=page_size, - filters=cast(rawFilters, task_filter.to_disjunction().to_message()) - if task_filter - else rawFilters(), - sort=ListTasksRequest.Sort( - field=cast(TaskField, sort_field.field), direction=sort_direction + filters=( + TaskFilter().to_message() if task_filter is None else task_filter.to_message() ), + sort=ListTasksRequest.Sort(field=sort_field.field, direction=sort_direction), with_errors=with_errors, ) if detailed: @@ -377,9 +181,7 @@ def count_tasks_by_status(self, task_filter: Optional[Filter] = None) -> Dict[Ta A dictionnary mapping each status to the number of filtered tasks. """ request = CountTasksByStatusRequest( - filters=cast(rawFilters, task_filter.to_disjunction().to_message()) - if task_filter - else rawFilters() + filters=(TaskFilter().to_message() if task_filter is None else task_filter.to_message()) ) count_tasks_by_status_response: CountTasksByStatusResponse = ( self._client.CountTasksByStatus(request) @@ -423,7 +225,7 @@ def submit_tasks( request = SubmitTasksRequest( session_id=session_id, task_creations=task_creations, - task_options=default_task_options.to_message() if default_task_options else None, + task_options=(default_task_options.to_message() if default_task_options else None), ) self._client.SubmitTasks(request) diff --git a/packages/python/src/armonik/common/__init__.py b/packages/python/src/armonik/common/__init__.py index c6397e806..b8b853524 100644 --- a/packages/python/src/armonik/common/__init__.py +++ b/packages/python/src/armonik/common/__init__.py @@ -15,7 +15,6 @@ ResultStatusUpdateEvent, TaskStatusUpdateEvent, ) -from .filter import Filter, StatusFilter, StringFilter from .helpers import ( batched, datetime_to_timestamp, @@ -34,6 +33,7 @@ TaskDefinition, TaskOptions, ) +from .filter import Filter __all__ = [ "datetime_to_timestamp", @@ -57,9 +57,6 @@ "ResultStatus", "EventTypes", # Include all names from events module - "Filter", - "StringFilter", - "StatusFilter", "ServiceHealthCheckStatus", "NewResultEvent", "NewTaskEvent", @@ -67,4 +64,5 @@ "ResultStatusUpdateEvent", "TaskStatusUpdateEvent", "Event", + "Filter", ] diff --git a/packages/python/src/armonik/common/filter.py b/packages/python/src/armonik/common/filter.py deleted file mode 100644 index f23c3f9bf..000000000 --- a/packages/python/src/armonik/common/filter.py +++ /dev/null @@ -1,611 +0,0 @@ -from __future__ import annotations - -import json -from abc import abstractmethod -from typing import Any, Dict, List, Optional, Type - -import google.protobuf.duration_pb2 as duration -import google.protobuf.timestamp_pb2 as timestamp -from google.protobuf.message import Message - -from ..protogen.common.filters_common_pb2 import ( - FILTER_STRING_OPERATOR_EQUAL, - FILTER_STRING_OPERATOR_NOT_EQUAL, - FILTER_STRING_OPERATOR_CONTAINS, - FILTER_STRING_OPERATOR_NOT_CONTAINS, - FILTER_STRING_OPERATOR_STARTS_WITH, - FILTER_STRING_OPERATOR_ENDS_WITH, - FilterString, - FILTER_NUMBER_OPERATOR_EQUAL, - FILTER_NUMBER_OPERATOR_NOT_EQUAL, - FILTER_NUMBER_OPERATOR_LESS_THAN, - FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL, - FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL, - FILTER_NUMBER_OPERATOR_GREATER_THAN, - FilterNumber, - FILTER_DATE_OPERATOR_EQUAL, - FILTER_DATE_OPERATOR_NOT_EQUAL, - FILTER_DATE_OPERATOR_BEFORE, - FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL, - FILTER_DATE_OPERATOR_AFTER, - FILTER_DATE_OPERATOR_AFTER_OR_EQUAL, - FilterDate, - FILTER_ARRAY_OPERATOR_CONTAINS, - FILTER_ARRAY_OPERATOR_NOT_CONTAINS, - FilterArray, - FILTER_STATUS_OPERATOR_EQUAL, - FILTER_STATUS_OPERATOR_NOT_EQUAL, - FILTER_BOOLEAN_OPERATOR_IS, - FilterBoolean, - FILTER_DURATION_OPERATOR_EQUAL, - FILTER_DURATION_OPERATOR_NOT_EQUAL, - FILTER_DURATION_OPERATOR_SHORTER_THAN, - FILTER_DURATION_OPERATOR_SHORTER_THAN_OR_EQUAL, - FILTER_DURATION_OPERATOR_LONGER_THAN, - FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL, - FilterDuration, -) - - -class Filter: - """ - Filter for use with ArmoniK - - Attributes: - eq_: equality raw Api operator - ne_: inequality raw Api operator - lt_: less than raw Api operator - le_: less or equal raw Api operator - gt_: greater than raw Api operator - ge_: greater or equal raw Api operator - contains_: contains raw Api operator - notcontains_: not contains raw Api operator - value_type_: expected type for the value to test against in this filter - - field: field of the filter if it's a simple filter - message_type: Api message type of the filter - inner_message_type: Api message type of the inner filter (with value and operator) - conjunction_type: Type of the conjunction for this filter - value: value to test against in this filter if it's a simple filter - operator: operator to apply for this filter if it's a simple filter - """ - - eq_ = None - ne_ = None - lt_ = None - le_ = None - gt_ = None - ge_ = None - contains_ = None - notcontains_ = None - value_type_ = None - - def __init__( - self, - field: Optional[Message], - disjunction_message_type: Type[Message], - conjunction_message_type: Type[Message], - message_type: Type[Message], - inner_message_type: Optional[Type[Message]], - filters: Optional[List[List["Filter"]]] = None, - value=None, - operator=None, - ): - self._filters: List[List["Filter"]] = [[]] if filters is None else filters - self.field = field - self.message_type = message_type - self.conjunction_type = conjunction_message_type - self.disjunction_type = disjunction_message_type - self.inner_message_type = inner_message_type - self.value = value - self.operator = operator - - def is_true_conjunction(self) -> bool: - """ - Tests whether the filter is a conjunction (logical and) - Note : This will only output true if it's an actual conjunction with multiple filters and no disjunction - """ - return self.message_type == self.conjunction_type or ( - len(self._filters) == 1 and len(self._filters[0]) > 1 - ) - - def is_true_disjunction(self) -> bool: - """ - Tests whether the filter is a disjunction (logical or) - Note : This will only output true if it's an actual disjunction with multiple filters - """ - return len(self._filters) > 1 - - def to_disjunction(self) -> Filter: - """ - Converts the filter into a disjunction - - """ - if self.is_true_disjunction(): - return self - if self.is_true_conjunction(): - return Filter( - None, - self.disjunction_type, - self.conjunction_type, - self.disjunction_type, - None, - self._filters, - ) - return Filter( - None, - self.disjunction_type, - self.conjunction_type, - self.disjunction_type, - None, - [[self]], - ) - - def __and__(self, other: "Filter") -> "Filter": - if not isinstance(other, Filter): - msg = f"Cannot create a conjunction between Filter and {other.__class__.__name__}" - raise Exception(msg) - if self.is_true_disjunction() or other.is_true_disjunction(): - raise Exception("Cannot make a conjunction of disjunctions") - if self.conjunction_type != other.conjunction_type: - raise Exception("Conjunction types are different") - return Filter( - None, - self.disjunction_type, - self.conjunction_type, - self.conjunction_type, - None, - [self.to_disjunction()._filters[0] + other.to_disjunction()._filters[0]], - ) - - def __mul__(self, other: Filter) -> "Filter": - return self & other - - def __or__(self, other: "Filter") -> "Filter": - if not isinstance(other, Filter): - msg = f"Cannot create a conjunction between Filter and {other.__class__.__name__}" - raise Exception(msg) - if self.disjunction_type != other.disjunction_type: - raise Exception("Disjunction types are different") - return Filter( - None, - self.disjunction_type, - self.conjunction_type, - self.disjunction_type, - None, - self.to_disjunction()._filters + other.to_disjunction()._filters, - ) - - def __add__(self, other: "Filter") -> "Filter": - return self | other - - def __eq__(self, value) -> Filter: - return self._check(value, self.__class__.eq_, "==") - - def __ne__(self, value) -> Filter: - return self._check(value, self.__class__.ne_, "!=") - - def __lt__(self, value) -> Filter: - return self._check(value, self.__class__.lt_, "<") - - def __le__(self, value) -> Filter: - return self._check(value, self.__class__.le_, "<=") - - def __gt__(self, value) -> Filter: - return self._check(value, self.__class__.gt_, ">") - - def __ge__(self, value) -> Filter: - return self._check(value, self.__class__.ge_, ">=") - - def contains(self, value) -> Filter: - return self._check(value, self.__class__.contains_, "contains") - - def __invert__(self) -> Filter: - """ - Inverts the test - - Returns: - Filter with the test being inverted - """ - if self.operator is None: - if self.is_true_conjunction() or self.is_true_disjunction(): - raise Exception("Cannot invert conjunctions or disjunctions") - msg = f"Cannot invert None operator in class {self.__class__.__name__} for field {str(self.field)}" - raise Exception(msg) - if self.operator == self.__class__.eq_: - return self.__ne__(self.value) - if self.operator == self.__class__.ne_: - return self.__eq__(self.value) - if self.operator == self.__class__.lt_: - return self.__ge__(self.value) - if self.operator == self.__class__.le_: - return self.__gt__(self.value) - if self.operator == self.__class__.gt_: - return self.__le__(self.value) - if self.operator == self.__class__.ge_: - return self.__lt__(self.value) - if self.operator == self.__class__.contains_: - return self._check(self.value, self.__class__.notcontains_, "not_contains") - if self.operator == self.__class__.notcontains_: - return self.contains(self.value) - msg = f"{self.__class__.__name__} operator {str(self.operator)} for field {str(self.field)} has no inverted equivalent" - raise Exception(msg) - - def __neg__(self) -> "Filter": - return ~self - - def to_dict(self) -> Dict: - rep = {} - if self.is_true_disjunction(): - rep["or"] = [{"and": [f.to_dict() for f in conj]} for conj in self._filters] - return rep - if self.is_true_conjunction(): - rep["and"] = [f.to_dict() for f in self._filters[0]] - return rep - if len(self._filters) == 1 and len(self._filters[0]) == 1: - return self._filters[0][0].to_dict() - return { - "field": str(self.field), - "value": str(self.value), - "operator": str(self.operator), - } - - def __str__(self) -> str: - return json.dumps(self.to_dict()) - - def _verify_value(self, value): - """ - Checks if the value is of the expected type - Args: - value: Value to test - - Raises: - Exception if value is not of the expected type - - """ - if self.__class__.value_type_ is None or isinstance(value, self.__class__.value_type_): - return - msg = f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead" - raise Exception(msg) - - def _check(self, value: Any, operator: Any, operator_str: str = "") -> "Filter": - """ - Internal function to create a new filter from the current filter with a different value and/or operator - Args: - value: Value of the new filter - operator: Operator of the new filter - operator_str: Optional string for error message clarification - - Returns: - new filter with the given value/operator - - Raises: - NotImplementedError if the given operator is not available for the given class - """ - if self.is_true_conjunction() or self.is_true_disjunction(): - raise Exception("Cannot apply operator to a disjunction or a conjunction") - self._verify_value(value) - if operator is None: - msg = f"Operator {operator_str} is not available for {self.__class__.__name__}" - raise NotImplementedError(msg) - return self.__class__( - self.field, - self.disjunction_type, - self.conjunction_type, - self.message_type, - self.inner_message_type, - self._filters, - value, - operator, - ) - - @abstractmethod - def to_basic_message(self) -> Message: - pass - - def to_message(self) -> Message: - def to_conjunction_message(conj: List[Filter]) -> Message: - conj_raw = self.conjunction_type() - getattr(conj_raw, "and").extend([f.to_basic_message() for f in conj]) - return conj_raw - - if self.message_type == self.disjunction_type: - raw = self.to_disjunction().disjunction_type() - getattr(raw, "or").extend([to_conjunction_message(conj) for conj in self._filters]) - return raw - if self.message_type == self.conjunction_type: - return to_conjunction_message(self.to_disjunction()._filters[0]) - return self.to_basic_message() - - -class StringFilter(Filter): - """ - Filter for string comparisons - """ - - eq_ = FILTER_STRING_OPERATOR_EQUAL - ne_ = FILTER_STRING_OPERATOR_NOT_EQUAL - contains_ = FILTER_STRING_OPERATOR_CONTAINS - notcontains_ = FILTER_STRING_OPERATOR_NOT_CONTAINS - value_type_ = str - - def __init__( - self, - field: Optional[Message], - disjunction_message_type: Type[Message], - conjunction_message_type: Type[Message], - message_type: Type[Message], - inner_message_type: Optional[Type[Message]] = FilterString, - filters: Optional[List[List["Filter"]]] = None, - value=None, - operator=None, - ): - super().__init__( - field, - disjunction_message_type, - conjunction_message_type, - message_type, - inner_message_type, - filters, - value, - operator, - ) - - def startswith(self, value: str) -> "StringFilter": - return self._check(value, FILTER_STRING_OPERATOR_STARTS_WITH, "startswith") - - def endswith(self, value: str) -> "StringFilter": - return self._check(value, FILTER_STRING_OPERATOR_ENDS_WITH, "endswith") - - def to_basic_message(self) -> Message: - return self.message_type( - field=self.field, - filter_string=self.inner_message_type(value=self.value, operator=self.operator), - ) - - def __repr__(self) -> str: - return f'{str(self.field)} {str(self.operator)} "{str(self.value)}"' - - -class StatusFilter(Filter): - """ - Filter for status comparison - """ - - eq_ = FILTER_STATUS_OPERATOR_EQUAL - ne_ = FILTER_STATUS_OPERATOR_NOT_EQUAL - - def __init__( - self, - field: Optional[Message], - disjunction_message_type: Type[Message], - conjunction_message_type: Type[Message], - message_type: Type[Message], - inner_message_type: Type[Message], - filters: Optional[List[List["Filter"]]] = None, - value=None, - operator=None, - ): - super().__init__( - field, - disjunction_message_type, - conjunction_message_type, - message_type, - inner_message_type, - filters, - value, - operator, - ) - - def to_basic_message(self) -> Message: - return self.message_type( - field=self.field, - filter_status=self.inner_message_type(value=self.value, operator=self.operator), - ) - - -class DateFilter(Filter): - """ - Filter for timestamp comparison - """ - - eq_ = FILTER_DATE_OPERATOR_EQUAL - ne_ = FILTER_DATE_OPERATOR_NOT_EQUAL - lt_ = FILTER_DATE_OPERATOR_BEFORE - le_ = FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL - gt_ = FILTER_DATE_OPERATOR_AFTER - ge_ = FILTER_DATE_OPERATOR_AFTER_OR_EQUAL - value_type = timestamp.Timestamp - - def __init__( - self, - field: Optional[Message], - disjunction_message_type: Type[Message], - conjunction_message_type: Type[Message], - message_type: Type[Message], - inner_message_type: Optional[Type[Message]] = FilterDate, - filters: Optional[List[List["Filter"]]] = None, - value=None, - operator=None, - ): - super().__init__( - field, - disjunction_message_type, - conjunction_message_type, - message_type, - inner_message_type, - filters, - value, - operator, - ) - - def to_basic_message(self) -> Message: - return self.message_type( - field=self.field, - filter_date=self.inner_message_type(value=self.value, operator=self.operator), - ) - - -class NumberFilter(Filter): - """ - Filter for int comparison - """ - - eq_ = FILTER_NUMBER_OPERATOR_EQUAL - ne_ = FILTER_NUMBER_OPERATOR_NOT_EQUAL - lt_ = FILTER_NUMBER_OPERATOR_LESS_THAN - le_ = FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL - gt_ = FILTER_NUMBER_OPERATOR_GREATER_THAN - ge_ = FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL - value_type_ = int - - def __init__( - self, - field: Optional[Message], - disjunction_message_type: Type[Message], - conjunction_message_type: Type[Message], - message_type: Type[Message], - inner_message_type: Optional[Type[Message]] = FilterNumber, - filters: Optional[List[List["Filter"]]] = None, - value=None, - operator=None, - ): - super().__init__( - field, - disjunction_message_type, - conjunction_message_type, - message_type, - inner_message_type, - filters, - value, - operator, - ) - - def to_basic_message(self) -> Message: - return self.message_type( - field=self.field, - filter_number=self.inner_message_type(value=self.value, operator=self.operator), - ) - - -class BooleanFilter(Filter): - """ - Filter for boolean comparison - """ - - eq_ = FILTER_BOOLEAN_OPERATOR_IS - value_type_ = bool - - def __init__( - self, - field: Optional[Message], - disjunction_message_type: Type[Message], - conjunction_message_type: Type[Message], - message_type: Type[Message], - inner_message_type: Optional[Type[Message]] = FilterBoolean, - filters: Optional[List[List["Filter"]]] = None, - value=True, - operator=FILTER_BOOLEAN_OPERATOR_IS, - ): - super().__init__( - field, - disjunction_message_type, - conjunction_message_type, - message_type, - inner_message_type, - filters, - value, - operator, - ) - - def __ne__(self, value: bool) -> "BooleanFilter": - return self.__eq__(not value) - - def __invert__(self) -> "BooleanFilter": - return self.__eq__(not self.value) - - def to_basic_message(self) -> Message: - return self.message_type( - field=self.field, - filter_boolean=self.inner_message_type(value=self.value, operator=self.operator), - ) - - -class ArrayFilter(Filter): - """ - Filter for array comparisons - """ - - contains_ = FILTER_ARRAY_OPERATOR_CONTAINS - notcontains_ = FILTER_ARRAY_OPERATOR_NOT_CONTAINS - value_type_ = str - - def __init__( - self, - field: Optional[Message], - disjunction_message_type: Type[Message], - conjunction_message_type: Type[Message], - message_type: Type[Message], - inner_message_type: Optional[Type[Message]] = FilterArray, - filters: Optional[List[List["Filter"]]] = None, - value=None, - operator=None, - ): - super().__init__( - field, - disjunction_message_type, - conjunction_message_type, - message_type, - inner_message_type, - filters, - value, - operator, - ) - - def to_basic_message(self) -> Message: - return self.message_type( - field=self.field, - filter_array=self.inner_message_type(value=self.value, operator=self.operator), - ) - - -class DurationFilter(Filter): - """ - Filter for duration comparison - """ - - eq_ = FILTER_DURATION_OPERATOR_EQUAL - ne_ = FILTER_DURATION_OPERATOR_NOT_EQUAL - lt_ = FILTER_DURATION_OPERATOR_SHORTER_THAN - le_ = FILTER_DURATION_OPERATOR_SHORTER_THAN_OR_EQUAL - gt_ = FILTER_DURATION_OPERATOR_LONGER_THAN - ge_ = FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL - value_type_ = duration.Duration - - def __init__( - self, - field: Optional[Message], - disjunction_message_type: Type[Message], - conjunction_message_type: Type[Message], - message_type: Type[Message], - inner_message_type: Optional[Type[Message]] = FilterDuration, - filters: Optional[List[List["Filter"]]] = None, - value=None, - operator=None, - ): - super().__init__( - field, - disjunction_message_type, - conjunction_message_type, - message_type, - inner_message_type, - filters, - value, - operator, - ) - - def to_basic_message(self) -> Message: - return self.message_type( - field=self.field, - filter_duration=self.inner_message_type(value=self.value, operator=self.operator), - ) diff --git a/packages/python/src/armonik/common/filter/__init__.py b/packages/python/src/armonik/common/filter/__init__.py new file mode 100644 index 000000000..3af0d5480 --- /dev/null +++ b/packages/python/src/armonik/common/filter/__init__.py @@ -0,0 +1,56 @@ +from ._message_types import ( + DisjunctionType, + ConjunctionType, + BasicMessageType, + InnerMessageType, +) +from .filter import ( + Filter, + FilterError, + NumberFilter, + DurationFilter, + DateFilter, + StringFilter, + ArrayFilter, + BooleanFilter, + StatusFilter, + FilterDescriptor, +) + +from ._filter_field import ( + PartitionFilter, + TaskFilter, + TaskOptionFilter, + SessionFilter, + SessionTaskOptionFilter, + ResultFilter, + ApplicationFilter, + GenericTaskOptionsFilter, + OutputFilter, +) + +__all__ = [ + "Filter", + "NumberFilter", + "DurationFilter", + "DateFilter", + "StringFilter", + "ArrayFilter", + "BooleanFilter", + "StatusFilter", + "TaskFilter", + "FilterError", + "TaskOptionFilter", + "DisjunctionType", + "ConjunctionType", + "BasicMessageType", + "InnerMessageType", + "SessionFilter", + "SessionTaskOptionFilter", + "ResultFilter", + "PartitionFilter", + "ApplicationFilter", + "FilterDescriptor", + "GenericTaskOptionsFilter", + "OutputFilter", +] diff --git a/packages/python/src/armonik/common/filter/_filter_field.py b/packages/python/src/armonik/common/filter/_filter_field.py new file mode 100644 index 000000000..87e4dc053 --- /dev/null +++ b/packages/python/src/armonik/common/filter/_filter_field.py @@ -0,0 +1,378 @@ +from abc import ABC, abstractmethod +from typing import Any, cast + +from google.protobuf.message import Message + +from .filter import FilterWrapper, StringFilter, DurationFilter, NumberFilter, FType, _na + +from ...protogen.common.tasks_fields_pb2 import ( + TaskField as rawTaskField, + TaskSummaryField, + TaskOptionGenericField, + TaskOptionField, + TASK_SUMMARY_ENUM_FIELD_TASK_ID, + TASK_SUMMARY_ENUM_FIELD_SESSION_ID, + TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID, + TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID, + TASK_SUMMARY_ENUM_FIELD_STATUS, + TASK_SUMMARY_ENUM_FIELD_CREATED_AT, + TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT, + TASK_SUMMARY_ENUM_FIELD_STARTED_AT, + TASK_SUMMARY_ENUM_FIELD_ENDED_AT, + TASK_SUMMARY_ENUM_FIELD_CREATION_TO_END_DURATION, + TASK_SUMMARY_ENUM_FIELD_PROCESSING_TO_END_DURATION, + TASK_SUMMARY_ENUM_FIELD_RECEIVED_TO_END_DURATION, + TASK_SUMMARY_ENUM_FIELD_POD_TTL, + TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME, + TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT, + TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT, + TASK_SUMMARY_ENUM_FIELD_PROCESSED_AT, + TASK_SUMMARY_ENUM_FIELD_ERROR, + TASK_SUMMARY_ENUM_FIELD_FETCHED_AT, + TASK_SUMMARY_ENUM_FIELD_PAYLOAD_ID, + TASK_OPTION_ENUM_FIELD_MAX_DURATION, + TASK_OPTION_ENUM_FIELD_MAX_RETRIES, + TASK_OPTION_ENUM_FIELD_PRIORITY, + TASK_OPTION_ENUM_FIELD_PARTITION_ID, + TASK_OPTION_ENUM_FIELD_APPLICATION_NAME, + TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE, + TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION, + TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE, + TASK_OPTION_ENUM_FIELD_ENGINE_TYPE, +) + +from ...protogen.common.sessions_fields_pb2 import ( + SessionField, + SessionRawField, + SESSION_RAW_ENUM_FIELD_SESSION_ID, + SESSION_RAW_ENUM_FIELD_DURATION, + SESSION_RAW_ENUM_FIELD_CREATED_AT, + SESSION_RAW_ENUM_FIELD_DELETED_AT, + SESSION_RAW_ENUM_FIELD_PURGED_AT, + SESSION_RAW_ENUM_FIELD_STATUS, + SESSION_RAW_ENUM_FIELD_PARTITION_IDS, + SESSION_RAW_ENUM_FIELD_CLIENT_SUBMISSION, + SESSION_RAW_ENUM_FIELD_WORKER_SUBMISSION, + SESSION_RAW_ENUM_FIELD_CLOSED_AT, + SESSION_RAW_ENUM_FIELD_CANCELLED_AT, + TaskOptionField as SessionOptionField, + TaskOptionGenericField as SessionOptionGenericField, + TASK_OPTION_ENUM_FIELD_MAX_RETRIES as SESSION_OPTION_MAX_RETRIES, + TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE as SESSION_OPTION_APPLICATION_NAMESPACE, + TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION as SESSION_OPTION_APPLICATION_VERSION, + TASK_OPTION_ENUM_FIELD_PRIORITY as SESSION_OPTION_PRIORITY, + TASK_OPTION_ENUM_FIELD_APPLICATION_NAME as SESSION_OPTION_APPLICATION_NAME, + TASK_OPTION_ENUM_FIELD_PARTITION_ID as SESSION_OPTION_PARTITION_ID, + TASK_OPTION_ENUM_FIELD_ENGINE_TYPE as SESSION_OPTION_ENGINE_TYPE, + TASK_OPTION_ENUM_FIELD_MAX_DURATION as SESSION_OPTION_MAX_DURATION, + TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE as SESSION_OPTION_APPLICATION_SERVICE, +) + +from ...protogen.common.results_fields_pb2 import ( + ResultField, + ResultRawField, + RESULT_RAW_ENUM_FIELD_RESULT_ID, + RESULT_RAW_ENUM_FIELD_SIZE, + RESULT_RAW_ENUM_FIELD_NAME, + RESULT_RAW_ENUM_FIELD_STATUS, + RESULT_RAW_ENUM_FIELD_COMPLETED_AT, + RESULT_RAW_ENUM_FIELD_CREATED_AT, + RESULT_RAW_ENUM_FIELD_SESSION_ID, + RESULT_RAW_ENUM_FIELD_OWNER_TASK_ID, +) + +from ...protogen.common.partitions_fields_pb2 import ( + PartitionField, + PartitionRawField, + PARTITION_RAW_ENUM_FIELD_ID, + PARTITION_RAW_ENUM_FIELD_PRIORITY, + PARTITION_RAW_ENUM_FIELD_PREEMPTION_PERCENTAGE, + PARTITION_RAW_ENUM_FIELD_POD_RESERVED, + PARTITION_RAW_ENUM_FIELD_PARENT_PARTITION_IDS, + PARTITION_RAW_ENUM_FIELD_POD_MAX, +) + +from ...protogen.common.applications_fields_pb2 import ( + ApplicationField, + ApplicationRawField, + APPLICATION_RAW_ENUM_FIELD_NAMESPACE, + APPLICATION_RAW_ENUM_FIELD_SERVICE, + APPLICATION_RAW_ENUM_FIELD_VERSION, + APPLICATION_RAW_ENUM_FIELD_NAME, +) + +from ...protogen.common.tasks_filters_pb2 import ( + FilterField as rawTaskFilterField, + FilterStatus as rawTaskFilterStatus, + Filters as rawTaskFilters, + FiltersAnd as rawTaskFilterAnd, +) + +from ...protogen.common.sessions_filters_pb2 import ( + FilterField as rawSessionFilterField, + FilterStatus as rawSessionFilterStatus, + Filters as rawSessionFilters, + FiltersAnd as rawSessionFilterAnd, +) + +from ...protogen.common.results_filters_pb2 import ( + FilterField as rawResultFilterField, + FilterStatus as rawResultFilterStatus, + Filters as rawResultFilters, + FiltersAnd as rawResultFilterAnd, +) + +from ...protogen.common.partitions_filters_pb2 import ( + FilterField as rawPartitionFilterField, + Filters as rawPartitionFilters, + FiltersAnd as rawPartitionFilterAnd, +) + +from ...protogen.common.applications_filters_pb2 import ( + FilterField as rawApplicationFilterField, + Filters as rawApplicationFilters, + FiltersAnd as rawApplicationFilterAnd, +) + +""" +This file defines the fields available for each object type. Used internally. +""" + + +class GenericTaskOptionsFilter(FilterWrapper, ABC): + """ + Filter for task options + """ + + @abstractmethod + def __getitem__(self, item: str) -> StringFilter: ... + + @abstractmethod + def _build_field(self, field: Any) -> Message: ... + + @property + def max_duration(self) -> DurationFilter: + return cast(DurationFilter, self("max_duration")) + + @property + def max_retries(self) -> NumberFilter: + return cast(NumberFilter, self("max_retries")) + + @property + def priority(self) -> NumberFilter: + return cast(NumberFilter, self("priority")) + + @property + def partition_id(self) -> StringFilter: + return cast(StringFilter, self("partition_id")) + + @property + def application_name(self) -> StringFilter: + return cast(StringFilter, self("application_name")) + + @property + def application_namespace(self) -> StringFilter: + return cast(StringFilter, self("application_namespace")) + + @property + def application_version(self) -> StringFilter: + return cast(StringFilter, self("application_version")) + + @property + def application_service(self) -> StringFilter: + return cast(StringFilter, self("application_service")) + + @property + def engine_type(self) -> StringFilter: + return cast(StringFilter, self("engine_type")) + + +class OutputFilter(FilterWrapper): + def __init__(self): + super().__init__(rawTaskFilters, rawTaskFilterAnd, rawTaskFilterField, rawTaskFilterStatus) + + @property + def error(self) -> StringFilter: + return self._string(self._build_field(TASK_SUMMARY_ENUM_FIELD_ERROR)) + + def _build_field(self, field: Any) -> Message: + if field != TASK_SUMMARY_ENUM_FIELD_ERROR: + _na("") + return rawTaskField(task_summary_field=TaskSummaryField(field=field)) + + +class TaskFilter(FilterWrapper): + _fields = { + "id": (FType.STR, TASK_SUMMARY_ENUM_FIELD_TASK_ID), + "session_id": (FType.STR, TASK_SUMMARY_ENUM_FIELD_SESSION_ID), + "owner_pod_id": (FType.STR, TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID), + "initial_task_id": (FType.STR, TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID), + "parent_task_ids": (FType.NA, "parent_task_ids"), + "data_dependencies": (FType.NA, "data_dependencies"), + "expected_output_ids": (FType.NA, "expected_output_ids"), + "retry_of_ids": (FType.NA, "retry_of_ids"), + "status": (FType.STATUS, TASK_SUMMARY_ENUM_FIELD_STATUS), + "status_message": (FType.NA, "status_message"), + "options": (FType.NA, "options"), + "created_at": (FType.DATE, TASK_SUMMARY_ENUM_FIELD_CREATED_AT), + "submitted_at": (FType.DATE, TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT), + "received_at": (FType.DATE, TASK_SUMMARY_ENUM_FIELD_RECEIVED_AT), + "acquired_at": (FType.DATE, TASK_SUMMARY_ENUM_FIELD_ACQUIRED_AT), + "fetched_at": (FType.DATE, TASK_SUMMARY_ENUM_FIELD_FETCHED_AT), + "started_at": (FType.DATE, TASK_SUMMARY_ENUM_FIELD_STARTED_AT), + "processed_at": (FType.DATE, TASK_SUMMARY_ENUM_FIELD_PROCESSED_AT), + "ended_at": (FType.DATE, TASK_SUMMARY_ENUM_FIELD_ENDED_AT), + "pod_ttl": (FType.DATE, TASK_SUMMARY_ENUM_FIELD_POD_TTL), + "creation_to_end_duration": ( + FType.DURATION, + TASK_SUMMARY_ENUM_FIELD_CREATION_TO_END_DURATION, + ), + "processing_to_end_duration": ( + FType.DURATION, + TASK_SUMMARY_ENUM_FIELD_PROCESSING_TO_END_DURATION, + ), + "received_to_end_duration": ( + FType.DURATION, + TASK_SUMMARY_ENUM_FIELD_RECEIVED_TO_END_DURATION, + ), + "output": (FType.NA, "output"), + "pod_hostname": (FType.STR, TASK_SUMMARY_ENUM_FIELD_POD_HOSTNAME), + "payload_id": (FType.STR, TASK_SUMMARY_ENUM_FIELD_PAYLOAD_ID), + } + + def __init__(self): + super().__init__(rawTaskFilters, rawTaskFilterAnd, rawTaskFilterField, rawTaskFilterStatus) + + def _build_field(self, field: Any) -> Message: + return rawTaskField(task_summary_field=TaskSummaryField(field=field)) + + +class TaskOptionFilter(GenericTaskOptionsFilter): + _fields = { + "max_duration": (FType.DURATION, TASK_OPTION_ENUM_FIELD_MAX_DURATION), + "max_retries": (FType.NUM, TASK_OPTION_ENUM_FIELD_MAX_RETRIES), + "priority": (FType.NUM, TASK_OPTION_ENUM_FIELD_PRIORITY), + "partition_id": (FType.STR, TASK_OPTION_ENUM_FIELD_PARTITION_ID), + "application_name": (FType.STR, TASK_OPTION_ENUM_FIELD_APPLICATION_NAME), + "application_namespace": (FType.STR, TASK_OPTION_ENUM_FIELD_APPLICATION_NAMESPACE), + "application_version": (FType.STR, TASK_OPTION_ENUM_FIELD_APPLICATION_VERSION), + "application_service": (FType.STR, TASK_OPTION_ENUM_FIELD_APPLICATION_SERVICE), + "engine_type": (FType.STR, TASK_OPTION_ENUM_FIELD_ENGINE_TYPE), + } + + def __init__(self): + super().__init__(rawTaskFilters, rawTaskFilterAnd, rawTaskFilterField, rawTaskFilterStatus) + + def __getitem__(self, item: str) -> StringFilter: + return self._string( + rawTaskField(task_option_generic_field=TaskOptionGenericField(field=item)) + ) + + def _build_field(self, field: Any) -> Message: + return rawTaskField(task_option_field=TaskOptionField(field=field)) + + +class SessionFilter(FilterWrapper): + _fields = { + "session_id": (FType.STR, SESSION_RAW_ENUM_FIELD_SESSION_ID), + "status": (FType.STATUS, SESSION_RAW_ENUM_FIELD_STATUS), + "client_submission": (FType.BOOL, SESSION_RAW_ENUM_FIELD_CLIENT_SUBMISSION), + "worker_submission": (FType.BOOL, SESSION_RAW_ENUM_FIELD_WORKER_SUBMISSION), + "partition_ids": (FType.ARRAY, SESSION_RAW_ENUM_FIELD_PARTITION_IDS), + "options": (FType.NA, "options"), + "created_at": (FType.DATE, SESSION_RAW_ENUM_FIELD_CREATED_AT), + "cancelled_at": (FType.DATE, SESSION_RAW_ENUM_FIELD_CANCELLED_AT), + "closed_at": (FType.DATE, SESSION_RAW_ENUM_FIELD_CLOSED_AT), + "purged_at": (FType.DATE, SESSION_RAW_ENUM_FIELD_PURGED_AT), + "deleted_at": (FType.DATE, SESSION_RAW_ENUM_FIELD_DELETED_AT), + "duration": (FType.DURATION, SESSION_RAW_ENUM_FIELD_DURATION), + } + + def __init__(self): + super().__init__( + rawSessionFilters, rawSessionFilterAnd, rawSessionFilterField, rawSessionFilterStatus + ) + + def _build_field(self, field: Any) -> Message: + return SessionField(session_raw_field=SessionRawField(field=field)) + + +class SessionTaskOptionFilter(GenericTaskOptionsFilter): + _fields = { + "max_duration": (FType.DURATION, SESSION_OPTION_MAX_DURATION), + "max_retries": (FType.NUM, SESSION_OPTION_MAX_RETRIES), + "priority": (FType.NUM, SESSION_OPTION_PRIORITY), + "partition_id": (FType.STR, SESSION_OPTION_PARTITION_ID), + "application_name": (FType.STR, SESSION_OPTION_APPLICATION_NAME), + "application_namespace": (FType.STR, SESSION_OPTION_APPLICATION_NAMESPACE), + "application_version": (FType.STR, SESSION_OPTION_APPLICATION_VERSION), + "application_service": (FType.STR, SESSION_OPTION_APPLICATION_SERVICE), + "engine_type": (FType.STR, SESSION_OPTION_ENGINE_TYPE), + } + + def __init__(self): + super().__init__( + rawSessionFilters, rawSessionFilterAnd, rawSessionFilterField, rawSessionFilterStatus + ) + + def __getitem__(self, item: str) -> StringFilter: + return self._string( + SessionField(task_option_generic_field=SessionOptionGenericField(field=item)) + ) + + def _build_field(self, field: Any) -> Message: + return SessionField(task_option_field=SessionOptionField(field=field)) + + +class ResultFilter(FilterWrapper): + _fields = { + "session_id": (FType.STR, RESULT_RAW_ENUM_FIELD_SESSION_ID), + "status": (FType.STATUS, RESULT_RAW_ENUM_FIELD_STATUS), + "name": (FType.STR, RESULT_RAW_ENUM_FIELD_NAME), + "created_at": (FType.DATE, RESULT_RAW_ENUM_FIELD_CREATED_AT), + "completed_at": (FType.DATE, RESULT_RAW_ENUM_FIELD_COMPLETED_AT), + "result_id": (FType.STR, RESULT_RAW_ENUM_FIELD_RESULT_ID), + "size": (FType.NUM, RESULT_RAW_ENUM_FIELD_SIZE), + "owner_task_id": (FType.STR, RESULT_RAW_ENUM_FIELD_OWNER_TASK_ID), + } + + def __init__(self): + super().__init__( + rawResultFilters, rawResultFilterAnd, rawResultFilterField, rawResultFilterStatus + ) + + def _build_field(self, field: Any) -> Message: + return ResultField(result_raw_field=ResultRawField(field=field)) + + +class PartitionFilter(FilterWrapper): + _fields = { + "id": (FType.STR, PARTITION_RAW_ENUM_FIELD_ID), + "priority": (FType.NUM, PARTITION_RAW_ENUM_FIELD_PRIORITY), + "preemption_percentage": (FType.NUM, PARTITION_RAW_ENUM_FIELD_PREEMPTION_PERCENTAGE), + "pod_reserved": (FType.NUM, PARTITION_RAW_ENUM_FIELD_POD_RESERVED), + "pod_max": (FType.NUM, PARTITION_RAW_ENUM_FIELD_POD_MAX), + "parent_partition_ids": (FType.ARRAY, PARTITION_RAW_ENUM_FIELD_PARENT_PARTITION_IDS), + "pod_configuration": (FType.NA, "pod_configuration"), + } + + def __init__(self): + super().__init__(rawPartitionFilters, rawPartitionFilterAnd, rawPartitionFilterField) + + def _build_field(self, field: Any) -> Message: + return PartitionField(partition_raw_field=PartitionRawField(field=field)) + + +class ApplicationFilter(FilterWrapper): + _fields = { + "name": (FType.STR, APPLICATION_RAW_ENUM_FIELD_NAME), + "namespace": (FType.STR, APPLICATION_RAW_ENUM_FIELD_NAMESPACE), + "service": (FType.STR, APPLICATION_RAW_ENUM_FIELD_SERVICE), + "version": (FType.STR, APPLICATION_RAW_ENUM_FIELD_VERSION), + } + + def __init__(self): + super().__init__(rawApplicationFilters, rawApplicationFilterAnd, rawApplicationFilterField) + + def _build_field(self, field: Any) -> Message: + return ApplicationField(application_field=ApplicationRawField(field=field)) diff --git a/packages/python/src/armonik/common/filter/_message_types.py b/packages/python/src/armonik/common/filter/_message_types.py new file mode 100644 index 000000000..d659c5407 --- /dev/null +++ b/packages/python/src/armonik/common/filter/_message_types.py @@ -0,0 +1,62 @@ +from typing import Union, Any, Type, TYPE_CHECKING, TypeVar + +from google.protobuf.message import Message + +""" +This file allows for better typing and autocompletion support +""" + +SimpleOperator = int + + +class BasicMessage(Message): + """ + Message type that requires a "field" kwarg + """ + + def __init__(self, *, field, **kwargs): + self.field = field + for k, v in kwargs.items(): + setattr(self, k, v) + + +if TYPE_CHECKING: + BasicMessageType = Union[Type[BasicMessage], Type[Message]] +else: + BasicMessageType = BasicMessage + + +class CombinationMessage(Message): + """ + Message type for the ands and ors + """ + + def __init__(self, **kwargs): + for k, v in kwargs.items(): + setattr(self, k, v) + + +if TYPE_CHECKING: + CombinationMessageType = Union[Type[CombinationMessage], Type[Message]] + DisjunctionType = TypeVar("DisjunctionType", bound=CombinationMessageType) + ConjunctionType = TypeVar("ConjunctionType", bound=CombinationMessageType) +else: + CombinationMessageType = CombinationMessage + DisjunctionType = CombinationMessageType + ConjunctionType = CombinationMessageType + + +class InnerMessage(Message): + """ + Message type for the value and operator + """ + + def __init__(self, *, value: Any, operator: SimpleOperator): + self.value = value + self.operator = operator + + +if TYPE_CHECKING: + InnerMessageType = Union[Type[InnerMessage], Type[Message]] +else: + InnerMessageType = InnerMessage diff --git a/packages/python/src/armonik/common/filter/filter.py b/packages/python/src/armonik/common/filter/filter.py new file mode 100644 index 000000000..9a029fdf0 --- /dev/null +++ b/packages/python/src/armonik/common/filter/filter.py @@ -0,0 +1,1042 @@ +from __future__ import annotations + +import json +from abc import abstractmethod, ABC +from datetime import datetime, timedelta +from enum import Enum, auto +from typing import Optional, Union, Any, List, Dict, Generic, TypeVar, overload, Type, Tuple + +# noinspection PyUnresolvedReferences +from google.protobuf.duration_pb2 import Duration +from google.protobuf.message import Message + +# noinspection PyUnresolvedReferences +from google.protobuf.timestamp_pb2 import Timestamp + +from ._message_types import ( + BasicMessageType, + InnerMessageType, + SimpleOperator, + DisjunctionType, + ConjunctionType, +) +from ..helpers import datetime_to_timestamp, timedelta_to_duration +from ...protogen.common.filters_common_pb2 import ( + FILTER_STRING_OPERATOR_EQUAL, + FILTER_STRING_OPERATOR_NOT_EQUAL, + FILTER_STRING_OPERATOR_CONTAINS, + FILTER_STRING_OPERATOR_NOT_CONTAINS, + FilterString, + FILTER_STRING_OPERATOR_STARTS_WITH, + FILTER_STRING_OPERATOR_ENDS_WITH, + FILTER_STATUS_OPERATOR_EQUAL, + FILTER_STATUS_OPERATOR_NOT_EQUAL, + FILTER_DATE_OPERATOR_EQUAL, + FILTER_DATE_OPERATOR_NOT_EQUAL, + FILTER_DATE_OPERATOR_BEFORE, + FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL, + FILTER_DATE_OPERATOR_AFTER, + FILTER_DATE_OPERATOR_AFTER_OR_EQUAL, + FILTER_NUMBER_OPERATOR_EQUAL, + FILTER_NUMBER_OPERATOR_NOT_EQUAL, + FILTER_NUMBER_OPERATOR_LESS_THAN, + FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL, + FILTER_NUMBER_OPERATOR_GREATER_THAN, + FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL, + FilterDate, + FilterNumber, + FILTER_BOOLEAN_OPERATOR_IS, + FilterBoolean, + FILTER_ARRAY_OPERATOR_CONTAINS, + FILTER_ARRAY_OPERATOR_NOT_CONTAINS, + FilterArray, + FILTER_DURATION_OPERATOR_EQUAL, + FILTER_DURATION_OPERATOR_NOT_EQUAL, + FILTER_DURATION_OPERATOR_SHORTER_THAN, + FILTER_DURATION_OPERATOR_SHORTER_THAN_OR_EQUAL, + FILTER_DURATION_OPERATOR_LONGER_THAN, + FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL, + FilterDuration, +) + + +class FilterError(ValueError): + """ + Exception raised when there is an error related to filter + """ + + def __init__(self, filter_instance: Optional[Filter], message: str): + """ + + Args: + filter_instance: Instance of the filter + message: Accompanying message + """ + self.filter = filter_instance + self.message = message + + def __str__(self): + return f"Filter: {str(self.filter)} Error: {self.message}" + + +eq_special = object() +ne_special = object() + + +class Filter: + """ + Base class of all filters. + How to use it : + A filter should not be created directly by the end user. Instead, users should use the class static properties to indicate what filter they want to use. + For example, if a user wants to list tasks that are in session "xxx", then they should use : + Task.session_id == "xxx" + Users can combine filters using the binary operators (& | ~). + + When combining filters together, the new filter combination is always kept in the disjunctive normal form to be compatible with ArmoniK. + """ + + eq_ = eq_special # Special case + ne_ = ne_special # Special case + lt_ = None + le_ = None + gt_ = None + ge_ = None + contains_ = None + notcontains_ = None + value_type_ = None + inner_message_type_attr_ = None + + def __init__( + self, + field: Optional[Message], + disjunction_message_type: DisjunctionType, + conjunction_message_type: ConjunctionType, + message_type: Union[BasicMessageType, DisjunctionType], + inner_message_type: Optional[InnerMessageType], + operator: Union[SimpleOperator, None] = None, + value: Any = None, + ): + """ + Init a new filter + Notes: This class should not be instanced directly. Always use the proxies in armonik.common.filter + Args: + field: gRPC Message field + disjunction_message_type: Message type of the logical OR + conjunction_message_type: Message type of the logical AND + message_type: Filter gRPC message type + inner_message_type: Filter type gRPC message type + operator: Filter operator + value: Value of the filter + """ + self.field = field + self.disjunction_message_type = disjunction_message_type + self.conjunction_message_type = conjunction_message_type + self.message_type = message_type + self.inner_message_type = inner_message_type + self.operator = operator + self.value = value + + def _disjunction(self, filters: List[List[Filter]]) -> Filter: + """ + Creates a disjunction from the current Filter types and a list of lists of filter + Args: + filters: List of Lists of Filters (OR of ANDs) + + Returns: + New Filter instance as disjunction + """ + return Filter( + None, + self.disjunction_message_type, + self.conjunction_message_type, + self.disjunction_message_type, + None, + None, + filters, + ) + + def _check_compatible(self, other: Filter): + """ + Checks if the given Filter is compatible with the current Filter. Raises ValueError if they are not compatible. + Args: + other: Other Filter + + Returns: + None + """ + if not isinstance(other, Filter): + msg = ( + f"{str(self)} is not compatible with " f"{str(other)} as the latter is not a Filter" + ) + raise ValueError(msg) + if not ( + self.disjunction_message_type == other.disjunction_message_type + and self.conjunction_message_type == other.conjunction_message_type + ): + msg = ( + f"{str(self)} is not compatible with " + f"{str(other)} as they apply to different object types" + ) + raise ValueError(msg) + + def _is_empty(self) -> bool: + """ + Checks if the current Filter is empty + Returns: + True if the current Filter is empty + """ + return self.value is None or ( + isinstance(self.value, list) + and ( + len(self.value) == 0 + or (isinstance(self.value[0], list) and len(self.value[0]) == 0) + ) + ) + + def _is_disjunction(self) -> bool: + """ + Checks if the current Filter is a disjunction + Returns: + True if the current Filter is a disjunction + """ + return self.message_type == self.disjunction_message_type + + def to_disjunction(self) -> Filter: + """ + Wraps the current Filter into a disjunction. Does nothing if the current Filter is already a disjunction. + Returns: + Disjunction Filter + Raises: + FilterError if the filter is empty + """ + if self._is_empty(): + raise FilterError(self, "Empty filter") + if isinstance(self.operator, SimpleOperator): + return self._disjunction([[self]]) + return self + + def __and__(self, other: Filter) -> Filter: + """ + Logical and + """ + self._check_compatible(other) + # (a | (b&c)) & (d | (e&f)) = a&d | a&e&f | b&c&d | b&c&e&f + return self._disjunction( + [c1 + c2 for c2 in other.to_disjunction().value for c1 in self.to_disjunction().value] + ) + + def __mul__(self, other: Filter) -> Filter: + """ + Same as A & B + """ + return self & other + + def __or__(self, other: Filter) -> Filter: + """ + Logical or + """ + self._check_compatible(other) + # (a | b&c) | (d | e&f) = a | b&c | d | e&f + return self._disjunction(self.to_disjunction().value + other.to_disjunction().value) + + def __add__(self, other: Filter) -> Filter: + """ + Same as Logical or + """ + return self | other + + def __eq__(self, value) -> Filter: + """ + Creates a Filter which checks for the equality of the property compared to the value + Args: + value: Value to check against + + Returns: + New Filter instance + """ + return self._change_operation(value, self.__class__.eq_, "==") + + def __ne__(self, value) -> Filter: + """ + Creates a Filter which checks for the inequality of the property compared to the value + Args: + value: Value to check against + + Returns: + New Filter instance + """ + return self._change_operation(value, self.__class__.ne_, "!=") + + def __lt__(self, value) -> Filter: + """ + Creates a Filter which checks that the object's value is less than the value + Args: + value: Value to check against + + Returns: + New Filter instance + """ + return self._change_operation(value, self.__class__.lt_, "<") + + def __le__(self, value) -> Filter: + """ + Creates a Filter which checks that the object's value is less than or equal to the value + Args: + value: Value to check against + + Returns: + New Filter instance + """ + return self._change_operation(value, self.__class__.le_, "<=") + + def __gt__(self, value) -> Filter: + """ + Creates a Filter which checks that the object's value is greater than to the value + Args: + value: Value to check against + + Returns: + New Filter instance + """ + return self._change_operation(value, self.__class__.gt_, ">") + + def __ge__(self, value) -> Filter: + """ + Creates a Filter which checks that the object's value is greater than or equal to the value + Args: + value: Value to check against + + Returns: + New Filter instance + """ + return self._change_operation(value, self.__class__.ge_, ">=") + + def contains(self, value) -> Filter: + """ + Creates a Filter which checks that the object's value contains the value + Args: + value: Value to check against + + Returns: + New Filter instance + """ + return self._change_operation(value, self.__class__.contains_, "contains") + + def __invert__(self) -> Filter: + """ + Logical not + """ + if self.operator is None: + # No operator + if self._is_empty(): + raise FilterError(self, "Cannot invert filter without a value or operator") + try: + # The filter is a combination + # ~(a | (b & c)) => ~a & (~b | ~c) => ~a&~b | ~a&~c + new_filter = self._disjunction([[~c] for c in self.value[0]]) + for conj in self.value[1:]: + new_filter &= self._disjunction([[~c] for c in conj]) + return new_filter + except FilterError as e: + msg = f"Could not invert because of an error in subfilter inversion : {str(e)}" + raise FilterError(self, msg) + # Invert the operation + if self.operator == self.__class__.eq_: + return self._change_operation(self.value, self.__class__.ne_, "!=", True) + if self.operator == self.__class__.ne_: + return self._change_operation(self.value, self.__class__.eq_, "==", True) + if self.operator == self.__class__.lt_: + return self._change_operation(self.value, self.__class__.ge_, ">=", True) + if self.operator == self.__class__.le_: + return self._change_operation(self.value, self.__class__.gt_, ">", True) + if self.operator == self.__class__.gt_: + return self._change_operation(self.value, self.__class__.le_, "<=", True) + if self.operator == self.__class__.ge_: + return self._change_operation(self.value, self.__class__.lt_, "<", True) + if self.operator == self.__class__.contains_: + return self._change_operation( + self.value, self.__class__.notcontains_, "not_contains", True + ) + if self.operator == self.__class__.notcontains_: + return self._change_operation(self.value, self.__class__.contains_, "contains", True) + msg = f"{self.__class__.__name__} operator {str(self.operator)} for field {str(self.field)} has no inverted equivalent" + raise FilterError(self, msg) + + def __neg__(self) -> Filter: + """ + Same as Logical not + """ + return ~self + + def __xor__(self, other: Filter) -> Filter: + """ + Logical xor + """ + return (self & (~other)) | ((~self) & other) + + def _sanitize_value(self, value: Any) -> Any: + """ + Takes an input value and sanitizes it to be compatible with the filter. + If the type is incompatible, throws a FilterError + Args: + value: Value to be sanitized + + Returns: + Sanitized value + """ + if self.__class__.value_type_ is None or isinstance(value, self.__class__.value_type_): + return value + msg = f"Expected value type {str(self.__class__.value_type_)} for field {str(self.field)}, got {str(type(value))} instead" + raise FilterError(None, msg) + + def _change_operation( + self, value: Any, operator: Any, operator_str: str = "", override: bool = False + ) -> Filter: + """ + Internal function to create a new filter from the current filter with a different value and/or operator + Args: + value: Value of the new filter + operator: Operator of the new filter + operator_str: Optional string for error message clarification + override: If set to true, bypasses the check for reassignment + Returns: + new filter with the given value/operator + + Raises: + FilterError if the given operator is not available for the given class + """ + if not override: + if self.value is not None: + if isinstance(value, bool): + if operator is self.__class__.eq_ and self.__class__.eq_ is not None: + return self if value else ~self + if operator is self.__class__.ne_ and self.__class__.ne_ is not None: + return ~self if value else self + if self._is_disjunction(): + raise FilterError(self, "Cannot apply operator to a filter combination") + raise FilterError(self, "Cannot apply operator to an already defined filter") + if operator is None or self._is_disjunction(): + msg = f"Operator {operator_str} is not available for {self.__class__.__name__}" + raise FilterError(self, msg) + return self.__class__( + self.field, + self.disjunction_message_type, + self.conjunction_message_type, + self.message_type, + self.inner_message_type, + operator, + self._sanitize_value(value), + ) + + def to_dict(self) -> Dict[str, Any]: + """ + Transforms the filter in a dictionary describing it + Returns: + Dictionary representing the filter in a disjunctive normal form + """ + if not self._is_disjunction() or self.value is None: + return { + "field": str(self.field), + "value": str(self.value), + "operator": str(self.operator), + } + if len(self.value) > 1: + return { + "or": [ + ({"and": [c.to_dict() for c in conj]} if len(conj) > 1 else conj[0].to_dict()) + for conj in self.value + ] + } + return ( + ( + {"and": [c.to_dict() for c in self.value[0]]} + if len(self.value[0]) > 1 + else self.value[0][0].to_dict() + ) + if not self._is_empty() + else {} + ) + + def __str__(self) -> str: + return json.dumps(self.to_dict()) + + def to_basic_message(self) -> BasicMessageType: + """ + Converts the filter into its base gRPC message + Returns: + Base gRPC message + """ + if self.__class__.inner_message_type_attr_ is None: + raise FilterError( + self, + "Cannot use an empty filter in combination with others. " + "Did you forget to write the condition ?", + ) + return self.message_type( + field=self.field, + **{ + self.__class__.inner_message_type_attr_: self.inner_message_type( + value=self.value, operator=self.operator + ) + }, + ) + + def to_message(self) -> DisjunctionType: + """ + Converts the filter into its gRPC disjunctive message + Returns: + Disjunctive gRPC message + """ + if not self._is_disjunction(): + # Convert the message to a disjunction if it's not the case + return self.to_disjunction().to_message() + + def to_conjunction_message(conj: List[Filter]) -> ConjunctionType: + conj_raw = self.conjunction_message_type() + # Need to use getattr because and is a reserved name + getattr(conj_raw, "and").extend(f.to_basic_message() for f in conj) + return conj_raw + + raw = self.disjunction_message_type() + # Need to use getattr because or is a reserved name + getattr(raw, "or").extend( + (to_conjunction_message(conj) for conj in self.value) if self.value is not None else [] + ) + return raw + + def __bool__(self): + raise FilterError( + self, + "Filters cannot be transformed into booleans. " + "You may see this error if you try to combine filters with 'or', 'and', 'in', or 'not'. " + "Use '|', '&', '.contains' or '~' instead.", + ) + + +class StringFilter(Filter): + """ + Filter for string comparisons + """ + + eq_ = FILTER_STRING_OPERATOR_EQUAL + ne_ = FILTER_STRING_OPERATOR_NOT_EQUAL + contains_ = FILTER_STRING_OPERATOR_CONTAINS + notcontains_ = FILTER_STRING_OPERATOR_NOT_CONTAINS + value_type_ = str + inner_message_type_attr_ = "filter_string" + + def __init__( + self, + field: Optional[Message], + disjunction_message_type: DisjunctionType, + conjunction_message_type: ConjunctionType, + message_type: Union[BasicMessageType, DisjunctionType], + inner_message_type: Optional[InnerMessageType] = FilterString, + operator: Union[SimpleOperator, None] = None, + value: Any = None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + operator, + value, + ) + + def startswith(self, value: str) -> "StringFilter": + """ + Creates a Filter which checks that the object's value starts with the value + Args: + value: Value to check against + + Returns: + New Filter instance + """ + return self._change_operation(value, FILTER_STRING_OPERATOR_STARTS_WITH, "startswith") + + def endswith(self, value: str) -> "StringFilter": + """ + Creates a Filter which checks that the object's value ends with the value + Args: + value: Value to check against + + Returns: + New Filter instance + """ + return self._change_operation(value, FILTER_STRING_OPERATOR_ENDS_WITH, "endswith") + + def __repr__(self) -> str: + return f'{str(self.field)} {str(self.operator)} "{str(self.value)}"' + + +class StatusFilter(Filter): + """ + Filter for status comparison + """ + + eq_ = FILTER_STATUS_OPERATOR_EQUAL + ne_ = FILTER_STATUS_OPERATOR_NOT_EQUAL + inner_message_type_attr_ = "filter_status" + + def __init__( + self, + field: Optional[Message], + disjunction_message_type: DisjunctionType, + conjunction_message_type: ConjunctionType, + message_type: Union[BasicMessageType, DisjunctionType], + inner_message_type: InnerMessageType, + operator: Union[SimpleOperator, None] = None, + value: Any = None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + operator, + value, + ) + + +class DateFilter(Filter): + """ + Filter for timestamp comparison + """ + + eq_ = FILTER_DATE_OPERATOR_EQUAL + ne_ = FILTER_DATE_OPERATOR_NOT_EQUAL + lt_ = FILTER_DATE_OPERATOR_BEFORE + le_ = FILTER_DATE_OPERATOR_BEFORE_OR_EQUAL + gt_ = FILTER_DATE_OPERATOR_AFTER + ge_ = FILTER_DATE_OPERATOR_AFTER_OR_EQUAL + inner_message_type_attr_ = "filter_date" + + def __init__( + self, + field: Optional[Message], + disjunction_message_type: DisjunctionType, + conjunction_message_type: ConjunctionType, + message_type: Union[BasicMessageType, DisjunctionType], + inner_message_type: InnerMessageType = FilterDate, + operator: Union[SimpleOperator, None] = None, + value: Any = None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + operator, + value, + ) + + def _sanitize_value(self, value: Any) -> Any: + if isinstance(value, datetime): + return datetime_to_timestamp(value) + if isinstance(value, Timestamp): + return value + msg = ( + f"Expected value type {datetime.__class__.__name__} or {Timestamp.__class__.__name__}" + f"for field {str(self.field)}, got {str(type(value))} instead" + ) + raise FilterError(self, msg) + + +class NumberFilter(Filter): + """ + Filter for int comparison + """ + + eq_ = FILTER_NUMBER_OPERATOR_EQUAL + ne_ = FILTER_NUMBER_OPERATOR_NOT_EQUAL + lt_ = FILTER_NUMBER_OPERATOR_LESS_THAN + le_ = FILTER_NUMBER_OPERATOR_LESS_THAN_OR_EQUAL + gt_ = FILTER_NUMBER_OPERATOR_GREATER_THAN + ge_ = FILTER_NUMBER_OPERATOR_GREATER_THAN_OR_EQUAL + value_type_ = int + inner_message_type_attr_ = "filter_number" + + def __init__( + self, + field: Optional[Message], + disjunction_message_type: DisjunctionType, + conjunction_message_type: ConjunctionType, + message_type: Union[BasicMessageType, DisjunctionType], + inner_message_type: InnerMessageType = FilterNumber, + operator: Union[SimpleOperator, None] = None, + value: Any = None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + operator, + value, + ) + + +class BooleanFilter(Filter): + """ + Filter for boolean comparison + """ + + eq_ = FILTER_BOOLEAN_OPERATOR_IS + value_type_ = bool + inner_message_type_attr_ = "filter_boolean" + + def __init__( + self, + field: Optional[Message], + disjunction_message_type: DisjunctionType, + conjunction_message_type: ConjunctionType, + message_type: Union[BasicMessageType, DisjunctionType], + inner_message_type: InnerMessageType = FilterBoolean, + operator: Union[SimpleOperator, None] = FILTER_BOOLEAN_OPERATOR_IS, + value: Any = True, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + operator, + value, + ) + + def __ne__(self, value: bool) -> BooleanFilter: + return self._change_operation(not value, self.__class__.eq_, "!=", True) + + def __invert__(self) -> BooleanFilter: + return self._change_operation(not self.value, self.__class__.eq_, "==", True) + + +class ArrayFilter(Filter): + """ + Filter for array comparisons + """ + + contains_ = FILTER_ARRAY_OPERATOR_CONTAINS + notcontains_ = FILTER_ARRAY_OPERATOR_NOT_CONTAINS + value_type_ = str + inner_message_type_attr_ = "filter_array" + + def __init__( + self, + field: Optional[Message], + disjunction_message_type: DisjunctionType, + conjunction_message_type: ConjunctionType, + message_type: Union[BasicMessageType, DisjunctionType], + inner_message_type: InnerMessageType = FilterArray, + operator: Union[SimpleOperator, None] = None, + value: Any = None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + operator, + value, + ) + + +class DurationFilter(Filter): + """ + Filter for duration comparison + """ + + eq_ = FILTER_DURATION_OPERATOR_EQUAL + ne_ = FILTER_DURATION_OPERATOR_NOT_EQUAL + lt_ = FILTER_DURATION_OPERATOR_SHORTER_THAN + le_ = FILTER_DURATION_OPERATOR_SHORTER_THAN_OR_EQUAL + gt_ = FILTER_DURATION_OPERATOR_LONGER_THAN + ge_ = FILTER_DURATION_OPERATOR_LONGER_THAN_OR_EQUAL + value_type_ = Duration + inner_message_type_attr_ = "filter_duration" + + def __init__( + self, + field: Optional[Message], + disjunction_message_type: DisjunctionType, + conjunction_message_type: ConjunctionType, + message_type: Union[BasicMessageType, DisjunctionType], + inner_message_type: InnerMessageType = FilterDuration, + operator: Union[SimpleOperator, None] = None, + value: Any = None, + ): + super().__init__( + field, + disjunction_message_type, + conjunction_message_type, + message_type, + inner_message_type, + operator, + value, + ) + + def _sanitize_value(self, value: Any) -> Any: + if isinstance(value, timedelta): + return timedelta_to_duration(value) + if isinstance(value, Duration): + return value + msg = ( + f"Expected value type {timedelta.__class__.__name__} or {Duration.__class__.__name__}" + f"for field {str(self.field)}, got {str(type(value))} instead" + ) + raise FilterError(self, msg) + + +class FType(Enum): + """ + Enum for the type of a filter. Used internally. + """ + + UNKNOWN = auto() + NA = auto() + NUM = auto() + STR = auto() + ARRAY = auto() + DURATION = auto() + DATE = auto() + STATUS = auto() + BOOL = auto() + + +def _raise(field): + """ + The field is unknown in the class + Args: + field: Unknown field + + Returns: + + """ + msg = f"Unknown field {field}" + raise ValueError(msg) + + +def _na(field): + msg = f"Field {field} is not available as a filter" + raise FilterError(None, msg) + + +class FilterWrapper(Filter, ABC): + """ + Wraps the filter creation to alleviate repetitions + """ + + _fields: Dict[str, Tuple[FType, Optional[Any]]] = {} + + def __init__( + self, + disjunction_message_type: DisjunctionType, + conjunction_message_type: ConjunctionType, + message_type: BasicMessageType, + status_type: Optional[InnerMessageType] = None, + ): + super().__init__( + None, + disjunction_message_type, + conjunction_message_type, + disjunction_message_type, + status_type, + ) + self._vtable = { + FType.UNKNOWN: _raise, + FType.NA: _na, + FType.NUM: self._number, + FType.STR: self._string, + FType.ARRAY: self._array, + FType.DURATION: self._duration, + FType.DATE: self._date, + FType.STATUS: self._status, + FType.BOOL: self._bool, + } + self.basic_message_type = message_type + + def _string(self, field: Message) -> StringFilter: + """ + Creates a new string filter on the given field + Args: + field: field to filter against + + Returns: + New string filter on the given field + """ + return StringFilter( + field, + self.disjunction_message_type, + self.conjunction_message_type, + self.basic_message_type, + ) + + def _bool(self, field: Message) -> BooleanFilter: + """ + Creates a new boolean filter on the given field + Args: + field: field to filter against + + Returns: + New boolean filter on the given field + """ + return BooleanFilter( + field, + self.disjunction_message_type, + self.conjunction_message_type, + self.basic_message_type, + ) + + def _array(self, field: Message) -> ArrayFilter: + """ + Creates a new array filter on the given field + Args: + field: field to filter against + + Returns: + New array filter on the given field + """ + return ArrayFilter( + field, + self.disjunction_message_type, + self.conjunction_message_type, + self.basic_message_type, + ) + + def _duration(self, field: Message) -> DurationFilter: + """ + Creates a new duration filter on the given field + Args: + field: field to filter against + + Returns: + New duration filter on the given field + + """ + return DurationFilter( + field, + self.disjunction_message_type, + self.conjunction_message_type, + self.basic_message_type, + ) + + def _date(self, field: Message) -> DateFilter: + """ + Creates a new date filter on the given field + Args: + field: field to filter against + + Returns: + New date filter on the given field + + """ + return DateFilter( + field, + self.disjunction_message_type, + self.conjunction_message_type, + self.basic_message_type, + ) + + def _number(self, field: Message) -> NumberFilter: + """ + Creates a new number filter on the given field + Args: + field: field to filter against + + Returns: + New number filter on the given field + + """ + return NumberFilter( + field, + self.disjunction_message_type, + self.conjunction_message_type, + self.basic_message_type, + ) + + def _status(self, field: Message) -> StatusFilter: + """ + Creates a new status filter on the given field + Args: + field: field to filter against + + Returns: + New status filter on the given field + + """ + return StatusFilter( + field, + self.disjunction_message_type, + self.conjunction_message_type, + self.basic_message_type, + self.inner_message_type, + ) + + @abstractmethod + def _build_field(self, field: Any) -> Message: + """ + Build the gRPC field object + Args: + field: base field enum value + + Returns: + Field message + """ + ... + + def __call__(self, field_name: str) -> Filter: + """ + Get the Filter associated with the field name + Args: + field_name: Field name + + Returns: + Filter associated with the field name + """ + ftype, field_value = self.__class__._fields.get(field_name, (FType.UNKNOWN, field_name)) + return self._vtable[ftype]( + self._build_field(field_value) + if ftype not in (FType.UNKNOWN, FType.NA) + else field_value + ) + + +AttributeType = TypeVar("AttributeType") + + +class FilterDescriptor(Generic[AttributeType]): + """ + Descriptor used to declare a filter + """ + + def __init__(self, wrapper: FilterWrapper): + self.wrapper = wrapper + + def __set_name__(self, owner: Type, name: str): + self.name = name + self._name = "_" + name + + @overload + def __get__(self, instance: None, owner: Type) -> Filter: ... + + @overload + def __get__(self, instance: object, owner: Type) -> AttributeType: ... + + def __get__( + self, instance: Optional[object], owner: Optional[Type] + ) -> Union[Filter, AttributeType]: + # When called statically, returns the filter + if instance is None: + return self.wrapper(self.name) + # Otherwise gets the object's hidden property + return getattr(instance, self._name) + + def __set__(self, instance: object, value: AttributeType): + setattr(instance, self._name, value) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 4bac86ce0..3eacb0eca 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -6,6 +6,20 @@ from deprecation import deprecated +from ..protogen.common.applications_common_pb2 import ApplicationRaw +from ..protogen.common.tasks_common_pb2 import TaskDetailed +from .filter import ( + FilterDescriptor, + GenericTaskOptionsFilter, + TaskFilter, + TaskOptionFilter, + SessionTaskOptionFilter, + OutputFilter, + SessionFilter, + ResultFilter, + PartitionFilter, + ApplicationFilter, +) from ..protogen.common.objects_pb2 import ( Empty, ) @@ -20,8 +34,6 @@ from ..protogen.common.results_common_pb2 import ResultRaw from ..protogen.common.session_status_pb2 import SessionStatus as RawSessionStatus from ..protogen.common.sessions_common_pb2 import SessionRaw -from ..protogen.common.task_status_pb2 import TaskStatus as RawTaskStatus -from ..protogen.common.tasks_common_pb2 import TaskDetailed from .enumwrapper import ResultStatus, SessionStatus, TaskStatus from .helpers import duration_to_timedelta, timedelta_to_duration, timestamp_to_datetime @@ -96,41 +108,116 @@ def __post_init__(self): raise ValueError("expected_output_ids must be not be empty") -@dataclass() -class Task: - id: Optional[str] = None - session_id: Optional[str] = None - owner_pod_id: Optional[str] = None - - initial_task_id: Optional[str] = None - parent_task_ids: List[str] = field(default_factory=list) - data_dependencies: List[str] = field(default_factory=list) - expected_output_ids: List[str] = field(default_factory=list) - retry_of_ids: List[str] = field(default_factory=list) +_task_filter = TaskFilter() - status: RawTaskStatus = TaskStatus.UNSPECIFIED - status_message: Optional[str] = None - options: Optional[TaskOptions] = None - created_at: Optional[datetime] = None - submitted_at: Optional[datetime] = None - received_at: Optional[datetime] = None - acquired_at: Optional[datetime] = None - fetched_at: Optional[datetime] = None - started_at: Optional[datetime] = None - processed_at: Optional[datetime] = None - ended_at: Optional[datetime] = None - pod_ttl: Optional[datetime] = None +class TaskOptionDescriptor(FilterDescriptor): + def __get__(self, instance, owner) -> GenericTaskOptionsFilter: + # When called statically, returns the Task option filter + if instance is None: + return TaskOptionFilter() if issubclass(owner, Task) else SessionTaskOptionFilter() + # Otherwise gets the object's hidden property + return getattr(instance, self._name) - creation_to_end_duration: Optional[timedelta] = timedelta(0) - processing_to_end_duration: Optional[timedelta] = timedelta(0) - received_to_end_duration: Optional[timedelta] = timedelta(0) - output: Optional[Output] = None +class OutputDescriptor(FilterDescriptor): + def __get__(self, instance, owner) -> OutputFilter: + # When called statically, returns the Task option filter + if instance is None: + return OutputFilter() + # Otherwise gets the object's hidden property + return getattr(instance, self._name) - pod_hostname: Optional[str] = None - payload_id: Optional[str] = None +class Task: + id = FilterDescriptor(_task_filter) + session_id = FilterDescriptor(_task_filter) + owner_pod_id = FilterDescriptor(_task_filter) + + initial_task_id = FilterDescriptor(_task_filter) + parent_task_ids = FilterDescriptor(_task_filter) + data_dependencies = FilterDescriptor(_task_filter) + expected_output_ids = FilterDescriptor(_task_filter) + retry_of_ids = FilterDescriptor(_task_filter) + + status = FilterDescriptor(_task_filter) + status_message = FilterDescriptor(_task_filter) + + options = TaskOptionDescriptor(_task_filter) + created_at = FilterDescriptor(_task_filter) + submitted_at = FilterDescriptor(_task_filter) + received_at = FilterDescriptor(_task_filter) + acquired_at = FilterDescriptor(_task_filter) + fetched_at = FilterDescriptor(_task_filter) + started_at = FilterDescriptor(_task_filter) + processed_at = FilterDescriptor(_task_filter) + ended_at = FilterDescriptor(_task_filter) + pod_ttl = FilterDescriptor(_task_filter) + + creation_to_end_duration = FilterDescriptor(_task_filter) + processing_to_end_duration = FilterDescriptor(_task_filter) + received_to_end_duration = FilterDescriptor(_task_filter) + + output = OutputDescriptor(_task_filter) + + pod_hostname = FilterDescriptor(_task_filter) + payload_id = FilterDescriptor(_task_filter) + + def __init__( + self, + id: Optional[str] = None, + session_id: Optional[str] = None, + owner_pod_id: Optional[str] = None, + initial_task_id: Optional[str] = None, + parent_task_ids: Optional[List[str]] = None, + data_dependencies: Optional[List[str]] = None, + expected_output_ids: Optional[List[str]] = None, + retry_of_ids: Optional[List[str]] = None, + status: TaskStatus = TaskStatus.UNSPECIFIED, + status_message: Optional[str] = None, + options: Optional[TaskOptions] = None, + created_at: Optional[datetime] = None, + submitted_at: Optional[datetime] = None, + received_at: Optional[datetime] = None, + acquired_at: Optional[datetime] = None, + fetched_at: Optional[datetime] = None, + started_at: Optional[datetime] = None, + processed_at: Optional[datetime] = None, + ended_at: Optional[datetime] = None, + pod_ttl: Optional[datetime] = None, + creation_to_end_duration: timedelta = timedelta(0), + processing_to_end_duration: timedelta = timedelta(0), + received_to_end_duration: timedelta = timedelta(0), + output: Optional[Output] = None, + pod_hostname: Optional[str] = None, + payload_id: Optional[str] = None, + ): + self.id = id + self.session_id = session_id + self.owner_pod_id = owner_pod_id + self.initial_task_id = initial_task_id + self.parent_task_ids = parent_task_ids if parent_task_ids is not None else [] + self.data_dependencies = data_dependencies if data_dependencies is not None else [] + self.expected_output_ids = expected_output_ids if expected_output_ids is not None else [] + self.retry_of_ids = retry_of_ids if retry_of_ids is not None else [] + self.status = status + self.status_message = status_message + self.options = options + self.created_at = created_at + self.submitted_at = submitted_at + self.received_at = received_at + self.acquired_at = acquired_at + self.fetched_at = fetched_at + self.started_at = started_at + self.processed_at = processed_at + self.ended_at = ended_at + self.pod_ttl = pod_ttl + self.creation_to_end_duration = creation_to_end_duration + self.processing_to_end_duration = processing_to_end_duration + self.received_to_end_duration = received_to_end_duration + self.output = output + self.pod_hostname = pod_hostname + self.payload_id = payload_id def refresh(self, task_client) -> None: """Refresh the fields of this task object by using the given task client @@ -203,6 +290,36 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": payload_id=task_raw.payload_id, ) + def __eq__(self, other: "Task") -> bool: + return ( + self.id == other.id + and self.session_id == other.session_id + and self.owner_pod_id == other.owner_pod_id + and self.initial_task_id == other.initial_task_id + and self.parent_task_ids == other.parent_task_ids + and self.data_dependencies == other.data_dependencies + and self.expected_output_ids == other.expected_output_ids + and self.retry_of_ids == other.retry_of_ids + and self.status == other.status + and self.status_message == other.status_message + and self.options == other.options + and self.created_at == other.created_at + and self.submitted_at == other.submitted_at + and self.received_at == other.received_at + and self.acquired_at == other.acquired_at + and self.fetched_at == other.fetched_at + and self.started_at == other.started_at + and self.processed_at == other.processed_at + and self.ended_at == other.ended_at + and self.pod_ttl == other.pod_ttl + and self.creation_to_end_duration == other.creation_to_end_duration + and self.processing_to_end_duration == other.processing_to_end_duration + and self.received_to_end_duration == other.received_to_end_duration + and self.output == other.output + and self.pod_hostname == other.pod_hostname + and self.payload_id == other.payload_id + ) + @deprecated(deprecated_in="3.14.0", details="Use sessions, task and results client instead") @dataclass @@ -213,20 +330,50 @@ def is_available(self) -> bool: return len(self.errors) == 0 -@dataclass +_sessionFilter = SessionFilter() + + class Session: - session_id: Optional[str] = None - status: RawSessionStatus = SessionStatus.UNSPECIFIED - client_submission: Optional[bool] = None - worker_submission: Optional[bool] = None - partition_ids: List[str] = field(default_factory=list) - options: Optional[TaskOptions] = None - created_at: Optional[datetime] = None - cancelled_at: Optional[datetime] = None - closed_at: Optional[datetime] = None - purged_at: Optional[datetime] = None - deleted_at: Optional[datetime] = None - duration: Optional[timedelta] = None + session_id = FilterDescriptor(_sessionFilter) + status = FilterDescriptor(_sessionFilter) + client_submission = FilterDescriptor(_sessionFilter) + worker_submission = FilterDescriptor(_sessionFilter) + partition_ids = FilterDescriptor(_sessionFilter) + options = TaskOptionDescriptor(_sessionFilter) + created_at = FilterDescriptor(_sessionFilter) + cancelled_at = FilterDescriptor(_sessionFilter) + closed_at = FilterDescriptor(_sessionFilter) + purged_at = FilterDescriptor(_sessionFilter) + deleted_at = FilterDescriptor(_sessionFilter) + duration = FilterDescriptor(_sessionFilter) + + def __init__( + self, + session_id: Optional[str] = None, + status: RawSessionStatus = SessionStatus.UNSPECIFIED, + client_submission: Optional[bool] = None, + worker_submission: Optional[bool] = None, + partition_ids: Optional[List[str]] = None, + options: Optional[TaskOptions] = None, + created_at: Optional[datetime] = None, + cancelled_at: Optional[datetime] = None, + closed_at: Optional[datetime] = None, + purged_at: Optional[datetime] = None, + deleted_at: Optional[datetime] = None, + duration: Optional[timedelta] = None, + ): + self.session_id = session_id + self.status = status + self.client_submission = client_submission + self.worker_submission = worker_submission + self.partition_ids = partition_ids if partition_ids is not None else [] + self.options = options + self.created_at = created_at + self.cancelled_at = cancelled_at + self.closed_at = closed_at + self.purged_at = purged_at + self.deleted_at = deleted_at + self.duration = duration @classmethod def from_message(cls, session_raw: SessionRaw) -> "Session": @@ -245,17 +392,55 @@ def from_message(cls, session_raw: SessionRaw) -> "Session": duration=duration_to_timedelta(session_raw.duration), ) + def __eq__(self, other: "Session") -> bool: + return ( + self.session_id == other.session_id + and self.status == other.status + and self.client_submission == other.client_submission + and self.worker_submission == other.worker_submission + and self.partition_ids == other.partition_ids + and self.options == other.options + and self.created_at == other.created_at + and self.cancelled_at == other.cancelled_at + and self.closed_at == other.closed_at + and self.purged_at == other.purged_at + and self.deleted_at == other.deleted_at + and self.duration == other.duration + ) + + +_resultFilter = ResultFilter() + -@dataclass class Result: - session_id: Optional[str] = None - name: Optional[str] = None - owner_task_id: Optional[str] = None - status: RawResultStatus = ResultStatus.UNSPECIFIED - created_at: Optional[datetime] = None - completed_at: Optional[datetime] = None - result_id: Optional[str] = None - size: Optional[int] = None + session_id = FilterDescriptor(_resultFilter) + name = FilterDescriptor(_resultFilter) + owner_task_id = FilterDescriptor(_resultFilter) + status = FilterDescriptor(_resultFilter) + created_at = FilterDescriptor(_resultFilter) + completed_at = FilterDescriptor(_resultFilter) + result_id = FilterDescriptor(_resultFilter) + size = FilterDescriptor(_resultFilter) + + def __init__( + self, + session_id: Optional[str] = None, + name: Optional[str] = None, + owner_task_id: Optional[str] = None, + status: RawResultStatus = ResultStatus.UNSPECIFIED, + created_at: Optional[datetime] = None, + completed_at: Optional[datetime] = None, + result_id: Optional[str] = None, + size: Optional[int] = None, + ): + self.session_id = session_id + self.name = name + self.owner_task_id = owner_task_id + self.status = status + self.created_at = created_at + self.completed_at = completed_at + self.result_id = result_id + self.size = size @classmethod def from_message(cls, result_raw: ResultRaw) -> "Result": @@ -270,16 +455,47 @@ def from_message(cls, result_raw: ResultRaw) -> "Result": size=result_raw.size, ) + def __eq__(self, other: "Result") -> bool: + return ( + self.session_id == other.session_id + and self.status == other.status + and self.result_id == other.result_id + and self.created_at == other.created_at + and self.completed_at == other.completed_at + and self.result_id == other.result_id + and self.size == other.size + ) + + +_partitionFilter = PartitionFilter() + -@dataclass class Partition: - id: str - parent_partition_ids: List[str] - pod_reserved: int - pod_max: int - pod_configuration: Dict[str, str] - preemption_percentage: int - priority: int + id = FilterDescriptor(_partitionFilter) + parent_partition_ids = FilterDescriptor(_partitionFilter) + pod_reserved = FilterDescriptor(_partitionFilter) + pod_max = FilterDescriptor(_partitionFilter) + pod_configuration = FilterDescriptor(_partitionFilter) + preemption_percentage = FilterDescriptor(_partitionFilter) + priority = FilterDescriptor(_partitionFilter) + + def __init__( + self, + id: str, + parent_partition_ids: List[str], + pod_reserved: int, + pod_max: int, + pod_configuration: Dict[str, str], + preemption_percentage: int, + priority: int, + ): + self.id = id + self.parent_partition_ids = parent_partition_ids + self.pod_reserved = pod_reserved + self.pod_max = pod_max + self.pod_configuration = pod_configuration + self.preemption_percentage = preemption_percentage + self.priority = priority @classmethod def from_message(cls, partition_raw: PartitionRaw) -> "Partition": @@ -292,3 +508,47 @@ def from_message(cls, partition_raw: PartitionRaw) -> "Partition": preemption_percentage=partition_raw.preemption_percentage, priority=partition_raw.priority, ) + + def __eq__(self, other: "Partition") -> bool: + return ( + self.id == other.id + and self.parent_partition_ids == other.parent_partition_ids + and self.pod_reserved == other.pod_reserved + and self.pod_max == other.pod_max + and self.pod_configuration == other.pod_configuration + and self.preemption_percentage == other.preemption_percentage + and self.priority == other.priority + ) + + +_applicationFilter = ApplicationFilter() + + +class Application: + name = FilterDescriptor(_applicationFilter) + namespace = FilterDescriptor(_applicationFilter) + service = FilterDescriptor(_applicationFilter) + version = FilterDescriptor(_applicationFilter) + + def __init__(self, name: str, namespace: str, service: str, version: str): + self.name = name + self.namespace = namespace + self.service = service + self.version = version + + @classmethod + def from_message(cls, application_raw: ApplicationRaw) -> "Application": + return cls( + name=application_raw.name, + namespace=application_raw.namespace, + service=application_raw.service, + version=application_raw.version, + ) + + def __eq__(self, other: "Application") -> bool: + return ( + self.name == other.name + and self.namespace == other.namespace + and self.service == other.service + and self.version == other.version + ) diff --git a/packages/python/tests/__init__.py b/packages/python/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index edc74ff6f..9741e0898 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -52,7 +52,8 @@ def clean_up(request): # Remove the temporary files created for testing os.remove(os.path.join(data_folder, "payload-id")) os.remove(os.path.join(data_folder, "dd-id")) - os.remove(os.path.join(data_folder, "result-id")) + if os.path.exists(os.path.join(data_folder, "result-id")): + os.remove(os.path.join(data_folder, "result-id")) # Reset the mock server counters try: @@ -90,29 +91,27 @@ def get_client( ValueError: If the specified service name is not recognized. Example: - >>> result_service = get_service("Results") - >>> submitter_service = get_service("Submitter", "custom_endpoint") + >>> result_service = get_client("Results") + >>> submitter_service = get_client("Submitter", "custom_endpoint") """ channel = grpc.insecure_channel(endpoint).__enter__() - match client_name: - case "Agent": - return AgentStub(channel) - case "Events": - return ArmoniKEvents(channel) - case "HealthChecks": - return ArmoniKHealthChecks(channel) - case "Partitions": - return ArmoniKPartitions(channel) - case "Results": - return ArmoniKResults(channel) - case "Sessions": - return ArmoniKSessions(channel) - case "Tasks": - return ArmoniKTasks(channel) - case "Versions": - return ArmoniKVersions(channel) - case _: - raise ValueError("Unknown service name: " + str(client_name)) + if client_name == "Agent": + return AgentStub(channel) + if client_name == "Events": + return ArmoniKEvents(channel) + if client_name == "HealthChecks": + return ArmoniKHealthChecks(channel) + if client_name == "Partitions": + return ArmoniKPartitions(channel) + if client_name == "Sessions": + return ArmoniKSessions(channel) + if client_name == "Tasks": + return ArmoniKTasks(channel) + if client_name == "Versions": + return ArmoniKVersions(channel) + if client_name == "Results": + return ArmoniKResults(channel) + raise ValueError("Unknown service name: " + str(client_name)) def rpc_called( diff --git a/packages/python/tests/test_filters.py b/packages/python/tests/test_filters.py index 8a8ead89c..899056dcc 100644 --- a/packages/python/tests/test_filters.py +++ b/packages/python/tests/test_filters.py @@ -1,66 +1,92 @@ #!/usr/bin/env python3 +import itertools +from typing import Dict, cast, Union import pytest from dataclasses import dataclass -from armonik.common.filter import Filter, StringFilter, BooleanFilter, NumberFilter + +from armonik.common import Task, Partition +from armonik.common.filter import ( + Filter, + StringFilter, + BooleanFilter, + NumberFilter, + DisjunctionType, + ConjunctionType, + BasicMessageType, + TaskOptionFilter, + FilterError, +) from armonik.protogen.common.filters_common_pb2 import FilterBoolean from google.protobuf.message import Message @dataclass -class DummyMessage(Message): - pass +class DummyMessage(DisjunctionType): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._disjunction = [] + + def __getattr__(self, item): + if item == "or": + return self._disjunction + raise AttributeError() @dataclass -class DummyMessageAnd(Message): - pass +class DummyMessageAnd(ConjunctionType): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._conjunction = [] + + def __getattr__(self, item): + if item == "and": + return self._conjunction + raise AttributeError() @dataclass class Field(Message): - pass + name: str = "" + + +@dataclass +class BaseMessage(BasicMessageType): + def __init__(self, *, field, **kwargs): + super().__init__(field=field, **kwargs) @pytest.mark.parametrize( "filt,inverted", [ ( - StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) == "Test", - StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) != "Test", + StringFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) == "Test", + StringFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) != "Test", ), ( - StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains("Test"), - ~(StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).contains("Test")), + StringFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage).contains("Test"), + ~(StringFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage).contains("Test")), ), ( - BooleanFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage), - BooleanFilter( - Field(), - DummyMessage, - DummyMessageAnd, - DummyMessage, - FilterBoolean, - None, - False, - ), + BooleanFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage), + BooleanFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage, value=False), ), ( - NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) > 0, - NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) <= 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) > 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) <= 0, ), ( - NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) >= 0, - NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) < 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) >= 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) < 0, ), ( - NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) < 0, - NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) >= 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) < 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) >= 0, ), ( - NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) <= 0, - NumberFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage) > 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) <= 0, + NumberFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage) > 0, ), ], ) @@ -75,12 +101,124 @@ def test_inversion(filt: Filter, inverted: Filter): @pytest.mark.parametrize( "filt", [ - (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).startswith("Test")), - (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage).endswith("Test")), - (StringFilter(Field(), DummyMessage, DummyMessageAnd, DummyMessage)), # No op + (StringFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage).startswith("Test")), + (StringFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage).endswith("Test")), + (StringFilter(Field(), DummyMessage, DummyMessageAnd, BaseMessage)), # No op ], ) def test_inversion_raises(filt: Filter): with pytest.raises(Exception): test = ~filt print(test) + + +def test_descriptor(): + task = Task() + assert task.id is None + task.id = "xxx" + assert isinstance(task.id, str) + assert isinstance(Task.id, Filter) + assert isinstance(Task.id == "xxx", Filter) + + +def test_extra_operator(): + with pytest.raises(FilterError): + try: + print((Task.id == "x") == "y") + except FilterError as e: + print(e) + raise + + with pytest.raises(FilterError): + try: + print(((Task.id == "x") & (Task.session_id == "y")) == "y") + except FilterError as e: + print(e) + raise + + +def test_extra_bool_compare(): + def check_eq(f1: Filter, f2: Filter) -> bool: + return f1.operator == f2.operator and f1.value == f2.value + + task_filt = cast(Filter, Task.id == "x") + task_filt_not = cast(Filter, Task.id != "x") + + assert isinstance(task_filt, Filter) + assert isinstance(task_filt_not, Filter) + + task_filt_eq_true = cast(Filter, task_filt == True) # noqa: E712 + task_filt_eq_false = cast(Filter, task_filt == False) # noqa: E712 + task_filt_ne_true = cast(Filter, task_filt != True) # noqa: E712 + task_filt_ne_false = cast(Filter, task_filt != False) # noqa: E712 + assert check_eq(task_filt_eq_true, task_filt) + assert not check_eq(task_filt_eq_true, task_filt_not) + assert not check_eq(task_filt_eq_false, task_filt) + assert check_eq(task_filt_eq_false, task_filt_not) + assert not check_eq(task_filt_ne_true, task_filt) + assert check_eq(task_filt_ne_true, task_filt_not) + assert check_eq(task_filt_ne_false, task_filt) + assert not check_eq(task_filt_ne_false, task_filt_not) + + +def test_task_option_descriptor(): + assert isinstance(Task.options, TaskOptionFilter) + assert isinstance(Task.options.priority, Filter) + with pytest.raises(FilterError): + try: + print(Task.options == "test") + except FilterError as e: + print(e) + raise + with pytest.raises(FilterError): + try: + print(Task.options.contains("test")) + except FilterError as e: + print(e) + raise + + +def test_unavailable_field(): + with pytest.raises(FilterError): + print(Partition.pod_configuration == {}) + + +def apply_filter(state: Dict[str, bool], message: Union[Message, Filter]) -> bool: + if isinstance(message, Filter): + return apply_filter(state, message.to_message()) + if hasattr(message, "or"): + return any(apply_filter(state, m) for m in getattr(message, "or")) + if hasattr(message, "and"): + return all(apply_filter(state, m) for m in getattr(message, "and")) + vp = cast(FilterBoolean, getattr(message, "filter_boolean")) + field = cast(Field, getattr(message, "field")) + return vp.value == state[field.name] + + +def get_bool_filter(name: str) -> BooleanFilter: + return BooleanFilter(Field(name), DummyMessage, DummyMessageAnd, BaseMessage) + + +def test_combine(): + a = get_bool_filter("a") + b = get_bool_filter("b") + c = get_bool_filter("c") + d = get_bool_filter("d") + e = get_bool_filter("e") + for _a, _b, _c, _d, _e in itertools.product([True, False], repeat=5): + t = {"a": _a, "b": _b, "c": _c, "d": _d, "e": _e} + assert apply_filter(t, a) == _a + assert apply_filter(t, (~a)) == (not _a) + assert apply_filter(t, (a | b)) == (_a or _b) + assert apply_filter(t, ((~a) | b)) == ((not _a) or _b) + assert apply_filter(t, (a | (~b))) == (_a or not _b) + assert apply_filter(t, ((~a) | (~b))) == (not _a or not _b) + assert apply_filter(t, ((~a) & b)) == ((not _a) and _b) + assert apply_filter(t, (~(a | b))) == (not (_a or _b)) + assert apply_filter(t, (~(a & b))) == (not (_a and _b)) + assert apply_filter(t, (c & (a | b))) == (_c and (_a or _b)) + assert apply_filter(t, (c | (a & b))) == (_c or (_a and _b)) + assert apply_filter(t, (a & (b | c)) & (d | e)) == (_a and (_b or _c) and (_d or _e)) + assert apply_filter(t, ~((a & (b | c)) & (d | e))) == ( + not (_a and (_b or _c) and (_d or _e)) + ) From 110c082fd05f8d17a4c25d9bbcd03d02b9d5e8c3 Mon Sep 17 00:00:00 2001 From: qdelamea Date: Tue, 9 Jul 2024 17:39:13 +0200 Subject: [PATCH 276/344] fix: Python API event client wait_for_result_availability method --- packages/python/src/armonik/client/events.py | 107 +++++++++++-------- 1 file changed, 63 insertions(+), 44 deletions(-) diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index bb7407393..2ec160342 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -1,3 +1,4 @@ +from copy import deepcopy from typing import Callable, cast, Iterable, List, Optional from grpc import Channel @@ -56,66 +57,84 @@ def get_events( event_types: The list of the types of event to catch. event_handlers: The list of handlers that process the events. Handlers are evaluated in he order they are provided. An handler takes three positional arguments: the ID of the session, the type of event and the event as an object. - An handler returns a boolean, if True the process continues, otherwise the stream is closed and the service stops - listening to new events. + An handler returns a boolean, if False the process continues, otherwise the stream is closed and the service stops + listening to new events. As handlers are evaluated in order, when a handler interrupts execution (by returning True) + all the handlers following it will not be executed. task_filter: A filter on tasks. result_filter: A filter on results. """ - request = EventSubscriptionRequest(session_id=session_id, returned_events=event_types) - if task_filter: - request.tasks_filters = cast(rawTaskFilters, task_filter.to_disjunction().to_message()) - if result_filter: - request.results_filters = cast( + request = EventSubscriptionRequest( + session_id=session_id, + returned_events=event_types, + tasks_filters=cast(rawTaskFilters, task_filter.to_disjunction().to_message()) if task_filter else rawTaskFilters(), + results_filters=cast( rawResultFilters, result_filter.to_disjunction().to_message() - ) + ) if result_filter else rawResultFilters(), + ) streaming_call = self._client.GetEvents(request) for message in streaming_call: event_type = message.WhichOneof("update") - if any( - [ - event_handler( - session_id, - EventTypes.from_string(event_type), - self._events_obj_mapping[event_type].from_raw_event( - getattr(message, event_type) - ), - ) - for event_handler in event_handlers - ] - ): - break - - def wait_for_result_availability(self, result_id: str, session_id: str) -> None: + for event_handler in event_handlers: + if event_handler( + session_id, + EventTypes.from_string(event_type), + self._events_obj_mapping[event_type].from_raw_event( + getattr(message, event_type) + ), + ): + break + + def wait_for_result_availability(self, result_ids: List[str], session_id: str) -> None: """Wait until a result is ready i.e its status updates to COMPLETED. Args: - result_id: The ID of the result. + result_ids: The IDs of the results. session_id: The ID of the session. Raises: RuntimeError: If the result status is ABORTED. """ - def handler(session_id, event_type, event): - if not isinstance(event, ResultStatusUpdateEvent): - raise ValueError("Handler should receive event of type 'ResultStatusUpdateEvent'.") - if event.status == ResultStatus.COMPLETED: - return False - elif event.status == ResultStatus.ABORTED: - raise RuntimeError(f"Result {result.name} with ID {result_id} is aborted.") - return True - - result = self._results_client.get_result(result_id) - if result.status == ResultStatus.COMPLETED: - return - elif result.status == ResultStatus.ABORTED: - raise RuntimeError(f"Result {result.name} with ID {result_id} is aborted.") - - self.get_events( - session_id, - [EventTypes.RESULT_STATUS_UPDATE], - [handler], - result_filter=(ResultFieldFilter.RESULT_ID == result_id), + results_not_found = deepcopy(result_ids) + + results_filter = (ResultFieldFilter.RESULT_ID == result_ids[0]) + for result_id in result_ids[1:]: + results_filter = results_filter | (ResultFieldFilter.RESULT_ID == result_id) + + request = EventSubscriptionRequest( + session_id=session_id, + returned_events=[EventTypes.RESULT_STATUS_UPDATE], + tasks_filters=rawTaskFilters(), + results_filters=cast( + rawResultFilters, results_filter.to_disjunction().to_message() + ), ) + + while results_not_found: + streaming_call = self._client.GetEvents(request) + try: + for message in streaming_call: + event_type = EventTypes.from_string(message.WhichOneof("update")) + if event_type == EventTypes.RESULT_STATUS_UPDATE: + event = ResultStatusUpdateEvent.from_raw_event(message.result_status_update) + if event.result_id in results_not_found: + if event.status == ResultStatus.COMPLETED: + results_not_found.remove(event.result_id) + if not results_not_found: + break + if event.status == ResultStatus.ABORTED: + raise RuntimeError(f"Result {event.result_id} has been aborted.") + if event_type == EventTypes.NEW_RESULT: + event = NewResultEvent.from_raw_event(messae.new_result) + if event.result_id in results_not_found: + if event.status == ResultStatus.COMPLETED: + results_not_found.remove(event.result_id) + if not results_not_found: + break + if event.status == ResultStatus.ABORTED: + RuntimeError(f"Result {event.result_id} has been aborted.") + + except grpc.RpcError: + pass From 43f283b017e39a3fca6c6558909dc3adb9ad58e9 Mon Sep 17 00:00:00 2001 From: salma-aneo Date: Thu, 11 Jul 2024 14:58:55 +0200 Subject: [PATCH 277/344] fix: Python event client --- packages/python/src/armonik/client/events.py | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index 2ec160342..fde4150e6 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -1,7 +1,7 @@ from copy import deepcopy from typing import Callable, cast, Iterable, List, Optional -from grpc import Channel +from grpc import Channel, RpcError from .results import ArmoniKResults from ..common import ( @@ -67,16 +67,18 @@ def get_events( request = EventSubscriptionRequest( session_id=session_id, returned_events=event_types, - tasks_filters=cast(rawTaskFilters, task_filter.to_disjunction().to_message()) if task_filter else rawTaskFilters(), - results_filters=cast( - rawResultFilters, result_filter.to_disjunction().to_message() - ) if result_filter else rawResultFilters(), + tasks_filters=cast(rawTaskFilters, task_filter.to_disjunction().to_message()) + if task_filter + else rawTaskFilters(), + results_filters=cast(rawResultFilters, result_filter.to_disjunction().to_message()) + if result_filter + else rawResultFilters(), ) streaming_call = self._client.GetEvents(request) for message in streaming_call: event_type = message.WhichOneof("update") - for event_handler in event_handlers: + for event_handler in event_handlers: if event_handler( session_id, EventTypes.from_string(event_type), @@ -99,7 +101,7 @@ def wait_for_result_availability(self, result_ids: List[str], session_id: str) - results_not_found = deepcopy(result_ids) - results_filter = (ResultFieldFilter.RESULT_ID == result_ids[0]) + results_filter = ResultFieldFilter.RESULT_ID == result_ids[0] for result_id in result_ids[1:]: results_filter = results_filter | (ResultFieldFilter.RESULT_ID == result_id) @@ -107,9 +109,7 @@ def wait_for_result_availability(self, result_ids: List[str], session_id: str) - session_id=session_id, returned_events=[EventTypes.RESULT_STATUS_UPDATE], tasks_filters=rawTaskFilters(), - results_filters=cast( - rawResultFilters, results_filter.to_disjunction().to_message() - ), + results_filters=cast(rawResultFilters, results_filter.to_disjunction().to_message()), ) while results_not_found: @@ -127,7 +127,7 @@ def wait_for_result_availability(self, result_ids: List[str], session_id: str) - if event.status == ResultStatus.ABORTED: raise RuntimeError(f"Result {event.result_id} has been aborted.") if event_type == EventTypes.NEW_RESULT: - event = NewResultEvent.from_raw_event(messae.new_result) + event = NewResultEvent.from_raw_event(message.new_result) if event.result_id in results_not_found: if event.status == ResultStatus.COMPLETED: results_not_found.remove(event.result_id) @@ -136,5 +136,5 @@ def wait_for_result_availability(self, result_ids: List[str], session_id: str) - if event.status == ResultStatus.ABORTED: RuntimeError(f"Result {event.result_id} has been aborted.") - except grpc.RpcError: + except RpcError: pass From 07b4e6ed969c87de7e3eec8537e028de9788e079 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 20 Aug 2024 10:57:32 +0200 Subject: [PATCH 278/344] Fixed event handling --- packages/python/src/armonik/client/events.py | 90 ++++++++++---------- packages/python/src/armonik/common/events.py | 1 + 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index fde4150e6..bf95b9489 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -1,5 +1,5 @@ -from copy import deepcopy -from typing import Callable, cast, Iterable, List, Optional +from __future__ import annotations +from typing import Callable, cast, Iterable, List, Optional, Union from grpc import Channel, RpcError @@ -13,11 +13,11 @@ TaskStatusUpdateEvent, ResultStatus, Event, + Result, ) -from .results import ResultFieldFilter from ..common.filter import Filter from ..protogen.client.events_service_pb2_grpc import EventsStub -from ..protogen.common.events_common_pb2 import EventSubscriptionRequest +from ..protogen.common.events_common_pb2 import EventSubscriptionRequest, EventsEnum from ..protogen.common.results_filters_pb2 import Filters as rawResultFilters from ..protogen.common.tasks_filters_pb2 import Filters as rawTaskFilters @@ -44,7 +44,7 @@ def get_events( self, session_id: str, event_types: Iterable[ - EventTypes + EventsEnum ], # TODO: make EventTypes an enum when Python 3.8 support will be not supported event_handlers: List[Callable[[str, EventTypes, Event], bool]], task_filter: Optional[Filter] = None, @@ -55,7 +55,7 @@ def get_events( Args: session_id: The ID of the session. event_types: The list of the types of event to catch. - event_handlers: The list of handlers that process the events. Handlers are evaluated in he order they are provided. + event_handlers: The list of handlers that process the events. Handlers are evaluated in the order they are provided. An handler takes three positional arguments: the ID of the session, the type of event and the event as an object. An handler returns a boolean, if False the process continues, otherwise the stream is closed and the service stops listening to new events. As handlers are evaluated in order, when a handler interrupts execution (by returning True) @@ -68,27 +68,31 @@ def get_events( session_id=session_id, returned_events=event_types, tasks_filters=cast(rawTaskFilters, task_filter.to_disjunction().to_message()) - if task_filter + if task_filter is not None else rawTaskFilters(), results_filters=cast(rawResultFilters, result_filter.to_disjunction().to_message()) - if result_filter + if result_filter is not None else rawResultFilters(), ) streaming_call = self._client.GetEvents(request) for message in streaming_call: event_type = message.WhichOneof("update") - for event_handler in event_handlers: - if event_handler( + if any( + event_handler( session_id, EventTypes.from_string(event_type), self._events_obj_mapping[event_type].from_raw_event( getattr(message, event_type) ), - ): - break + ) + for event_handler in event_handlers + ): + break - def wait_for_result_availability(self, result_ids: List[str], session_id: str) -> None: + def wait_for_result_availability( + self, result_ids: Union[str, List[str]], session_id: str + ) -> None: """Wait until a result is ready i.e its status updates to COMPLETED. Args: @@ -98,43 +102,37 @@ def wait_for_result_availability(self, result_ids: List[str], session_id: str) - Raises: RuntimeError: If the result status is ABORTED. """ + if isinstance(result_ids, str): + result_ids = [result_ids] + if len(result_ids) == 0: + return + results_not_found = set(result_ids) - results_not_found = deepcopy(result_ids) - - results_filter = ResultFieldFilter.RESULT_ID == result_ids[0] + results_filter = Result.result_id == result_ids[0] for result_id in result_ids[1:]: - results_filter = results_filter | (ResultFieldFilter.RESULT_ID == result_id) - - request = EventSubscriptionRequest( - session_id=session_id, - returned_events=[EventTypes.RESULT_STATUS_UPDATE], - tasks_filters=rawTaskFilters(), - results_filters=cast(rawResultFilters, results_filter.to_disjunction().to_message()), - ) + results_filter = results_filter | (Result.result_id == result_id) + + def handler(_, _2, event: Event) -> bool: + event = cast(Union[NewResultEvent, ResultStatusUpdateEvent], event) + if event.result_id in results_not_found: + if event.status == ResultStatus.COMPLETED: + results_not_found.remove(event.result_id) + if not results_not_found: + return True + elif event.status == ResultStatus.ABORTED: + raise RuntimeError(f"Result {event.result_id} has been aborted.") + return False while results_not_found: - streaming_call = self._client.GetEvents(request) try: - for message in streaming_call: - event_type = EventTypes.from_string(message.WhichOneof("update")) - if event_type == EventTypes.RESULT_STATUS_UPDATE: - event = ResultStatusUpdateEvent.from_raw_event(message.result_status_update) - if event.result_id in results_not_found: - if event.status == ResultStatus.COMPLETED: - results_not_found.remove(event.result_id) - if not results_not_found: - break - if event.status == ResultStatus.ABORTED: - raise RuntimeError(f"Result {event.result_id} has been aborted.") - if event_type == EventTypes.NEW_RESULT: - event = NewResultEvent.from_raw_event(message.new_result) - if event.result_id in results_not_found: - if event.status == ResultStatus.COMPLETED: - results_not_found.remove(event.result_id) - if not results_not_found: - break - if event.status == ResultStatus.ABORTED: - RuntimeError(f"Result {event.result_id} has been aborted.") - + self.get_events( + session_id, + [EventTypes.RESULT_STATUS_UPDATE, EventTypes.NEW_RESULT], + [handler], + None, + results_filter, + ) except RpcError: pass + else: + break diff --git a/packages/python/src/armonik/common/events.py b/packages/python/src/armonik/common/events.py index b8d0d07b3..3e43907e5 100644 --- a/packages/python/src/armonik/common/events.py +++ b/packages/python/src/armonik/common/events.py @@ -1,3 +1,4 @@ +from __future__ import annotations from typing import List from dataclasses import dataclass From 9cfc4b27aa518d4e7732790a1a4b28b4d74eaca8 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 23 Aug 2024 09:59:34 +0200 Subject: [PATCH 279/344] feat: Removing deprecated task handler function fix: Fixed result parsing in task handler --- packages/python/src/armonik/common/objects.py | 11 ++ .../python/src/armonik/worker/taskhandler.py | 167 +++--------------- packages/python/tests/test_taskhandler.py | 29 +-- 3 files changed, 40 insertions(+), 167 deletions(-) diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 3eacb0eca..db89ac00b 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -6,6 +6,7 @@ from deprecation import deprecated +from ..protogen.common.agent_common_pb2 import ResultMetaData from ..protogen.common.applications_common_pb2 import ApplicationRaw from ..protogen.common.tasks_common_pb2 import TaskDetailed from .filter import ( @@ -455,6 +456,16 @@ def from_message(cls, result_raw: ResultRaw) -> "Result": size=result_raw.size, ) + @classmethod + def from_result_metadata(cls, result_metadata: ResultMetaData) -> "Result": + return cls( + session_id=result_metadata.session_id, + name=result_metadata.name, + status=result_metadata.status, + created_at=timestamp_to_datetime(result_metadata.created_at), + result_id=result_metadata.result_id, + ) + def __eq__(self, other: "Result") -> bool: return ( self.session_id == other.session_id diff --git a/packages/python/src/armonik/worker/taskhandler.py b/packages/python/src/armonik/worker/taskhandler.py index 508150670..4fa518f16 100644 --- a/packages/python/src/armonik/worker/taskhandler.py +++ b/packages/python/src/armonik/worker/taskhandler.py @@ -1,11 +1,11 @@ from __future__ import annotations + import os -from deprecation import deprecated -from typing import Optional, Dict, List, Tuple, Union +from typing import Optional, Dict, List, Union -from ..common import TaskOptions, TaskDefinition, Task, Result +from ..common import TaskOptions, TaskDefinition, Result, Task +from ..common.helpers import batched from ..protogen.common.agent_common_pb2 import ( - CreateTaskRequest, CreateResultsMetaDataRequest, CreateResultsMetaDataResponse, NotifyResultDataRequest, @@ -14,15 +14,10 @@ SubmitTasksRequest, ) from ..protogen.common.objects_pb2 import ( - TaskRequest, - DataChunk, - InitTaskRequest, - TaskRequestHeader, Configuration, ) -from ..protogen.worker.agent_service_pb2_grpc import AgentStub from ..protogen.common.worker_common_pb2 import ProcessRequest -from ..common.helpers import batched +from ..protogen.worker.agent_service_pb2_grpc import AgentStub class TaskHandler: @@ -47,72 +42,12 @@ def __init__(self, request: ProcessRequest, agent_client: AgentStub): with open(os.path.join(self.data_folder, dd), "rb") as f: self.data_dependencies[dd] = f.read() - @deprecated( - deprecated_in="3.15.0", - details="Use submit_tasks and instead and create the payload using create_result_metadata and send_result", - ) - def create_tasks( - self, tasks: List[TaskDefinition], task_options: Optional[TaskOptions] = None - ) -> Tuple[List[Task], List[str]]: - """Create new tasks for ArmoniK - - Args: - tasks: List of task definitions - task_options: Task Options used for this batch of tasks - - Returns: - Tuple containing the list of successfully sent tasks, and - the list of submission errors if any - """ - task_requests = [] - - for t in tasks: - task_request = TaskRequest() - task_request.expected_output_keys.extend(t.expected_output_ids) - task_request.data_dependencies.extend(t.data_dependencies) - task_request.payload = t.payload - task_requests.append(task_request) - assert self.configuration is not None - create_tasks_reply = self._client.CreateTask( - _to_request_stream( - task_requests, - self.token, - task_options.to_message() if task_options is not None else None, - self.configuration.data_chunk_max_size, - ) - ) - ret = create_tasks_reply.WhichOneof("Response") - if ret is None or ret == "error": - raise Exception(f"Issue with server when submitting tasks : {create_tasks_reply.error}") - elif ret == "creation_status_list": - tasks_created = [] - tasks_creation_failed = [] - for creation_status in create_tasks_reply.creation_status_list.creation_statuses: - if creation_status.WhichOneof("Status") == "task_info": - tasks_created.append( - Task( - id=creation_status.task_info.task_id, - session_id=self.session_id, - expected_output_ids=[ - k for k in creation_status.task_info.expected_output_keys - ], - data_dependencies=[ - k for k in creation_status.task_info.data_dependencies - ], - ) - ) - else: - tasks_creation_failed.append(creation_status.error) - else: - raise Exception("Unknown value") - return tasks_created, tasks_creation_failed - def submit_tasks( self, tasks: List[TaskDefinition], default_task_options: Optional[TaskOptions] = None, batch_size: Optional[int] = 100, - ) -> None: + ) -> List[Task]: """Submit tasks to the agent. Args: @@ -120,6 +55,7 @@ def submit_tasks( default_task_options: Default Task Options used if a task has its options not set batch_size: Batch size for submission """ + submitted_tasks: List[Task] = [] for tasks_batch in batched(tasks, batch_size): task_creations = [] @@ -142,13 +78,23 @@ def submit_tasks( if default_task_options: request.task_options = (default_task_options.to_message(),) - self._client.SubmitTasks(request) + submitted_tasks.extend( + Task( + id=t.task_id, + expected_output_ids=list(t.expected_output_ids), + data_dependencies=list(t.data_dependencies), + session_id=self.session_id, + payload_id=self.payload_id, + ) + for t in self._client.SubmitTasks(request).task_infos + ) + return submitted_tasks def send_results(self, results_data: Dict[str, Union[bytes, bytearray]]) -> None: """Send results. Args: - result_data: A dictionnary mapping each result ID to its data. + results_data: A dictionary mapping each result ID to its data. """ for result_id, result_data in results_data.items(): with open(os.path.join(self.data_folder, result_id), "wb") as f: @@ -167,7 +113,7 @@ def send_results(self, results_data: Dict[str, Union[bytes, bytearray]]) -> None def create_results_metadata( self, result_names: List[str], batch_size: int = 100 - ) -> Dict[str, List[Result]]: + ) -> Dict[str, Result]: """ Create the metadata of multiple results at once. Data have to be uploaded separately. @@ -177,21 +123,21 @@ def create_results_metadata( batch_size: Batch size for querying. Return: - A dictionnary mapping each result name to its result summary. + A dictionary mapping each result name to its result summary. """ results = {} for result_names_batch in batched(result_names, batch_size): request = CreateResultsMetaDataRequest( results=[ CreateResultsMetaDataRequest.ResultCreate(name=result_name) - for result_name in result_names + for result_name in result_names_batch ], session_id=self.session_id, communication_token=self.token, ) response: CreateResultsMetaDataResponse = self._client.CreateResultsMetaData(request) for result_message in response.results: - results[result_message.name] = Result.from_message(result_message) + results[result_message.name] = Result.from_result_metadata(result_message) return results def create_results( @@ -200,11 +146,11 @@ def create_results( """Create one result with data included in the request. Args: - results_data: A dictionnary mapping the result names to their actual data. + results_data: A dictionary mapping the result names to their actual data. batch_size: Batch size for querying. Return: - A dictionnary mappin each result name to its corresponding result summary. + A dictionary mapping each result name to its corresponding result summary. """ results = {} for results_ids_batch in batched(results_data.keys(), batch_size): @@ -218,66 +164,5 @@ def create_results( ) response: CreateResultsResponse = self._client.CreateResults(request) for message in response.results: - results[message.name] = Result.from_message(message) + results[message.name] = Result.from_result_metadata(message) return results - - -def _to_request_stream_internal(request, communication_token, is_last, chunk_max_size): - req = CreateTaskRequest( - init_task=InitTaskRequest( - header=TaskRequestHeader( - data_dependencies=request.data_dependencies, - expected_output_keys=request.expected_output_keys, - ) - ), - communication_token=communication_token, - ) - yield req - start = 0 - payload_length = len(request.payload) - if payload_length == 0: - req = CreateTaskRequest( - task_payload=DataChunk(data=b""), communication_token=communication_token - ) - yield req - while start < payload_length: - chunk_size = min(chunk_max_size, payload_length - start) - req = CreateTaskRequest( - task_payload=DataChunk(data=request.payload[start : start + chunk_size]), - communication_token=communication_token, - ) - yield req - start += chunk_size - req = CreateTaskRequest( - task_payload=DataChunk(data_complete=True), - communication_token=communication_token, - ) - yield req - - if is_last: - req = CreateTaskRequest( - init_task=InitTaskRequest(last_task=True), - communication_token=communication_token, - ) - yield req - - -def _to_request_stream(requests, communication_token, t_options, chunk_max_size): - if t_options is None: - req = CreateTaskRequest( - init_request=CreateTaskRequest.InitRequest(), - communication_token=communication_token, - ) - else: - req = CreateTaskRequest( - init_request=CreateTaskRequest.InitRequest(task_options=t_options), - communication_token=communication_token, - ) - yield req - if len(requests) == 0: - return - for r in requests[:-1]: - for req in _to_request_stream_internal(r, communication_token, False, chunk_max_size): - yield req - for req in _to_request_stream_internal(requests[-1], communication_token, True, chunk_max_size): - yield req diff --git a/packages/python/tests/test_taskhandler.py b/packages/python/tests/test_taskhandler.py index ce00d9add..bf602b530 100644 --- a/packages/python/tests/test_taskhandler.py +++ b/packages/python/tests/test_taskhandler.py @@ -1,6 +1,5 @@ import datetime import logging -import warnings from .conftest import all_rpc_called, rpc_called, get_client, data_folder from armonik.common import TaskDefinition, TaskOptions @@ -53,27 +52,6 @@ def test_taskhandler_init(self): assert task_handler.payload == "payload".encode() assert task_handler.data_dependencies == {"dd-id": "dd".encode()} - def test_create_task(self): - with warnings.catch_warnings(record=True) as w: - # Cause all warnings to always be triggered. - warnings.simplefilter("always") - - task_handler = TaskHandler(self.request, get_client("Agent")) - tasks, errors = task_handler.create_tasks( - [ - TaskDefinition( - payload=b"payload", - expected_output_ids=["result-id"], - data_dependencies=[], - ) - ] - ) - - assert issubclass(w[-1].category, DeprecationWarning) - assert rpc_called("Agent", "CreateTask") - assert tasks == [] - assert errors == [] - def test_submit_tasks(self): task_handler = TaskHandler(self.request, get_client("Agent")) tasks = task_handler.submit_tasks( @@ -87,13 +65,12 @@ def test_submit_tasks(self): ) assert rpc_called("Agent", "SubmitTasks") - assert tasks is None + assert tasks is not None def test_send_results(self): task_handler = TaskHandler(self.request, get_client("Agent")) - resuls = task_handler.send_results({"result-id": b"result data"}) + task_handler.send_results({"result-id": b"result data"}) assert rpc_called("Agent", "NotifyResultData") - assert resuls is None def test_create_result_metadata(self): task_handler = TaskHandler(self.request, get_client("Agent")) @@ -112,5 +89,5 @@ def test_create_results(self): def test_service_fully_implemented(self): assert all_rpc_called( - "Agent", missings=["GetCommonData", "GetDirectData", "GetResourceData"] + "Agent", missings=["CreateTask", "GetCommonData", "GetDirectData", "GetResourceData"] ) From 1605ae1f471b3cd48147a9820dd2cca6b2d42ab0 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 23 Aug 2024 10:30:41 +0200 Subject: [PATCH 280/344] feat: Removing deprecated Submitter feat: Removing unused payload property from TaskDefinition --- .../python/src/armonik/client/__init__.py | 2 - .../python/src/armonik/client/submitter.py | 369 ------------------ packages/python/src/armonik/client/tasks.py | 17 +- packages/python/src/armonik/common/objects.py | 3 +- packages/python/tests/test_submitter.py | 0 packages/python/tests/test_tasks.py | 2 +- 6 files changed, 15 insertions(+), 378 deletions(-) delete mode 100644 packages/python/src/armonik/client/submitter.py delete mode 100644 packages/python/tests/test_submitter.py diff --git a/packages/python/src/armonik/client/__init__.py b/packages/python/src/armonik/client/__init__.py index 3df30798f..27a2ebb34 100644 --- a/packages/python/src/armonik/client/__init__.py +++ b/packages/python/src/armonik/client/__init__.py @@ -1,6 +1,5 @@ from .partitions import ArmoniKPartitions, PartitionFieldFilter from .sessions import ArmoniKSessions, SessionFieldFilter -from .submitter import ArmoniKSubmitter from .tasks import ArmoniKTasks, TaskFieldFilter from .results import ArmoniKResults, ResultFieldFilter from .versions import ArmoniKVersions @@ -10,7 +9,6 @@ __all__ = [ "ArmoniKPartitions", "ArmoniKSessions", - "ArmoniKSubmitter", "ArmoniKTasks", "ArmoniKResults", "ArmoniKVersions", diff --git a/packages/python/src/armonik/client/submitter.py b/packages/python/src/armonik/client/submitter.py deleted file mode 100644 index 92b519e59..000000000 --- a/packages/python/src/armonik/client/submitter.py +++ /dev/null @@ -1,369 +0,0 @@ -from __future__ import annotations -from typing import Optional, List, Tuple, Dict, Union, Generator -from deprecation import deprecated - -from grpc import Channel - -from ..common import ( - get_task_filter, - TaskOptions, - TaskDefinition, - Task, - ResultAvailability, -) -from ..protogen.client.submitter_service_pb2_grpc import SubmitterStub -from ..protogen.common.objects_pb2 import ( - Empty, - TaskRequest, - ResultRequest, - DataChunk, - InitTaskRequest, - TaskRequestHeader, - Configuration, - Session, - TaskOptions as InnerTaskOptions, -) -from ..protogen.common.submitter_common_pb2 import ( - CreateSessionRequest, - GetTaskStatusRequest, - CreateLargeTaskRequest, - WaitRequest, - GetTaskStatusReply, -) -from ..protogen.common.task_status_pb2 import TaskStatus - - -@deprecated(deprecated_in="3.14.0", details="Use sessions, task and results client instead") -class ArmoniKSubmitter: - """ - Deprecated: - Use Session client, Task client and Result client instead - """ - - def __init__(self, grpc_channel: Channel): - """Create a Submitter with the given channel - - Args: - grpc_channel: gRPC channel to use - """ - self._client = SubmitterStub(grpc_channel) - - def get_service_configuration(self) -> Configuration: - """Get service configuration - - Returns: - Configuration object containing the chunk size - """ - return self._client.GetServiceConfiguration(Empty()) - - def create_session( - self, - default_task_options: TaskOptions, - partition_ids: Optional[List[str]] = None, - ) -> str: - """Create a session - - Args: - default_task_options: Default TaskOptions used when - submitting tasks without specifying the options - partition_ids: List of partitions this session can send - tasks to. If unspecified, can only send to the default - partition - - Returns: - Session Id - """ - if partition_ids is None: - partition_ids = [] - request = CreateSessionRequest(default_task_option=default_task_options.to_message()) - for partition in partition_ids: - request.partition_ids.append(partition) - return self._client.CreateSession(request).session_id - - def cancel_session(self, session_id: str) -> None: - """Cancel a session - - Args: - session_id: Id of the session to b cancelled - """ - self._client.CancelSession(Session(id=session_id)) - - def submit( - self, - session_id: str, - tasks: List[TaskDefinition], - task_options: Optional[TaskOptions] = None, - ) -> Tuple[List[Task], List[str]]: - """Send tasks to ArmoniK - - Args: - session_id: Session Id - tasks: List of task definitions - task_options: Task Options used for this batch of tasks - - Returns: - Tuple containing the list of successfully sent tasks, and - the list of submission errors if any - """ - task_requests = [] - - for t in tasks: - task_request = TaskRequest() - task_request.expected_output_keys.extend(t.expected_output_ids) - if t.data_dependencies: - task_request.data_dependencies.extend(t.data_dependencies) - task_request.payload = t.payload - task_requests.append(task_request) - - configuration = self.get_service_configuration() - create_tasks_reply = self._client.CreateLargeTasks( - _to_request_stream( - task_requests, - session_id, - task_options.to_message() if task_options is not None else None, - configuration.data_chunk_max_size, - ) - ) - ret = create_tasks_reply.WhichOneof("Response") - if ret is None or ret == "error": - raise Exception(f"Issue with server when submitting tasks : {create_tasks_reply.error}") - elif ret == "creation_status_list": - tasks_created = [] - tasks_creation_failed = [] - for creation_status in create_tasks_reply.creation_status_list.creation_statuses: - if creation_status.WhichOneof("Status") == "task_info": - tasks_created.append( - Task( - id=creation_status.task_info.task_id, - session_id=session_id, - expected_output_ids=[ - k for k in creation_status.task_info.expected_output_keys - ], - data_dependencies=[ - k for k in creation_status.task_info.data_dependencies - ], - ) - ) - else: - tasks_creation_failed.append(creation_status.error) - else: - raise Exception("Unknown value") - return tasks_created, tasks_creation_failed - - def list_tasks( - self, - session_ids: Optional[List[str]] = None, - task_ids: Optional[List[str]] = None, - included_statuses: Optional[List[TaskStatus]] = None, - excluded_statuses: Optional[List[TaskStatus]] = None, - ) -> List[str]: - """List tasks - - Args: - session_ids: List of session ids from which to list tasks - from. Mutually exclusive with task_ids - task_ids: List of task ids to list. Mutually exclusive with - session_ids - included_statuses: List of statuses to list tasks from, - excluding other stask statuses. Mutually exclusive with - excluded_statuses - excluded_statuses: List of statuses to not list tasks from, - including other stask statuses. Mutually exclusive with - included_statuses - - Returns: - List of task ids - """ - return [ - t - for t in self._client.ListTasks( - get_task_filter(session_ids, task_ids, included_statuses, excluded_statuses) - ).task_ids - ] - - def get_task_status(self, task_ids: List[str]) -> Dict[str, TaskStatus]: - """Get statuses of a given task list - - Args: - task_ids: List of task ids - - Returns: - Dictionary mapping a task id to the status of the - corresponding task - """ - request = GetTaskStatusRequest() - request.task_ids.extend(task_ids) - reply: GetTaskStatusReply = self._client.GetTaskStatus(request) - return {s.task_id: s.status for s in reply.id_statuses} - - def wait_for_completion( - self, - session_ids: Optional[List[str]] = None, - task_ids: Optional[List[str]] = None, - included_statuses: Optional[List[TaskStatus]] = None, - excluded_statuses: Optional[List[TaskStatus]] = None, - stop_on_first_task_error: bool = False, - stop_on_first_task_cancellation: bool = False, - ) -> Dict[TaskStatus, int]: - """Wait for the tasks matching the filters - - Args: - session_ids: List of session ids from which to list tasks - from. Mutually exclusive with task_ids - task_ids: List of task ids to list. Mutually exclusive with - session_ids - included_statuses: List of statuses to list tasks from, - excluding other stask statuses. Mutually exclusive with - excluded_statuses - excluded_statuses: List of statuses to not list tasks from, - including other stask statuses. Mutually exclusive with - included_statuses - stop_on_first_task_error: If set to true, stop the wait if a - matching task fails - stop_on_first_task_cancellation: If set to true, stop the - wait if a matching task is cancelled - - Returns: - Dictionary containing the number of tasks in each status - after waiting for completion - """ - return { - sc.status: sc.count - for sc in self._client.WaitForCompletion( - WaitRequest( - filter=get_task_filter( - session_ids, task_ids, included_statuses, excluded_statuses - ), - stop_on_first_task_error=stop_on_first_task_error, - stop_on_first_task_cancellation=stop_on_first_task_cancellation, - ) - ).values - } - - def get_result(self, session_id: str, result_id: str) -> Union[bytes, None]: - """Get a result - - Args: - session_id: Session Id - result_id: Result Id - - Returns: - content of the result as bytes - """ - result_request = ResultRequest(result_id=result_id, session=session_id) - streaming_call = self._client.TryGetResultStream(result_request) - result = bytearray() - valid = False - for message in streaming_call: - ret = message.WhichOneof("type") - if ret is None: - raise Exception("Error with server") - elif ret == "result": - if message.result.WhichOneof("type") == "data": - result += message.result.data - valid = False - elif message.result.WhichOneof("type") == "data_complete": - valid = True - elif ret == "error": - raise Exception("Task in error") - elif ret == "not_completed_task": - return None - else: - raise Exception("Unknown return type") - if valid: - return result - raise Exception("Incomplete Data") - - def wait_for_availability( - self, session_id: str, result_id: str - ) -> Union[ResultAvailability, None]: - """Blocks until the result is available or is in error - - Args: - session_id: Session Id - result_id: Result Id - - Returns: - None if the wait was cancelled unexpectedly, otherwise a - ResultAvailability with potential errors - """ - result_request = ResultRequest(result_id=result_id, session=session_id) - response = self._client.WaitForAvailability(result_request) - response_type = response.WhichOneof("type") - if response_type == "ok": - return ResultAvailability() - if response_type == "error": - return ResultAvailability(errors=[e.detail for e in response.error.errors]) - return None - - -def _to_request_stream_internal( - request: TaskRequest, is_last: bool, chunk_max_size: int -) -> Generator[CreateLargeTaskRequest, None, None]: - """Generate the CreateLargeTaskRequests for the given request - - Args: - request: TaskRequest - is_last: true if the request is the last one to send - chunk_max_size: Chunk max size - - Yields: - CreateLargeTaskRequest - """ - req = CreateLargeTaskRequest( - init_task=InitTaskRequest( - header=TaskRequestHeader( - data_dependencies=request.data_dependencies, - expected_output_keys=request.expected_output_keys, - ) - ) - ) - yield req - start = 0 - payload_length = len(request.payload) - if payload_length == 0: - req = CreateLargeTaskRequest(task_payload=DataChunk(data=b"")) - yield req - while start < payload_length: - chunk_size = min(chunk_max_size, payload_length - start) - req = CreateLargeTaskRequest( - task_payload=DataChunk(data=request.payload[start : start + chunk_size]) - ) - yield req - start += chunk_size - req = CreateLargeTaskRequest(task_payload=DataChunk(data_complete=True)) - yield req - - if is_last: - req = CreateLargeTaskRequest(init_task=InitTaskRequest(last_task=True)) - yield req - - -def _to_request_stream( - requests: List[TaskRequest], - s_id: str, - t_options: Optional[InnerTaskOptions], - chunk_max_size: int, -) -> Generator[CreateLargeTaskRequest, None, None]: - """Generate the CreateLargeTaskRequests from a list of TaskRequest - This is necessary to respect the payload size limit - Args: - requests: List of Task requests - s_id: session id - t_options: Task options - chunk_max_size: chunk max size - - Yields: - CreateLargeTaskRequest from the list of task requests - """ - req = CreateLargeTaskRequest( - init_request=CreateLargeTaskRequest.InitRequest(session_id=s_id, task_options=t_options) - ) - yield req - if len(requests) == 0: - return - for r in requests[:-1]: - for req in _to_request_stream_internal(r, False, chunk_max_size): - yield req - for req in _to_request_stream_internal(requests[-1], True, chunk_max_size): - yield req diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 647e99fb0..57a326784 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -207,9 +207,9 @@ def submit_tasks( chunk_size: Batch size for submission Returns: - Tuple containing the list of successfully sent tasks, and - the list of submission errors if any + List of successfully sent tasks """ + submitted = [] for tasks_batch in batched(tasks, chunk_size): task_creations = [] @@ -227,5 +227,14 @@ def submit_tasks( task_creations=task_creations, task_options=(default_task_options.to_message() if default_task_options else None), ) - - self._client.SubmitTasks(request) + submitted.extend( + Task( + id=t.task_id, + session_id=session_id, + expected_output_ids=list(t.expected_output_keys), + data_dependencies=list(t.data_dependencies), + payload_id=t.payload_id, + ) + for t in self._client.SubmitTasks(request).task_infos + ) + return submitted diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index db89ac00b..a7ca8bda4 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -98,8 +98,7 @@ def to_message(self): @dataclass() class TaskDefinition: - payload_id: str = field(default_factory=str) - payload: bytes = field(default_factory=bytes) + payload_id: str = "" expected_output_ids: List[str] = field(default_factory=list) data_dependencies: List[str] = field(default_factory=list) options: Optional[TaskOptions] = None diff --git a/packages/python/tests/test_submitter.py b/packages/python/tests/test_submitter.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py index 8ed993c9d..383fee529 100644 --- a/packages/python/tests/test_tasks.py +++ b/packages/python/tests/test_tasks.py @@ -128,7 +128,7 @@ def test_submit_tasks(self): ) assert rpc_called("Tasks", "SubmitTasks") # TODO: Mock must be updated to return something and so that changes the following assertions - assert tasks is None + assert tasks is not None def test_service_fully_implemented(self): assert all_rpc_called("Tasks") From 4f3b30ac6d5be2dfa7191d34fc442aefa97b8292 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 23 Aug 2024 17:31:47 +0200 Subject: [PATCH 281/344] feat: Batching for events --- packages/python/src/armonik/client/events.py | 104 +++++++++++------ packages/python/src/armonik/client/tasks.py | 2 +- packages/python/src/armonik/common/helpers.py | 2 +- .../python/tests/test_wait_availability.py | 109 ++++++++++++++++++ 4 files changed, 181 insertions(+), 36 deletions(-) create mode 100644 packages/python/tests/test_wait_availability.py diff --git a/packages/python/src/armonik/client/events.py b/packages/python/src/armonik/client/events.py index bf95b9489..3430ee440 100644 --- a/packages/python/src/armonik/client/events.py +++ b/packages/python/src/armonik/client/events.py @@ -1,9 +1,11 @@ from __future__ import annotations -from typing import Callable, cast, Iterable, List, Optional, Union + +import concurrent.futures +from concurrent.futures.thread import ThreadPoolExecutor +from typing import Callable, cast, Iterable, List, Optional, Union, Collection from grpc import Channel, RpcError -from .results import ArmoniKResults from ..common import ( EventTypes, NewTaskEvent, @@ -14,6 +16,7 @@ ResultStatus, Event, Result, + batched, ) from ..common.filter import Filter from ..protogen.client.events_service_pb2_grpc import EventsStub @@ -38,7 +41,6 @@ def __init__(self, grpc_channel: Channel): grpc_channel: gRPC channel to use """ self._client = EventsStub(grpc_channel) - self._results_client = ArmoniKResults(grpc_channel) def get_events( self, @@ -91,48 +93,82 @@ def get_events( break def wait_for_result_availability( - self, result_ids: Union[str, List[str]], session_id: str + self, + result_ids: Union[str, List[str]], + session_id: str, + bucket_size: int = 100, + parallelism: int = 1, ) -> None: """Wait until a result is ready i.e its status updates to COMPLETED. Args: result_ids: The IDs of the results. session_id: The ID of the session. - + bucket_size: Batch size + parallelism: Parallelism Raises: RuntimeError: If the result status is ABORTED. """ if isinstance(result_ids, str): result_ids = [result_ids] + result_ids = set(result_ids) if len(result_ids) == 0: return - results_not_found = set(result_ids) - - results_filter = Result.result_id == result_ids[0] - for result_id in result_ids[1:]: - results_filter = results_filter | (Result.result_id == result_id) - - def handler(_, _2, event: Event) -> bool: - event = cast(Union[NewResultEvent, ResultStatusUpdateEvent], event) - if event.result_id in results_not_found: - if event.status == ResultStatus.COMPLETED: - results_not_found.remove(event.result_id) - if not results_not_found: - return True - elif event.status == ResultStatus.ABORTED: - raise RuntimeError(f"Result {event.result_id} has been aborted.") - return False - - while results_not_found: + + if parallelism > 1: + pool = ThreadPoolExecutor(max_workers=parallelism) try: - self.get_events( - session_id, - [EventTypes.RESULT_STATUS_UPDATE, EventTypes.NEW_RESULT], - [handler], - None, - results_filter, - ) - except RpcError: - pass - else: - break + futures = [ + pool.submit(_wait_all, self, session_id, batch) + for batch in batched(result_ids, bucket_size) + ] + for i, future in enumerate(concurrent.futures.as_completed(futures)): + exp = future.exception() + if exp is not None: + for f in futures: + f.cancel() + raise exp + finally: + pool.shutdown(wait=False) + else: + for batch in batched(result_ids, bucket_size): + _wait_all(self, session_id, batch) + + +def _wait_all(event_client: ArmoniKEvents, session_id: str, results: Collection[str]): + if len(results) == 0: + return + results_filter = None + for result_id in results: + results_filter = ( + Result.result_id == result_id + if results_filter is None + else (results_filter | (Result.result_id == result_id)) + ) + + not_found = set(results) + + def handler(_, _2, event: Event) -> bool: + event = cast(Union[NewResultEvent, ResultStatusUpdateEvent], event) + if event.result_id in not_found: + if event.status == ResultStatus.COMPLETED: + not_found.remove(event.result_id) + if not not_found: + return True + elif event.status == ResultStatus.ABORTED: + raise RuntimeError(f"Result {event.result_id} has been aborted.") + return False + + while not_found: + try: + event_client.get_events( + session_id, + [EventTypes.RESULT_STATUS_UPDATE, EventTypes.NEW_RESULT], + [handler], + None, + results_filter, + ) + except RpcError: + pass + else: + break diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index 57a326784..f88ed009e 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -231,7 +231,7 @@ def submit_tasks( Task( id=t.task_id, session_id=session_id, - expected_output_ids=list(t.expected_output_keys), + expected_output_ids=list(t.expected_output_ids), data_dependencies=list(t.data_dependencies), payload_id=t.payload_id, ) diff --git a/packages/python/src/armonik/common/helpers.py b/packages/python/src/armonik/common/helpers.py index c7abc9d80..c4caca1d3 100644 --- a/packages/python/src/armonik/common/helpers.py +++ b/packages/python/src/armonik/common/helpers.py @@ -130,7 +130,7 @@ def batched(iterable: Iterable[T], n: int) -> Iterable[List[T]]: batch.append(c) if len(batch) == n: yield batch - batch.clear() + batch = [] c = next(it, sentinel) if len(batch) > 0: yield batch diff --git a/packages/python/tests/test_wait_availability.py b/packages/python/tests/test_wait_availability.py new file mode 100644 index 000000000..eb39de74f --- /dev/null +++ b/packages/python/tests/test_wait_availability.py @@ -0,0 +1,109 @@ +from datetime import timedelta +import time +from threading import Thread + +import grpc +import pytest +from armonik.client import ArmoniKTasks, ArmoniKResults, ArmoniKSessions, ArmoniKEvents +from armonik.common import TaskOptions, TaskDefinition + +endpoint = "" + + +def wait_and_unpause(session_id: str): + time.sleep(1) + with grpc.insecure_channel(endpoint) as channel: + ArmoniKSessions(channel).resume_session(session_id) + print("Session resumed") + + +class TestWaitAvailability: + def test_wait_availability(self): + pytest.skip() + n_tasks = 10000 + with grpc.insecure_channel(endpoint) as channel: + task_client = ArmoniKTasks(channel) + result_client = ArmoniKResults(channel) + session_client = ArmoniKSessions(channel) + events_client = ArmoniKEvents(channel) + session_id = session_client.create_session(TaskOptions(timedelta(seconds=60), 1, 1, "")) + print(f"Created session {session_id}") + session_client.pause_session(session_id) + payload_ids = list( + r.result_id + for r in result_client.create_results( + {str(r): str(r).encode() for r in range(n_tasks)}, session_id + ).values() + ) + print(f"Submitted payloads {len(payload_ids)}") + result_ids = list( + r.result_id + for r in result_client.create_results_metadata( + [str(r) for r in range(n_tasks)], session_id + ).values() + ) + print(f"Submitted results {len(result_ids)}") + tasks = task_client.submit_tasks( + session_id, + [ + TaskDefinition(payload_id=p, expected_output_ids=[r]) + for p, r in zip(payload_ids, result_ids) + ], + ) + print(f"Submitted tasks {len(tasks)}") + t = Thread(target=wait_and_unpause, args=(session_id,)) + start = time.time() + t.start() + print("Waiting on results") + events_client.wait_for_result_availability(result_ids, session_id, bucket_size=100) + end = time.time() + print(end - start) + session_client.close_session(session_id) + session_client.purge_session(session_id) + session_client.delete_session(session_id) + + def test_wait_availability2(self): + pytest.skip() + n_tasks = 10000 + with grpc.insecure_channel(endpoint) as channel: + task_client = ArmoniKTasks(channel) + result_client = ArmoniKResults(channel) + session_client = ArmoniKSessions(channel) + events_client = ArmoniKEvents(channel) + session_id = session_client.create_session(TaskOptions(timedelta(seconds=60), 1, 1, "")) + print(f"Created session {session_id}") + session_client.pause_session(session_id) + payload_ids = list( + r.result_id + for r in result_client.create_results( + {str(r): str(r).encode() for r in range(n_tasks)}, session_id + ).values() + ) + print(f"Submitted payloads {len(payload_ids)}") + result_ids = list( + r.result_id + for r in result_client.create_results_metadata( + [str(r) for r in range(n_tasks)], session_id + ).values() + ) + print(f"Submitted results {len(result_ids)}") + tasks = task_client.submit_tasks( + session_id, + [ + TaskDefinition(payload_id=p, expected_output_ids=[r]) + for p, r in zip(payload_ids, result_ids) + ], + ) + print(f"Submitted tasks {len(tasks)}") + t = Thread(target=wait_and_unpause, args=(session_id,)) + start = time.time() + t.start() + print("Waiting on results") + events_client.wait_for_result_availability( + result_ids, session_id, bucket_size=100, parallelism=10 + ) + end = time.time() + print(end - start) + session_client.close_session(session_id) + session_client.purge_session(session_id) + session_client.delete_session(session_id) From 44c824070443e504cf553201a0fb6e7d22cc48ce Mon Sep 17 00:00:00 2001 From: Faust1 Date: Tue, 27 Aug 2024 10:33:28 +0200 Subject: [PATCH 282/344] chore(package): update angular version --- packages/angular/package.json | 28 +- packages/angular/pnpm-lock.yaml | 12701 +++++++++------- .../armonik.api.angular/package.json | 4 +- 3 files changed, 7188 insertions(+), 5545 deletions(-) diff --git a/packages/angular/package.json b/packages/angular/package.json index baae3f74b..d1c73a219 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -11,26 +11,26 @@ "proto:generate:linux": "protoc --plugin=protoc-gen-ng=$(which protoc-gen-ng) --ng_out=./projects/aneoconsultingfr/armonik.api.angular/src/lib/generated -I ../../Protos/V1 ../../Protos/V1/*.proto" }, "dependencies": { - "@angular/animations": "^16.2.1", - "@angular/common": "^16.2.1", - "@angular/compiler": "^16.2.1", - "@angular/core": "^16.2.1", - "@angular/forms": "^16.2.1", - "@angular/platform-browser": "^16.2.1", - "@angular/platform-browser-dynamic": "^16.2.1", - "@angular/router": "^16.2.1", + "@angular/animations": "^18.2.1", + "@angular/common": "^18.2.1", + "@angular/compiler": "^18.2.1", + "@angular/core": "^18.2.1", + "@angular/forms": "^18.2.1", + "@angular/platform-browser": "^18.2.1", + "@angular/platform-browser-dynamic": "^18.2.1", + "@angular/router": "^18.2.1", "@ngx-grpc/common": "^3.1.2", "@ngx-grpc/core": "^3.1.2", "@ngx-grpc/well-known-types": "^3.1.2", "google-protobuf": "^3.21.2", "rxjs": "~7.8.1", "tslib": "^2.6.2", - "zone.js": "~0.13.1" + "zone.js": "~0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.0", - "@angular/cli": "~16.2.0", - "@angular/compiler-cli": "^16.2.1", + "@angular-devkit/build-angular": "^18.2.1", + "@angular/cli": "~18.2.1", + "@angular/compiler-cli": "^18.2.1", "@ngx-grpc/protoc-gen-ng": "^3.1.2", "@types/google-protobuf": "^3.15.6", "@types/jasmine": "~4.3.5", @@ -40,7 +40,7 @@ "karma-coverage": "~2.2.1", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", - "ng-packagr": "^16.2.0", - "typescript": "~5.1.6" + "ng-packagr": "^18.2.1", + "typescript": "~5.5.4" } } diff --git a/packages/angular/pnpm-lock.yaml b/packages/angular/pnpm-lock.yaml index ff4a933c6..ce251177c 100644 --- a/packages/angular/pnpm-lock.yaml +++ b/packages/angular/pnpm-lock.yaml @@ -1,135 +1,133 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@angular/animations': - specifier: ^16.2.1 - version: 16.2.1(@angular/core@16.2.1) - '@angular/common': - specifier: ^16.2.1 - version: 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) - '@angular/compiler': - specifier: ^16.2.1 - version: 16.2.1(@angular/core@16.2.1) - '@angular/core': - specifier: ^16.2.1 - version: 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) - '@angular/forms': - specifier: ^16.2.1 - version: 16.2.1(@angular/common@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1)(rxjs@7.8.1) - '@angular/platform-browser': - specifier: ^16.2.1 - version: 16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1) - '@angular/platform-browser-dynamic': - specifier: ^16.2.1 - version: 16.2.1(@angular/common@16.2.1)(@angular/compiler@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1) - '@angular/router': - specifier: ^16.2.1 - version: 16.2.1(@angular/common@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1)(rxjs@7.8.1) - '@ngx-grpc/common': - specifier: ^3.1.2 - version: 3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1) - '@ngx-grpc/core': - specifier: ^3.1.2 - version: 3.1.2(@angular/core@16.2.1)(@ngx-grpc/common@3.1.2)(rxjs@7.8.1) - '@ngx-grpc/well-known-types': - specifier: ^3.1.2 - version: 3.1.2(@ngx-grpc/common@3.1.2)(google-protobuf@3.21.2) - google-protobuf: - specifier: ^3.21.2 - version: 3.21.2 - rxjs: - specifier: ~7.8.1 - version: 7.8.1 - tslib: - specifier: ^2.6.2 - version: 2.6.2 - zone.js: - specifier: ~0.13.1 - version: 0.13.1 - -devDependencies: - '@angular-devkit/build-angular': - specifier: ^16.2.0 - version: 16.2.0(@angular/compiler-cli@16.2.1)(karma@6.4.2)(ng-packagr@16.2.0)(typescript@5.1.6) - '@angular/cli': - specifier: ~16.2.0 - version: 16.2.0 - '@angular/compiler-cli': - specifier: ^16.2.1 - version: 16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6) - '@ngx-grpc/protoc-gen-ng': - specifier: ^3.1.2 - version: 3.1.2 - '@types/google-protobuf': - specifier: ^3.15.6 - version: 3.15.6 - '@types/jasmine': - specifier: ~4.3.5 - version: 4.3.5 - jasmine-core: - specifier: ~5.1.0 - version: 5.1.0 - karma: - specifier: ~6.4.2 - version: 6.4.2 - karma-chrome-launcher: - specifier: ~3.2.0 - version: 3.2.0 - karma-coverage: - specifier: ~2.2.1 - version: 2.2.1 - karma-jasmine: - specifier: ~5.1.0 - version: 5.1.0(karma@6.4.2) - karma-jasmine-html-reporter: - specifier: ~2.1.0 - version: 2.1.0(jasmine-core@5.1.0)(karma-jasmine@5.1.0)(karma@6.4.2) - ng-packagr: - specifier: ^16.2.0 - version: 16.2.0(@angular/compiler-cli@16.2.1)(tslib@2.6.2)(typescript@5.1.6) - typescript: - specifier: ~5.1.6 - version: 5.1.6 +importers: + + .: + dependencies: + '@angular/animations': + specifier: ^18.2.1 + version: 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)) + '@angular/common': + specifier: ^18.2.1 + version: 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) + '@angular/compiler': + specifier: ^18.2.1 + version: 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)) + '@angular/core': + specifier: ^18.2.1 + version: 18.2.1(rxjs@7.8.1)(zone.js@0.14.10) + '@angular/forms': + specifier: ^18.2.1 + version: 18.2.1(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1) + '@angular/platform-browser': + specifier: ^18.2.1 + version: 18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)) + '@angular/platform-browser-dynamic': + specifier: ^18.2.1 + version: 18.2.1(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))) + '@angular/router': + specifier: ^18.2.1 + version: 18.2.1(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1) + '@ngx-grpc/common': + specifier: ^3.1.2 + version: 3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1) + '@ngx-grpc/core': + specifier: ^3.1.2 + version: 3.1.2(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(@ngx-grpc/common@3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1))(rxjs@7.8.1) + '@ngx-grpc/well-known-types': + specifier: ^3.1.2 + version: 3.1.2(@ngx-grpc/common@3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1))(google-protobuf@3.21.2) + google-protobuf: + specifier: ^3.21.2 + version: 3.21.2 + rxjs: + specifier: ~7.8.1 + version: 7.8.1 + tslib: + specifier: ^2.6.2 + version: 2.6.2 + zone.js: + specifier: ~0.14.4 + version: 0.14.10 + devDependencies: + '@angular-devkit/build-angular': + specifier: ^18.2.1 + version: 18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@types/node@22.5.0)(chokidar@3.6.0)(karma@6.4.2)(ng-packagr@18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(tslib@2.6.2)(typescript@5.5.4))(typescript@5.5.4) + '@angular/cli': + specifier: ~18.2.1 + version: 18.2.1(chokidar@3.6.0) + '@angular/compiler-cli': + specifier: ^18.2.1 + version: 18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4) + '@ngx-grpc/protoc-gen-ng': + specifier: ^3.1.2 + version: 3.1.2 + '@types/google-protobuf': + specifier: ^3.15.6 + version: 3.15.6 + '@types/jasmine': + specifier: ~4.3.5 + version: 4.3.5 + jasmine-core: + specifier: ~5.1.0 + version: 5.1.0 + karma: + specifier: ~6.4.2 + version: 6.4.2 + karma-chrome-launcher: + specifier: ~3.2.0 + version: 3.2.0 + karma-coverage: + specifier: ~2.2.1 + version: 2.2.1 + karma-jasmine: + specifier: ~5.1.0 + version: 5.1.0(karma@6.4.2) + karma-jasmine-html-reporter: + specifier: ~2.1.0 + version: 2.1.0(jasmine-core@5.1.0)(karma-jasmine@5.1.0(karma@6.4.2))(karma@6.4.2) + ng-packagr: + specifier: ^18.2.1 + version: 18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(tslib@2.6.2)(typescript@5.5.4) + typescript: + specifier: ~5.5.4 + version: 5.5.4 packages: - /@ampproject/remapping@2.2.1: + '@ampproject/remapping@2.2.1': resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - dev: true - /@angular-devkit/architect@0.1602.0(chokidar@3.5.3): - resolution: {integrity: sha512-ZRmUTBeD+uGr605eOHnsovEn6f1mOBI+kxP64DRvagNweX5TN04s3iyQ8jmLSAHQD9ush31LFxv3dVNxv3ceXQ==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - dependencies: - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - dev: true + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} - /@angular-devkit/build-angular@16.2.0(@angular/compiler-cli@16.2.1)(karma@6.4.2)(ng-packagr@16.2.0)(typescript@5.1.6): - resolution: {integrity: sha512-miylwjOqvlKmYrzS84bjRaJrecZxOXH9xsPVvQE8VBe8UKePJjRAL6yyOqXUOGtzlch2YmT98RAnuni7y0FEAw==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/architect@0.1802.1': + resolution: {integrity: sha512-XTnJfCBMDQl3xF4w/eNrq821gbj2Ig1cqbzpRflhz4pqrANTAfHfPoIC7piWEZ60FNlHapzb6fvh6tJUGXG9og==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-devkit/build-angular@18.2.1': + resolution: {integrity: sha512-ANsTWKjIlEvJ6s276TbwnDhkoHhQDfsNiRFUDRGBZu94UNR78ImQZSyKYGHJOeQQH6jpBtraA1rvW5WKozAtlw==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler-cli': ^16.0.0 - '@angular/localize': ^16.0.0 - '@angular/platform-server': ^16.0.0 - '@angular/service-worker': ^16.0.0 + '@angular/compiler-cli': ^18.0.0 + '@angular/localize': ^18.0.0 + '@angular/platform-server': ^18.0.0 + '@angular/service-worker': ^18.0.0 + '@web/test-runner': ^0.18.0 + browser-sync: ^3.0.2 jest: ^29.5.0 jest-environment-jsdom: ^29.5.0 karma: ^6.3.0 - ng-packagr: ^16.0.0 + ng-packagr: ^18.0.0 protractor: ^7.0.0 tailwindcss: ^2.0.0 || ^3.0.0 - typescript: '>=4.9.3 <5.2' + typescript: '>=5.4 <5.6' peerDependenciesMeta: '@angular/localize': optional: true @@ -137,6 +135,10 @@ packages: optional: true '@angular/service-worker': optional: true + '@web/test-runner': + optional: true + browser-sync: + optional: true jest: optional: true jest-environment-jsdom: @@ -149,3088 +151,6823 @@ packages: optional: true tailwindcss: optional: true - dependencies: - '@ampproject/remapping': 2.2.1 - '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) - '@angular-devkit/build-webpack': 0.1602.0(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.88.2) - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - '@angular/compiler-cli': 16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6) - '@babel/core': 7.22.9 - '@babel/generator': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.9) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-runtime': 7.22.9(@babel/core@7.22.9) - '@babel/preset-env': 7.22.9(@babel/core@7.22.9) - '@babel/runtime': 7.22.6 - '@babel/template': 7.22.5 - '@discoveryjs/json-ext': 0.5.7 - '@ngtools/webpack': 16.2.0(@angular/compiler-cli@16.2.1)(typescript@5.1.6)(webpack@5.88.2) - '@vitejs/plugin-basic-ssl': 1.0.1(vite@4.4.7) - ansi-colors: 4.1.3 - autoprefixer: 10.4.14(postcss@8.4.27) - babel-loader: 9.1.3(@babel/core@7.22.9)(webpack@5.88.2) - babel-plugin-istanbul: 6.1.1 - browserslist: 4.21.5 - chokidar: 3.5.3 - copy-webpack-plugin: 11.0.0(webpack@5.88.2) - critters: 0.0.20 - css-loader: 6.8.1(webpack@5.88.2) - esbuild-wasm: 0.18.17 - fast-glob: 3.3.1 - guess-parser: 0.4.22(typescript@5.1.6) - https-proxy-agent: 5.0.1 - inquirer: 8.2.4 - jsonc-parser: 3.2.0 - karma: 6.4.2 - karma-source-map-support: 1.4.0 - less: 4.1.3 - less-loader: 11.1.0(less@4.1.3)(webpack@5.88.2) - license-webpack-plugin: 4.0.2(webpack@5.88.2) - loader-utils: 3.2.1 - magic-string: 0.30.1 - mini-css-extract-plugin: 2.7.6(webpack@5.88.2) - mrmime: 1.0.1 - ng-packagr: 16.2.0(@angular/compiler-cli@16.2.1)(tslib@2.6.2)(typescript@5.1.6) - open: 8.4.2 - ora: 5.4.1 - parse5-html-rewriting-stream: 7.0.0 - picomatch: 2.3.1 - piscina: 4.0.0 - postcss: 8.4.27 - postcss-loader: 7.3.3(postcss@8.4.27)(webpack@5.88.2) - resolve-url-loader: 5.0.0 - rxjs: 7.8.1 - sass: 1.64.1 - sass-loader: 13.3.2(sass@1.64.1)(webpack@5.88.2) - semver: 7.5.4 - source-map-loader: 4.0.1(webpack@5.88.2) - source-map-support: 0.5.21 - terser: 5.19.2 - text-table: 0.2.0 - tree-kill: 1.2.2 - tslib: 2.6.1 - typescript: 5.1.6 - vite: 4.4.7(less@4.1.3)(sass@1.64.1)(terser@5.19.2) - webpack: 5.88.2(esbuild@0.18.17) - webpack-dev-middleware: 6.1.1(webpack@5.88.2) - webpack-dev-server: 4.15.1(webpack@5.88.2) - webpack-merge: 5.9.0 - webpack-subresource-integrity: 5.1.0(webpack@5.88.2) - optionalDependencies: - esbuild: 0.18.17 - transitivePeerDependencies: - - '@swc/core' - - '@types/node' - - bufferutil - - canvas - - debug - - fibers - - html-webpack-plugin - - lightningcss - - node-sass - - sass-embedded - - stylus - - sugarss - - supports-color - - uglify-js - - utf-8-validate - - webpack-cli - dev: true - /@angular-devkit/build-webpack@0.1602.0(chokidar@3.5.3)(webpack-dev-server@4.15.1)(webpack@5.88.2): - resolution: {integrity: sha512-KdSr6iAcO30i/LIGL8mYi+d1buVXuDCp2dptzEJ4vxReOMFJca90KLwb+tVHEqqnDb0WkNfWm8Ii2QYh2FrNyA==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/build-webpack@0.1802.1': + resolution: {integrity: sha512-xOP9Hxkj/mWYdMTa/8uNxFTv7z+3UiGdt4VAO7vetV5qkU/S9rRq8FEKviCc2llXfwkhInSgeeHpWKdATa+YIQ==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: webpack: ^5.30.0 - webpack-dev-server: ^4.0.0 - dependencies: - '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) - rxjs: 7.8.1 - webpack: 5.88.2(esbuild@0.18.17) - webpack-dev-server: 4.15.1(webpack@5.88.2) - transitivePeerDependencies: - - chokidar - dev: true + webpack-dev-server: ^5.0.2 - /@angular-devkit/core@16.2.0(chokidar@3.5.3): - resolution: {integrity: sha512-l1k6Rqm3YM16BEn3CWyQKrk9xfu+2ux7Bw3oS+h1TO4/RoxO2PgHj8LLRh/WNrYVarhaqO7QZ5ePBkXNMkzJ1g==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/core@18.2.1': + resolution: {integrity: sha512-fSuGj6CxiTFR+yjuVcaWqaVb5Wts39CSBYRO1BlsOlbuWFZ2NKC/BAb5bdxpB31heCBJi7e3XbPvcMMJIcnKlA==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 peerDependenciesMeta: chokidar: optional: true - dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - chokidar: 3.5.3 - jsonc-parser: 3.2.0 - rxjs: 7.8.1 - source-map: 0.7.4 - dev: true - /@angular-devkit/schematics@16.2.0: - resolution: {integrity: sha512-QMDJXPE0+YQJ9Ap3MMzb0v7rx6ZbBEokmHgpdIjN3eILYmbAdsSGE8HTV8NjS9nKmcyE9OGzFCMb7PFrDTlTAw==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - dependencies: - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - jsonc-parser: 3.2.0 - magic-string: 0.30.1 - ora: 5.4.1 - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - dev: true + '@angular-devkit/schematics@18.2.1': + resolution: {integrity: sha512-2t/q0Jcv7yqhAzEdNgsxoGSCmPgD4qfnVOJ7EJw3LNIA+kX1CmtN4FESUS0i49kN4AyNJFAI5O2pV8iJiliKaw==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - /@angular/animations@16.2.1(@angular/core@16.2.1): - resolution: {integrity: sha512-XVabK9fRKJaYPhW5wn8ySL4KL45N5Np+xOssWhLPDRDBdZjl62MExfpvMkamdkos6E1n1IGsy9wSemjnR4WKhg==} - engines: {node: ^16.14.0 || >=18.10.0} + '@angular/animations@18.2.1': + resolution: {integrity: sha512-jit452yuE6DMVV09E6RAjgapgw64mMVH31ccpPvMDekzPsTuP3KNKtgRFU/k2DFhYJvyczM1AqqlgccE/JGaRw==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: - '@angular/core': 16.2.1 - dependencies: - '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) - tslib: 2.6.2 - dev: false + '@angular/core': 18.2.1 + + '@angular/build@18.2.1': + resolution: {integrity: sha512-HwzjB+I31cAtjTTbbS2NbayzfcWthaKaofJlSmZIst3PN+GwLZ8DU0DRpd/xu5AXkk+DoAIWd+lzUIaqngz6ow==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler-cli': ^18.0.0 + '@angular/localize': ^18.0.0 + '@angular/platform-server': ^18.0.0 + '@angular/service-worker': ^18.0.0 + less: ^4.2.0 + postcss: ^8.4.0 + tailwindcss: ^2.0.0 || ^3.0.0 + typescript: '>=5.4 <5.6' + peerDependenciesMeta: + '@angular/localize': + optional: true + '@angular/platform-server': + optional: true + '@angular/service-worker': + optional: true + less: + optional: true + postcss: + optional: true + tailwindcss: + optional: true - /@angular/cli@16.2.0: - resolution: {integrity: sha512-xT8vJOyw6Rc2364XDW2jHagLgKu7342ktd/lt+c0u6R+AB2XVFMePR7VceLohX9N/vRUsbQ0nVSZr+ru/hA+HA==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular/cli@18.2.1': + resolution: {integrity: sha512-SomUFDHanY4o7k3XBGf1eFt4z1h05IGJHfcbl2vxoc0lY59VN13m/pZsD2AtpqtJTzLQT02XQOUP4rmBbGoQ+Q==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - dependencies: - '@angular-devkit/architect': 0.1602.0(chokidar@3.5.3) - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.2.0 - '@schematics/angular': 16.2.0 - '@yarnpkg/lockfile': 1.1.0 - ansi-colors: 4.1.3 - ini: 4.1.1 - inquirer: 8.2.4 - jsonc-parser: 3.2.0 - npm-package-arg: 10.1.0 - npm-pick-manifest: 8.0.1 - open: 8.4.2 - ora: 5.4.1 - pacote: 15.2.0 - resolve: 1.22.2 - semver: 7.5.4 - symbol-observable: 4.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - bluebird - - chokidar - - supports-color - dev: true - /@angular/common@16.2.1(@angular/core@16.2.1)(rxjs@7.8.1): - resolution: {integrity: sha512-druackA5JQpvfS8cD8DFtPRXGRKbhx3mQ778t1n6x3fXpIdGaAX+nSAgAKhIoF7fxWmu0KuHGzb+3BFlZRyTXw==} - engines: {node: ^16.14.0 || >=18.10.0} + '@angular/common@18.2.1': + resolution: {integrity: sha512-N0ZJO1/iU9UhprplZRPvBcdRgA/i6l6Ng5gXs5ymHBJ0lxsB+mDVCmC4jISjR9gAWc426xXwLaOpuP5Gv3f/yg==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: - '@angular/core': 16.2.1 + '@angular/core': 18.2.1 rxjs: ^6.5.3 || ^7.4.0 - dependencies: - '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) - rxjs: 7.8.1 - tslib: 2.6.2 - dev: false - /@angular/compiler-cli@16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6): - resolution: {integrity: sha512-A5SyNZTZnXSCL5JVXHKbYj9p2dRYoeFnb6hGQFt2AuCcpUjVIIdwHtre3YzkKe5sFwepPctdoRe2fRXlTfTRjA==} - engines: {node: ^16.14.0 || >=18.10.0} + '@angular/compiler-cli@18.2.1': + resolution: {integrity: sha512-D+Qba0r6RfHfffzrebGYp54h05AxpkagLjit/GczKNgWSP1gIgZxSfi88D+GvFmeWvZxWN1ecAQ+yqft9hJqWg==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} hasBin: true peerDependencies: - '@angular/compiler': 16.2.1 - typescript: '>=4.9.3 <5.2' - dependencies: - '@angular/compiler': 16.2.1(@angular/core@16.2.1) - '@babel/core': 7.22.5 - '@jridgewell/sourcemap-codec': 1.4.14 - chokidar: 3.5.3 - convert-source-map: 1.9.0 - reflect-metadata: 0.1.13 - semver: 7.5.3 - tslib: 2.6.2 - typescript: 5.1.6 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - dev: true + '@angular/compiler': 18.2.1 + typescript: '>=5.4 <5.6' - /@angular/compiler@16.2.1(@angular/core@16.2.1): - resolution: {integrity: sha512-dPauu+ESn79d66U9nBvnunNuBk/UMqnm7iL9Q31J8OKYN/4vrKbsO57pmULOft/GRAYsE3FdLBH0NkocFZKIMQ==} - engines: {node: ^16.14.0 || >=18.10.0} + '@angular/compiler@18.2.1': + resolution: {integrity: sha512-5e9ygKEcsBoV6xpaGKVrtsLxLETlrM0oB7twl4qG/xuKYqCLj8cRQMcAKSqDfTPzWMOAQc7pHdk+uFVo/8dWHA==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: - '@angular/core': 16.2.1 + '@angular/core': 18.2.1 peerDependenciesMeta: '@angular/core': optional: true - dependencies: - '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) - tslib: 2.6.2 - /@angular/core@16.2.1(rxjs@7.8.1)(zone.js@0.13.1): - resolution: {integrity: sha512-Y+0jssQnJPovxMv9cDKYlp6BBHeFBLOHd/+FPv5IIGD1c7NwBP/TImJxCaIV78a57xnO8L0SFacDg/kULzvKrg==} - engines: {node: ^16.14.0 || >=18.10.0} + '@angular/core@18.2.1': + resolution: {integrity: sha512-9KrSpJ65UlJZNXrE18NszcfOwb5LZgG+LYi5Doe7amt218R1bzb3trvuAm0ZzMaoKh4ugtUCkzEOd4FALPEX6w==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: rxjs: ^6.5.3 || ^7.4.0 - zone.js: ~0.13.0 - dependencies: - rxjs: 7.8.1 - tslib: 2.6.2 - zone.js: 0.13.1 + zone.js: ~0.14.10 - /@angular/forms@16.2.1(@angular/common@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1)(rxjs@7.8.1): - resolution: {integrity: sha512-cCygiLfBAsVHdtKmNptlk2IgXu0wjRc8kSiiSnJkfK6U/NiNg8ADMiN7iYgKW2TD1ZRw+7dYZV856lxEy2n0+A==} - engines: {node: ^16.14.0 || >=18.10.0} + '@angular/forms@18.2.1': + resolution: {integrity: sha512-T7z8KUuj2PoPxrMrAruQVJha+x4a9Y6IrKYtArgOQQlTwCEJuqpVYuOk5l3fwWpHE9bVEjvgkAMI1D5YXA/U6w==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: - '@angular/common': 16.2.1 - '@angular/core': 16.2.1 - '@angular/platform-browser': 16.2.1 + '@angular/common': 18.2.1 + '@angular/core': 18.2.1 + '@angular/platform-browser': 18.2.1 rxjs: ^6.5.3 || ^7.4.0 - dependencies: - '@angular/common': 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) - '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) - '@angular/platform-browser': 16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1) - rxjs: 7.8.1 - tslib: 2.6.2 - dev: false - /@angular/platform-browser-dynamic@16.2.1(@angular/common@16.2.1)(@angular/compiler@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1): - resolution: {integrity: sha512-dKMCSrbD/joOMXM1mhDOKNDZ1BxwO9r9uu5ZxY0L/fWm/ousgMucNikLr38vBudgWM8CN6BuabzkxWKcqi3k4g==} - engines: {node: ^16.14.0 || >=18.10.0} + '@angular/platform-browser-dynamic@18.2.1': + resolution: {integrity: sha512-tYJHtshbaKrtnRA15k3vrveSVBqkVUGhINvGugFA2vMtdTOfhfPw+hhzYrcwJibgU49rHogCfI9mkIbpNRYntA==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: - '@angular/common': 16.2.1 - '@angular/compiler': 16.2.1 - '@angular/core': 16.2.1 - '@angular/platform-browser': 16.2.1 - dependencies: - '@angular/common': 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) - '@angular/compiler': 16.2.1(@angular/core@16.2.1) - '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) - '@angular/platform-browser': 16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1) - tslib: 2.6.2 - dev: false + '@angular/common': 18.2.1 + '@angular/compiler': 18.2.1 + '@angular/core': 18.2.1 + '@angular/platform-browser': 18.2.1 - /@angular/platform-browser@16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1): - resolution: {integrity: sha512-SH8zRiRAcw0B5/tVlEc5U/lN5F8g+JizSuu7BQvpCAQEDkM6IjF9LP36Bjav7JuadItbWLfT6peWYa1sJvax2w==} - engines: {node: ^16.14.0 || >=18.10.0} + '@angular/platform-browser@18.2.1': + resolution: {integrity: sha512-hQABX7QotGmCIR3EhCBCDh5ZTvQao+JkuK5CCw2G1PkRfJMBwEpjNqnyhz41hZhWiGlucp9jgbeypppW+mIQEw==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: - '@angular/animations': 16.2.1 - '@angular/common': 16.2.1 - '@angular/core': 16.2.1 + '@angular/animations': 18.2.1 + '@angular/common': 18.2.1 + '@angular/core': 18.2.1 peerDependenciesMeta: '@angular/animations': optional: true - dependencies: - '@angular/animations': 16.2.1(@angular/core@16.2.1) - '@angular/common': 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) - '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) - tslib: 2.6.2 - dev: false - /@angular/router@16.2.1(@angular/common@16.2.1)(@angular/core@16.2.1)(@angular/platform-browser@16.2.1)(rxjs@7.8.1): - resolution: {integrity: sha512-C0WfcktsC25G37unxdH/5I7PbkVBSEB1o+0DJK9/HG97r1yzEkptF6fbRIzDBTS7dX0NfWN/PTAKF0ep7YlHvA==} - engines: {node: ^16.14.0 || >=18.10.0} + '@angular/router@18.2.1': + resolution: {integrity: sha512-gVyqW6fYnG7oq1DlZSXJMQ2Py2dJQB7g6XVtRcYB1gR4aeowx5N9ws7PjqAi0ih91ASq2MmP4OlSSWLq+eaMGg==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: - '@angular/common': 16.2.1 - '@angular/core': 16.2.1 - '@angular/platform-browser': 16.2.1 + '@angular/common': 18.2.1 + '@angular/core': 18.2.1 + '@angular/platform-browser': 18.2.1 rxjs: ^6.5.3 || ^7.4.0 - dependencies: - '@angular/common': 16.2.1(@angular/core@16.2.1)(rxjs@7.8.1) - '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) - '@angular/platform-browser': 16.2.1(@angular/animations@16.2.1)(@angular/common@16.2.1)(@angular/core@16.2.1) - rxjs: 7.8.1 - tslib: 2.6.2 - dev: false - /@assemblyscript/loader@0.10.1: - resolution: {integrity: sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==} - dev: true - - /@babel/code-frame@7.22.10: + '@babel/code-frame@7.22.10': resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.10 - chalk: 2.4.2 - dev: true - /@babel/code-frame@7.22.5: + '@babel/code-frame@7.22.5': resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.5 - dev: true - /@babel/compat-data@7.22.5: - resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/compat-data@7.22.9: + '@babel/compat-data@7.22.9': resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.22.5: + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.22.5': resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.7 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) - '@babel/helper-module-transforms': 7.22.5 - '@babel/helpers': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/core@7.22.9: - resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.9 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) - '@babel/helpers': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/generator@7.22.10: + '@babel/generator@7.22.10': resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.10 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 - dev: true - /@babel/generator@7.22.7: + '@babel/generator@7.22.7': resolution: {integrity: sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 - dev: true - /@babel/generator@7.22.9: - resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 - dev: true - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/generator@7.25.5': + resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.5: - resolution: {integrity: sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==} + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-compilation-targets@7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5): + '@babel/helper-compilation-targets@7.22.5': resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.0 - dev: true - /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==} + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.4': + resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-create-regexp-features-plugin@7.22.5(@babel/core@7.22.9): + '@babel/helper-create-regexp-features-plugin@7.22.5': resolution: {integrity: sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: true - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.9): - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + '@babel/helper-create-regexp-features-plugin@7.25.2': + resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-environment-visitor@7.22.5: + '@babel/helper-environment-visitor@7.22.5': resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-function-name@7.22.5: + '@babel/helper-function-name@7.22.5': resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - dev: true - /@babel/helper-hoist-variables@7.22.5: + '@babel/helper-hoist-variables@7.22.5': resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-member-expression-to-functions@7.22.5: - resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + '@babel/helper-member-expression-to-functions@7.24.8': + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-module-imports@7.22.5: + '@babel/helper-module-imports@7.22.5': resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-module-transforms@7.22.5: + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.22.5': resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - dev: true - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-remap-async-to-generator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==} + '@babel/helper-remap-async-to-generator@7.25.0': + resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} + '@babel/helper-replace-supers@7.25.0': + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.10 - dev: true - /@babel/helper-replace-supers@7.22.5: - resolution: {integrity: sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==} + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-split-export-declaration@7.22.5: - resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==} + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/helper-string-parser@7.22.5: + '@babel/helper-string-parser@7.22.5': resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.5: + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.5': resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-wrap-function@7.22.10: - resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} + '@babel/helper-validator-option@7.22.5': + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 - '@babel/types': 7.22.10 - dev: true - /@babel/helper-wrap-function@7.22.5: - resolution: {integrity: sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==} + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helpers@7.22.10: - resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} + '@babel/helper-wrap-function@7.25.0': + resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helpers@7.22.5: + '@babel/helpers@7.22.5': resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/highlight@7.22.10: + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.22.10': resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - /@babel/highlight@7.22.5: + '@babel/highlight@7.22.5': resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - /@babel/parser@7.22.10: + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.22.10': resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/parser@7.22.5: + '@babel/parser@7.22.5': resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} + '@babel/parser@7.25.4': + resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3': + resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0': + resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.10(@babel/core@7.22.9) - dev: true + '@babel/core': ^7.0.0 - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.9): - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0': + resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color - dev: true + '@babel/core': ^7.0.0 - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.9): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - dev: true + '@babel/core': ^7.13.0 - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.9): - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0': + resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.9): + '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.9): + '@babel/plugin-syntax-class-properties@7.12.13': resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.9): + '@babel/plugin-syntax-class-static-block@7.14.5': resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.9): + '@babel/plugin-syntax-dynamic-import@7.8.3': resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.9): + '@babel/plugin-syntax-export-namespace-from@7.8.3': resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + '@babel/plugin-syntax-import-assertions@7.24.7': + resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + '@babel/plugin-syntax-import-attributes@7.24.7': + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.9): + '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.9): + '@babel/plugin-syntax-json-strings@7.8.3': resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.9): + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.9): + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.9): + '@babel/plugin-syntax-numeric-separator@7.10.4': resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.9): + '@babel/plugin-syntax-object-rest-spread@7.8.3': resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.9): + '@babel/plugin-syntax-optional-catch-binding@7.8.3': resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9): + '@babel/plugin-syntax-optional-chaining@7.8.3': resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.9): + '@babel/plugin-syntax-private-property-in-object@7.14.5': resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9): + '@babel/plugin-syntax-top-level-await@7.14.5': resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.9): + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + '@babel/plugin-transform-arrow-functions@7.24.7': + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-async-generator-functions@7.22.10(@babel/core@7.22.9): - resolution: {integrity: sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==} + '@babel/plugin-transform-async-generator-functions@7.25.0': + resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + '@babel/plugin-transform-async-to-generator@7.24.7': + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + '@babel/plugin-transform-block-scoped-functions@7.24.7': + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==} + '@babel/plugin-transform-block-scoping@7.25.0': + resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + '@babel/plugin-transform-class-properties@7.25.4': + resolution: {integrity: sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-class-static-block@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==} + '@babel/plugin-transform-class-static-block@7.24.7': + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.9): - resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} + '@babel/plugin-transform-classes@7.25.4': + resolution: {integrity: sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + '@babel/plugin-transform-computed-properties@7.24.7': + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.5 - dev: true - /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} + '@babel/plugin-transform-destructuring@7.24.8': + resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + '@babel/plugin-transform-dotall-regex@7.24.7': + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + '@babel/plugin-transform-duplicate-keys@7.24.7': + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-dynamic-import@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0': + resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.24.7': + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + '@babel/plugin-transform-exponentiation-operator@7.24.7': + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-export-namespace-from@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==} + '@babel/plugin-transform-export-namespace-from@7.24.7': + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} + '@babel/plugin-transform-for-of@7.24.7': + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + '@babel/plugin-transform-function-name@7.25.1': + resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-json-strings@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==} + '@babel/plugin-transform-json-strings@7.24.7': + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + '@babel/plugin-transform-literals@7.25.2': + resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-logical-assignment-operators@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==} + '@babel/plugin-transform-logical-assignment-operators@7.24.7': + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + '@babel/plugin-transform-member-expression-literals@7.24.7': + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + '@babel/plugin-transform-modules-amd@7.24.7': + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} + '@babel/plugin-transform-modules-commonjs@7.24.8': + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} + '@babel/plugin-transform-modules-systemjs@7.25.0': + resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + '@babel/plugin-transform-modules-umd@7.24.7': + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-transforms': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + '@babel/plugin-transform-new-target@7.24.7': + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==} + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-numeric-separator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==} + '@babel/plugin-transform-numeric-separator@7.24.7': + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-object-rest-spread@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==} + '@babel/plugin-transform-object-rest-spread@7.24.7': + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) - dev: true - - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + + '@babel/plugin-transform-object-super@7.24.7': + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} + '@babel/plugin-transform-optional-catch-binding@7.24.7': + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-optional-chaining@7.22.10(@babel/core@7.22.9): - resolution: {integrity: sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==} + '@babel/plugin-transform-optional-chaining@7.24.8': + resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) - dev: true - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} + '@babel/plugin-transform-parameters@7.24.7': + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + '@babel/plugin-transform-private-methods@7.25.4': + resolution: {integrity: sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-private-property-in-object@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==} + '@babel/plugin-transform-private-property-in-object@7.24.7': + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + '@babel/plugin-transform-property-literals@7.24.7': + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==} + '@babel/plugin-transform-regenerator@7.24.7': + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.1 - dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + '@babel/plugin-transform-reserved-words@7.24.7': + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-runtime@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==} + '@babel/plugin-transform-runtime@7.24.7': + resolution: {integrity: sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.9) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.9) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.9) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + '@babel/plugin-transform-shorthand-properties@7.24.7': + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + '@babel/plugin-transform-spread@7.24.7': + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + '@babel/plugin-transform-sticky-regex@7.24.7': + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + '@babel/plugin-transform-template-literals@7.24.7': + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + '@babel/plugin-transform-typeof-symbol@7.24.8': + resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==} + '@babel/plugin-transform-unicode-escapes@7.24.7': + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + '@babel/plugin-transform-unicode-property-regex@7.24.7': + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + '@babel/plugin-transform-unicode-regex@7.24.7': + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.9): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + '@babel/plugin-transform-unicode-sets-regex@7.25.4': + resolution: {integrity: sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.22.9) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/preset-env@7.22.9(@babel/core@7.22.9): - resolution: {integrity: sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==} + '@babel/preset-env@7.25.3': + resolution: {integrity: sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-async-generator-functions': 7.22.10(@babel/core@7.22.9) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-class-static-block': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.9) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-dynamic-import': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-export-namespace-from': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-json-strings': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-logical-assignment-operators': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-systemjs': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-numeric-separator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-object-rest-spread': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-optional-catch-binding': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-optional-chaining': 7.22.10(@babel/core@7.22.9) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-private-property-in-object': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-escapes': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.9) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.9) - '@babel/preset-modules': 0.1.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.9) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.9) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.9) - core-js-compat: 3.31.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.22.9): - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.9 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.9) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.9) - '@babel/types': 7.22.5 - esutils: 2.0.3 - dev: true + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - /@babel/regjsgen@0.8.0: + '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: true - /@babel/runtime@7.22.6: - resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - dev: true - /@babel/template@7.22.5: + '@babel/template@7.22.5': resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - dev: true - /@babel/traverse@7.22.10: + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.22.10': resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.10 - '@babel/types': 7.22.10 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/traverse@7.22.5: + '@babel/traverse@7.22.5': resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.7 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/types@7.22.10: + '@babel/traverse@7.25.4': + resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.22.10': resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: true - /@babel/types@7.22.5: + '@babel/types@7.22.5': resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: true - /@colors/colors@1.5.0: + '@babel/types@7.25.4': + resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} + engines: {node: '>=6.9.0'} + + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - dev: true - /@dabh/diagnostics@2.0.3: + '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 - dev: true - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - dev: true + '@discoveryjs/json-ext@0.6.1': + resolution: {integrity: sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==} + engines: {node: '>=14.17.0'} - /@esbuild/android-arm64@0.18.17: - resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.0': + resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - /@esbuild/android-arm64@0.19.2: - resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.18.17: - resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} + '@esbuild/android-arm64@0.23.0': + resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.2: - resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.23.0': + resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + engines: {node: '>=18'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.18.17: - resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.2: - resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.23.0': + resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} + engines: {node: '>=18'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.18.17: - resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.2: - resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.23.0': + resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.18.17: - resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.2: - resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.23.0': + resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.18.17: - resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.2: - resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.23.0': + resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.18.17: - resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.2: - resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.23.0': + resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.18.17: - resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.2: - resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.23.0': + resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.18.17: - resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.2: - resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.23.0': + resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.18.17: - resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.2: - resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.23.0': + resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.18.17: - resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.2: - resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.23.0': + resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.18.17: - resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.2: - resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.23.0': + resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.18.17: - resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.2: - resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.23.0': + resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.18.17: - resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.2: - resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.23.0': + resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.18.17: - resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.2: - resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.23.0': + resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.18.17: - resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.2: - resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.23.0': + resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.18.17: - resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.2: - resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.23.0': + resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.18.17: - resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} + '@esbuild/openbsd-arm64@0.23.0': + resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.2: - resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.23.0': + resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.18.17: - resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.2: - resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.23.0': + resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.18.17: - resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.2: - resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.23.0': + resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.18.17: - resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.2: - resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.23.0': + resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.18.17: - resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.2: - resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.23.0': + resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - dev: true + '@inquirer/checkbox@2.4.7': + resolution: {integrity: sha512-5YwCySyV1UEgqzz34gNsC38eKxRBtlRDpJLlKcRtTjlYA/yDKuc1rfw+hjw+2WJxbAZtaDPsRl5Zk7J14SBoBw==} + engines: {node: '>=18'} + + '@inquirer/confirm@3.1.22': + resolution: {integrity: sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==} + engines: {node: '>=18'} + + '@inquirer/core@9.0.10': + resolution: {integrity: sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==} + engines: {node: '>=18'} + + '@inquirer/editor@2.1.22': + resolution: {integrity: sha512-K1QwTu7GCK+nKOVRBp5HY9jt3DXOfPGPr6WRDrPImkcJRelG9UTx2cAtK1liXmibRrzJlTWOwqgWT3k2XnS62w==} + engines: {node: '>=18'} + + '@inquirer/expand@2.1.22': + resolution: {integrity: sha512-wTZOBkzH+ItPuZ3ZPa9lynBsdMp6kQ9zbjVPYEtSBG7UulGjg2kQiAnUjgyG4SlntpTce5bOmXAPvE4sguXjpA==} + engines: {node: '>=18'} + + '@inquirer/figures@1.0.5': + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + engines: {node: '>=18'} + + '@inquirer/input@2.2.9': + resolution: {integrity: sha512-7Z6N+uzkWM7+xsE+3rJdhdG/+mQgejOVqspoW+w0AbSZnL6nq5tGMEVASaYVWbkoSzecABWwmludO2evU3d31g==} + engines: {node: '>=18'} + + '@inquirer/number@1.0.10': + resolution: {integrity: sha512-kWTxRF8zHjQOn2TJs+XttLioBih6bdc5CcosXIzZsrTY383PXI35DuhIllZKu7CdXFi2rz2BWPN9l0dPsvrQOA==} + engines: {node: '>=18'} - /@isaacs/cliui@8.0.2: + '@inquirer/password@2.1.22': + resolution: {integrity: sha512-5Fxt1L9vh3rAKqjYwqsjU4DZsEvY/2Gll+QkqR4yEpy6wvzLxdSgFhUcxfDAOtO4BEoTreWoznC0phagwLU5Kw==} + engines: {node: '>=18'} + + '@inquirer/prompts@5.3.8': + resolution: {integrity: sha512-b2BudQY/Si4Y2a0PdZZL6BeJtl8llgeZa7U2j47aaJSCeAl1e4UI7y8a9bSkO3o/ZbZrgT5muy/34JbsjfIWxA==} + engines: {node: '>=18'} + + '@inquirer/rawlist@2.2.4': + resolution: {integrity: sha512-pb6w9pWrm7EfnYDgQObOurh2d2YH07+eDo3xQBsNAM2GRhliz6wFXGi1thKQ4bN6B0xDd6C3tBsjdr3obsCl3Q==} + engines: {node: '>=18'} + + '@inquirer/search@1.0.7': + resolution: {integrity: sha512-p1wpV+3gd1eST/o5N3yQpYEdFNCzSP0Klrl+5bfD3cTTz8BGG6nf4Z07aBW0xjlKIj1Rp0y3x/X4cZYi6TfcLw==} + engines: {node: '>=18'} + + '@inquirer/select@2.4.7': + resolution: {integrity: sha512-JH7XqPEkBpNWp3gPCqWqY8ECbyMoFcCZANlL6pV9hf59qK6dGmkOlx1ydyhY+KZ0c5X74+W6Mtp+nm2QX0/MAQ==} + engines: {node: '>=18'} + + '@inquirer/type@1.5.2': + resolution: {integrity: sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==} + engines: {node: '>=18'} + + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.0.1 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - dev: true - /@jridgewell/gen-mapping@0.3.2: + '@jridgewell/gen-mapping@0.3.2': resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 - dev: true - /@jridgewell/resolve-uri@3.1.0: + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.0': resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/set-array@1.1.2: + '@jridgewell/set-array@1.1.2': resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/source-map@0.3.3: + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.3': resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} - dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - dev: true - /@jridgewell/sourcemap-codec@1.4.14: + '@jridgewell/sourcemap-codec@1.4.14': resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - /@jridgewell/sourcemap-codec@1.4.15: + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - /@jridgewell/trace-mapping@0.3.17: + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.17': resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - /@leichtgewicht/ip-codec@2.0.4: + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.1.0': + resolution: {integrity: sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.3.0': + resolution: {integrity: sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@leichtgewicht/ip-codec@2.0.4': resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - dev: true - /@ngtools/webpack@16.2.0(@angular/compiler-cli@16.2.1)(typescript@5.1.6)(webpack@5.88.2): - resolution: {integrity: sha512-c9jv4r7GnLTpnPOeF+a9yAm/3/2wwl9lMBU32i9hlY+q/Hqde4PiL95bUOLnRRL1I64DV7BFTlSZqSPgDpFXZQ==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@listr2/prompt-adapter-inquirer@2.0.15': + resolution: {integrity: sha512-MZrGem/Ujjd4cPTLYDfCZK2iKKeiO/8OX13S6jqxldLs0Prf2aGqVlJ77nMBqMv7fzqgXEgjrNHLXcKR8l9lOg==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@inquirer/prompts': '>= 3 < 6' + + '@lmdb/lmdb-darwin-arm64@3.0.13': + resolution: {integrity: sha512-uiKPB0Fv6WEEOZjruu9a6wnW/8jrjzlZbxXscMB8kuCJ1k6kHpcBnuvaAWcqhbI7rqX5GKziwWEdD+wi2gNLfA==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@3.0.13': + resolution: {integrity: sha512-bEVIIfK5mSQoG1R19qA+fJOvCB+0wVGGnXHT3smchBVahYBdlPn2OsZZKzlHWfb1E+PhLBmYfqB5zQXFP7hJig==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-linux-arm64@3.0.13': + resolution: {integrity: sha512-afbVrsMgZ9dUTNUchFpj5VkmJRxvht/u335jUJ7o23YTbNbnpmXif3VKQGCtnjSh+CZaqm6N3CPG8KO3zwyZ1Q==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm@3.0.13': + resolution: {integrity: sha512-Yml1KlMzOnXj/tnW7yX8U78iAzTk39aILYvCPbqeewAq1kSzl+w59k/fiVkTBfvDi/oW/5YRxL+Fq+Y1Fr1r2Q==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-x64@3.0.13': + resolution: {integrity: sha512-vOtxu0xC0SLdQ2WRXg8Qgd8T32ak4SPqk5zjItRszrJk2BdeXqfGxBJbP7o4aOvSPSmSSv46Lr1EP4HXU8v7Kg==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-win32-x64@3.0.13': + resolution: {integrity: sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA==} + cpu: [x64] + os: [win32] + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@ngtools/webpack@18.2.1': + resolution: {integrity: sha512-v86U3jOoy5R9ZWe9Q0LbHRx/IBw1lbn0ldBU+gIIepREyVvb9CcH/vAyIb2Fw1zaYvvfG1OyzdrHyW8iGXjdnQ==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler-cli': ^16.0.0 - typescript: '>=4.9.3 <5.2' + '@angular/compiler-cli': ^18.0.0 + typescript: '>=5.4 <5.6' webpack: ^5.54.0 - dependencies: - '@angular/compiler-cli': 16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6) - typescript: 5.1.6 - webpack: 5.88.2(esbuild@0.18.17) - dev: true - /@ngx-grpc/common@3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1): + '@ngx-grpc/common@3.1.2': resolution: {integrity: sha512-8HvfXDNFrY2oFhkxchHQF2pku1+1sA+MUHcnALURkPE0yvTuqYGkuL7XVxTBImJMZaHiiV7YhFMYDUDOC1ISPg==} peerDependencies: google-protobuf: ^3.10.0 rxjs: '>=6.0.0' - dependencies: - google-protobuf: 3.21.2 - rxjs: 7.8.1 - tslib: 2.6.2 - dev: false - /@ngx-grpc/core@3.1.2(@angular/core@16.2.1)(@ngx-grpc/common@3.1.2)(rxjs@7.8.1): + '@ngx-grpc/core@3.1.2': resolution: {integrity: sha512-h4CFRPvTFdvk94M6TkHeGlTA6edbIEDd6o0H5KLWVzrwRH1mUH0oX6+GXjulZfm7u1qY+mhX/913wrd86UTYbg==} peerDependencies: '@angular/core': '>=12.0.0' '@ngx-grpc/common': 3.1.2 rxjs: '>=6.0.0' - dependencies: - '@angular/core': 16.2.1(rxjs@7.8.1)(zone.js@0.13.1) - '@ngx-grpc/common': 3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1) - rxjs: 7.8.1 - tslib: 2.6.2 - dev: false - /@ngx-grpc/protoc-gen-ng@3.1.2: + '@ngx-grpc/protoc-gen-ng@3.1.2': resolution: {integrity: sha512-epOAs0hEXT2l9l4jjXgaxB5TPtg6AWYq3uRl1vIo7vNHj7qsg0sMIOhxV+bPgZ93YOfKCQkemklt7koKDRJyIw==} hasBin: true - dependencies: - google-protobuf: 3.21.2 - prettier: 1.19.1 - tslib: 2.6.2 - winston: 3.8.2 - dev: true - /@ngx-grpc/well-known-types@3.1.2(@ngx-grpc/common@3.1.2)(google-protobuf@3.21.2): + '@ngx-grpc/well-known-types@3.1.2': resolution: {integrity: sha512-otJ8C/NuLwm4JuvqzTT/xAHLJJN/EpkowooKgVGzXOnfTckzp5OWiUmBdxBk/pXo234CTT42KvOnDMtSloa+sA==} peerDependencies: '@ngx-grpc/common': 3.1.2 google-protobuf: ^3.10.0 - dependencies: - '@ngx-grpc/common': 3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1) - google-protobuf: 3.21.2 - tslib: 2.6.2 - dev: false - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - /@npmcli/fs@2.1.2: - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.5.4 - dev: true + '@npmcli/agent@2.2.2': + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} - /@npmcli/fs@3.1.0: + '@npmcli/fs@3.1.0': resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - semver: 7.5.3 - dev: true - /@npmcli/git@4.0.4: - resolution: {integrity: sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/promise-spawn': 6.0.2 - lru-cache: 7.18.3 - npm-pick-manifest: 8.0.1 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.4 - which: 3.0.0 - transitivePeerDependencies: - - bluebird - dev: true + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} - /@npmcli/installed-package-contents@2.0.2: + '@npmcli/installed-package-contents@2.0.2': resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.0 - dev: true - /@npmcli/move-file@2.0.1: - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true + '@npmcli/node-gyp@3.0.0': + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.2.0': + resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/redact@2.0.1': + resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/run-script@8.1.0': + resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.2.3': + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.0.2': + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.20.0': + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.21.1': + resolution: {integrity: sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.20.0': + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.21.1': + resolution: {integrity: sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.20.0': + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.21.1': + resolution: {integrity: sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.20.0': + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.21.1': + resolution: {integrity: sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.21.1': + resolution: {integrity: sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.21.1': + resolution: {integrity: sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.21.1': + resolution: {integrity: sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.20.0': + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.21.1': + resolution: {integrity: sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': + resolution: {integrity: sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.21.1': + resolution: {integrity: sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.21.1': + resolution: {integrity: sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.20.0': + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.21.1': + resolution: {integrity: sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.20.0': + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.21.1': + resolution: {integrity: sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.21.1': + resolution: {integrity: sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.21.1': + resolution: {integrity: sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.20.0': + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.21.1': + resolution: {integrity: sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==} + cpu: [x64] + os: [win32] + + '@rollup/wasm-node@4.21.1': + resolution: {integrity: sha512-U91HbBWWbyevXQAsW5/NTbfsOP1QoKFeyuQNWbo2dQTnfx5W1iVq7Ma1ul+Kp36oj5Cb8nj8D7e1PlRc02u/oQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + '@schematics/angular@18.2.1': + resolution: {integrity: sha512-bBV7I+MCbdQmBPUFF4ECg37VReM0+AdQsxgwkjBBSYExmkErkDoDgKquwL/tH7stDCc5IfTd0g9BMeosRgDMug==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@sigstore/bundle@2.3.2': + resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/core@1.1.0': + resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/protobuf-specs@0.3.2': + resolution: {integrity: sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/sign@2.3.2': + resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/tuf@2.3.4': + resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/verify@1.2.1': + resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@socket.io/component-emitter@3.1.0': + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + + '@tufjs/canonical-json@2.0.0': + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tufjs/models@2.0.1': + resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@types/body-parser@1.19.2': + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.35': + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/cors@2.8.13': + resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} + + '@types/eslint-scope@3.7.4': + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + + '@types/eslint@8.37.0': + resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.17.33': + resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/google-protobuf@3.15.6': + resolution: {integrity: sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/http-proxy@1.17.10': + resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} + + '@types/jasmine@4.3.5': + resolution: {integrity: sha512-9YHUdvuNDDRJYXZwHqSsO72Ok0vmqoJbNn73ttyITQp/VA60SarnZ+MPLD37rJAhVoKp+9BWOvJP5tHIRfZylQ==} + + '@types/json-schema@7.0.11': + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@18.15.11': + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + + '@types/node@22.5.0': + resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==} + + '@types/qs@6.9.7': + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + + '@types/range-parser@1.2.4': + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/triple-beam@1.3.2': + resolution: {integrity: sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==} + + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + + '@types/ws@8.5.12': + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + + '@vitejs/plugin-basic-ssl@1.1.0': + resolution: {integrity: sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==} + engines: {node: '>=14.6.0'} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + + adjust-sourcemap-loader@4.0.0: + resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} + engines: {node: '>=8.9'} + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-loader@9.1.3: + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacache@18.0.4: + resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001521: + resolution: {integrity: sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==} + + caniuse-lite@1.0.30001653: + resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.7.0: + resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} + engines: {node: '>=6'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + copy-webpack-plugin@12.0.2: + resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.1.0 + + core-js-compat@3.38.1: + resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + critters@0.0.24: + resolution: {integrity: sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-loader@7.1.2: + resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + custom-event@1.0.1: + resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} + + date-format@4.0.14: + resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} + engines: {node: '>=4.0'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dependency-graph@1.0.0: + resolution: {integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==} + engines: {node: '>=4'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + di@0.0.1: + resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} + + dns-packet@5.5.0: + resolution: {integrity: sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA==} + engines: {node: '>=6'} + + dom-serialize@2.2.1: + resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.4.496: + resolution: {integrity: sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==} + + electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + engine.io-parser@5.0.6: + resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} + engines: {node: '>=10.0.0'} + + engine.io@6.4.1: + resolution: {integrity: sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==} + engines: {node: '>=10.0.0'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + ent@2.2.0: + resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-module-lexer@1.2.1: + resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} + + esbuild-wasm@0.23.0: + resolution: {integrity: sha512-6jP8UmWy6R6TUUV8bMuC3ZyZ6lZKI56x0tkxyCIqWwRRJ/DgeQKneh/Oid5EoGoPFLrGNkz47ZEtWAYuiY/u9g==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.0: + resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + + express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.1: + resolution: {integrity: sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-intrinsic@1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.2.3: + resolution: {integrity: sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + + google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http-proxy-middleware@2.0.6: + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy-middleware@3.0.0: + resolution: {integrity: sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-walk@6.0.5: + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immutable@4.3.0: + resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + injection-js@2.4.0: + resolution: {integrity: sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + + jackspeak@2.2.0: + resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==} + engines: {node: '>=14'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jasmine-core@4.6.0: + resolution: {integrity: sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==} + + jasmine-core@5.1.0: + resolution: {integrity: sha512-bFMMwpKuTZXCuGd51yClFobw5SOtad1kmdWnYO8dNwYV8i01Xj0C2+nyQpSKl1EKxiPfyd1ZgBl/rsusL3aS6w==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + karma-chrome-launcher@3.2.0: + resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==} + + karma-coverage@2.2.1: + resolution: {integrity: sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==} + engines: {node: '>=10.0.0'} + + karma-jasmine-html-reporter@2.1.0: + resolution: {integrity: sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==} + peerDependencies: + jasmine-core: ^4.0.0 || ^5.0.0 + karma: ^6.0.0 + karma-jasmine: ^5.0.0 + + karma-jasmine@5.1.0: + resolution: {integrity: sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==} + engines: {node: '>=12'} + peerDependencies: + karma: ^6.0.0 + + karma-source-map-support@1.4.0: + resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} + + karma@6.4.2: + resolution: {integrity: sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==} + engines: {node: '>= 10'} + hasBin: true + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + launch-editor@2.8.1: + resolution: {integrity: sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==} + + less-loader@12.2.0: + resolution: {integrity: sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + + license-webpack-plugin@4.0.2: + resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} + peerDependencies: + webpack: '*' + peerDependenciesMeta: + webpack: + optional: true + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} + engines: {node: '>=18.0.0'} + + lmdb@3.0.13: + resolution: {integrity: sha512-UGe+BbaSUQtAMZobTb4nHvFMrmvuAQKSeaqAX2meTEQjfsbpl5sxdHD8T72OnwD4GU9uwNhYXIVe4QGs8N9Zyw==} + hasBin: true + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + log4js@6.9.1: + resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} + engines: {node: '>=8.0'} + + logform@2.5.1: + resolution: {integrity: sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@9.1.1: + resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==} + engines: {node: 14 || >=16.14} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-fetch-happen@13.0.1: + resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} + engines: {node: ^16.14.0 || >=18.0.0} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@4.11.1: + resolution: {integrity: sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==} + engines: {node: '>= 4.0.0'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mini-css-extract-plugin@2.9.0: + resolution: {integrity: sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.0: + resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@3.0.1: + resolution: {integrity: sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.5: + resolution: {integrity: sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.0: + resolution: {integrity: sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + needle@3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + ng-packagr@18.2.1: + resolution: {integrity: sha512-dy9ZDpZb3QpAz+Y/m8VAu7ctr2VrnRU3gmQwJagnNybVJtCsKn3lZA3IW7Z7GTLoG5IALSPouiCgiB/C8ozv7w==} + engines: {node: ^18.19.1 || >=20.11.1} + hasBin: true + peerDependencies: + '@angular/compiler-cli': ^18.0.0 || ^18.2.0-next.0 + tailwindcss: ^2.0.0 || ^3.0.0 + tslib: ^2.3.0 + typescript: '>=5.4 <5.6' + peerDependenciesMeta: + tailwindcss: + optional: true + + nice-napi@1.0.2: + resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} + os: ['!win32'] + + node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-gyp-build@4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true + + node-gyp@10.2.0: + resolution: {integrity: sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-bundled@3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-install-checks@6.1.0: + resolution: {integrity: sha512-udSGENih/5xKh3Ex+L0PtZcOt0Pa+6ppDLnpG5D49/EhMja3LupaY9E/DtJTxyFBwE09ot7Fc+H4DywnZNWTVA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.0: + resolution: {integrity: sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-packlist@8.0.2: + resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-pick-manifest@9.1.0: + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-registry-fetch@17.1.0: + resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + ordered-binary@1.5.1: + resolution: {integrity: sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-retry@6.2.0: + resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} + engines: {node: '>=16.17'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + pacote@18.0.6: + resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse5-html-rewriting-stream@7.0.0: + resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==} + + parse5-sax-parser@7.0.0: + resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@1.8.0: + resolution: {integrity: sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==} + engines: {node: '>=16 || 14 >=14.17'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + piscina@4.6.1: + resolution: {integrity: sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + postcss-loader@8.1.1: + resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.0.5: + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.0: + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-selector-parser@6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + prettier@1.19.1: + resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} + engines: {node: '>=4'} + hasBin: true + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + qjobs@1.2.0: + resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} + engines: {node: '>=0.9'} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + regenerate-unicode-properties@10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regex-parser@2.2.11: + resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-url-loader@5.0.0: + resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} + engines: {node: '>=12'} + + resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.21.1: + resolution: {integrity: sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass-loader@16.0.0: + resolution: {integrity: sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + webpack: + optional: true + + sass@1.77.6: + resolution: {integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.0.0: + resolution: {integrity: sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==} + engines: {node: '>= 12.13.0'} + + schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + + semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sigstore@2.3.1: + resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socket.io-adapter@2.5.2: + resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + + socket.io-parser@4.2.2: + resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} + engines: {node: '>=10.0.0'} + + socket.io@4.6.1: + resolution: {integrity: sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==} + engines: {node: '>=10.0.0'} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + socks-proxy-agent@8.0.4: + resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + engines: {node: '>= 14'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-loader@5.0.0: + resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.72.1 + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssri@10.0.1: + resolution: {integrity: sha512-WVy6di9DlPOeBWEjMScpNipeSX2jIZBGEn5Uuo8Q7aIuFEuDX0pw8RxcOjlD1TWP4obi24ki7m/13+nFpcbXrw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + streamroller@3.1.5: + resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} + engines: {node: '>=8.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar@6.1.13: + resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} + engines: {node: '>=10'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.6: + resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} + engines: {node: '>=10'} + hasBin: true + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + triple-beam@1.3.0: + resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tuf-js@2.2.1: + resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} + engines: {node: ^16.14.0 || >=18.0.0} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-assert@1.0.9: + resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@0.7.35: + resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.0.11: + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite@5.4.0: + resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + void-elements@2.0.1: + resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} + engines: {node: '>=0.10.0'} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + + webpack-dev-middleware@7.3.0: + resolution: {integrity: sha512-xD2qnNew+F6KwOGZR7kWdbIou/ud7cVqLEXeK1q0nHcNsX/u7ul/fSdlOTX4ntSL5FNFy7ZJJXbf0piF591JYw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.0.4: + resolution: {integrity: sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-subresource-integrity@5.1.0: + resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} + engines: {node: '>= 12'} + peerDependencies: + html-webpack-plugin: '>= 5.0.0-beta.1 < 6' + webpack: ^5.12.0 + peerDependenciesMeta: + html-webpack-plugin: + optional: true + + webpack@5.93.0: + resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + winston-transport@4.5.0: + resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} + engines: {node: '>= 6.4.0'} + + winston@3.8.2: + resolution: {integrity: sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==} + engines: {node: '>= 12.0.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zone.js@0.14.10: + resolution: {integrity: sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==} + +snapshots: + + '@ampproject/remapping@2.2.1': + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@angular-devkit/architect@0.1802.1(chokidar@3.6.0)': + dependencies: + '@angular-devkit/core': 18.2.1(chokidar@3.6.0) + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/build-angular@18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@types/node@22.5.0)(chokidar@3.6.0)(karma@6.4.2)(ng-packagr@18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(tslib@2.6.2)(typescript@5.5.4))(typescript@5.5.4)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.1802.1(chokidar@3.6.0) + '@angular-devkit/build-webpack': 0.1802.1(chokidar@3.6.0)(webpack-dev-server@5.0.4(webpack@5.93.0))(webpack@5.93.0(esbuild@0.23.0)) + '@angular-devkit/core': 18.2.1(chokidar@3.6.0) + '@angular/build': 18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@types/node@22.5.0)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.41)(terser@5.31.6)(typescript@5.5.4) + '@angular/compiler-cli': 18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4) + '@babel/core': 7.25.2 + '@babel/generator': 7.25.0 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.25.2) + '@babel/preset-env': 7.25.3(@babel/core@7.25.2) + '@babel/runtime': 7.25.0 + '@discoveryjs/json-ext': 0.6.1 + '@ngtools/webpack': 18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(typescript@5.5.4)(webpack@5.93.0(esbuild@0.23.0)) + '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.4.0(@types/node@22.5.0)(less@4.2.0)(sass@1.77.6)(terser@5.31.6)) + ansi-colors: 4.1.3 + autoprefixer: 10.4.20(postcss@8.4.41) + babel-loader: 9.1.3(@babel/core@7.25.2)(webpack@5.93.0(esbuild@0.23.0)) + browserslist: 4.21.10 + copy-webpack-plugin: 12.0.2(webpack@5.93.0(esbuild@0.23.0)) + critters: 0.0.24 + css-loader: 7.1.2(webpack@5.93.0(esbuild@0.23.0)) + esbuild-wasm: 0.23.0 + fast-glob: 3.3.2 + http-proxy-middleware: 3.0.0 + https-proxy-agent: 7.0.5 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + karma-source-map-support: 1.4.0 + less: 4.2.0 + less-loader: 12.2.0(less@4.2.0)(webpack@5.93.0(esbuild@0.23.0)) + license-webpack-plugin: 4.0.2(webpack@5.93.0(esbuild@0.23.0)) + loader-utils: 3.3.1 + magic-string: 0.30.11 + mini-css-extract-plugin: 2.9.0(webpack@5.93.0(esbuild@0.23.0)) + mrmime: 2.0.0 + open: 10.1.0 + ora: 5.4.1 + parse5-html-rewriting-stream: 7.0.0 + picomatch: 4.0.2 + piscina: 4.6.1 + postcss: 8.4.41 + postcss-loader: 8.1.1(postcss@8.4.41)(typescript@5.5.4)(webpack@5.93.0(esbuild@0.23.0)) + resolve-url-loader: 5.0.0 + rxjs: 7.8.1 + sass: 1.77.6 + sass-loader: 16.0.0(sass@1.77.6)(webpack@5.93.0(esbuild@0.23.0)) + semver: 7.6.3 + source-map-loader: 5.0.0(webpack@5.93.0(esbuild@0.23.0)) + source-map-support: 0.5.21 + terser: 5.31.6 + tree-kill: 1.2.2 + tslib: 2.6.3 + typescript: 5.5.4 + vite: 5.4.0(@types/node@22.5.0)(less@4.2.0)(sass@1.77.6)(terser@5.31.6) + watchpack: 2.4.1 + webpack: 5.93.0(esbuild@0.23.0) + webpack-dev-middleware: 7.3.0(webpack@5.93.0) + webpack-dev-server: 5.0.4(webpack@5.93.0) + webpack-merge: 6.0.1 + webpack-subresource-integrity: 5.1.0(webpack@5.93.0(esbuild@0.23.0)) + optionalDependencies: + esbuild: 0.23.0 + karma: 6.4.2 + ng-packagr: 18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(tslib@2.6.2)(typescript@5.5.4) + transitivePeerDependencies: + - '@rspack/core' + - '@swc/core' + - '@types/node' + - bufferutil + - chokidar + - debug + - html-webpack-plugin + - lightningcss + - node-sass + - sass-embedded + - stylus + - sugarss + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + + '@angular-devkit/build-webpack@0.1802.1(chokidar@3.6.0)(webpack-dev-server@5.0.4(webpack@5.93.0))(webpack@5.93.0(esbuild@0.23.0))': + dependencies: + '@angular-devkit/architect': 0.1802.1(chokidar@3.6.0) + rxjs: 7.8.1 + webpack: 5.93.0(esbuild@0.23.0) + webpack-dev-server: 5.0.4(webpack@5.93.0) + transitivePeerDependencies: + - chokidar + + '@angular-devkit/core@18.2.1(chokidar@3.6.0)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 3.6.0 + + '@angular-devkit/schematics@18.2.1(chokidar@3.6.0)': + dependencies: + '@angular-devkit/core': 18.2.1(chokidar@3.6.0) + jsonc-parser: 3.3.1 + magic-string: 0.30.11 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + + '@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))': + dependencies: + '@angular/core': 18.2.1(rxjs@7.8.1)(zone.js@0.14.10) + tslib: 2.6.2 + + '@angular/build@18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(@types/node@22.5.0)(chokidar@3.6.0)(less@4.2.0)(postcss@8.4.41)(terser@5.31.6)(typescript@5.5.4)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.1802.1(chokidar@3.6.0) + '@angular/compiler-cli': 18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4) + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@inquirer/confirm': 3.1.22 + '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.4.0(@types/node@22.5.0)(less@4.2.0)(sass@1.77.6)(terser@5.31.6)) + browserslist: 4.23.3 + critters: 0.0.24 + esbuild: 0.23.0 + fast-glob: 3.3.2 + https-proxy-agent: 7.0.5 + listr2: 8.2.4 + lmdb: 3.0.13 + magic-string: 0.30.11 + mrmime: 2.0.0 + parse5-html-rewriting-stream: 7.0.0 + picomatch: 4.0.2 + piscina: 4.6.1 + rollup: 4.20.0 + sass: 1.77.6 + semver: 7.6.3 + typescript: 5.5.4 + vite: 5.4.0(@types/node@22.5.0)(less@4.2.0)(sass@1.77.6)(terser@5.31.6) + watchpack: 2.4.1 + optionalDependencies: + less: 4.2.0 + postcss: 8.4.41 + transitivePeerDependencies: + - '@types/node' + - chokidar + - lightningcss + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + '@angular/cli@18.2.1(chokidar@3.6.0)': + dependencies: + '@angular-devkit/architect': 0.1802.1(chokidar@3.6.0) + '@angular-devkit/core': 18.2.1(chokidar@3.6.0) + '@angular-devkit/schematics': 18.2.1(chokidar@3.6.0) + '@inquirer/prompts': 5.3.8 + '@listr2/prompt-adapter-inquirer': 2.0.15(@inquirer/prompts@5.3.8) + '@schematics/angular': 18.2.1(chokidar@3.6.0) + '@yarnpkg/lockfile': 1.1.0 + ini: 4.1.3 + jsonc-parser: 3.3.1 + listr2: 8.2.4 + npm-package-arg: 11.0.3 + npm-pick-manifest: 9.1.0 + pacote: 18.0.6 + resolve: 1.22.8 + semver: 7.6.3 + symbol-observable: 4.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - bluebird + - chokidar + - supports-color + + '@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1)': + dependencies: + '@angular/core': 18.2.1(rxjs@7.8.1)(zone.js@0.14.10) + rxjs: 7.8.1 + tslib: 2.6.2 + + '@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4)': + dependencies: + '@angular/compiler': 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)) + '@babel/core': 7.25.2 + '@jridgewell/sourcemap-codec': 1.4.15 + chokidar: 3.5.3 + convert-source-map: 1.9.0 + reflect-metadata: 0.2.2 + semver: 7.5.4 + tslib: 2.6.2 + typescript: 5.5.4 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))': + dependencies: + tslib: 2.6.2 + optionalDependencies: + '@angular/core': 18.2.1(rxjs@7.8.1)(zone.js@0.14.10) + + '@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)': + dependencies: + rxjs: 7.8.1 + tslib: 2.6.2 + zone.js: 0.14.10 + + '@angular/forms@18.2.1(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1)': + dependencies: + '@angular/common': 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) + '@angular/core': 18.2.1(rxjs@7.8.1)(zone.js@0.14.10) + '@angular/platform-browser': 18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)) + rxjs: 7.8.1 + tslib: 2.6.2 + + '@angular/platform-browser-dynamic@18.2.1(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))': + dependencies: + '@angular/common': 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) + '@angular/compiler': 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)) + '@angular/core': 18.2.1(rxjs@7.8.1)(zone.js@0.14.10) + '@angular/platform-browser': 18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)) + tslib: 2.6.2 + + '@angular/platform-browser@18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))': + dependencies: + '@angular/common': 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) + '@angular/core': 18.2.1(rxjs@7.8.1)(zone.js@0.14.10) + tslib: 2.6.2 + optionalDependencies: + '@angular/animations': 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)) + + '@angular/router@18.2.1(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1)': + dependencies: + '@angular/common': 18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) + '@angular/core': 18.2.1(rxjs@7.8.1)(zone.js@0.14.10) + '@angular/platform-browser': 18.2.1(@angular/animations@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)) + rxjs: 7.8.1 + tslib: 2.6.2 + + '@babel/code-frame@7.22.10': + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + + '@babel/code-frame@7.22.5': + dependencies: + '@babel/highlight': 7.22.5 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.0 + + '@babel/compat-data@7.22.9': {} + + '@babel/compat-data@7.25.4': {} + + '@babel/core@7.22.5': + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.7 + '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/helper-module-transforms': 7.22.5 + '@babel/helpers': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.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/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.4 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.22.10': + dependencies: + '@babel/types': 7.22.10 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + + '@babel/generator@7.22.7': + dependencies: + '@babel/types': 7.22.10 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + + '@babel/generator@7.25.0': + dependencies: + '@babel/types': 7.25.4 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/generator@7.25.5': + dependencies: + '@babel/types': 7.25.4 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.25.4 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5)': + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.22.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-environment-visitor@7.22.5': {} + + '@babel/helper-function-name@7.22.5': + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.22.10 + + '@babel/helper-member-expression-to-functions@7.24.8': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.22.5': + dependencies: + '@babel/types': 7.22.10 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.22.5': + dependencies: + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.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.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.25.4 + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-wrap-function': 7.25.0 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.22.5': + dependencies: + '@babel/types': 7.22.10 + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.22.10 + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.25.4 + + '@babel/helper-string-parser@7.22.5': {} + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.22.5': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.22.5': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helper-wrap-function@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.22.5': + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 + + '@babel/highlight@7.22.10': + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/highlight@7.22.5': + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.22.10': + dependencies: + '@babel/types': 7.22.10 + + '@babel/parser@7.22.5': + dependencies: + '@babel/types': 7.22.5 + + '@babel/parser@7.25.4': + dependencies: + '@babel/types': 7.25.4 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/traverse': 7.25.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 + + '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + + '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + + '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + + '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-runtime@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-sets-regex@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/preset-env@7.25.3(@babel/core@7.25.2)': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.25.4(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.22.10 + esutils: 2.0.3 + + '@babel/regjsgen@0.8.0': {} + + '@babel/runtime@7.25.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.22.5': + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + + '@babel/traverse@7.22.10': + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.22.5': + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.25.4': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.5 + '@babel/parser': 7.25.4 + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.22.10': + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + + '@babel/types@7.22.5': + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + + '@babel/types@7.25.4': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@colors/colors@1.5.0': {} + + '@dabh/diagnostics@2.0.3': + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + + '@discoveryjs/json-ext@0.6.1': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.0': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.0': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.0': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.0': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.0': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.0': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.0': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.0': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.0': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.0': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.0': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.0': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.0': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.0': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.0': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.0': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.0': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.0': + optional: true + + '@esbuild/openbsd-arm64@0.23.0': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.0': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.0': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.0': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.0': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.0': + optional: true + + '@inquirer/checkbox@2.4.7': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.2 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/confirm@3.1.22': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/type': 1.5.2 + + '@inquirer/core@9.0.10': + dependencies: + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.2 + '@types/mute-stream': 0.0.4 + '@types/node': 22.5.0 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/editor@2.1.22': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/type': 1.5.2 + external-editor: 3.1.0 + + '@inquirer/expand@2.1.22': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/type': 1.5.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.5': {} + + '@inquirer/input@2.2.9': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/type': 1.5.2 + + '@inquirer/number@1.0.10': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/type': 1.5.2 + + '@inquirer/password@2.1.22': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/type': 1.5.2 + ansi-escapes: 4.3.2 + + '@inquirer/prompts@5.3.8': + dependencies: + '@inquirer/checkbox': 2.4.7 + '@inquirer/confirm': 3.1.22 + '@inquirer/editor': 2.1.22 + '@inquirer/expand': 2.1.22 + '@inquirer/input': 2.2.9 + '@inquirer/number': 1.0.10 + '@inquirer/password': 2.1.22 + '@inquirer/rawlist': 2.2.4 + '@inquirer/search': 1.0.7 + '@inquirer/select': 2.4.7 + + '@inquirer/rawlist@2.2.4': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/type': 1.5.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/search@1.0.7': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/select@2.4.7': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.2 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/type@1.5.2': + dependencies: + mute-stream: 1.0.0 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.2': + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.17 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.0': {} + + '@jridgewell/set-array@1.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.3': + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + + '@jridgewell/sourcemap-codec@1.4.14': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.17': + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@jsonjoy.com/base64@1.1.2(tslib@2.6.3)': + dependencies: + tslib: 2.6.3 + + '@jsonjoy.com/json-pack@1.1.0(tslib@2.6.3)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.6.3) + '@jsonjoy.com/util': 1.3.0(tslib@2.6.3) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.6.3) + tslib: 2.6.3 + + '@jsonjoy.com/util@1.3.0(tslib@2.6.3)': + dependencies: + tslib: 2.6.3 + + '@leichtgewicht/ip-codec@2.0.4': {} + + '@listr2/prompt-adapter-inquirer@2.0.15(@inquirer/prompts@5.3.8)': + dependencies: + '@inquirer/prompts': 5.3.8 + '@inquirer/type': 1.5.2 + + '@lmdb/lmdb-darwin-arm64@3.0.13': + optional: true + + '@lmdb/lmdb-darwin-x64@3.0.13': + optional: true + + '@lmdb/lmdb-linux-arm64@3.0.13': + optional: true + + '@lmdb/lmdb-linux-arm@3.0.13': + optional: true + + '@lmdb/lmdb-linux-x64@3.0.13': + optional: true + + '@lmdb/lmdb-win32-x64@3.0.13': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@ngtools/webpack@18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(typescript@5.5.4)(webpack@5.93.0(esbuild@0.23.0))': + dependencies: + '@angular/compiler-cli': 18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4) + typescript: 5.5.4 + webpack: 5.93.0(esbuild@0.23.0) + + '@ngx-grpc/common@3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1)': + dependencies: + google-protobuf: 3.21.2 + rxjs: 7.8.1 + tslib: 2.6.2 + + '@ngx-grpc/core@3.1.2(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10))(@ngx-grpc/common@3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1))(rxjs@7.8.1)': + dependencies: + '@angular/core': 18.2.1(rxjs@7.8.1)(zone.js@0.14.10) + '@ngx-grpc/common': 3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1) + rxjs: 7.8.1 + tslib: 2.6.2 + + '@ngx-grpc/protoc-gen-ng@3.1.2': + dependencies: + google-protobuf: 3.21.2 + prettier: 1.19.1 + tslib: 2.6.2 + winston: 3.8.2 + + '@ngx-grpc/well-known-types@3.1.2(@ngx-grpc/common@3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1))(google-protobuf@3.21.2)': + dependencies: + '@ngx-grpc/common': 3.1.2(google-protobuf@3.21.2)(rxjs@7.8.1) + google-protobuf: 3.21.2 + tslib: 2.6.2 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + '@npmcli/agent@2.2.2': + dependencies: + agent-base: 7.1.1 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@3.1.0': + dependencies: + semver: 7.6.3 + + '@npmcli/git@5.0.8': + dependencies: + '@npmcli/promise-spawn': 7.0.2 + ini: 4.1.3 + lru-cache: 10.4.3 + npm-pick-manifest: 9.1.0 + proc-log: 4.2.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.6.3 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + + '@npmcli/installed-package-contents@2.0.2': + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.0 + + '@npmcli/node-gyp@3.0.0': {} + + '@npmcli/package-json@5.2.0': + dependencies: + '@npmcli/git': 5.0.8 + glob: 10.2.3 + hosted-git-info: 7.0.2 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 6.0.2 + proc-log: 4.2.0 + semver: 7.6.3 + transitivePeerDependencies: + - bluebird + + '@npmcli/promise-spawn@7.0.2': + dependencies: + which: 4.0.0 + + '@npmcli/redact@2.0.1': {} + + '@npmcli/run-script@8.1.0': + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/package-json': 5.2.0 + '@npmcli/promise-spawn': 7.0.2 + node-gyp: 10.2.0 + proc-log: 4.2.0 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + - supports-color + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/plugin-json@6.1.0(rollup@4.21.1)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.21.1) + optionalDependencies: + rollup: 4.21.1 + + '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.1)': + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@4.21.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + optionalDependencies: + rollup: 4.21.1 + + '@rollup/pluginutils@5.0.2(rollup@4.21.1)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.1 + + '@rollup/pluginutils@5.1.0(rollup@4.21.1)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.1 + + '@rollup/rollup-android-arm-eabi@4.20.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.21.1': + optional: true + + '@rollup/rollup-android-arm64@4.20.0': + optional: true + + '@rollup/rollup-android-arm64@4.21.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.1': + optional: true + + '@rollup/rollup-darwin-x64@4.20.0': + optional: true + + '@rollup/rollup-darwin-x64@4.21.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + optional: true - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@rollup/rollup-win32-arm64-msvc@4.21.1': + optional: true - /@npmcli/promise-spawn@6.0.2: - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - which: 3.0.0 - dev: true + '@rollup/rollup-win32-ia32-msvc@4.20.0': + optional: true - /@npmcli/run-script@6.0.0: - resolution: {integrity: sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.3.1 - read-package-json-fast: 3.0.2 - which: 3.0.0 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true + '@rollup/rollup-win32-ia32-msvc@4.21.1': + optional: true - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-msvc@4.20.0': optional: true - /@rollup/plugin-json@6.0.0(rollup@3.25.3): - resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/rollup-win32-x64-msvc@4.21.1': + optional: true + + '@rollup/wasm-node@4.21.1': dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.25.3) - rollup: 3.25.3 - dev: true + '@types/estree': 1.0.5 + optionalDependencies: + fsevents: 2.3.3 - /@rollup/plugin-node-resolve@15.0.1(rollup@3.25.3): - resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@schematics/angular@18.2.1(chokidar@3.6.0)': dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.25.3) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-builtin-module: 3.2.1 - is-module: 1.0.0 - resolve: 1.22.2 - rollup: 3.25.3 - dev: true + '@angular-devkit/core': 18.2.1(chokidar@3.6.0) + '@angular-devkit/schematics': 18.2.1(chokidar@3.6.0) + jsonc-parser: 3.3.1 + transitivePeerDependencies: + - chokidar - /@rollup/pluginutils@5.0.2(rollup@3.25.3): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@sigstore/bundle@2.3.2': dependencies: - '@types/estree': 1.0.0 - estree-walker: 2.0.2 - picomatch: 2.3.1 - rollup: 3.25.3 - dev: true + '@sigstore/protobuf-specs': 0.3.2 + + '@sigstore/core@1.1.0': {} - /@schematics/angular@16.2.0: - resolution: {integrity: sha512-Ib0/ZCkjWt7a5p3209JVwEWwf41v03K3ylvlxLIEo1ZGijAZAlrBj4GrA5YQ+TmPm2hRyt+owss7x91/x+i0Gw==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@sigstore/protobuf-specs@0.3.2': {} + + '@sigstore/sign@2.3.2': dependencies: - '@angular-devkit/core': 16.2.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.2.0 - jsonc-parser: 3.2.0 + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + make-fetch-happen: 13.0.1 + proc-log: 4.2.0 + promise-retry: 2.0.1 transitivePeerDependencies: - - chokidar - dev: true + - supports-color - /@sigstore/protobuf-specs@0.1.0: - resolution: {integrity: sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@sigstore/tuf@2.3.4': + dependencies: + '@sigstore/protobuf-specs': 0.3.2 + tuf-js: 2.2.1 + transitivePeerDependencies: + - supports-color - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: true + '@sigstore/verify@1.2.1': + dependencies: + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 - /@tootallnate/once@1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - dev: true + '@sindresorhus/merge-streams@2.3.0': {} - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true + '@socket.io/component-emitter@3.1.0': {} - /@tufjs/canonical-json@1.0.0: - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@tufjs/canonical-json@2.0.0': {} - /@tufjs/models@1.0.4: - resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@tufjs/models@2.0.1': dependencies: - '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.0 - dev: true + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.5 - /@types/body-parser@1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + '@types/body-parser@1.19.2': dependencies: '@types/connect': 3.4.35 '@types/node': 18.15.11 - dev: true - /@types/bonjour@3.5.10: - resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} + '@types/bonjour@3.5.13': dependencies: '@types/node': 18.15.11 - dev: true - /@types/connect-history-api-fallback@1.3.5: - resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} + '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.17.33 '@types/node': 18.15.11 - dev: true - /@types/connect@3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + '@types/connect@3.4.35': dependencies: '@types/node': 18.15.11 - dev: true - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: true + '@types/cookie@0.4.1': {} - /@types/cors@2.8.13: - resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} + '@types/cors@2.8.13': dependencies: '@types/node': 18.15.11 - dev: true - /@types/eslint-scope@3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + '@types/eslint-scope@3.7.4': dependencies: '@types/eslint': 8.37.0 - '@types/estree': 1.0.0 - dev: true + '@types/estree': 1.0.5 - /@types/eslint@8.37.0: - resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} + '@types/eslint@8.37.0': dependencies: - '@types/estree': 1.0.0 + '@types/estree': 1.0.5 '@types/json-schema': 7.0.11 - dev: true - /@types/estree@1.0.0: - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - dev: true + '@types/estree@1.0.5': {} - /@types/express-serve-static-core@4.17.33: - resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + '@types/express-serve-static-core@4.17.33': dependencies: '@types/node': 18.15.11 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 - dev: true - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.33 '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 - dev: true + '@types/serve-static': 1.15.7 - /@types/google-protobuf@3.15.6: - resolution: {integrity: sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==} - dev: true + '@types/google-protobuf@3.15.6': {} - /@types/http-proxy@1.17.10: - resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} + '@types/http-errors@2.0.4': {} + + '@types/http-proxy@1.17.10': dependencies: '@types/node': 18.15.11 - dev: true - /@types/jasmine@4.3.5: - resolution: {integrity: sha512-9YHUdvuNDDRJYXZwHqSsO72Ok0vmqoJbNn73ttyITQp/VA60SarnZ+MPLD37rJAhVoKp+9BWOvJP5tHIRfZylQ==} - dev: true + '@types/jasmine@4.3.5': {} - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - dev: true + '@types/json-schema@7.0.11': {} - /@types/mime@3.0.1: - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - dev: true + '@types/mime@1.3.5': {} - /@types/node@18.15.11: - resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - dev: true + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 22.5.0 - /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - dev: true + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 18.15.11 - /@types/range-parser@1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - dev: true + '@types/node@18.15.11': {} - /@types/resolve@1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: true + '@types/node@22.5.0': + dependencies: + undici-types: 6.19.8 + + '@types/qs@6.9.7': {} + + '@types/range-parser@1.2.4': {} + + '@types/resolve@1.20.2': {} - /@types/retry@0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: true + '@types/retry@0.12.2': {} - /@types/serve-index@1.9.1: - resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} + '@types/send@0.17.4': dependencies: - '@types/express': 4.17.17 - dev: true + '@types/mime': 1.3.5 + '@types/node': 18.15.11 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.21 - /@types/serve-static@1.15.1: - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + '@types/serve-static@1.15.7': dependencies: - '@types/mime': 3.0.1 + '@types/http-errors': 2.0.4 '@types/node': 18.15.11 - dev: true + '@types/send': 0.17.4 - /@types/sockjs@0.3.33: - resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} + '@types/sockjs@0.3.36': dependencies: '@types/node': 18.15.11 - dev: true - /@types/triple-beam@1.3.2: - resolution: {integrity: sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==} - dev: true + '@types/triple-beam@1.3.2': {} - /@types/ws@8.5.5: - resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} + '@types/wrap-ansi@3.0.0': {} + + '@types/ws@8.5.12': dependencies: '@types/node': 18.15.11 - dev: true - /@vitejs/plugin-basic-ssl@1.0.1(vite@4.4.7): - resolution: {integrity: sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==} - engines: {node: '>=14.6.0'} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 + '@vitejs/plugin-basic-ssl@1.1.0(vite@5.4.0(@types/node@22.5.0)(less@4.2.0)(sass@1.77.6)(terser@5.31.6))': dependencies: - vite: 4.4.7(less@4.1.3)(sass@1.64.1)(terser@5.19.2) - dev: true + vite: 5.4.0(@types/node@22.5.0)(less@4.2.0)(sass@1.77.6)(terser@5.31.6) - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true + '@webassemblyjs/helper-buffer@1.12.1': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + '@webassemblyjs/helper-wasm-section@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - dev: true + '@webassemblyjs/wasm-gen': 1.12.1 - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - dev: true - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + '@webassemblyjs/wasm-edit@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - dev: true + '@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@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + '@webassemblyjs/wasm-gen@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 + '@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 - dev: true - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + '@webassemblyjs/wasm-opt@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - dev: true + '@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@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + '@webassemblyjs/wasm-parser@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 + '@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 - dev: true - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + '@webassemblyjs/wast-printer@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - dev: true - - /@wessberg/ts-evaluator@0.0.27(typescript@5.1.6): - resolution: {integrity: sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==} - engines: {node: '>=10.1.0'} - deprecated: this package has been renamed to ts-evaluator. Please install ts-evaluator instead - peerDependencies: - typescript: '>=3.2.x || >= 4.x' - dependencies: - chalk: 4.1.2 - jsdom: 16.7.0 - object-path: 0.11.8 - tslib: 2.6.2 - typescript: 5.1.6 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true + '@xtuc/ieee754@1.2.0': {} - /@yarnpkg/lockfile@1.1.0: - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - dev: true + '@xtuc/long@4.2.2': {} - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: true + '@yarnpkg/lockfile@1.1.0': {} - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true + abbrev@2.0.0: {} - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: true - - /acorn-globals@6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - dev: true - /acorn-import-assertions@1.9.0(acorn@8.8.2): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 + acorn-import-attributes@1.9.5(acorn@8.8.2): dependencies: acorn: 8.8.2 - dev: true - - /acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.8.2: {} - /adjust-sourcemap-loader@4.0.0: - resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} - engines: {node: '>=8.9'} + adjust-sourcemap-loader@4.0.0: dependencies: loader-utils: 2.0.4 regex-parser: 2.2.11 - dev: true - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /agentkeepalive@4.3.0: - resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} - engines: {node: '>= 8.0.0'} + agent-base@7.1.1: dependencies: debug: 4.3.4 - depd: 2.0.0 - humanize-ms: 1.2.1 transitivePeerDependencies: - supports-color - dev: true - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: true - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: ajv: 8.12.0 - dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: true - /ajv-keywords@5.1.0(ajv@8.12.0): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 + ajv-keywords@5.1.0(ajv@8.12.0): dependencies: ajv: 8.12.0 fast-deep-equal: 3.1.3 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: true + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + ansi-html-community@0.0.8: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@5.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: true - - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true - - /array-flatten@2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - dev: true - - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: true + argparse@2.0.1: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + array-flatten@1.1.1: {} - /autoprefixer@10.4.14(postcss@8.4.24): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001473 - fraction.js: 4.2.0 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.24 - postcss-value-parser: 4.2.0 - dev: true + async@3.2.4: {} - /autoprefixer@10.4.14(postcss@8.4.27): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.20(postcss@8.4.41): dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001473 - fraction.js: 4.2.0 + browserslist: 4.23.3 + caniuse-lite: 1.0.30001653 + fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.27 + picocolors: 1.0.1 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - dev: true - /babel-loader@9.1.3(@babel/core@7.22.9)(webpack@5.88.2): - resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' + babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.93.0(esbuild@0.23.0)): dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.0.0 - webpack: 5.88.2(esbuild@0.18.17) - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true + webpack: 5.93.0(esbuild@0.23.0) - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.9): - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.9): - resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) - core-js-compat: 3.31.0 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.9): - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): dependencies: - '@babel/core': 7.22.9 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.9) + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true + base64-js@1.5.1: {} - /base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: true + base64id@2.0.0: {} - /batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: true + batch@0.6.1: {} - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true + big.js@5.2.2: {} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true + binary-extensions@2.2.0: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.1: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -3246,11 +6983,8 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -3266,192 +7000,102 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /bonjour-service@1.1.1: - resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} + bonjour-service@1.2.1: dependencies: - array-flatten: 2.1.2 - dns-equal: 1.0.0 fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 - dev: true - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true + boolbase@1.0.0: {} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - dev: true - /browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: true - - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.21.10: dependencies: caniuse-lite: 1.0.30001521 electron-to-chromium: 1.4.496 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) - dev: true - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001473 - electron-to-chromium: 1.4.348 - node-releases: 2.0.10 - update-browserslist-db: 1.0.10(browserslist@4.21.5) - dev: true + caniuse-lite: 1.0.30001653 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true + builtin-modules@3.3.0: {} - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + builtins@5.0.1: dependencies: - semver: 7.5.4 - dev: true + semver: 7.6.3 - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true + bytes@3.0.0: {} - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.1.13 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - dev: true + bytes@3.1.2: {} - /cacache@17.1.3: - resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + cacache@18.0.4: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.1 - glob: 10.2.3 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-collect: 1.0.2 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 p-map: 4.0.0 ssri: 10.0.1 - tar: 6.1.13 + tar: 6.2.1 unique-filename: 3.0.0 - dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + call-bind@1.0.2: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /caniuse-lite@1.0.30001473: - resolution: {integrity: sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==} - dev: true + caniuse-lite@1.0.30001521: {} - /caniuse-lite@1.0.30001521: - resolution: {integrity: sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==} - dev: true + caniuse-lite@1.0.30001653: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chardet@0.7.0: {} - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -3462,156 +7106,108 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.2 - dev: true - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true + chownr@2.0.0: {} - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true + chrome-trace-event@1.0.3: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + clean-stack@2.2.0: {} + + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-spinners@2.7.0: - resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} - engines: {node: '>=6'} - dev: true + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true + cli-spinners@2.7.0: {} - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cli-spinners@2.9.2: {} + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cli-width@4.1.0: {} + + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true + clone@1.0.4: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + color-name@1.1.4: {} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - dev: true - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: true - - /color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@3.2.1: dependencies: color-convert: 1.9.3 color-string: 1.9.1 - dev: true - /colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - dev: true + colorette@2.0.19: {} - /colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + colorette@2.0.20: {} + + colorspace@1.1.4: dependencies: color: 3.2.1 text-hex: 1.0.0 - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} - dev: true + commander@12.1.0: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true + commander@2.20.3: {} - /common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true + common-path-prefix@3.0.0: {} - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true + commondir@1.0.1: {} - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + compressible@2.0.18: dependencies: mime-db: 1.52.0 - dev: true - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + compression@1.7.4: dependencies: accepts: 1.3.8 bytes: 3.0.0 @@ -3622,20 +7218,12 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - dev: true + connect-history-api-fallback@2.0.0: {} - /connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} + connect@3.7.0: dependencies: debug: 2.6.9 finalhandler: 1.1.2 @@ -3643,406 +7231,205 @@ packages: utils-merge: 1.0.1 transitivePeerDependencies: - supports-color - dev: true - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: true - - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - dev: true - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true + content-type@1.0.5: {} - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true + cookie-signature@1.0.6: {} - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.4.2: {} - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.5.0: {} - /copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + copy-anything@2.0.6: dependencies: is-what: 3.14.1 - dev: true - /copy-webpack-plugin@11.0.0(webpack@5.88.2): - resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.1.0 + copy-webpack-plugin@12.0.2(webpack@5.93.0(esbuild@0.23.0)): dependencies: - fast-glob: 3.3.1 + fast-glob: 3.3.2 glob-parent: 6.0.2 - globby: 13.1.3 + globby: 14.0.2 normalize-path: 3.0.0 - schema-utils: 4.0.0 - serialize-javascript: 6.0.1 - webpack: 5.88.2(esbuild@0.18.17) - dev: true + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 + webpack: 5.93.0(esbuild@0.23.0) - /core-js-compat@3.31.0: - resolution: {integrity: sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==} + core-js-compat@3.38.1: dependencies: - browserslist: 4.21.5 - dev: true + browserslist: 4.23.3 - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true + core-util-is@1.0.3: {} - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} + cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 - dev: true - /cosmiconfig@8.2.0: - resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} - engines: {node: '>=14'} + cosmiconfig@9.0.0(typescript@5.5.4): dependencies: + env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 - path-type: 4.0.0 - dev: true + optionalDependencies: + typescript: 5.5.4 - /critters@0.0.20: - resolution: {integrity: sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==} + critters@0.0.24: dependencies: chalk: 4.1.2 css-select: 5.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 htmlparser2: 8.0.2 - postcss: 8.4.27 - pretty-bytes: 5.6.0 - dev: true + postcss: 8.4.41 + postcss-media-query-parser: 0.2.3 - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /css-loader@6.8.1(webpack@5.88.2): - resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 + css-loader@7.1.2(webpack@5.93.0(esbuild@0.23.0)): dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.27) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.27) - postcss-modules-scope: 3.0.0(postcss@8.4.27) - postcss-modules-values: 4.0.0(postcss@8.4.27) + icss-utils: 5.1.0(postcss@8.4.41) + postcss: 8.4.41 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.41) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.41) + postcss-modules-scope: 3.2.0(postcss@8.4.41) + postcss-modules-values: 4.0.0(postcss@8.4.41) postcss-value-parser: 4.2.0 - semver: 7.5.4 - webpack: 5.88.2(esbuild@0.18.17) - dev: true + semver: 7.6.3 + optionalDependencies: + webpack: 5.93.0(esbuild@0.23.0) - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 - dev: true - - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: true - - /cssom@0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - dev: true - - /cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - dependencies: - cssom: 0.3.8 - dev: true - /cuint@0.2.2: - resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} - dev: true + css-what@6.1.0: {} - /custom-event@1.0.1: - resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} - dev: true + cssesc@3.0.0: {} - /data-urls@2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - dev: true + custom-event@1.0.1: {} - /date-format@4.0.14: - resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} - engines: {node: '>=4.0'} - dev: true + date-format@4.0.14: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - dev: true - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - requiresBuild: true - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true optional: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - dev: true - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true + deepmerge@4.3.1: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true + default-browser-id@5.0.0: {} - /default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + default-gateway@6.0.3: dependencies: execa: 5.1.1 - dev: true - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: true + define-lazy-prop@3.0.0: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true + depd@1.1.2: {} - /dependency-graph@0.11.0: - resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} - engines: {node: '>= 0.6.0'} - dev: true + depd@2.0.0: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true + dependency-graph@1.0.0: {} - /detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: true + destroy@1.2.0: {} - /di@0.0.1: - resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} - dev: true + detect-libc@2.0.3: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true + detect-node@2.1.0: {} - /dns-equal@1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: true + di@0.0.1: {} - /dns-packet@5.5.0: - resolution: {integrity: sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA==} - engines: {node: '>=6'} + dns-packet@5.5.0: dependencies: '@leichtgewicht/ip-codec': 2.0.4 - dev: true - /dom-serialize@2.2.1: - resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} + dom-serialize@2.2.1: dependencies: custom-event: 1.0.1 ent: 2.2.0 extend: 3.0.2 void-elements: 2.0.1 - dev: true - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: true - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - - /domexception@2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} - dependencies: - webidl-conversions: 5.0.0 - dev: true + domelementtype@2.3.0: {} - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: true - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true + ee-first@1.1.1: {} - /electron-to-chromium@1.4.348: - resolution: {integrity: sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==} - dev: true + electron-to-chromium@1.4.496: {} - /electron-to-chromium@1.4.496: - resolution: {integrity: sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==} - dev: true + electron-to-chromium@1.5.13: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@10.4.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@8.0.0: {} - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true + emoji-regex@9.2.2: {} - /enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - dev: true + emojis-list@3.0.0: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true + enabled@2.0.0: {} - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true + encodeurl@1.0.2: {} + + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 - dev: true optional: true - /engine.io-parser@5.0.6: - resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} - engines: {node: '>=10.0.0'} - dev: true + engine.io-parser@5.0.6: {} - /engine.io@6.4.1: - resolution: {integrity: sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==} - engines: {node: '>=10.0.0'} + engine.io@6.4.1: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.13 @@ -4058,213 +7445,122 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /ent@2.2.0: - resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} - dev: true + ent@2.2.0: {} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + env-paths@2.2.1: {} - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: true + environment@1.1.0: {} - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - requiresBuild: true + err-code@2.0.3: {} + + errno@0.1.8: dependencies: prr: 1.0.1 - dev: true optional: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - - /es-module-lexer@1.2.1: - resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} - dev: true - - /esbuild-wasm@0.18.17: - resolution: {integrity: sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==} - engines: {node: '>=12'} - hasBin: true - dev: true - - /esbuild-wasm@0.19.2: - resolution: {integrity: sha512-ak2XIIJKby+Uo3Iqh8wtw4pn2uZcnfLgtcmBHIgkShpun5ZIJsFigWXp7uLt7gXk3QAOCMmv0TSsIxD5qdn+Vw==} - engines: {node: '>=12'} - hasBin: true - dev: true - - /esbuild@0.18.17: - resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.17 - '@esbuild/android-arm64': 0.18.17 - '@esbuild/android-x64': 0.18.17 - '@esbuild/darwin-arm64': 0.18.17 - '@esbuild/darwin-x64': 0.18.17 - '@esbuild/freebsd-arm64': 0.18.17 - '@esbuild/freebsd-x64': 0.18.17 - '@esbuild/linux-arm': 0.18.17 - '@esbuild/linux-arm64': 0.18.17 - '@esbuild/linux-ia32': 0.18.17 - '@esbuild/linux-loong64': 0.18.17 - '@esbuild/linux-mips64el': 0.18.17 - '@esbuild/linux-ppc64': 0.18.17 - '@esbuild/linux-riscv64': 0.18.17 - '@esbuild/linux-s390x': 0.18.17 - '@esbuild/linux-x64': 0.18.17 - '@esbuild/netbsd-x64': 0.18.17 - '@esbuild/openbsd-x64': 0.18.17 - '@esbuild/sunos-x64': 0.18.17 - '@esbuild/win32-arm64': 0.18.17 - '@esbuild/win32-ia32': 0.18.17 - '@esbuild/win32-x64': 0.18.17 - dev: true - - /esbuild@0.19.2: - resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.2 - '@esbuild/android-arm64': 0.19.2 - '@esbuild/android-x64': 0.19.2 - '@esbuild/darwin-arm64': 0.19.2 - '@esbuild/darwin-x64': 0.19.2 - '@esbuild/freebsd-arm64': 0.19.2 - '@esbuild/freebsd-x64': 0.19.2 - '@esbuild/linux-arm': 0.19.2 - '@esbuild/linux-arm64': 0.19.2 - '@esbuild/linux-ia32': 0.19.2 - '@esbuild/linux-loong64': 0.19.2 - '@esbuild/linux-mips64el': 0.19.2 - '@esbuild/linux-ppc64': 0.19.2 - '@esbuild/linux-riscv64': 0.19.2 - '@esbuild/linux-s390x': 0.19.2 - '@esbuild/linux-x64': 0.19.2 - '@esbuild/netbsd-x64': 0.19.2 - '@esbuild/openbsd-x64': 0.19.2 - '@esbuild/sunos-x64': 0.19.2 - '@esbuild/win32-arm64': 0.19.2 - '@esbuild/win32-ia32': 0.19.2 - '@esbuild/win32-x64': 0.19.2 - dev: true - optional: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + es-module-lexer@1.2.1: {} - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - dev: true + esbuild-wasm@0.23.0: {} - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.0 + '@esbuild/android-arm': 0.23.0 + '@esbuild/android-arm64': 0.23.0 + '@esbuild/android-x64': 0.23.0 + '@esbuild/darwin-arm64': 0.23.0 + '@esbuild/darwin-x64': 0.23.0 + '@esbuild/freebsd-arm64': 0.23.0 + '@esbuild/freebsd-x64': 0.23.0 + '@esbuild/linux-arm': 0.23.0 + '@esbuild/linux-arm64': 0.23.0 + '@esbuild/linux-ia32': 0.23.0 + '@esbuild/linux-loong64': 0.23.0 + '@esbuild/linux-mips64el': 0.23.0 + '@esbuild/linux-ppc64': 0.23.0 + '@esbuild/linux-riscv64': 0.23.0 + '@esbuild/linux-s390x': 0.23.0 + '@esbuild/linux-x64': 0.23.0 + '@esbuild/netbsd-x64': 0.23.0 + '@esbuild/openbsd-arm64': 0.23.0 + '@esbuild/openbsd-x64': 0.23.0 + '@esbuild/sunos-x64': 0.23.0 + '@esbuild/win32-arm64': 0.23.0 + '@esbuild/win32-ia32': 0.23.0 + '@esbuild/win32-x64': 0.23.0 + + escalade@3.1.1: {} + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + estree-walker@2.0.2: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true + etag@1.8.1: {} - /eventemitter-asyncresource@1.0.0: - resolution: {integrity: sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==} - dev: true + eventemitter3@4.0.7: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true + eventemitter3@5.0.1: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true + events@3.3.0: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4275,11 +7571,10 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} + exponential-backoff@3.1.1: {} + + express@4.18.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -4314,85 +7609,44 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true + extend@3.0.2: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-uri@3.0.1: {} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.15.0: dependencies: reusify: 1.0.4 - dev: true - /faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + faye-websocket@0.11.4: dependencies: websocket-driver: 0.7.4 - dev: true - - /fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - dev: true - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true + fecha@4.2.3: {} - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - dev: true - /finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} + finalhandler@1.1.2: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -4403,11 +7657,8 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.2.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -4418,728 +7669,385 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - dev: true - /find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} + find-cache-dir@4.0.0: dependencies: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 - dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-up@6.3.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 - dev: true - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true + flat@5.0.2: {} - /fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - dev: true + flatted@3.2.7: {} - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true + fn.name@1.1.0: {} - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + follow-redirects@1.15.2(debug@4.3.4): + optionalDependencies: + debug: 4.3.4 + + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.0.2 - dev: true - - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true + forwarded@0.2.0: {} - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true + fraction.js@4.3.7: {} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true + fresh@0.5.2: {} - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - dev: true - /fs-minipass@3.0.1: - resolution: {integrity: sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs-minipass@3.0.1: dependencies: minipass: 4.2.5 - dev: true - /fs-monkey@1.0.3: - resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} - dev: true + fs.realpath@1.0.0: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fsevents@2.3.2: + optional: true - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true + function-bind@1.1.1: {} - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true + function-bind@1.1.2: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + get-east-asian-width@1.2.0: {} + + get-intrinsic@1.2.0: dependencies: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 - dev: true - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true + glob-to-regexp@0.4.1: {} - /glob@10.2.3: - resolution: {integrity: sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.2.3: dependencies: foreground-child: 3.1.1 jackspeak: 2.2.0 minimatch: 9.0.0 minipass: 5.0.0 path-scurry: 1.8.0 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@10.4.5: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true + foreground-child: 3.1.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.6 + minimatch: 3.1.2 once: 1.4.0 - dev: true - - /glob@9.3.4: - resolution: {integrity: sha512-qaSc49hojMOv1EPM4EuyITjDSgSKI0rthoHnvE81tcOi1SCVndHko7auqxdQ14eiQG2NDBJBE86+2xIrbIvrbA==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.2 - minipass: 4.2.5 - path-scurry: 1.8.0 - dev: true + path-is-absolute: 1.0.1 - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + globals@11.12.0: {} - /globby@13.1.3: - resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@14.0.2: dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.1 + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /google-protobuf@3.21.2: - resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /guess-parser@0.4.22(typescript@5.1.6): - resolution: {integrity: sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==} - peerDependencies: - typescript: '>=3.7.5' - dependencies: - '@wessberg/ts-evaluator': 0.0.27(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true + google-protobuf@3.21.2: {} - /handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: true + graceful-fs@4.2.11: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + handle-thing@2.0.1: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@3.0.0: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-flag@4.0.0: {} - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true + has-symbols@1.0.3: {} - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + has@1.0.3: dependencies: function-bind: 1.1.1 - dev: true - /hdr-histogram-js@2.0.3: - resolution: {integrity: sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==} + hasown@2.0.2: dependencies: - '@assemblyscript/loader': 0.10.1 - base64-js: 1.5.1 - pako: 1.0.11 - dev: true + function-bind: 1.1.2 - /hdr-histogram-percentiles-obj@3.0.0: - resolution: {integrity: sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==} - dev: true - - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hosted-git-info@7.0.2: dependencies: - lru-cache: 7.18.3 - dev: true + lru-cache: 10.4.3 - /hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + hpack.js@2.1.6: dependencies: inherits: 2.0.4 obuf: 1.1.2 readable-stream: 2.3.8 wbuf: 1.7.3 - dev: true - - /html-encoding-sniffer@2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} - dependencies: - whatwg-encoding: 1.0.5 - dev: true - /html-entities@2.3.3: - resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - dev: true + html-entities@2.5.2: {} - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + html-escaper@2.0.2: {} - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 - dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + http-cache-semantics@4.1.1: {} - /http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: true + http-deceiver@1.2.7: {} - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + http-errors@1.6.3: dependencies: depd: 1.1.2 inherits: 2.0.3 setprototypeof: 1.1.0 statuses: 1.5.0 - dev: true - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: true - /http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: true + http-parser-js@0.5.8: {} - /http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} + http-proxy-agent@7.0.2: dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 + agent-base: 7.1.1 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + http-proxy-middleware@2.0.6(@types/express@4.17.21): dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 + '@types/http-proxy': 1.17.10 + http-proxy: 1.18.1(debug@4.3.4) + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.5 + optionalDependencies: + '@types/express': 4.17.21 transitivePeerDependencies: - - supports-color - dev: true + - debug - /http-proxy-middleware@2.0.6(@types/express@4.17.17): - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true + http-proxy-middleware@3.0.0: dependencies: - '@types/express': 4.17.17 '@types/http-proxy': 1.17.10 - http-proxy: 1.18.1 + debug: 4.3.4 + http-proxy: 1.18.1(debug@4.3.4) is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.5 transitivePeerDependencies: - - debug - dev: true + - supports-color - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + http-proxy@1.18.1(debug@4.3.4): dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@7.0.5: dependencies: - agent-base: 6.0.2 + agent-base: 7.1.1 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - dependencies: - ms: 2.1.3 - dev: true + hyperdyperid@1.2.0: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true - /icss-utils@5.1.0(postcss@8.4.27): - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + icss-utils@5.1.0(postcss@8.4.41): dependencies: - postcss: 8.4.27 - dev: true + postcss: 8.4.41 - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + ieee754@1.2.1: {} - /ignore-walk@6.0.2: - resolution: {integrity: sha512-ezmQ1Dg2b3jVZh2Dh+ar6Eu2MqNSTkyb32HU2MAQQQX9tKM3q/UQ/9lf03lQ5hW+fOeoMnwxwkleZ0xcNp0/qg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore-walk@6.0.5: dependencies: - minimatch: 7.4.4 - dev: true + minimatch: 9.0.0 - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true + ignore@5.2.4: {} - /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: true + image-size@0.5.5: optional: true - /immutable@4.3.0: - resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} - dev: true + immutable@4.3.0: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + imurmurhash@0.1.4: {} - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: true + indent-string@4.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true + inherits@2.0.3: {} - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + ini@4.1.3: {} - /injection-js@2.4.0: - resolution: {integrity: sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==} + injection-js@2.4.0: dependencies: - tslib: 2.6.2 - dev: true + tslib: 2.6.3 - /inquirer@8.2.4: - resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} - engines: {node: '>=12.0.0'} + ip-address@9.0.5: dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - dev: true + jsbn: 1.1.0 + sprintf-js: 1.1.3 - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true + ipaddr.js@1.9.1: {} - /ipaddr.js@2.0.1: - resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==} - engines: {node: '>= 10'} - dev: true + ipaddr.js@2.2.0: {} - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: true + is-arrayish@0.3.2: {} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - dev: true - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - dev: true - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + is-core-module@2.11.0: dependencies: has: 1.0.3 - dev: true - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: true + is-interactive@1.0.0: {} - /is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - dev: true + is-lambda@1.0.1: {} - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-module@1.0.0: {} - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: true + is-network-error@1.1.0: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + is-number@7.0.0: {} + + is-plain-obj@3.0.0: {} + + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - dev: true - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.1: {} - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-unicode-supported@0.1.0: {} - /is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: true + is-what@3.14.1: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@3.1.0: dependencies: - is-docker: 2.2.1 - dev: true + is-inside-container: 1.0.0 - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true + isarray@1.0.0: {} - /isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - dev: true + isbinaryfile@4.0.10: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true + isexe@3.1.1: {} - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true + isobject@3.0.1: {} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-coverage@3.2.0: {} + + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.22.5 '@babel/parser': 7.22.5 @@ -5148,186 +8056,95 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.0: dependencies: istanbul-lib-coverage: 3.2.0 make-dir: 3.1.0 supports-color: 7.2.0 - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.3.4 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} + istanbul-reports@3.1.5: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.0 - dev: true - /jackspeak@2.2.0: - resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==} - engines: {node: '>=14'} + jackspeak@2.2.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /jasmine-core@4.6.0: - resolution: {integrity: sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==} - dev: true + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 - /jasmine-core@5.1.0: - resolution: {integrity: sha512-bFMMwpKuTZXCuGd51yClFobw5SOtad1kmdWnYO8dNwYV8i01Xj0C2+nyQpSKl1EKxiPfyd1ZgBl/rsusL3aS6w==} - dev: true + jasmine-core@4.6.0: {} - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jasmine-core@5.1.0: {} + + jest-worker@27.5.1: dependencies: '@types/node': 18.15.11 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - - /jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} - hasBin: true - dev: true - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + jiti@1.21.6: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true + js-tokens@4.0.0: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsdom@16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} - engines: {node: '>=10'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - acorn: 8.8.2 - acorn-globals: 6.0.0 - cssom: 0.4.4 - cssstyle: 2.3.0 - data-urls: 2.0.0 - decimal.js: 10.4.3 - domexception: 2.0.1 - escodegen: 2.1.0 - form-data: 3.0.1 - html-encoding-sniffer: 2.0.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 6.0.1 - saxes: 5.0.1 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 2.0.0 - webidl-conversions: 6.1.0 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - ws: 7.5.9 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true + jsbn@1.1.0: {} - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + jsesc@2.5.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + json-parse-even-better-errors@3.0.0: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + json-schema-traverse@1.0.0: {} - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + jsonc-parser@3.3.1: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /karma-chrome-launcher@3.2.0: - resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==} + karma-chrome-launcher@3.2.0: dependencies: which: 1.3.1 - dev: true - /karma-coverage@2.2.1: - resolution: {integrity: sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==} - engines: {node: '>=10.0.0'} + karma-coverage@2.2.1: dependencies: istanbul-lib-coverage: 3.2.0 istanbul-lib-instrument: 5.2.1 @@ -5337,40 +8154,23 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /karma-jasmine-html-reporter@2.1.0(jasmine-core@5.1.0)(karma-jasmine@5.1.0)(karma@6.4.2): - resolution: {integrity: sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==} - peerDependencies: - jasmine-core: ^4.0.0 || ^5.0.0 - karma: ^6.0.0 - karma-jasmine: ^5.0.0 + karma-jasmine-html-reporter@2.1.0(jasmine-core@5.1.0)(karma-jasmine@5.1.0(karma@6.4.2))(karma@6.4.2): dependencies: jasmine-core: 5.1.0 karma: 6.4.2 karma-jasmine: 5.1.0(karma@6.4.2) - dev: true - /karma-jasmine@5.1.0(karma@6.4.2): - resolution: {integrity: sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==} - engines: {node: '>=12'} - peerDependencies: - karma: ^6.0.0 + karma-jasmine@5.1.0(karma@6.4.2): dependencies: jasmine-core: 4.6.0 karma: 6.4.2 - dev: true - /karma-source-map-support@1.4.0: - resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} + karma-source-map-support@1.4.0: dependencies: source-map-support: 0.5.21 - dev: true - /karma@6.4.2: - resolution: {integrity: sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==} - engines: {node: '>= 10'} - hasBin: true + karma@6.4.2: dependencies: '@colors/colors': 1.5.0 body-parser: 1.20.2 @@ -5381,7 +8181,7 @@ packages: dom-serialize: 2.2.1 glob: 7.2.3 graceful-fs: 4.2.11 - http-proxy: 1.18.1 + http-proxy: 1.18.1(debug@4.3.4) isbinaryfile: 4.0.10 lodash: 4.17.21 log4js: 6.9.1 @@ -5401,49 +8201,27 @@ packages: - debug - supports-color - utf-8-validate - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - dev: true + kind-of@6.0.3: {} - /kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - dev: true + kuler@2.0.0: {} - /launch-editor@2.6.0: - resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} + launch-editor@2.8.1: dependencies: picocolors: 1.0.0 shell-quote: 1.8.1 - dev: true - /less-loader@11.1.0(less@4.1.3)(webpack@5.88.2): - resolution: {integrity: sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==} - engines: {node: '>= 14.15.0'} - peerDependencies: - less: ^3.5.0 || ^4.0.0 - webpack: ^5.0.0 + less-loader@12.2.0(less@4.2.0)(webpack@5.93.0(esbuild@0.23.0)): dependencies: - klona: 2.0.6 - less: 4.1.3 - webpack: 5.88.2(esbuild@0.18.17) - dev: true + less: 4.2.0 + optionalDependencies: + webpack: 5.93.0(esbuild@0.23.0) - /less@4.1.3: - resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} - engines: {node: '>=6'} - hasBin: true + less@4.2.0: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.6.2 + tslib: 2.6.3 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -5454,78 +8232,75 @@ packages: source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /license-webpack-plugin@4.0.2(webpack@5.88.2): - resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} - peerDependencies: - webpack: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-sources: - optional: true + license-webpack-plugin@4.0.2(webpack@5.93.0(esbuild@0.23.0)): dependencies: - webpack: 5.88.2(esbuild@0.18.17) webpack-sources: 3.2.3 - dev: true + optionalDependencies: + webpack: 5.93.0(esbuild@0.23.0) - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true + listr2@8.2.4: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + lmdb@3.0.13: + dependencies: + msgpackr: 1.11.0 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.2.2 + ordered-binary: 1.5.1 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 3.0.13 + '@lmdb/lmdb-darwin-x64': 3.0.13 + '@lmdb/lmdb-linux-arm': 3.0.13 + '@lmdb/lmdb-linux-arm64': 3.0.13 + '@lmdb/lmdb-linux-x64': 3.0.13 + '@lmdb/lmdb-win32-x64': 3.0.13 + + loader-runner@4.3.0: {} + + loader-utils@2.0.4: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true - /loader-utils@3.2.1: - resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} - engines: {node: '>= 12.13.0'} - dev: true + loader-utils@3.3.1: {} - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true + lodash.debounce@4.0.8: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /log4js@6.9.1: - resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} - engines: {node: '>=8.0'} + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + log4js@6.9.1: dependencies: date-format: 4.0.14 debug: 4.3.4 @@ -5534,10 +8309,8 @@ packages: streamroller: 3.1.5 transitivePeerDependencies: - supports-color - dev: true - /logform@2.5.1: - resolution: {integrity: sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==} + logform@2.5.1: dependencies: '@colors/colors': 1.5.0 '@types/triple-beam': 1.3.2 @@ -5545,673 +8318,373 @@ packages: ms: 2.1.3 safe-stable-stringify: 2.4.3 triple-beam: 1.3.0 - dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@10.4.3: {} + + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: true - /lru-cache@9.1.1: - resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@9.1.1: {} - /magic-string@0.30.1: - resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} - engines: {node: '>=12'} + magic-string@0.30.11: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + '@jridgewell/sourcemap-codec': 1.5.0 - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - requiresBuild: true + make-dir@2.1.0: dependencies: pify: 4.0.1 semver: 5.7.1 - dev: true optional: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - - /make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + make-dir@3.1.0: dependencies: - agentkeepalive: 4.3.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true + semver: 6.3.1 - /make-fetch-happen@11.1.1: - resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + make-fetch-happen@13.0.1: dependencies: - agentkeepalive: 4.3.0 - cacache: 17.1.3 + '@npmcli/agent': 2.2.2 + cacache: 18.0.4 http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 5.0.0 + minipass: 7.1.2 minipass-fetch: 3.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 negotiator: 0.6.3 + proc-log: 4.2.0 promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 ssri: 10.0.1 transitivePeerDependencies: - supports-color - dev: true - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true + media-typer@0.3.0: {} - /memfs@3.4.13: - resolution: {integrity: sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==} - engines: {node: '>= 4.0.0'} + memfs@4.11.1: dependencies: - fs-monkey: 1.0.3 - dev: true + '@jsonjoy.com/json-pack': 1.1.0(tslib@2.6.3) + '@jsonjoy.com/util': 1.3.0(tslib@2.6.3) + tree-dump: 1.0.2(tslib@2.6.3) + tslib: 2.6.3 - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true + merge-descriptors@1.0.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true + methods@1.1.2: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: true - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true + mime@1.6.0: {} - /mime@2.5.2: - resolution: {integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true + mime@2.6.0: {} - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-function@5.0.1: {} - /mini-css-extract-plugin@2.7.6(webpack@5.88.2): - resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 + mini-css-extract-plugin@2.9.0(webpack@5.93.0(esbuild@0.23.0)): dependencies: schema-utils: 4.0.0 - webpack: 5.88.2(esbuild@0.18.17) - dev: true - - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true + tapable: 2.2.1 + webpack: 5.93.0(esbuild@0.23.0) - /minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - dependencies: - brace-expansion: 1.1.11 - dev: true + minimalistic-assert@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.4: - resolution: {integrity: sha512-T+8B3kNrLP7jDb5eaC4rUIp6DKoeTSb6f9SwF2phcY2gxJUA0GEf1i29/FHxBMEfx0ppWlr434/D0P+6jb8bOQ==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@8.0.2: - resolution: {integrity: sha512-ikHGF67ODxj7vS5NKU2wvTsFLbExee+KXVCnBWh8Cg2hVJfBMQIrlo50qru/09E0EifjnU8dZhJ/iHhyXJM6Mw==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.0: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.0: - resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true + minimist@1.2.8: {} - /minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + minipass-collect@2.0.1: dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true + minipass: 7.1.2 - /minipass-fetch@3.0.1: - resolution: {integrity: sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@3.0.1: dependencies: minipass: 4.2.5 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 - dev: true - - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - /minipass-json-stream@1.0.1: - resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + minipass-flush@1.0.5: dependencies: - jsonparse: 1.3.1 minipass: 3.3.6 - dev: true - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + minipass-pipeline@1.2.4: dependencies: minipass: 3.3.6 - dev: true - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} + minipass-sized@1.0.3: dependencies: minipass: 3.3.6 - dev: true - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - dev: true - /minipass@4.2.5: - resolution: {integrity: sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==} - engines: {node: '>=8'} - dev: true + minipass@4.2.5: {} - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: true + minipass@5.0.0: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minipass@7.1.2: {} + + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: true - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - dev: true - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true + mkdirp@1.0.4: {} - /mrmime@1.0.1: - resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} - engines: {node: '>=10'} - dev: true + mrmime@2.0.0: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.3: {} - /multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.0: + optionalDependencies: + msgpackr-extract: 3.0.3 + + multicast-dns@7.2.5: dependencies: dns-packet: 5.5.0 thunky: 1.1.0 - dev: true - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true + mute-stream@1.0.0: {} - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.7: {} - /needle@3.2.0: - resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} - engines: {node: '>= 4.4.x'} - hasBin: true - requiresBuild: true + needle@3.2.0: dependencies: debug: 3.2.7 iconv-lite: 0.6.3 sax: 1.2.4 transitivePeerDependencies: - supports-color - dev: true optional: true - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true + negotiator@0.6.3: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + neo-async@2.6.2: {} - /ng-packagr@16.2.0(@angular/compiler-cli@16.2.1)(tslib@2.6.2)(typescript@5.1.6): - resolution: {integrity: sha512-3u2FVSpKDa0EJRSGOAhYIZwjtnG7SVFBnUf5fk/VfDOxVV4kFRea6DEK7f/mb1D4WV/yqSZB9JmvBZp0uuIGeA==} - engines: {node: ^16.14.0 || >=18.10.0} - hasBin: true - peerDependencies: - '@angular/compiler-cli': ^16.0.0 || ^16.2.0-next.0 - tailwindcss: ^2.0.0 || ^3.0.0 - tslib: ^2.3.0 - typescript: '>=4.9.3 <5.2' - peerDependenciesMeta: - tailwindcss: - optional: true + ng-packagr@18.2.1(@angular/compiler-cli@18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(tslib@2.6.2)(typescript@5.5.4): dependencies: - '@angular/compiler-cli': 16.2.1(@angular/compiler@16.2.1)(typescript@5.1.6) - '@rollup/plugin-json': 6.0.0(rollup@3.25.3) - '@rollup/plugin-node-resolve': 15.0.1(rollup@3.25.3) - ajv: 8.12.0 + '@angular/compiler-cli': 18.2.1(@angular/compiler@18.2.1(@angular/core@18.2.1(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4) + '@rollup/plugin-json': 6.1.0(rollup@4.21.1) + '@rollup/plugin-node-resolve': 15.2.3(rollup@4.21.1) + '@rollup/wasm-node': 4.21.1 + ajv: 8.17.1 ansi-colors: 4.1.3 - autoprefixer: 10.4.14(postcss@8.4.24) - browserslist: 4.21.5 - cacache: 17.1.3 - chokidar: 3.5.3 - commander: 11.0.0 + browserslist: 4.23.3 + cacache: 18.0.4 + chokidar: 3.6.0 + commander: 12.1.0 convert-source-map: 2.0.0 - dependency-graph: 0.11.0 - esbuild-wasm: 0.19.2 - fast-glob: 3.2.12 + dependency-graph: 1.0.0 + esbuild: 0.23.0 + fast-glob: 3.3.2 find-cache-dir: 3.3.2 injection-js: 2.4.0 - jsonc-parser: 3.2.0 - less: 4.1.3 + jsonc-parser: 3.3.1 + less: 4.2.0 ora: 5.4.1 - piscina: 4.1.0 - postcss: 8.4.24 - postcss-url: 10.1.3(postcss@8.4.24) - rollup: 3.25.3 + piscina: 4.6.1 + postcss: 8.4.41 rxjs: 7.8.1 - sass: 1.63.2 + sass: 1.77.6 tslib: 2.6.2 - typescript: 5.1.6 + typescript: 5.5.4 optionalDependencies: - esbuild: 0.19.2 + rollup: 4.21.1 transitivePeerDependencies: - supports-color - dev: true - /nice-napi@1.0.2: - resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} - os: ['!win32'] - requiresBuild: true + nice-napi@1.0.2: dependencies: node-addon-api: 3.2.1 node-gyp-build: 4.6.0 - dev: true optional: true - /node-addon-api@3.2.1: - resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} - requiresBuild: true - dev: true + node-addon-api@3.2.1: optional: true - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true + node-addon-api@6.1.0: {} - /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} - hasBin: true - requiresBuild: true - dev: true + node-forge@1.3.1: {} + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.0.3 + + node-gyp-build@4.6.0: optional: true - /node-gyp@9.3.1: - resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true + node-gyp@10.2.0: dependencies: env-paths: 2.2.1 - glob: 7.2.3 + exponential-backoff: 3.1.1 + glob: 10.4.5 graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.4 - tar: 6.1.13 - which: 2.0.2 + make-fetch-happen: 13.0.1 + nopt: 7.2.1 + proc-log: 4.2.0 + semver: 7.6.3 + tar: 6.2.1 + which: 4.0.0 transitivePeerDependencies: - - bluebird - supports-color - dev: true - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - dev: true + node-releases@2.0.13: {} - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true + node-releases@2.0.18: {} - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true + nopt@7.2.1: dependencies: - abbrev: 1.1.1 - dev: true + abbrev: 2.0.0 - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + normalize-package-data@6.0.2: dependencies: - hosted-git-info: 6.1.1 - is-core-module: 2.11.0 - semver: 7.5.4 + hosted-git-info: 7.0.2 + semver: 7.6.3 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-range@0.1.2: {} - /npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-bundled@3.0.0: dependencies: npm-normalize-package-bin: 3.0.0 - dev: true - /npm-install-checks@6.1.0: - resolution: {integrity: sha512-udSGENih/5xKh3Ex+L0PtZcOt0Pa+6ppDLnpG5D49/EhMja3LupaY9E/DtJTxyFBwE09ot7Fc+H4DywnZNWTVA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-install-checks@6.1.0: dependencies: - semver: 7.5.4 - dev: true + semver: 7.6.3 - /npm-normalize-package-bin@3.0.0: - resolution: {integrity: sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + npm-normalize-package-bin@3.0.0: {} - /npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-package-arg@11.0.3: dependencies: - hosted-git-info: 6.1.1 - proc-log: 3.0.0 - semver: 7.5.4 + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.6.3 validate-npm-package-name: 5.0.0 - dev: true - /npm-packlist@7.0.4: - resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-packlist@8.0.2: dependencies: - ignore-walk: 6.0.2 - dev: true + ignore-walk: 6.0.5 - /npm-pick-manifest@8.0.1: - resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-pick-manifest@9.1.0: dependencies: npm-install-checks: 6.1.0 npm-normalize-package-bin: 3.0.0 - npm-package-arg: 10.1.0 - semver: 7.5.4 - dev: true + npm-package-arg: 11.0.3 + semver: 7.6.3 - /npm-registry-fetch@14.0.3: - resolution: {integrity: sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-registry-fetch@17.1.0: dependencies: - make-fetch-happen: 11.1.1 - minipass: 4.2.5 + '@npmcli/redact': 2.0.1 + jsonparse: 1.3.1 + make-fetch-happen: 13.0.1 + minipass: 7.1.2 minipass-fetch: 3.0.1 - minipass-json-stream: 1.0.1 minizlib: 2.1.2 - npm-package-arg: 10.1.0 - proc-log: 3.0.0 + npm-package-arg: 11.0.3 + proc-log: 4.2.0 transitivePeerDependencies: - supports-color - dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - dev: true - - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: true - - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true + object-assign@4.1.1: {} - /object-path@0.11.8: - resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} - engines: {node: '>= 10.12.0'} - dev: true + object-inspect@1.12.3: {} - /obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: true + obuf@1.1.2: {} - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 - dev: true - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - dev: true - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true + on-headers@1.0.2: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + one-time@1.0.0: dependencies: fn.name: 1.1.0 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + onetime@7.0.0: dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true + mimic-function: 5.0.1 - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -6222,464 +8695,239 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + ordered-binary@1.5.1: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + os-tmpdir@1.0.2: {} + + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} + p-retry@6.2.0: dependencies: - '@types/retry': 0.12.0 + '@types/retry': 0.12.2 + is-network-error: 1.1.0 retry: 0.13.1 - dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /pacote@15.2.0: - resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + package-json-from-dist@1.0.0: {} + + pacote@18.0.6: dependencies: - '@npmcli/git': 4.0.4 + '@npmcli/git': 5.0.8 '@npmcli/installed-package-contents': 2.0.2 - '@npmcli/promise-spawn': 6.0.2 - '@npmcli/run-script': 6.0.0 - cacache: 17.1.3 + '@npmcli/package-json': 5.2.0 + '@npmcli/promise-spawn': 7.0.2 + '@npmcli/run-script': 8.1.0 + cacache: 18.0.4 fs-minipass: 3.0.1 - minipass: 5.0.0 - npm-package-arg: 10.1.0 - npm-packlist: 7.0.4 - npm-pick-manifest: 8.0.1 - npm-registry-fetch: 14.0.3 - proc-log: 3.0.0 + minipass: 7.1.2 + npm-package-arg: 11.0.3 + npm-packlist: 8.0.2 + npm-pick-manifest: 9.1.0 + npm-registry-fetch: 17.1.0 + proc-log: 4.2.0 promise-retry: 2.0.1 - read-package-json: 6.0.1 - read-package-json-fast: 3.0.2 - sigstore: 1.4.0 + sigstore: 2.3.1 ssri: 10.0.1 tar: 6.1.13 transitivePeerDependencies: - bluebird - supports-color - dev: true - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.10 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - dev: true + parse-node-version@1.0.1: {} - /parse5-html-rewriting-stream@7.0.0: - resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==} + parse5-html-rewriting-stream@7.0.0: dependencies: entities: 4.5.0 parse5: 7.1.2 parse5-sax-parser: 7.0.0 - dev: true - /parse5-sax-parser@7.0.0: - resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==} + parse5-sax-parser@7.0.0: dependencies: parse5: 7.1.2 - dev: true - - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: true - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true + parseurl@1.3.3: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-scurry@1.8.0: - resolution: {integrity: sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@1.8.0: dependencies: lru-cache: 9.1.1 minipass: 5.0.0 - dev: true - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true + path-to-regexp@0.1.7: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@5.0.0: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picocolors@1.0.1: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - requiresBuild: true - dev: true - optional: true + picomatch@2.3.1: {} - /piscina@4.0.0: - resolution: {integrity: sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==} - dependencies: - eventemitter-asyncresource: 1.0.0 - hdr-histogram-js: 2.0.3 - hdr-histogram-percentiles-obj: 3.0.0 - optionalDependencies: - nice-napi: 1.0.2 - dev: true + picomatch@4.0.2: {} - /piscina@4.1.0: - resolution: {integrity: sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==} - dependencies: - eventemitter-asyncresource: 1.0.0 - hdr-histogram-js: 2.0.3 - hdr-histogram-percentiles-obj: 3.0.0 + pify@4.0.1: + optional: true + + piscina@4.6.1: optionalDependencies: nice-napi: 1.0.2 - dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} + pkg-dir@7.0.0: dependencies: find-up: 6.3.0 - dev: true - /postcss-loader@7.3.3(postcss@8.4.27)(webpack@5.88.2): - resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 + postcss-loader@8.1.1(postcss@8.4.41)(typescript@5.5.4)(webpack@5.93.0(esbuild@0.23.0)): dependencies: - cosmiconfig: 8.2.0 - jiti: 1.18.2 - postcss: 8.4.27 - semver: 7.5.4 - webpack: 5.88.2(esbuild@0.18.17) - dev: true + cosmiconfig: 9.0.0(typescript@5.5.4) + jiti: 1.21.6 + postcss: 8.4.41 + semver: 7.6.3 + optionalDependencies: + webpack: 5.93.0(esbuild@0.23.0) + transitivePeerDependencies: + - typescript - /postcss-modules-extract-imports@3.0.0(postcss@8.4.27): - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-media-query-parser@0.2.3: {} + + postcss-modules-extract-imports@3.1.0(postcss@8.4.41): dependencies: - postcss: 8.4.27 - dev: true + postcss: 8.4.41 - /postcss-modules-local-by-default@4.0.3(postcss@8.4.27): - resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-local-by-default@4.0.5(postcss@8.4.41): dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 + icss-utils: 5.1.0(postcss@8.4.41) + postcss: 8.4.41 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 - dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.27): - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-scope@3.2.0(postcss@8.4.41): dependencies: - postcss: 8.4.27 + postcss: 8.4.41 postcss-selector-parser: 6.0.11 - dev: true - /postcss-modules-values@4.0.0(postcss@8.4.27): - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-values@4.0.0(postcss@8.4.41): dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 - dev: true + icss-utils: 5.1.0(postcss@8.4.41) + postcss: 8.4.41 - /postcss-selector-parser@6.0.11: - resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} - engines: {node: '>=4'} + postcss-selector-parser@6.0.11: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true - - /postcss-url@10.1.3(postcss@8.4.24): - resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} - engines: {node: '>=10'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - make-dir: 3.1.0 - mime: 2.5.2 - minimatch: 3.0.8 - postcss: 8.4.24 - xxhashjs: 0.2.2 - dev: true - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true - /postcss@8.4.24: - resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true + postcss-value-parser@4.2.0: {} - /postcss@8.4.27: - resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.41: dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prettier@1.19.1: - resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} - engines: {node: '>=4'} - hasBin: true - dev: true + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: true + prettier@1.19.1: {} - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + proc-log@4.2.0: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true + process-nextick-args@2.0.1: {} - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: true + promise-inflight@1.0.1: {} - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 - dev: true - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - dev: true - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - requiresBuild: true - dev: true + prr@1.0.1: optional: true - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true + punycode@2.3.0: {} - /qjobs@1.2.0: - resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} - engines: {node: '>=0.9'} - dev: true + qjobs@1.2.0: {} - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + qs@6.11.0: dependencies: side-channel: 1.0.4 - dev: true - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true + queue-microtask@1.2.3: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true + range-parser@1.2.1: {} - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} + raw-body@2.5.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - json-parse-even-better-errors: 3.0.0 - npm-normalize-package-bin: 3.0.0 - dev: true - - /read-package-json@6.0.1: - resolution: {integrity: sha512-AaHqXxfAVa+fNL07x8iAghfKOds/XXsu7zoouIVsbm7PEbQ3nMWXlvjcbrNLjElnUHWQtAo4QEa0RXuvD4XlpA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - glob: 9.3.4 - json-parse-even-better-errors: 3.0.0 - normalize-package-data: 5.0.0 - npm-normalize-package-bin: 3.0.0 - dev: true + unpipe: 1.0.0 - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -6688,56 +8936,34 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - dev: true + reflect-metadata@0.2.2: {} - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} - engines: {node: '>=4'} + regenerate-unicode-properties@10.1.0: dependencies: regenerate: 1.4.2 - dev: true - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true + regenerate@1.4.2: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: true + regenerator-runtime@0.14.1: {} - /regenerator-transform@0.15.1: - resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} + regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.22.6 - dev: true + '@babel/runtime': 7.25.0 - /regex-parser@2.2.11: - resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} - dev: true + regex-parser@2.2.11: {} - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + regexpu-core@5.3.2: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 @@ -6745,257 +8971,186 @@ packages: regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - dev: true - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + regjsparser@0.9.1: dependencies: jsesc: 0.5.0 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + require-directory@2.1.1: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + require-from-string@2.0.2: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + requires-port@1.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@4.0.0: {} - /resolve-url-loader@5.0.0: - resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} - engines: {node: '>=12'} + resolve-url-loader@5.0.0: dependencies: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.4.27 + postcss: 8.4.41 source-map: 0.6.1 - dev: true - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true + resolve@1.22.2: dependencies: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: true + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: true + retry@0.12.0: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + retry@0.13.1: {} - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true + reusify@1.0.4: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rfdc@1.3.0: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rollup@3.25.3: - resolution: {integrity: sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + rollup@4.20.0: + dependencies: + '@types/estree': 1.0.5 optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 fsevents: 2.3.2 - dev: true - - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rollup@4.21.1: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.1 + '@rollup/rollup-android-arm64': 4.21.1 + '@rollup/rollup-darwin-arm64': 4.21.1 + '@rollup/rollup-darwin-x64': 4.21.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.1 + '@rollup/rollup-linux-arm-musleabihf': 4.21.1 + '@rollup/rollup-linux-arm64-gnu': 4.21.1 + '@rollup/rollup-linux-arm64-musl': 4.21.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.1 + '@rollup/rollup-linux-riscv64-gnu': 4.21.1 + '@rollup/rollup-linux-s390x-gnu': 4.21.1 + '@rollup/rollup-linux-x64-gnu': 4.21.1 + '@rollup/rollup-linux-x64-musl': 4.21.1 + '@rollup/rollup-win32-arm64-msvc': 4.21.1 + '@rollup/rollup-win32-ia32-msvc': 4.21.1 + '@rollup/rollup-win32-x64-msvc': 4.21.1 + fsevents: 2.3.3 + + run-applescript@7.0.0: {} + + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.2.1: {} - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: true + safe-stable-stringify@2.4.3: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /sass-loader@13.3.2(sass@1.64.1)(webpack@5.88.2): - resolution: {integrity: sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==} - engines: {node: '>= 14.15.0'} - peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true + sass-loader@16.0.0(sass@1.77.6)(webpack@5.93.0(esbuild@0.23.0)): dependencies: neo-async: 2.6.2 - sass: 1.64.1 - webpack: 5.88.2(esbuild@0.18.17) - dev: true - - /sass@1.63.2: - resolution: {integrity: sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - chokidar: 3.5.3 - immutable: 4.3.0 - source-map-js: 1.0.2 - dev: true + optionalDependencies: + sass: 1.77.6 + webpack: 5.93.0(esbuild@0.23.0) - /sass@1.64.1: - resolution: {integrity: sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==} - engines: {node: '>=14.0.0'} - hasBin: true + sass@1.77.6: dependencies: chokidar: 3.5.3 immutable: 4.3.0 source-map-js: 1.0.2 - dev: true - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - requiresBuild: true - dev: true + sax@1.2.4: optional: true - /saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} - dependencies: - xmlchars: 2.2.0 - dev: true - - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - /schema-utils@4.0.0: - resolution: {integrity: sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==} - engines: {node: '>= 12.13.0'} + schema-utils@4.0.0: dependencies: '@types/json-schema': 7.0.11 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) - dev: true - /select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: true + schema-utils@4.2.0: + dependencies: + '@types/json-schema': 7.0.11 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) - /selfsigned@2.1.1: - resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} - engines: {node: '>=10'} + select-hose@2.0.0: {} + + selfsigned@2.4.1: dependencies: + '@types/node-forge': 1.3.11 node-forge: 1.3.1 - dev: true - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - requiresBuild: true - dev: true + semver@5.7.1: optional: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true + semver@6.3.0: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true + semver@7.6.3: {} - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -7012,17 +9167,16 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + serialize-javascript@6.0.1: dependencies: randombytes: 2.1.0 - dev: true - /serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-index@1.9.1: dependencies: accepts: 1.3.8 batch: 0.6.1 @@ -7033,11 +9187,8 @@ packages: parseurl: 1.3.3 transitivePeerDependencies: - supports-color - dev: true - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -7045,110 +9196,79 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true + setprototypeof@1.1.0: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true + setprototypeof@1.2.0: {} - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true + shell-quote@1.8.1: {} - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.4: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 object-inspect: 1.12.3 - dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@3.0.7: {} - /signal-exit@4.0.2: - resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} - engines: {node: '>=14'} - dev: true + signal-exit@4.0.2: {} - /sigstore@1.4.0: - resolution: {integrity: sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + signal-exit@4.1.0: {} + + sigstore@2.3.1: dependencies: - '@sigstore/protobuf-specs': 0.1.0 - make-fetch-happen: 11.1.1 - tuf-js: 1.1.6 + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/sign': 2.3.2 + '@sigstore/tuf': 2.3.4 + '@sigstore/verify': 1.2.1 transitivePeerDependencies: - supports-color - dev: true - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - dev: true - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true + slash@5.1.0: {} - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 - /socket.io-adapter@2.5.2: - resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + smart-buffer@4.2.0: {} + + socket.io-adapter@2.5.2: dependencies: ws: 8.11.0 transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /socket.io-parser@4.2.2: - resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} - engines: {node: '>=10.0.0'} + socket.io-parser@4.2.2: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /socket.io@4.6.1: - resolution: {integrity: sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==} - engines: {node: '>=10.0.0'} + socket.io@4.6.1: dependencies: accepts: 1.3.8 base64id: 2.0.0 @@ -7160,93 +9280,60 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 uuid: 8.3.2 websocket-driver: 0.7.4 - dev: true - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} + socks-proxy-agent@8.0.4: dependencies: - agent-base: 6.0.2 + agent-base: 7.1.1 debug: 4.3.4 - socks: 2.7.1 + socks: 2.8.3 transitivePeerDependencies: - supports-color - dev: true - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + socks@2.8.3: dependencies: - ip: 2.0.0 + ip-address: 9.0.5 smart-buffer: 4.2.0 - dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.0.2: {} - /source-map-loader@4.0.1(webpack@5.88.2): - resolution: {integrity: sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.72.1 + source-map-js@1.2.0: {} + + source-map-loader@5.0.0(webpack@5.93.0(esbuild@0.23.0)): dependencies: - abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.88.2(esbuild@0.18.17) - dev: true + webpack: 5.93.0(esbuild@0.23.0) - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.6.1: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true + source-map@0.7.4: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 - dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 - dev: true - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - dev: true + spdx-license-ids@3.0.13: {} - /spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + spdy-transport@3.0.0: dependencies: debug: 4.3.4 detect-node: 2.1.0 @@ -7256,11 +9343,8 @@ packages: wbuf: 1.7.3 transitivePeerDependencies: - supports-color - dev: true - /spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} + spdy@4.0.2: dependencies: debug: 4.3.4 handle-thing: 2.0.1 @@ -7269,143 +9353,86 @@ packages: spdy-transport: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.1.3: {} - /ssri@10.0.1: - resolution: {integrity: sha512-WVy6di9DlPOeBWEjMScpNipeSX2jIZBGEn5Uuo8Q7aIuFEuDX0pw8RxcOjlD1TWP4obi24ki7m/13+nFpcbXrw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@10.0.1: dependencies: minipass: 4.2.5 - dev: true - - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - minipass: 3.3.6 - dev: true - /stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - dev: true + stack-trace@0.0.10: {} - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true + statuses@1.5.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true + statuses@2.0.1: {} - /streamroller@3.1.5: - resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} - engines: {node: '>=8.0'} + streamroller@3.1.5: dependencies: date-format: 4.0.14 debug: 4.3.4 fs-extra: 8.1.0 transitivePeerDependencies: - supports-color - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.0.1 - dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} + strip-ansi@7.0.1: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + strip-final-newline@2.0.0: {} + + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - /symbol-observable@4.0.0: - resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} - engines: {node: '>=0.10'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + symbol-observable@4.0.0: {} - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.2.1: {} - /tar@6.1.13: - resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} - engines: {node: '>=10'} + tar@6.1.13: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -7413,521 +9440,256 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: true - /terser-webpack-plugin@5.3.7(esbuild@0.18.17)(webpack@5.88.2): - resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + tar@6.2.1: dependencies: - '@jridgewell/trace-mapping': 0.3.17 - esbuild: 0.18.17 + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + terser-webpack-plugin@5.3.10(esbuild@0.23.0)(webpack@5.93.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.19.2 - webpack: 5.88.2(esbuild@0.18.17) - dev: true - - /terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true + terser: 5.31.6 + webpack: 5.93.0(esbuild@0.23.0) + optionalDependencies: + esbuild: 0.23.0 - /text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - dev: true + terser@5.31.6: + dependencies: + '@jridgewell/source-map': 0.3.3 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-hex@1.0.0: {} - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + thingies@1.21.0(tslib@2.6.3): + dependencies: + tslib: 2.6.3 - /thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: true + thunky@1.1.0: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} + tmp@0.2.1: dependencies: rimraf: 3.0.2 - dev: true - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true - - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: true + toidentifier@1.0.1: {} - /tr46@2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} + tree-dump@1.0.2(tslib@2.6.3): dependencies: - punycode: 2.3.0 - dev: true + tslib: 2.6.3 - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /triple-beam@1.3.0: - resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} - dev: true + triple-beam@1.3.0: {} - /tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} - dev: true + tslib@2.6.2: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.3: {} - /tuf-js@1.1.6: - resolution: {integrity: sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + tuf-js@2.2.1: dependencies: - '@tufjs/models': 1.0.4 + '@tufjs/models': 2.0.1 debug: 4.3.4 - make-fetch-happen: 11.1.1 + make-fetch-happen: 13.0.1 transitivePeerDependencies: - supports-color - dev: true - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.21.3: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: true - /typed-assert@1.0.9: - resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} - dev: true + typed-assert@1.0.9: {} - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.5.4: {} - /ua-parser-js@0.7.35: - resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} - dev: true + ua-parser-js@0.7.35: {} - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: true + undici-types@6.19.8: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + unicode-canonical-property-names-ecmascript@2.0.0: {} + + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - dev: true - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: true + unicode-match-property-value-ecmascript@2.1.0: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: true + unicode-property-aliases-ecmascript@2.1.0: {} - /unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - unique-slug: 3.0.0 - dev: true + unicorn-magic@0.1.0: {} - /unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 - dev: true - - /unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - dev: true - /unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true + universalify@0.1.2: {} - /update-browserslist-db@1.0.10(browserslist@4.21.5): - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true + unpipe@1.0.0: {} - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.11(browserslist@4.21.10): dependencies: browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: - punycode: 2.3.0 - dev: true + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + uri-js@4.4.1: dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true + punycode: 2.3.0 - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + util-deprecate@1.0.2: {} - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true + utils-merge@1.0.1: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true + uuid@8.3.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@5.0.0: dependencies: builtins: 5.0.1 - dev: true - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true + vary@1.1.2: {} - /vite@4.4.7(less@4.1.3)(sass@1.64.1)(terser@5.19.2): - resolution: {integrity: sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.4.0(@types/node@22.5.0)(less@4.2.0)(sass@1.77.6)(terser@5.31.6): dependencies: - esbuild: 0.18.17 - less: 4.1.3 - postcss: 8.4.27 - rollup: 3.25.3 - sass: 1.64.1 - terser: 5.19.2 + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.21.1 optionalDependencies: - fsevents: 2.3.2 - dev: true - - /void-elements@2.0.1: - resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} - engines: {node: '>=0.10.0'} - dev: true + '@types/node': 22.5.0 + fsevents: 2.3.3 + less: 4.2.0 + sass: 1.77.6 + terser: 5.31.6 - /w3c-hr-time@1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. - dependencies: - browser-process-hrtime: 1.0.0 - dev: true - - /w3c-xmlserializer@2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} - dependencies: - xml-name-validator: 3.0.0 - dev: true + void-elements@2.0.1: {} - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true - /wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + wbuf@1.7.3: dependencies: minimalistic-assert: 1.0.1 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - - /webidl-conversions@5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} - dev: true - - /webidl-conversions@6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} - dev: true - /webpack-dev-middleware@5.3.3(webpack@5.88.2): - resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - colorette: 2.0.19 - memfs: 3.4.13 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.0.0 - webpack: 5.88.2(esbuild@0.18.17) - dev: true + weak-lru-cache@1.2.2: {} - /webpack-dev-middleware@6.1.1(webpack@5.88.2): - resolution: {integrity: sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true + webpack-dev-middleware@7.3.0(webpack@5.93.0): dependencies: colorette: 2.0.19 - memfs: 3.4.13 + memfs: 4.11.1 mime-types: 2.1.35 + on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.88.2(esbuild@0.18.17) - dev: true + optionalDependencies: + webpack: 5.93.0(esbuild@0.23.0) - /webpack-dev-server@4.15.1(webpack@5.88.2): - resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true + webpack-dev-server@5.0.4(webpack@5.93.0): dependencies: - '@types/bonjour': 3.5.10 - '@types/connect-history-api-fallback': 1.3.5 - '@types/express': 4.17.17 - '@types/serve-index': 1.9.1 - '@types/serve-static': 1.15.1 - '@types/sockjs': 0.3.33 - '@types/ws': 8.5.5 + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.12 ansi-html-community: 0.0.8 - bonjour-service: 1.1.1 - chokidar: 3.5.3 + bonjour-service: 1.2.1 + chokidar: 3.6.0 colorette: 2.0.19 compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 express: 4.18.2 graceful-fs: 4.2.11 - html-entities: 2.3.3 - http-proxy-middleware: 2.0.6(@types/express@4.17.17) - ipaddr.js: 2.0.1 - launch-editor: 2.6.0 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.0.0 - selfsigned: 2.1.1 + html-entities: 2.5.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.8.1 + open: 10.1.0 + p-retry: 6.2.0 + rimraf: 5.0.10 + schema-utils: 4.2.0 + selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2(esbuild@0.18.17) - webpack-dev-middleware: 5.3.3(webpack@5.88.2) - ws: 8.13.0 + webpack-dev-middleware: 7.3.0(webpack@5.93.0) + ws: 8.18.0 + optionalDependencies: + webpack: 5.93.0(esbuild@0.23.0) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - dev: true - /webpack-merge@5.9.0: - resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} - engines: {node: '>=10.0.0'} + webpack-merge@6.0.1: dependencies: clone-deep: 4.0.1 - wildcard: 2.0.0 - dev: true + flat: 5.0.2 + wildcard: 2.0.1 - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true + webpack-sources@3.2.3: {} - /webpack-subresource-integrity@5.1.0(webpack@5.88.2): - resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} - engines: {node: '>= 12'} - peerDependencies: - html-webpack-plugin: '>= 5.0.0-beta.1 < 6' - webpack: ^5.12.0 - peerDependenciesMeta: - html-webpack-plugin: - optional: true + webpack-subresource-integrity@5.1.0(webpack@5.93.0(esbuild@0.23.0)): dependencies: typed-assert: 1.0.9 - webpack: 5.88.2(esbuild@0.18.17) - dev: true + webpack: 5.93.0(esbuild@0.23.0) - /webpack@5.88.2(esbuild@0.18.17): - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.93.0(esbuild@0.23.0): dependencies: '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.0 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.8.2 - acorn-import-assertions: 1.9.0(acorn@8.8.2) - browserslist: 4.21.5 + acorn-import-attributes: 1.9.5(acorn@8.8.2) + browserslist: 4.21.10 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 + enhanced-resolve: 5.17.1 es-module-lexer: 1.2.1 eslint-scope: 5.1.1 events: 3.3.0 @@ -7939,93 +9701,43 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(esbuild@0.18.17)(webpack@5.88.2) - watchpack: 2.4.0 + terser-webpack-plugin: 5.3.10(esbuild@0.23.0)(webpack@5.93.0) + watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - dev: true - /websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} + websocket-driver@0.7.4: dependencies: http-parser-js: 0.5.8 safe-buffer: 5.2.1 websocket-extensions: 0.1.4 - dev: true - - /websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: true - - /whatwg-encoding@1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} - dependencies: - iconv-lite: 0.4.24 - dev: true - - /whatwg-mimetype@2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - dev: true - - /whatwg-url@8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} - dependencies: - lodash: 4.17.21 - tr46: 2.1.0 - webidl-conversions: 6.1.0 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true + websocket-extensions@0.1.4: {} - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@3.0.0: - resolution: {integrity: sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + which@4.0.0: dependencies: - string-width: 4.2.3 - dev: true + isexe: 3.1.1 - /wildcard@2.0.0: - resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} - dev: true + wildcard@2.0.1: {} - /winston-transport@4.5.0: - resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} - engines: {node: '>= 6.4.0'} + winston-transport@4.5.0: dependencies: logform: 2.5.1 readable-stream: 3.6.2 triple-beam: 1.3.0 - dev: true - /winston@3.8.2: - resolution: {integrity: sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==} - engines: {node: '>= 12.0.0'} + winston@3.8.2: dependencies: '@colors/colors': 1.5.0 '@dabh/diagnostics': 2.0.3 @@ -8038,109 +9750,48 @@ packages: stack-trace: 0.0.10 triple-beam: 1.3.0 winston-transport: 4.5.0 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.0.1 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 - /xml-name-validator@3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - dev: true + wrappy@1.0.2: {} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true + ws@8.11.0: {} - /xxhashjs@0.2.2: - resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} - dependencies: - cuint: 0.2.2 - dev: true + ws@8.18.0: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@21.1.1: {} - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -8149,11 +9800,8 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -8162,14 +9810,9 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} - /zone.js@0.13.1: - resolution: {integrity: sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==} - dependencies: - tslib: 2.6.2 + yoctocolors-cjs@2.1.2: {} + + zone.js@0.14.10: {} diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index d442a0b7d..69ca5e608 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -19,8 +19,8 @@ ], "sideEffects": false, "peerDependencies": { - "@angular/common": "^16.2.1", - "@angular/core": "^16.2.1", + "@angular/common": "^18.2.1", + "@angular/core": "^18.2.1", "@ngx-grpc/common": "^3.1.2", "@ngx-grpc/core": "^3.1.2", "@ngx-grpc/well-known-types": "^3.1.2", From 111c84ac0f8d04617b743f53cd67af19a9dd6d74 Mon Sep 17 00:00:00 2001 From: Faust1 Date: Tue, 27 Aug 2024 10:12:11 +0200 Subject: [PATCH 283/344] chore: moved example to Samples --- examples/angular/.editorconfig | 12 - examples/angular/.gitignore | 44 - examples/angular/.vscode/extensions.json | 4 - examples/angular/.vscode/launch.json | 20 - examples/angular/.vscode/tasks.json | 42 - examples/angular/README.md | 29 - examples/angular/angular.json | 131 - examples/angular/package.json | 45 - examples/angular/pnpm-lock.yaml | 7101 ----------------- examples/angular/src/app/app.component.ts | 67 - examples/angular/src/app/app.config.ts | 11 - .../app/services/partitions-grpc.service.ts | 30 - examples/angular/src/assets/.gitkeep | 0 examples/angular/src/favicon.ico | Bin 1642 -> 0 bytes examples/angular/src/index.html | 13 - examples/angular/src/main.ts | 6 - examples/angular/src/proxy.conf.example | 6 - examples/angular/src/proxy.conf.json | 6 - examples/angular/src/styles.css | 1 - examples/angular/tsconfig.app.json | 14 - examples/angular/tsconfig.json | 33 - examples/angular/tsconfig.spec.json | 14 - 22 files changed, 7629 deletions(-) delete mode 100644 examples/angular/.editorconfig delete mode 100644 examples/angular/.gitignore delete mode 100644 examples/angular/.vscode/extensions.json delete mode 100644 examples/angular/.vscode/launch.json delete mode 100644 examples/angular/.vscode/tasks.json delete mode 100644 examples/angular/README.md delete mode 100644 examples/angular/angular.json delete mode 100644 examples/angular/package.json delete mode 100644 examples/angular/pnpm-lock.yaml delete mode 100644 examples/angular/src/app/app.component.ts delete mode 100644 examples/angular/src/app/app.config.ts delete mode 100644 examples/angular/src/app/services/partitions-grpc.service.ts delete mode 100644 examples/angular/src/assets/.gitkeep delete mode 100644 examples/angular/src/favicon.ico delete mode 100644 examples/angular/src/index.html delete mode 100644 examples/angular/src/main.ts delete mode 100644 examples/angular/src/proxy.conf.example delete mode 100644 examples/angular/src/proxy.conf.json delete mode 100644 examples/angular/src/styles.css delete mode 100644 examples/angular/tsconfig.app.json delete mode 100644 examples/angular/tsconfig.json delete mode 100644 examples/angular/tsconfig.spec.json diff --git a/examples/angular/.editorconfig b/examples/angular/.editorconfig deleted file mode 100644 index 66971fae9..000000000 --- a/examples/angular/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -# Editor configuration, see https://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.ts] -quote_type = single diff --git a/examples/angular/.gitignore b/examples/angular/.gitignore deleted file mode 100644 index 54426f474..000000000 --- a/examples/angular/.gitignore +++ /dev/null @@ -1,44 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# Compiled output -/dist -/tmp -/out-tsc -/bazel-out - -# Node -/node_modules -npm-debug.log -yarn-error.log - -# IDEs and editors -.idea/ -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# Visual Studio Code -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# Miscellaneous -/.angular/cache -.sass-cache/ -/connect.lock -/coverage -/libpeerconnection.log -testem.log -/typings - -# System files -.DS_Store -Thumbs.db - -src/proxy.conf.json diff --git a/examples/angular/.vscode/extensions.json b/examples/angular/.vscode/extensions.json deleted file mode 100644 index 77b374577..000000000 --- a/examples/angular/.vscode/extensions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 - "recommendations": ["angular.ng-template"] -} diff --git a/examples/angular/.vscode/launch.json b/examples/angular/.vscode/launch.json deleted file mode 100644 index 925af8370..000000000 --- a/examples/angular/.vscode/launch.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "ng serve", - "type": "chrome", - "request": "launch", - "preLaunchTask": "npm: start", - "url": "http://localhost:4200/" - }, - { - "name": "ng test", - "type": "chrome", - "request": "launch", - "preLaunchTask": "npm: test", - "url": "http://localhost:9876/debug.html" - } - ] -} diff --git a/examples/angular/.vscode/tasks.json b/examples/angular/.vscode/tasks.json deleted file mode 100644 index a298b5bd8..000000000 --- a/examples/angular/.vscode/tasks.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "start", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - }, - { - "type": "npm", - "script": "test", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - } - ] -} diff --git a/examples/angular/README.md b/examples/angular/README.md deleted file mode 100644 index fb1532501..000000000 --- a/examples/angular/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Angular Example - -This is a demo to explain the use of ArmoniK Api for Angular. - -Please refer to the documentation to get more information about the use of the library. You will find a guide on how to use ArmoniK API with Angular. - -## How to run - -_You must have an ArmoniK instance running to run this example._ - -To run this example, you need to install the dependencies first: - -```bash -pnpm install -``` - -Then, create a `src/proxy.conf.json` from the `src/proxy.conf.json.example` file. You can do it by running: - -```bash -cp src/proxy.conf.json.example src/proxy.conf.json -``` - -And replace `:` with the IP and port of your ArmoniK instance. - -Finally, you can run the example: - -```bash -pnpm start -``` diff --git a/examples/angular/angular.json b/examples/angular/angular.json deleted file mode 100644 index 42b1f00ad..000000000 --- a/examples/angular/angular.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "armonik-api-angular": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "inlineTemplate": true, - "inlineStyle": true, - "skipTests": true, - "standalone": true - }, - "@schematics/angular:class": { - "skipTests": true - }, - "@schematics/angular:directive": { - "skipTests": true, - "standalone": true - }, - "@schematics/angular:guard": { - "skipTests": true - }, - "@schematics/angular:interceptor": { - "skipTests": true - }, - "@schematics/angular:pipe": { - "skipTests": true, - "standalone": true - }, - "@schematics/angular:resolver": { - "skipTests": true - }, - "@schematics/angular:service": { - "skipTests": true - } - }, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist/armonik-api-angular", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": [ - "zone.js" - ], - "tsConfig": "tsconfig.app.json", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "src/styles.css" - ], - "scripts": [] - }, - "configurations": { - "production": { - "budgets": [ - { - "type": "initial", - "maximumWarning": "500kb", - "maximumError": "1mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" - } - ], - "outputHashing": "all" - }, - "development": { - "buildOptimizer": false, - "optimization": false, - "vendorChunk": true, - "extractLicenses": false, - "sourceMap": true, - "namedChunks": true - } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "proxyConfig": "src/proxy.conf.json" - }, - "configurations": { - "production": { - "browserTarget": "armonik-api-angular:build:production" - }, - "development": { - "browserTarget": "armonik-api-angular:build:development" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "armonik-api-angular:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "polyfills": [ - "zone.js", - "zone.js/testing" - ], - "tsConfig": "tsconfig.spec.json", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "src/styles.css" - ], - "scripts": [] - } - } - } - } - } -} diff --git a/examples/angular/package.json b/examples/angular/package.json deleted file mode 100644 index 6d1d8de45..000000000 --- a/examples/angular/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "armonik-api-angular", - "version": "0.0.0", - "private": true, - "description": "This project is a demo of the ArmoniK API Angular library", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "watch": "ng build --watch --configuration development", - "test": "ng test" - }, - "dependencies": { - "@aneoconsultingfr/armonik.api.angular": "^3.8.1", - "@angular/animations": "^16.0.0", - "@angular/common": "^16.0.0", - "@angular/compiler": "^16.0.0", - "@angular/core": "^16.0.0", - "@angular/forms": "^16.0.0", - "@angular/platform-browser": "^16.0.0", - "@angular/platform-browser-dynamic": "^16.0.0", - "@angular/router": "^16.0.0", - "@ngx-grpc/common": "^3.1.1", - "@ngx-grpc/core": "^3.1.1", - "@ngx-grpc/grpc-web-client": "^3.1.1", - "google-protobuf": "^3.21.2", - "rxjs": "~7.8.0", - "tslib": "^2.3.0", - "zone.js": "~0.13.0" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^16.0.0", - "@angular/cli": "~16.0.0", - "@angular/compiler-cli": "^16.0.0", - "@types/google-protobuf": "^3.15.6", - "@types/jasmine": "~4.3.0", - "jasmine-core": "~4.6.0", - "karma": "~6.4.0", - "karma-chrome-launcher": "~3.2.0", - "karma-coverage": "~2.2.0", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "~2.0.0", - "typescript": "~5.0.2" - } -} diff --git a/examples/angular/pnpm-lock.yaml b/examples/angular/pnpm-lock.yaml deleted file mode 100644 index d0ecfdcbc..000000000 --- a/examples/angular/pnpm-lock.yaml +++ /dev/null @@ -1,7101 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@aneoconsultingfr/armonik.api.angular': - specifier: ^3.8.1 - version: 3.8.1(@angular/common@16.0.0)(@angular/core@16.0.0)(@ngx-grpc/common@3.1.1)(@ngx-grpc/core@3.1.1)(@ngx-grpc/well-known-types@3.1.1)(google-protobuf@3.21.2)(rxjs@7.8.0) - '@angular/animations': - specifier: ^16.0.0 - version: 16.0.0(@angular/core@16.0.0) - '@angular/common': - specifier: ^16.0.0 - version: 16.0.0(@angular/core@16.0.0)(rxjs@7.8.0) - '@angular/compiler': - specifier: ^16.0.0 - version: 16.0.0(@angular/core@16.0.0) - '@angular/core': - specifier: ^16.0.0 - version: 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - '@angular/forms': - specifier: ^16.0.0 - version: 16.0.0(@angular/common@16.0.0)(@angular/core@16.0.0)(@angular/platform-browser@16.0.0)(rxjs@7.8.0) - '@angular/platform-browser': - specifier: ^16.0.0 - version: 16.0.0(@angular/animations@16.0.0)(@angular/common@16.0.0)(@angular/core@16.0.0) - '@angular/platform-browser-dynamic': - specifier: ^16.0.0 - version: 16.0.0(@angular/common@16.0.0)(@angular/compiler@16.0.0)(@angular/core@16.0.0)(@angular/platform-browser@16.0.0) - '@angular/router': - specifier: ^16.0.0 - version: 16.0.0(@angular/common@16.0.0)(@angular/core@16.0.0)(@angular/platform-browser@16.0.0)(rxjs@7.8.0) - '@ngx-grpc/common': - specifier: ^3.1.1 - version: 3.1.1(google-protobuf@3.21.2)(rxjs@7.8.0) - '@ngx-grpc/core': - specifier: ^3.1.1 - version: 3.1.1(@angular/core@16.0.0)(@ngx-grpc/common@3.1.1)(rxjs@7.8.0) - '@ngx-grpc/grpc-web-client': - specifier: ^3.1.1 - version: 3.1.1(@angular/core@16.0.0)(@ngx-grpc/common@3.1.1)(@ngx-grpc/core@3.1.1)(grpc-web@1.4.2)(rxjs@7.8.0) - google-protobuf: - specifier: ^3.21.2 - version: 3.21.2 - rxjs: - specifier: ~7.8.0 - version: 7.8.0 - tslib: - specifier: ^2.3.0 - version: 2.3.0 - zone.js: - specifier: ~0.13.0 - version: 0.13.0 - -devDependencies: - '@angular-devkit/build-angular': - specifier: ^16.0.0 - version: 16.0.0(@angular/compiler-cli@16.0.0)(@types/node@20.3.1)(karma@6.4.0)(ts-node@10.9.1)(typescript@5.0.2) - '@angular/cli': - specifier: ~16.0.0 - version: 16.0.0 - '@angular/compiler-cli': - specifier: ^16.0.0 - version: 16.0.0(@angular/compiler@16.0.0)(typescript@5.0.2) - '@types/google-protobuf': - specifier: ^3.15.6 - version: 3.15.6 - '@types/jasmine': - specifier: ~4.3.0 - version: 4.3.0 - jasmine-core: - specifier: ~4.6.0 - version: 4.6.0 - karma: - specifier: ~6.4.0 - version: 6.4.0 - karma-chrome-launcher: - specifier: ~3.2.0 - version: 3.2.0 - karma-coverage: - specifier: ~2.2.0 - version: 2.2.0 - karma-jasmine: - specifier: ~5.1.0 - version: 5.1.0(karma@6.4.0) - karma-jasmine-html-reporter: - specifier: ~2.0.0 - version: 2.0.0(jasmine-core@4.6.0)(karma-jasmine@5.1.0)(karma@6.4.0) - typescript: - specifier: ~5.0.2 - version: 5.0.2 - -packages: - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@aneoconsultingfr/armonik.api.angular@3.8.1(@angular/common@16.0.0)(@angular/core@16.0.0)(@ngx-grpc/common@3.1.1)(@ngx-grpc/core@3.1.1)(@ngx-grpc/well-known-types@3.1.1)(google-protobuf@3.21.2)(rxjs@7.8.0): - resolution: {integrity: sha512-pQbonS92JysGclvWQtMK1saH34t72zpTm0x/yrHZDS7DOWUPYpxq+Z3YjbpofhyxoNNqaqcCPPeHcUMA+s7yCw==} - peerDependencies: - '@angular/common': ^15.1.0 - '@angular/core': ^15.1.0 - '@ngx-grpc/common': ^3.1.1 - '@ngx-grpc/core': ^3.1.1 - '@ngx-grpc/well-known-types': ^3.1.1 - google-protobuf: ^3.21.2 - rxjs: ~7.8.0 - dependencies: - '@angular/common': 16.0.0(@angular/core@16.0.0)(rxjs@7.8.0) - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - '@ngx-grpc/common': 3.1.1(google-protobuf@3.21.2)(rxjs@7.8.0) - '@ngx-grpc/core': 3.1.1(@angular/core@16.0.0)(@ngx-grpc/common@3.1.1)(rxjs@7.8.0) - '@ngx-grpc/well-known-types': 3.1.1(@ngx-grpc/common@3.1.1)(google-protobuf@3.21.2) - google-protobuf: 3.21.2 - rxjs: 7.8.0 - tslib: 2.5.0 - dev: false - - /@angular-devkit/architect@0.1600.0(chokidar@3.5.3): - resolution: {integrity: sha512-nYRcqAxZnndhAEpSpJ1U2TScs2huu674OKrsEyJTqLEANEyCPBnusAmS9HcGzMBgePAwNElqOKrr5/f1DbYq1A==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - dependencies: - '@angular-devkit/core': 16.0.0(chokidar@3.5.3) - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - dev: true - - /@angular-devkit/build-angular@16.0.0(@angular/compiler-cli@16.0.0)(@types/node@20.3.1)(karma@6.4.0)(ts-node@10.9.1)(typescript@5.0.2): - resolution: {integrity: sha512-OvDQAbrV3cUMfHws30MnDURsXselZ0GWhSxZjOdcD3cF64Nsq5ywftHOT+QC3YdDghwI8gMADN9et+aVDscBzQ==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler-cli': ^16.0.0 - '@angular/localize': ^16.0.0 - '@angular/platform-server': ^16.0.0 - '@angular/service-worker': ^16.0.0 - jest: ^29.5.0 - jest-environment-jsdom: ^29.5.0 - karma: ^6.3.0 - ng-packagr: ^16.0.0 - protractor: ^7.0.0 - tailwindcss: ^2.0.0 || ^3.0.0 - typescript: '>=4.9.3 <5.1' - peerDependenciesMeta: - '@angular/localize': - optional: true - '@angular/platform-server': - optional: true - '@angular/service-worker': - optional: true - jest: - optional: true - jest-environment-jsdom: - optional: true - karma: - optional: true - ng-packagr: - optional: true - protractor: - optional: true - tailwindcss: - optional: true - dependencies: - '@ampproject/remapping': 2.2.1 - '@angular-devkit/architect': 0.1600.0(chokidar@3.5.3) - '@angular-devkit/build-webpack': 0.1600.0(chokidar@3.5.3)(webpack-dev-server@4.13.2)(webpack@5.80.0) - '@angular-devkit/core': 16.0.0(chokidar@3.5.3) - '@angular/compiler-cli': 16.0.0(@angular/compiler@16.0.0)(typescript@5.0.2) - '@babel/core': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-runtime': 7.21.4(@babel/core@7.21.4) - '@babel/preset-env': 7.21.4(@babel/core@7.21.4) - '@babel/runtime': 7.21.0 - '@babel/template': 7.20.7 - '@discoveryjs/json-ext': 0.5.7 - '@ngtools/webpack': 16.0.0(@angular/compiler-cli@16.0.0)(typescript@5.0.2)(webpack@5.80.0) - '@vitejs/plugin-basic-ssl': 1.0.1(vite@4.3.1) - ansi-colors: 4.1.3 - autoprefixer: 10.4.14(postcss@8.4.23) - babel-loader: 9.1.2(@babel/core@7.21.4)(webpack@5.80.0) - babel-plugin-istanbul: 6.1.1 - browserslist: 4.21.5 - cacache: 17.0.6 - chokidar: 3.5.3 - copy-webpack-plugin: 11.0.0(webpack@5.80.0) - critters: 0.0.16 - css-loader: 6.7.3(webpack@5.80.0) - esbuild-wasm: 0.17.18 - glob: 8.1.0 - https-proxy-agent: 5.0.1 - inquirer: 8.2.4 - jsonc-parser: 3.2.0 - karma: 6.4.0 - karma-source-map-support: 1.4.0 - less: 4.1.3 - less-loader: 11.1.0(less@4.1.3)(webpack@5.80.0) - license-webpack-plugin: 4.0.2(webpack@5.80.0) - loader-utils: 3.2.1 - magic-string: 0.30.0 - mini-css-extract-plugin: 2.7.5(webpack@5.80.0) - mrmime: 1.0.1 - open: 8.4.2 - ora: 5.4.1 - parse5-html-rewriting-stream: 7.0.0 - piscina: 3.2.0 - postcss: 8.4.23 - postcss-loader: 7.2.4(@types/node@20.3.1)(postcss@8.4.23)(ts-node@10.9.1)(typescript@5.0.2)(webpack@5.80.0) - resolve-url-loader: 5.0.0 - rxjs: 7.8.1 - sass: 1.62.1 - sass-loader: 13.2.2(sass@1.62.1)(webpack@5.80.0) - semver: 7.4.0 - source-map-loader: 4.0.1(webpack@5.80.0) - source-map-support: 0.5.21 - terser: 5.17.1 - text-table: 0.2.0 - tree-kill: 1.2.2 - tslib: 2.5.0 - typescript: 5.0.2 - vite: 4.3.1(@types/node@20.3.1)(less@4.1.3)(sass@1.62.1)(terser@5.17.1) - webpack: 5.80.0(esbuild@0.17.18) - webpack-dev-middleware: 6.0.2(webpack@5.80.0) - webpack-dev-server: 4.13.2(webpack@5.80.0) - webpack-merge: 5.8.0 - webpack-subresource-integrity: 5.1.0(webpack@5.80.0) - optionalDependencies: - esbuild: 0.17.18 - transitivePeerDependencies: - - '@swc/core' - - '@types/node' - - bluebird - - bufferutil - - debug - - fibers - - html-webpack-plugin - - node-sass - - sass-embedded - - stylus - - sugarss - - supports-color - - ts-node - - uglify-js - - utf-8-validate - - webpack-cli - dev: true - - /@angular-devkit/build-webpack@0.1600.0(chokidar@3.5.3)(webpack-dev-server@4.13.2)(webpack@5.80.0): - resolution: {integrity: sha512-ZlNNMtAzgMCsaN5crkqtgeYxWEyZ78/ePfrJTB3+Hb6LS+hsRf4WAYubHWRWReSx87ppluRrgNZLy0K9ooWy1w==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - webpack: ^5.30.0 - webpack-dev-server: ^4.0.0 - dependencies: - '@angular-devkit/architect': 0.1600.0(chokidar@3.5.3) - rxjs: 7.8.1 - webpack: 5.80.0(esbuild@0.17.18) - webpack-dev-server: 4.13.2(webpack@5.80.0) - transitivePeerDependencies: - - chokidar - dev: true - - /@angular-devkit/core@16.0.0(chokidar@3.5.3): - resolution: {integrity: sha512-YJKvAJlg4/lfP93pQNawlOTQalynWGpoatZU+1aXBgRh5YCTKu2S/A3gtQ71DBuhac76gJe1RpxDoq41kB2KlQ==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - chokidar: ^3.5.2 - peerDependenciesMeta: - chokidar: - optional: true - dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - chokidar: 3.5.3 - jsonc-parser: 3.2.0 - rxjs: 7.8.1 - source-map: 0.7.4 - dev: true - - /@angular-devkit/schematics@16.0.0: - resolution: {integrity: sha512-9uFOqjOQdhnpxU5mku2LvBkV5Ave2ihHBFaQCH7vQ7DD+p4NpLHu93bMSh+f7k9W7F0lY18g9qrihRgK/7wfuA==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - dependencies: - '@angular-devkit/core': 16.0.0(chokidar@3.5.3) - jsonc-parser: 3.2.0 - magic-string: 0.30.0 - ora: 5.4.1 - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - dev: true - - /@angular/animations@16.0.0(@angular/core@16.0.0): - resolution: {integrity: sha512-Xx4Ffdo3sweg24MDVAXbDfxqkNPEuRgqOC1+f9171kf+w7cBEr4Bmy37DP7YkJceaU0xJH9imcx4708KeIjqkQ==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - '@angular/core': 16.0.0 - dependencies: - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - tslib: 2.3.0 - dev: false - - /@angular/cli@16.0.0: - resolution: {integrity: sha512-vsveaSJ5kj0MeJCg1nir5iJJEsdrRRnyNeL1awMcyrEjAhBPX3d0gfOP2fe0HR5KJtntX8zvihGus3i48Quo7A==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - hasBin: true - dependencies: - '@angular-devkit/architect': 0.1600.0(chokidar@3.5.3) - '@angular-devkit/core': 16.0.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.0.0 - '@schematics/angular': 16.0.0 - '@yarnpkg/lockfile': 1.1.0 - ansi-colors: 4.1.3 - ini: 4.0.0 - inquirer: 8.2.4 - jsonc-parser: 3.2.0 - npm-package-arg: 10.1.0 - npm-pick-manifest: 8.0.1 - open: 8.4.2 - ora: 5.4.1 - pacote: 15.1.3 - resolve: 1.22.2 - semver: 7.4.0 - symbol-observable: 4.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - bluebird - - chokidar - - supports-color - dev: true - - /@angular/common@16.0.0(@angular/core@16.0.0)(rxjs@7.8.0): - resolution: {integrity: sha512-at3/xCevf2t9swX2P7K7gaSBuQPy7ZJsf37qQkYIuczzfij69r7s9NjYeA74/q3EWG9Yl2DCrhYoCW7ViXQINQ==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - '@angular/core': 16.0.0 - rxjs: ^6.5.3 || ^7.4.0 - dependencies: - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - rxjs: 7.8.0 - tslib: 2.3.0 - dev: false - - /@angular/compiler-cli@16.0.0(@angular/compiler@16.0.0)(typescript@5.0.2): - resolution: {integrity: sha512-oyJzxiTHxziv7mD0QuA7K6tpDoL6YNGPkquKjeJjNVZvUrodGsvJ8xHO4ydmjK3nMu2ET1YarsdI8bRp4vp/7w==} - engines: {node: ^16.14.0 || >=18.10.0} - hasBin: true - peerDependencies: - '@angular/compiler': 16.0.0 - typescript: '>=4.9.3 <5.1' - dependencies: - '@angular/compiler': 16.0.0(@angular/core@16.0.0) - '@babel/core': 7.19.3 - '@jridgewell/sourcemap-codec': 1.4.15 - chokidar: 3.5.3 - convert-source-map: 1.9.0 - reflect-metadata: 0.1.13 - semver: 7.5.1 - tslib: 2.3.0 - typescript: 5.0.2 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@angular/compiler@16.0.0(@angular/core@16.0.0): - resolution: {integrity: sha512-xtg+KRvSeB9DUzMDtvlaRGKv+Y0MERsz+JOoqV9H4606ThNz5h8ih6fEhVKYqG100o7GhdJaVFO+vlr2/edUHA==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - '@angular/core': 16.0.0 - peerDependenciesMeta: - '@angular/core': - optional: true - dependencies: - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - tslib: 2.3.0 - - /@angular/core@16.0.0(rxjs@7.8.0)(zone.js@0.13.0): - resolution: {integrity: sha512-scppDxtXubum6ZiGu3ogmReBtMuA5XXk5FL3YKLb3c9O7q9Z5PC8KNQ6SsaOwEb6oW+0BWXMV698p/zmd0J4tA==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - rxjs: ^6.5.3 || ^7.4.0 - zone.js: ~0.13.0 - dependencies: - rxjs: 7.8.0 - tslib: 2.3.0 - zone.js: 0.13.0 - - /@angular/forms@16.0.0(@angular/common@16.0.0)(@angular/core@16.0.0)(@angular/platform-browser@16.0.0)(rxjs@7.8.0): - resolution: {integrity: sha512-avpreXyDYWf44RNM5hfi5cTXXiNwcajBURP5rLap8RPMSUi2ePlJsmi0O+3+GduNZFbtnRXIpKTj3W+GeNa0PA==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - '@angular/common': 16.0.0 - '@angular/core': 16.0.0 - '@angular/platform-browser': 16.0.0 - rxjs: ^6.5.3 || ^7.4.0 - dependencies: - '@angular/common': 16.0.0(@angular/core@16.0.0)(rxjs@7.8.0) - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - '@angular/platform-browser': 16.0.0(@angular/animations@16.0.0)(@angular/common@16.0.0)(@angular/core@16.0.0) - rxjs: 7.8.0 - tslib: 2.3.0 - dev: false - - /@angular/platform-browser-dynamic@16.0.0(@angular/common@16.0.0)(@angular/compiler@16.0.0)(@angular/core@16.0.0)(@angular/platform-browser@16.0.0): - resolution: {integrity: sha512-xUR36r+7hFQjAb0RA0VFfWrCLj2VnWg0xJgPe4FQmwaEWjKMc011tkJXs0PApaiTxvE0W08nadSDTu5jfsBrFw==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - '@angular/common': 16.0.0 - '@angular/compiler': 16.0.0 - '@angular/core': 16.0.0 - '@angular/platform-browser': 16.0.0 - dependencies: - '@angular/common': 16.0.0(@angular/core@16.0.0)(rxjs@7.8.0) - '@angular/compiler': 16.0.0(@angular/core@16.0.0) - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - '@angular/platform-browser': 16.0.0(@angular/animations@16.0.0)(@angular/common@16.0.0)(@angular/core@16.0.0) - tslib: 2.3.0 - dev: false - - /@angular/platform-browser@16.0.0(@angular/animations@16.0.0)(@angular/common@16.0.0)(@angular/core@16.0.0): - resolution: {integrity: sha512-6LpgLfEnumKMKM/S9joWrVSm4MdFuIjddFmlSG7zGcRqwM0N8doH/YkuwTK8/t9q8wI/yztp6qM2pg25Pgv1XA==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - '@angular/animations': 16.0.0 - '@angular/common': 16.0.0 - '@angular/core': 16.0.0 - peerDependenciesMeta: - '@angular/animations': - optional: true - dependencies: - '@angular/animations': 16.0.0(@angular/core@16.0.0) - '@angular/common': 16.0.0(@angular/core@16.0.0)(rxjs@7.8.0) - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - tslib: 2.3.0 - dev: false - - /@angular/router@16.0.0(@angular/common@16.0.0)(@angular/core@16.0.0)(@angular/platform-browser@16.0.0)(rxjs@7.8.0): - resolution: {integrity: sha512-+5gjJwFx3AFGv7OnY53pfUzaPbWe5gOVQWXAnlUuk6tsQmWJBMehuCQ5ZO5cxViQDZkyvNALzoUeU6aKWmNqmg==} - engines: {node: ^16.14.0 || >=18.10.0} - peerDependencies: - '@angular/common': 16.0.0 - '@angular/core': 16.0.0 - '@angular/platform-browser': 16.0.0 - rxjs: ^6.5.3 || ^7.4.0 - dependencies: - '@angular/common': 16.0.0(@angular/core@16.0.0)(rxjs@7.8.0) - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - '@angular/platform-browser': 16.0.0(@angular/animations@16.0.0)(@angular/common@16.0.0)(@angular/core@16.0.0) - rxjs: 7.8.0 - tslib: 2.3.0 - dev: false - - /@assemblyscript/loader@0.10.1: - resolution: {integrity: sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==} - dev: true - - /@babel/code-frame@7.22.5: - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.5 - dev: true - - /@babel/compat-data@7.22.5: - resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.19.3: - resolution: {integrity: sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.19.3) - '@babel/helper-module-transforms': 7.22.5 - '@babel/helpers': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/core@7.21.4: - resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.21.4 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.21.4) - '@babel/helper-module-transforms': 7.22.5 - '@babel/helpers': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/template': 7.20.7 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/core@7.22.5: - resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) - '@babel/helper-module-transforms': 7.22.5 - '@babel/helpers': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.21.4: - resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - dev: true - - /@babel/generator@7.22.5: - resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - dev: true - - /@babel/helper-annotate-as-pure@7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.5: - resolution: {integrity: sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-compilation-targets@7.22.5(@babel/core@7.19.3): - resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.19.3 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.0 - dev: true - - /@babel/helper-compilation-targets@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.21.4 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.0 - dev: true - - /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5): - resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.0 - dev: true - - /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-create-regexp-features-plugin@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.0 - dev: true - - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): - resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.2 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-member-expression-to-functions@7.22.5: - resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-module-transforms@7.22.5: - resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-remap-async-to-generator@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-replace-supers@7.22.5: - resolution: {integrity: sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-split-export-declaration@7.22.5: - resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-wrap-function@7.22.5: - resolution: {integrity: sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helpers@7.22.5: - resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.22.5: - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.22.5: - resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.5(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.21.4): - resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-classes@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.21.4) - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.5 - dev: true - - /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.21.4) - '@babel/helper-function-name': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-optional-chaining@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.1 - dev: true - - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-runtime@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.21.4): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/preset-env@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.21.4) - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-systemjs': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-regenerator': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-escapes': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.21.4) - '@babel/preset-modules': 0.1.5(@babel/core@7.21.4) - '@babel/types': 7.22.5 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) - core-js-compat: 3.31.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/preset-modules@0.1.5(@babel/core@7.21.4): - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.21.4) - '@babel/types': 7.22.5 - esutils: 2.0.3 - dev: true - - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: true - - /@babel/runtime@7.21.0: - resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - dev: true - - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - dev: true - - /@babel/traverse@7.22.5: - resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.22.5: - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: true - - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - dev: true - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: true - - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - dev: true - - /@esbuild/android-arm64@0.17.18: - resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.18: - resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.18: - resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.18: - resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.18: - resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.18: - resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.18: - resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.18: - resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.17.18: - resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.17.18: - resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.17.18: - resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.17.18: - resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.17.18: - resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.17.18: - resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.17.18: - resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.17.18: - resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.17.18: - resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.17.18: - resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.17.18: - resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.17.18: - resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.17.18: - resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.18: - resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/source-map@0.3.3: - resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@leichtgewicht/ip-codec@2.0.4: - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - dev: true - - /@ngtools/webpack@16.0.0(@angular/compiler-cli@16.0.0)(typescript@5.0.2)(webpack@5.80.0): - resolution: {integrity: sha512-I5zjGtJu2wwIdM+OFUHXezmwTJ0wpParVJgCxR0cLd0CIbpRYSjOSZQN/nR9ZnTKAI5uFZ3MM2p/VRQGUUHUcw==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler-cli': ^16.0.0 - typescript: '>=4.9.3 <5.1' - webpack: ^5.54.0 - dependencies: - '@angular/compiler-cli': 16.0.0(@angular/compiler@16.0.0)(typescript@5.0.2) - typescript: 5.0.2 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /@ngx-grpc/common@3.1.1(google-protobuf@3.21.2)(rxjs@7.8.0): - resolution: {integrity: sha512-RoTnu1etLPJT1cSJyCXgKCpKKhCR/nrNEdRyZreyLO4RgC8kThlD+akkytoCsDuj5s8NkJI/xDP61E7TLx/y2A==} - peerDependencies: - google-protobuf: ^3.10.0 - rxjs: '>=6.0.0' - dependencies: - google-protobuf: 3.21.2 - rxjs: 7.8.0 - tslib: 2.5.0 - dev: false - - /@ngx-grpc/core@3.1.1(@angular/core@16.0.0)(@ngx-grpc/common@3.1.1)(rxjs@7.8.0): - resolution: {integrity: sha512-GFhO/kpA7kJ3bu6mYwgjspPWjMJPUHxTrLZqxjsXtwNexPNSIQkVO4SOrROp+bZ91LVt+goiSeRz8CUzwiXWdQ==} - peerDependencies: - '@angular/core': '>=12.0.0' - '@ngx-grpc/common': 3.1.1 - rxjs: '>=6.0.0' - dependencies: - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - '@ngx-grpc/common': 3.1.1(google-protobuf@3.21.2)(rxjs@7.8.0) - rxjs: 7.8.0 - tslib: 2.5.0 - dev: false - - /@ngx-grpc/grpc-web-client@3.1.1(@angular/core@16.0.0)(@ngx-grpc/common@3.1.1)(@ngx-grpc/core@3.1.1)(grpc-web@1.4.2)(rxjs@7.8.0): - resolution: {integrity: sha512-ZRhrcODXKelmCH9NqleHf7RGTr00AkU7b5ZmkV3/BWMJIfu420qwr0nO/w2ff7puWwdLw+SZTyOw5UAxy2aKKg==} - peerDependencies: - '@angular/core': '>=12.0.0' - '@ngx-grpc/common': 3.1.1 - '@ngx-grpc/core': 3.1.1 - grpc-web: ^1.2.1 - rxjs: '>=6.0.0' - dependencies: - '@angular/core': 16.0.0(rxjs@7.8.0)(zone.js@0.13.0) - '@ngx-grpc/common': 3.1.1(google-protobuf@3.21.2)(rxjs@7.8.0) - '@ngx-grpc/core': 3.1.1(@angular/core@16.0.0)(@ngx-grpc/common@3.1.1)(rxjs@7.8.0) - grpc-web: 1.4.2 - rxjs: 7.8.0 - tslib: 2.5.0 - dev: false - - /@ngx-grpc/well-known-types@3.1.1(@ngx-grpc/common@3.1.1)(google-protobuf@3.21.2): - resolution: {integrity: sha512-iPcUqsgm0s+g8i8sDazPnJya0lPJ8981PdnjzTyqKlc8y97B75K20bRS9/mc2EjKP+FXHUfDejzA+SehjeRzew==} - peerDependencies: - '@ngx-grpc/common': 3.1.1 - google-protobuf: ^3.10.0 - dependencies: - '@ngx-grpc/common': 3.1.1(google-protobuf@3.21.2)(rxjs@7.8.0) - google-protobuf: 3.21.2 - tslib: 2.5.0 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /@npmcli/fs@3.1.0: - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - semver: 7.4.0 - dev: true - - /@npmcli/git@4.1.0: - resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/promise-spawn': 6.0.2 - lru-cache: 7.18.3 - npm-pick-manifest: 8.0.1 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.4.0 - which: 3.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/installed-package-contents@2.0.2: - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@npmcli/promise-spawn@6.0.2: - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - which: 3.0.1 - dev: true - - /@npmcli/run-script@6.0.2: - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.4.0 - read-package-json-fast: 3.0.2 - which: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - - /@schematics/angular@16.0.0: - resolution: {integrity: sha512-Ao1Y0hEDa30JjWDLnUfOsD+9nnfdBFclfKFzR+7pvvFYCpSUhH1u+8e+7noruIxlP26+SpqPn3AF5+IRTGza8w==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - dependencies: - '@angular-devkit/core': 16.0.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.0.0 - jsonc-parser: 3.2.0 - transitivePeerDependencies: - - chokidar - dev: true - - /@sigstore/protobuf-specs@0.1.0: - resolution: {integrity: sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@sigstore/tuf@1.0.0: - resolution: {integrity: sha512-bLzi9GeZgMCvjJeLUIfs8LJYCxrPRA8IXQkzUtaFKKVPTz0mucRyqFcV2U20yg9K+kYAD0YSitzGfRZCFLjdHQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@sigstore/protobuf-specs': 0.1.0 - make-fetch-happen: 11.1.1 - tuf-js: 1.1.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: true - - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: true - - /@tufjs/canonical-json@1.0.0: - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@tufjs/models@1.0.4: - resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.1 - dev: true - - /@types/body-parser@1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} - dependencies: - '@types/connect': 3.4.35 - '@types/node': 20.3.1 - dev: true - - /@types/bonjour@3.5.10: - resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} - dependencies: - '@types/node': 20.3.1 - dev: true - - /@types/connect-history-api-fallback@1.5.0: - resolution: {integrity: sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==} - dependencies: - '@types/express-serve-static-core': 4.17.35 - '@types/node': 20.3.1 - dev: true - - /@types/connect@3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} - dependencies: - '@types/node': 20.3.1 - dev: true - - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: true - - /@types/cors@2.8.13: - resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} - dependencies: - '@types/node': 20.3.1 - dev: true - - /@types/eslint-scope@3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} - dependencies: - '@types/eslint': 8.40.2 - '@types/estree': 1.0.1 - dev: true - - /@types/eslint@8.40.2: - resolution: {integrity: sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==} - dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 - dev: true - - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - dev: true - - /@types/express-serve-static-core@4.17.35: - resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} - dependencies: - '@types/node': 20.3.1 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - '@types/send': 0.17.1 - dev: true - - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} - dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.35 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 - dev: true - - /@types/google-protobuf@3.15.6: - resolution: {integrity: sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==} - dev: true - - /@types/http-proxy@1.17.11: - resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} - dependencies: - '@types/node': 20.3.1 - dev: true - - /@types/jasmine@4.3.0: - resolution: {integrity: sha512-u1jWakf8CWvLfSEZyxmzkgBzOEvXH/szpT0e6G8BTkx5Eu0BhDn7sbc5dz0JBN/6Wwm9rBe+JAsk9tJRyH9ZkA==} - dev: true - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true - - /@types/mime@1.3.2: - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} - dev: true - - /@types/mime@3.0.1: - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - dev: true - - /@types/node@20.3.1: - resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} - dev: true - - /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - dev: true - - /@types/range-parser@1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - dev: true - - /@types/retry@0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: true - - /@types/send@0.17.1: - resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} - dependencies: - '@types/mime': 1.3.2 - '@types/node': 20.3.1 - dev: true - - /@types/serve-index@1.9.1: - resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} - dependencies: - '@types/express': 4.17.17 - dev: true - - /@types/serve-static@1.15.1: - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} - dependencies: - '@types/mime': 3.0.1 - '@types/node': 20.3.1 - dev: true - - /@types/sockjs@0.3.33: - resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} - dependencies: - '@types/node': 20.3.1 - dev: true - - /@types/ws@8.5.5: - resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} - dependencies: - '@types/node': 20.3.1 - dev: true - - /@vitejs/plugin-basic-ssl@1.0.1(vite@4.3.1): - resolution: {integrity: sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==} - engines: {node: '>=14.6.0'} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 - dependencies: - vite: 4.3.1(@types/node@20.3.1)(less@4.1.3)(sass@1.62.1)(terser@5.17.1) - dev: true - - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true - - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - dev: true - - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - - /@yarnpkg/lockfile@1.1.0: - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - dev: true - - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: true - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - - /acorn-import-assertions@1.9.0(acorn@8.8.2): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.8.2 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /adjust-sourcemap-loader@4.0.0: - resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} - engines: {node: '>=8.9'} - dependencies: - loader-utils: 2.0.4 - regex-parser: 2.2.11 - dev: true - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /agentkeepalive@4.3.0: - resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} - engines: {node: '>= 8.0.0'} - dependencies: - debug: 4.3.4 - depd: 2.0.0 - humanize-ms: 1.2.1 - transitivePeerDependencies: - - supports-color - dev: true - - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: true - - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - - /ajv-keywords@5.1.0(ajv@8.12.0): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - dependencies: - ajv: 8.12.0 - fast-deep-equal: 3.1.3 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - - /ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: true - - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true - - /array-flatten@2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - dev: true - - /autoprefixer@10.4.14(postcss@8.4.23): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001503 - fraction.js: 4.2.0 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.23 - postcss-value-parser: 4.2.0 - dev: true - - /babel-loader@9.1.2(@babel/core@7.21.4)(webpack@5.80.0): - resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' - dependencies: - '@babel/core': 7.21.4 - find-cache-dir: 3.3.2 - schema-utils: 4.2.0 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.4): - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.5 - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.4): - resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - core-js-compat: 3.31.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): - resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: true - - /batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: true - - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /bonjour-service@1.1.1: - resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} - dependencies: - array-flatten: 2.1.2 - dns-equal: 1.0.0 - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - dev: true - - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001503 - electron-to-chromium: 1.4.431 - node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.5) - dev: true - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - dependencies: - semver: 7.4.0 - dev: true - - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true - - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true - - /cacache@17.0.6: - resolution: {integrity: sha512-ixcYmEBExFa/+ajIPjcwypxL97CjJyOsH9A/W+4qgEPIpJvKlC+HmVY8nkIck6n3PwUTdgq9c489niJGwl+5Cw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.2 - glob: 10.2.7 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - ssri: 10.0.4 - tar: 6.1.15 - unique-filename: 3.0.0 - transitivePeerDependencies: - - bluebird - dev: true - - /cacache@17.1.3: - resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.2 - glob: 10.2.7 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.4 - tar: 6.1.15 - unique-filename: 3.0.0 - dev: true - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /caniuse-lite@1.0.30001503: - resolution: {integrity: sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw==} - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true - - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true - - /cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} - dev: true - - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: true - - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true - - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - dev: true - - /connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: 1.3.3 - utils-merge: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: true - - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true - - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: true - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - dependencies: - is-what: 3.14.1 - dev: true - - /copy-webpack-plugin@11.0.0(webpack@5.80.0): - resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.1.0 - dependencies: - fast-glob: 3.2.12 - glob-parent: 6.0.2 - globby: 13.1.4 - normalize-path: 3.0.0 - schema-utils: 4.2.0 - serialize-javascript: 6.0.1 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /core-js-compat@3.31.0: - resolution: {integrity: sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==} - dependencies: - browserslist: 4.21.5 - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true - - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - dev: true - - /cosmiconfig-typescript-loader@4.3.0(@types/node@20.3.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.0.2): - resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=7' - ts-node: '>=10' - typescript: '>=3' - dependencies: - '@types/node': 20.3.1 - cosmiconfig: 8.2.0 - ts-node: 10.9.1(@types/node@20.3.1)(typescript@5.0.2) - typescript: 5.0.2 - dev: true - - /cosmiconfig@8.2.0: - resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} - engines: {node: '>=14'} - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /critters@0.0.16: - resolution: {integrity: sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==} - dependencies: - chalk: 4.1.2 - css-select: 4.3.0 - parse5: 6.0.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - postcss: 8.4.23 - pretty-bytes: 5.6.0 - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /css-loader@6.7.3(webpack@5.80.0): - resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.23) - postcss: 8.4.23 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.23) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.23) - postcss-modules-scope: 3.0.0(postcss@8.4.23) - postcss-modules-values: 4.0.0(postcss@8.4.23) - postcss-value-parser: 4.2.0 - semver: 7.4.0 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - dev: true - - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /custom-event@1.0.1: - resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} - dev: true - - /date-format@4.0.14: - resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} - engines: {node: '>=4.0'} - dev: true - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - optional: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} - dependencies: - execa: 5.1.1 - dev: true - - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: true - - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true - - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true - - /detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: true - - /di@0.0.1: - resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dns-equal@1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: true - - /dns-packet@5.6.0: - resolution: {integrity: sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==} - engines: {node: '>=6'} - dependencies: - '@leichtgewicht/ip-codec': 2.0.4 - dev: true - - /dom-serialize@2.2.1: - resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} - dependencies: - custom-event: 1.0.1 - ent: 2.2.0 - extend: 3.0.2 - void-elements: 2.0.1 - dev: true - - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: true - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - - /domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dev: true - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true - - /electron-to-chromium@1.4.431: - resolution: {integrity: sha512-m232JTVmCawA2vG+1azVxhKZ9Sv1Q//xxNv5PkP5rWxGgQE8c3CiZFrh8Xnp+d1NmNxlu3QQrGIfdeW5TtXX5w==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true - - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true - - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true - dependencies: - iconv-lite: 0.6.3 - dev: true - optional: true - - /engine.io-parser@5.0.7: - resolution: {integrity: sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==} - engines: {node: '>=10.0.0'} - dev: true - - /engine.io@6.4.2: - resolution: {integrity: sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==} - engines: {node: '>=10.0.0'} - dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.13 - '@types/node': 20.3.1 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.4.2 - cors: 2.8.5 - debug: 4.3.4 - engine.io-parser: 5.0.7 - ws: 8.11.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /ent@2.2.0: - resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} - dev: true - - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: true - - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true - - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true - - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: true - - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - requiresBuild: true - dependencies: - prr: 1.0.1 - dev: true - optional: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /es-module-lexer@1.3.0: - resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} - dev: true - - /esbuild-wasm@0.17.18: - resolution: {integrity: sha512-h4m5zVa+KaDuRFIbH9dokMwovvkIjTQJS7/Ry+0Z1paVuS9aIkso2vdA2GmwH9GSvGX6w71WveJ3PfkoLuWaRw==} - engines: {node: '>=12'} - hasBin: true - dev: true - - /esbuild@0.17.18: - resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.18 - '@esbuild/android-arm64': 0.17.18 - '@esbuild/android-x64': 0.17.18 - '@esbuild/darwin-arm64': 0.17.18 - '@esbuild/darwin-x64': 0.17.18 - '@esbuild/freebsd-arm64': 0.17.18 - '@esbuild/freebsd-x64': 0.17.18 - '@esbuild/linux-arm': 0.17.18 - '@esbuild/linux-arm64': 0.17.18 - '@esbuild/linux-ia32': 0.17.18 - '@esbuild/linux-loong64': 0.17.18 - '@esbuild/linux-mips64el': 0.17.18 - '@esbuild/linux-ppc64': 0.17.18 - '@esbuild/linux-riscv64': 0.17.18 - '@esbuild/linux-s390x': 0.17.18 - '@esbuild/linux-x64': 0.17.18 - '@esbuild/netbsd-x64': 0.17.18 - '@esbuild/openbsd-x64': 0.17.18 - '@esbuild/sunos-x64': 0.17.18 - '@esbuild/win32-arm64': 0.17.18 - '@esbuild/win32-ia32': 0.17.18 - '@esbuild/win32-x64': 0.17.18 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true - - /eventemitter-asyncresource@1.0.0: - resolution: {integrity: sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==} - dev: true - - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - dev: true - - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - dependencies: - websocket-driver: 0.7.4 - dev: true - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.5.0 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true - - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.0.2 - dev: true - - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true - - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /fs-minipass@3.0.2: - resolution: {integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minipass: 5.0.0 - dev: true - - /fs-monkey@1.0.4: - resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob@10.2.7: - resolution: {integrity: sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.2.1 - minimatch: 9.0.1 - minipass: 5.0.0 - path-scurry: 1.9.2 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /google-protobuf@3.21.2: - resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} - dev: false - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /grpc-web@1.4.2: - resolution: {integrity: sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==} - dev: false - - /handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /hdr-histogram-js@2.0.3: - resolution: {integrity: sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==} - dependencies: - '@assemblyscript/loader': 0.10.1 - base64-js: 1.5.1 - pako: 1.0.11 - dev: true - - /hdr-histogram-percentiles-obj@3.0.0: - resolution: {integrity: sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==} - dev: true - - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - lru-cache: 7.18.3 - dev: true - - /hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - dev: true - - /html-entities@2.3.6: - resolution: {integrity: sha512-9o0+dcpIw2/HxkNuYKxSJUF/MMRZQECK4GnF+oQOmJ83yCVHTWgCH5aOXxK5bozNRmM8wtgryjHD3uloPBDEGw==} - dev: true - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true - - /http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: true - - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - dev: true - - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: true - - /http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: true - - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-middleware@2.0.6(@types/express@4.17.17): - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true - dependencies: - '@types/express': 4.17.17 - '@types/http-proxy': 1.17.11 - http-proxy: 1.18.1 - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.5 - transitivePeerDependencies: - - debug - dev: true - - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.2 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - dev: true - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - dependencies: - ms: 2.1.3 - dev: true - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /icss-utils@5.1.0(postcss@8.4.23): - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.23 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore-walk@6.0.3: - resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minimatch: 9.0.1 - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - - /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /immutable@4.3.0: - resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /ini@4.0.0: - resolution: {integrity: sha512-t0ikzf5qkSFqRl1e6ejKBe+Tk2bsQd8ivEkcisyGXsku2t8NvXZ1Y3RRz5vxrDgOrTBOi13CvGsVoI5wVpd7xg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /inquirer@8.2.4: - resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - dev: true - - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true - - /ipaddr.js@2.1.0: - resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} - engines: {node: '>= 10'} - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} - dependencies: - has: 1.0.3 - dev: true - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true - - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: true - - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - - /is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - - /isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.22.5 - '@babel/parser': 7.22.5 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - - /jackspeak@2.2.1: - resolution: {integrity: sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: true - - /jasmine-core@4.6.0: - resolution: {integrity: sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==} - dev: true - - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 20.3.1 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true - - /karma-chrome-launcher@3.2.0: - resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==} - dependencies: - which: 1.3.1 - dev: true - - /karma-coverage@2.2.0: - resolution: {integrity: sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==} - engines: {node: '>=10.0.0'} - dependencies: - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /karma-jasmine-html-reporter@2.0.0(jasmine-core@4.6.0)(karma-jasmine@5.1.0)(karma@6.4.0): - resolution: {integrity: sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==} - peerDependencies: - jasmine-core: ^4.0.0 - karma: ^6.0.0 - karma-jasmine: ^5.0.0 - dependencies: - jasmine-core: 4.6.0 - karma: 6.4.0 - karma-jasmine: 5.1.0(karma@6.4.0) - dev: true - - /karma-jasmine@5.1.0(karma@6.4.0): - resolution: {integrity: sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==} - engines: {node: '>=12'} - peerDependencies: - karma: ^6.0.0 - dependencies: - jasmine-core: 4.6.0 - karma: 6.4.0 - dev: true - - /karma-source-map-support@1.4.0: - resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} - dependencies: - source-map-support: 0.5.21 - dev: true - - /karma@6.4.0: - resolution: {integrity: sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w==} - engines: {node: '>= 10'} - hasBin: true - dependencies: - '@colors/colors': 1.5.0 - body-parser: 1.20.2 - braces: 3.0.2 - chokidar: 3.5.3 - connect: 3.7.0 - di: 0.0.1 - dom-serialize: 2.2.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - http-proxy: 1.18.1 - isbinaryfile: 4.0.10 - lodash: 4.17.21 - log4js: 6.9.1 - mime: 2.6.0 - minimatch: 3.1.2 - mkdirp: 0.5.6 - qjobs: 1.2.0 - range-parser: 1.2.1 - rimraf: 3.0.2 - socket.io: 4.6.2 - source-map: 0.6.1 - tmp: 0.2.1 - ua-parser-js: 0.7.35 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - dev: true - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - dev: true - - /launch-editor@2.6.0: - resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} - dependencies: - picocolors: 1.0.0 - shell-quote: 1.8.1 - dev: true - - /less-loader@11.1.0(less@4.1.3)(webpack@5.80.0): - resolution: {integrity: sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==} - engines: {node: '>= 14.15.0'} - peerDependencies: - less: ^3.5.0 || ^4.0.0 - webpack: ^5.0.0 - dependencies: - klona: 2.0.6 - less: 4.1.3 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /less@4.1.3: - resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} - engines: {node: '>=6'} - hasBin: true - dependencies: - copy-anything: 2.0.6 - parse-node-version: 1.0.1 - tslib: 2.5.0 - optionalDependencies: - errno: 0.1.8 - graceful-fs: 4.2.11 - image-size: 0.5.5 - make-dir: 2.1.0 - mime: 1.6.0 - needle: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /license-webpack-plugin@4.0.2(webpack@5.80.0): - resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} - peerDependencies: - webpack: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-sources: - optional: true - dependencies: - webpack: 5.80.0(esbuild@0.17.18) - webpack-sources: 3.2.3 - dev: true - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true - - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - dev: true - - /loader-utils@3.2.1: - resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} - engines: {node: '>= 12.13.0'} - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /log4js@6.9.1: - resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} - engines: {node: '>=8.0'} - dependencies: - date-format: 4.0.14 - debug: 4.3.4 - flatted: 3.2.7 - rfdc: 1.3.0 - streamroller: 3.1.5 - transitivePeerDependencies: - - supports-color - dev: true - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: true - - /lru-cache@9.1.2: - resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} - engines: {node: 14 || >=16.14} - dev: true - - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - pify: 4.0.1 - semver: 5.7.1 - dev: true - optional: true - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /make-fetch-happen@11.1.1: - resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - agentkeepalive: 4.3.0 - cacache: 17.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 10.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true - - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} - dependencies: - fs-monkey: 1.0.4 - dev: true - - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /mini-css-extract-plugin@2.7.5(webpack@5.80.0): - resolution: {integrity: sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - schema-utils: 4.2.0 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-fetch@3.0.3: - resolution: {integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minipass: 5.0.0 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-json-stream@1.0.1: - resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} - dependencies: - jsonparse: 1.3.1 - minipass: 3.3.6 - dev: true - - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - dev: true - - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: true - - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: true - - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - dev: true - - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true - - /mrmime@1.0.1: - resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} - engines: {node: '>=10'} - dev: true - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true - dependencies: - dns-packet: 5.6.0 - thunky: 1.1.0 - dev: true - - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /needle@3.2.0: - resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} - engines: {node: '>= 4.4.x'} - hasBin: true - requiresBuild: true - dependencies: - debug: 3.2.7 - iconv-lite: 0.6.3 - sax: 1.2.4 - transitivePeerDependencies: - - supports-color - dev: true - optional: true - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /nice-napi@1.0.2: - resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} - os: ['!win32'] - requiresBuild: true - dependencies: - node-addon-api: 3.2.1 - node-gyp-build: 4.6.0 - dev: true - optional: true - - /node-addon-api@3.2.1: - resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} - requiresBuild: true - dev: true - optional: true - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /node-gyp@9.4.0: - resolution: {integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 11.1.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.4.0 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} - dev: true - - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - hosted-git-info: 6.1.1 - is-core-module: 2.12.1 - semver: 7.4.0 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true - - /npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-normalize-package-bin: 3.0.1 - dev: true - - /npm-install-checks@6.1.1: - resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - semver: 7.4.0 - dev: true - - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - hosted-git-info: 6.1.1 - proc-log: 3.0.0 - semver: 7.4.0 - validate-npm-package-name: 5.0.0 - dev: true - - /npm-packlist@7.0.4: - resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - ignore-walk: 6.0.3 - dev: true - - /npm-pick-manifest@8.0.1: - resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - npm-install-checks: 6.1.1 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 10.1.0 - semver: 7.4.0 - dev: true - - /npm-registry-fetch@14.0.5: - resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - make-fetch-happen: 11.1.1 - minipass: 5.0.0 - minipass-fetch: 3.0.3 - minipass-json-stream: 1.0.1 - minizlib: 2.1.2 - npm-package-arg: 10.1.0 - proc-log: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - dev: true - - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: true - - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} - dependencies: - '@types/retry': 0.12.0 - retry: 0.13.1 - dev: true - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /pacote@15.1.3: - resolution: {integrity: sha512-aRts8cZqxiJVDitmAh+3z+FxuO3tLNWEmwDRPEpDDiZJaRz06clP4XX112ynMT5uF0QNoMPajBBHnaStUEPJXA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - '@npmcli/git': 4.1.0 - '@npmcli/installed-package-contents': 2.0.2 - '@npmcli/promise-spawn': 6.0.2 - '@npmcli/run-script': 6.0.2 - cacache: 17.1.3 - fs-minipass: 3.0.2 - minipass: 5.0.0 - npm-package-arg: 10.1.0 - npm-packlist: 7.0.4 - npm-pick-manifest: 8.0.1 - npm-registry-fetch: 14.0.5 - proc-log: 3.0.0 - promise-retry: 2.0.1 - read-package-json: 6.0.4 - read-package-json-fast: 3.0.2 - sigstore: 1.6.0 - ssri: 10.0.4 - tar: 6.1.15 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.22.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - dev: true - - /parse5-html-rewriting-stream@7.0.0: - resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==} - dependencies: - entities: 4.5.0 - parse5: 7.1.2 - parse5-sax-parser: 7.0.0 - dev: true - - /parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - dependencies: - parse5: 6.0.1 - dev: true - - /parse5-sax-parser@7.0.0: - resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==} - dependencies: - parse5: 7.1.2 - dev: true - - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true - - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-scurry@1.9.2: - resolution: {integrity: sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 9.1.2 - minipass: 5.0.0 - dev: true - - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true - optional: true - - /piscina@3.2.0: - resolution: {integrity: sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==} - dependencies: - eventemitter-asyncresource: 1.0.0 - hdr-histogram-js: 2.0.3 - hdr-histogram-percentiles-obj: 3.0.0 - optionalDependencies: - nice-napi: 1.0.2 - dev: true - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /postcss-loader@7.2.4(@types/node@20.3.1)(postcss@8.4.23)(ts-node@10.9.1)(typescript@5.0.2)(webpack@5.80.0): - resolution: {integrity: sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w==} - engines: {node: '>= 14.15.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - ts-node: '>=10' - typescript: '>=4' - webpack: ^5.0.0 - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - dependencies: - cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.3.0(@types/node@20.3.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.0.2) - klona: 2.0.6 - postcss: 8.4.23 - semver: 7.4.0 - ts-node: 10.9.1(@types/node@20.3.1)(typescript@5.0.2) - typescript: 5.0.2 - webpack: 5.80.0(esbuild@0.17.18) - transitivePeerDependencies: - - '@types/node' - dev: true - - /postcss-modules-extract-imports@3.0.0(postcss@8.4.23): - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.23 - dev: true - - /postcss-modules-local-by-default@4.0.3(postcss@8.4.23): - resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.23) - postcss: 8.4.23 - postcss-selector-parser: 6.0.13 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-modules-scope@3.0.0(postcss@8.4.23): - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.23 - postcss-selector-parser: 6.0.13 - dev: true - - /postcss-modules-values@4.0.0(postcss@8.4.23): - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.23) - postcss: 8.4.23 - dev: true - - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true - - /postcss@8.4.23: - resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: true - - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: true - - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - dev: true - - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - dev: true - - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: true - optional: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /qjobs@1.2.0: - resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} - engines: {node: '>=0.9'} - dev: true - - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true - - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - json-parse-even-better-errors: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /read-package-json@6.0.4: - resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - glob: 10.2.7 - json-parse-even-better-errors: 3.0.0 - normalize-package-data: 5.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - dev: true - - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - dev: true - - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true - - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: true - - /regenerator-transform@0.15.1: - resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} - dependencies: - '@babel/runtime': 7.21.0 - dev: true - - /regex-parser@2.2.11: - resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} - dev: true - - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} - dependencies: - '@babel/regjsgen': 0.8.0 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - dev: true - - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve-url-loader@5.0.0: - resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} - engines: {node: '>=12'} - dependencies: - adjust-sourcemap-loader: 4.0.0 - convert-source-map: 1.9.0 - loader-utils: 2.0.4 - postcss: 8.4.23 - source-map: 0.6.1 - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true - - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: true - - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rollup@3.25.1: - resolution: {integrity: sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /rxjs@7.8.0: - resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} - dependencies: - tslib: 2.3.0 - - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.5.0 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - - /sass-loader@13.2.2(sass@1.62.1)(webpack@5.80.0): - resolution: {integrity: sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - dependencies: - klona: 2.0.6 - neo-async: 2.6.2 - sass: 1.62.1 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /sass@1.62.1: - resolution: {integrity: sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - chokidar: 3.5.3 - immutable: 4.3.0 - source-map-js: 1.0.2 - dev: true - - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: true - optional: true - - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.12 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} - dependencies: - '@types/json-schema': 7.0.12 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) - dev: true - - /select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: true - - /selfsigned@2.1.1: - resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} - engines: {node: '>=10'} - dependencies: - node-forge: 1.3.1 - dev: true - - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - optional: true - - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - - /semver@7.4.0: - resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.1: - resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - 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: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - dependencies: - randombytes: 2.1.0 - dev: true - - /serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true - - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true - - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /signal-exit@4.0.2: - resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} - engines: {node: '>=14'} - dev: true - - /sigstore@1.6.0: - resolution: {integrity: sha512-QODKff/qW/TXOZI6V/Clqu74xnInAS6it05mufj4/fSewexLtfEntgLZZcBtUK44CDQyUE5TUXYy1ARYzlfG9g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - '@sigstore/protobuf-specs': 0.1.0 - '@sigstore/tuf': 1.0.0 - make-fetch-happen: 11.1.1 - tuf-js: 1.1.7 - transitivePeerDependencies: - - supports-color - dev: true - - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true - - /socket.io-adapter@2.5.2: - resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} - dependencies: - ws: 8.11.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /socket.io@4.6.2: - resolution: {integrity: sha512-Vp+lSks5k0dewYTfwgPT9UeGGd+ht7sCpB7p0e83VgO4X/AHYWhXITMrNk/pg8syY2bpx23ptClCQuHhqi2BgQ==} - engines: {node: '>=10.0.0'} - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - debug: 4.3.4 - engine.io: 6.4.2 - socket.io-adapter: 2.5.2 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 - dev: true - - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - dependencies: - ip: 2.0.0 - smart-buffer: 4.2.0 - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map-loader@4.0.1(webpack@5.80.0): - resolution: {integrity: sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.72.1 - dependencies: - abab: 2.0.6 - iconv-lite: 0.6.3 - source-map-js: 1.0.2 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true - - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - dev: true - - /spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - dependencies: - debug: 4.3.4 - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - dev: true - - /spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - dependencies: - debug: 4.3.4 - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /ssri@10.0.4: - resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - minipass: 5.0.0 - dev: true - - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true - - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true - - /streamroller@3.1.5: - resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} - engines: {node: '>=8.0'} - dependencies: - date-format: 4.0.14 - debug: 4.3.4 - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - dev: true - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /symbol-observable@4.0.0: - resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} - engines: {node: '>=0.10'} - dev: true - - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - - /tar@6.1.15: - resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true - - /terser-webpack-plugin@5.3.9(esbuild@0.17.18)(webpack@5.80.0): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - esbuild: 0.17.18 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.17.1 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /terser@5.17.1: - resolution: {integrity: sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - - /thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: true - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true - - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true - - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - - /ts-node@10.9.1(@types/node@20.3.1)(typescript@5.0.2): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.3.1 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /tslib@2.3.0: - resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} - - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - - /tuf-js@1.1.7: - resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@tufjs/models': 1.0.4 - debug: 4.3.4 - make-fetch-happen: 11.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: true - - /typed-assert@1.0.9: - resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} - dev: true - - /typescript@5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true - - /ua-parser-js@0.7.35: - resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} - dev: true - - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: true - - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - dev: true - - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: true - - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: true - - /unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - unique-slug: 4.0.0 - dev: true - - /unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - imurmurhash: 0.1.4 - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true - - /update-browserslist-db@1.0.11(browserslist@4.21.5): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - builtins: 5.0.1 - dev: true - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true - - /vite@4.3.1(@types/node@20.3.1)(less@4.1.3)(sass@1.62.1)(terser@5.17.1): - resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 20.3.1 - esbuild: 0.17.18 - less: 4.1.3 - postcss: 8.4.23 - rollup: 3.25.1 - sass: 1.62.1 - terser: 5.17.1 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /void-elements@2.0.1: - resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} - engines: {node: '>=0.10.0'} - dev: true - - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - - /wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - dependencies: - minimalistic-assert: 1.0.1 - dev: true - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - dev: true - - /webpack-dev-middleware@5.3.3(webpack@5.80.0): - resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /webpack-dev-middleware@6.0.2(webpack@5.80.0): - resolution: {integrity: sha512-iOddiJzPcQC6lwOIu60vscbGWth8PCRcWRCwoQcTQf9RMoOWBHg5EyzpGdtSmGMrSPd5vHEfFXmVErQEmkRngQ==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /webpack-dev-server@4.13.2(webpack@5.80.0): - resolution: {integrity: sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - dependencies: - '@types/bonjour': 3.5.10 - '@types/connect-history-api-fallback': 1.5.0 - '@types/express': 4.17.17 - '@types/serve-index': 1.9.1 - '@types/serve-static': 1.15.1 - '@types/sockjs': 0.3.33 - '@types/ws': 8.5.5 - ansi-html-community: 0.0.8 - bonjour-service: 1.1.1 - chokidar: 3.5.3 - colorette: 2.0.20 - compression: 1.7.4 - connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.18.2 - graceful-fs: 4.2.11 - html-entities: 2.3.6 - http-proxy-middleware: 2.0.6(@types/express@4.17.17) - ipaddr.js: 2.1.0 - launch-editor: 2.6.0 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.2.0 - selfsigned: 2.1.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack: 5.80.0(esbuild@0.17.18) - webpack-dev-middleware: 5.3.3(webpack@5.80.0) - ws: 8.13.0 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - dev: true - - /webpack-merge@5.8.0: - resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} - engines: {node: '>=10.0.0'} - dependencies: - clone-deep: 4.0.1 - wildcard: 2.0.1 - dev: true - - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true - - /webpack-subresource-integrity@5.1.0(webpack@5.80.0): - resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} - engines: {node: '>= 12'} - peerDependencies: - html-webpack-plugin: '>= 5.0.0-beta.1 < 6' - webpack: ^5.12.0 - peerDependenciesMeta: - html-webpack-plugin: - optional: true - dependencies: - typed-assert: 1.0.9 - webpack: 5.80.0(esbuild@0.17.18) - dev: true - - /webpack@5.80.0(esbuild@0.17.18): - resolution: {integrity: sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.8.2 - acorn-import-assertions: 1.9.0(acorn@8.8.2) - browserslist: 4.21.5 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(esbuild@0.17.18)(webpack@5.80.0) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: true - - /websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: true - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - dependencies: - string-width: 4.2.3 - dev: true - - /wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true - - /zone.js@0.13.0: - resolution: {integrity: sha512-7m3hNNyswsdoDobCkYNAy5WiUulkMd3+fWaGT9ij6iq3Zr/IwJo4RMCYPSDjT+r7tnPErmY9sZpKhWQ8S5k6XQ==} - dependencies: - tslib: 2.3.0 diff --git a/examples/angular/src/app/app.component.ts b/examples/angular/src/app/app.component.ts deleted file mode 100644 index 41b73473f..000000000 --- a/examples/angular/src/app/app.component.ts +++ /dev/null @@ -1,67 +0,0 @@ -import type { AfterViewInit } from '@angular/core' -import { Component, inject } from '@angular/core' -import type { PartitionRaw } from '@aneoconsultingfr/armonik.api.angular' -import { Subject, merge, startWith, switchMap } from 'rxjs' -import { NgFor, NgIf } from '@angular/common' -import { PartitionsGrpcService } from './services/partitions-grpc.service' - -@Component({ - selector: 'app-root', - template: ` - -
- Loading... -
-
    -
  • - {{ partition.id }} -
  • -
- `, - styles: [` - `], - standalone: true, - providers: [ - PartitionsGrpcService, - ], - imports: [ - NgIf, - NgFor, - ], -}) -export class AppComponent implements AfterViewInit { - #partitionsGrpcService = inject(PartitionsGrpcService) - - #refresh$ = new Subject() - - loading = true - partitions: PartitionRaw.AsObject[] = [] - - ngAfterViewInit(): void { - merge( - this.#refresh$, - ) - .pipe( - startWith({}), - switchMap(() => { - this.loading = true - return this.#partitionsGrpcService.list$() - }), - ).subscribe( - (response) => { - this.loading = false - - if (response.partitions) - this.partitions = response.partitions - }, - ) - } - - refresh(): void { - this.#refresh$.next() - } - - trackByPartition(_index_: number, partition: PartitionRaw.AsObject): string { - return partition.id - } -} diff --git a/examples/angular/src/app/app.config.ts b/examples/angular/src/app/app.config.ts deleted file mode 100644 index debccae3e..000000000 --- a/examples/angular/src/app/app.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { ApplicationConfig } from '@angular/core' -import { importProvidersFrom } from '@angular/core' -import { GrpcCoreModule } from '@ngx-grpc/core' -import { GrpcWebClientModule } from '@ngx-grpc/grpc-web-client' - -export const appConfig: ApplicationConfig = { - providers: [ - importProvidersFrom(GrpcCoreModule.forRoot()), - importProvidersFrom(GrpcWebClientModule.forRoot({ settings: { host: '' } })), - ], -} diff --git a/examples/angular/src/app/services/partitions-grpc.service.ts b/examples/angular/src/app/services/partitions-grpc.service.ts deleted file mode 100644 index 8b990e040..000000000 --- a/examples/angular/src/app/services/partitions-grpc.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Injectable, inject } from '@angular/core' -import type { ListPartitionsResponse } from '@aneoconsultingfr/armonik.api.angular' -import { ListPartitionsRequest, PartitionsClient } from '@aneoconsultingfr/armonik.api.angular' -import type { Observable } from 'rxjs' - -@Injectable() -export class PartitionsGrpcService { - readonly #client = inject(PartitionsClient) - - list$(): Observable { - const options = new ListPartitionsRequest({ - page: 0, - pageSize: 10, - sort: { - direction: ListPartitionsRequest.OrderDirection.ORDER_DIRECTION_ASC, - field: ListPartitionsRequest.OrderByField.ORDER_BY_FIELD_ID, - }, - filter: { - id: '', - parentPartitionId: '', - podMax: 0, - podReserved: 0, - preemptionPercentage: 0, - priority: 0, - }, - }) - - return this.#client.listPartitions(options) - } -} diff --git a/examples/angular/src/assets/.gitkeep b/examples/angular/src/assets/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/angular/src/favicon.ico b/examples/angular/src/favicon.ico deleted file mode 100644 index 1cceb8320133505f616b784afb243c17f33c4ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1642 zcmZWqNl#Nz7<~+CTgD(DlL%4>W3@#=4GN`2T4|tdDnqeAK~PZ(f)k^fXe4eNVq$co z3lkGH8h3^S*+7i3#$llwBT*N+(!bz2elM3qlk=T(?)P5bz4yCAe=jb0Tbq+iIVMfh zlH4w*ADV~AH>?HM|6W{}MZg+IU0vgvmXOAXK~6o28*)4C0hgpYT0HB0>EglBo1n~7 z&5|$*s?Jk)SPl+y!gS*Q?ug>oW+Y$L1s09H`oCW0`>H^z`Pe`uXV_d!myOHk! zuOEThoS<#FlBte;dv#YQJiAUsj3B&;`&g`{yCX$zmMDw>Vi75b%BelpEl``8HS-(o z{t&e63ia#)05+YxZWAyA~lu#V}ex(J8BNm zvD?f?dWCmRudWrc4e~a>@2$%Nv(L0WponD}JZJ-jOF&!0%g-TzzPSB^eE-dPNjlC! zhhE=LZz`^ug8ew3DGxq9afoRZ8SdoZXIT(OLnS8Q0@B*RuK$6P8-cqc-(lmj=vPuh zarAnvjpr%-%ZsTI4svq?2 - - - - ArmoniKApiAngular - - - - - - - - diff --git a/examples/angular/src/main.ts b/examples/angular/src/main.ts deleted file mode 100644 index a74c853de..000000000 --- a/examples/angular/src/main.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { bootstrapApplication } from '@angular/platform-browser' -import { appConfig } from './app/app.config' -import { AppComponent } from './app/app.component' - -bootstrapApplication(AppComponent, appConfig) - .catch(err => console.error(err)) diff --git a/examples/angular/src/proxy.conf.example b/examples/angular/src/proxy.conf.example deleted file mode 100644 index b9222a0f0..000000000 --- a/examples/angular/src/proxy.conf.example +++ /dev/null @@ -1,6 +0,0 @@ -{ - "/armonik.api.grpc.v1": { - "target": "http://:", - "secure": false - } -} diff --git a/examples/angular/src/proxy.conf.json b/examples/angular/src/proxy.conf.json deleted file mode 100644 index 705ec8055..000000000 --- a/examples/angular/src/proxy.conf.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "/armonik.api.grpc.v1": { - "target": "http://172.30.34.216:5000", - "secure": false - } -} diff --git a/examples/angular/src/styles.css b/examples/angular/src/styles.css deleted file mode 100644 index 90d4ee007..000000000 --- a/examples/angular/src/styles.css +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/examples/angular/tsconfig.app.json b/examples/angular/tsconfig.app.json deleted file mode 100644 index 9e06c8ea7..000000000 --- a/examples/angular/tsconfig.app.json +++ /dev/null @@ -1,14 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "types": [], - "outDir": "./out-tsc/app" - }, - "files": [ - "src/main.ts" - ], - "include": [ - "src/**/*.d.ts" - ] -} diff --git a/examples/angular/tsconfig.json b/examples/angular/tsconfig.json deleted file mode 100644 index 26f1b96f6..000000000 --- a/examples/angular/tsconfig.json +++ /dev/null @@ -1,33 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "compileOnSave": false, - "compilerOptions": { - "target": "ES2022", - "lib": [ - "ES2022", - "dom" - ], - "useDefineForClassFields": false, - "experimentalDecorators": true, - "baseUrl": "./", - "module": "ES2022", - "moduleResolution": "node", - "strict": true, - "noFallthroughCasesInSwitch": true, - "noImplicitOverride": true, - "noImplicitReturns": true, - "noPropertyAccessFromIndexSignature": true, - "declaration": false, - "downlevelIteration": true, - "importHelpers": true, - "outDir": "./dist/out-tsc", - "sourceMap": true, - "forceConsistentCasingInFileNames": true - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true - } -} diff --git a/examples/angular/tsconfig.spec.json b/examples/angular/tsconfig.spec.json deleted file mode 100644 index f7ab59035..000000000 --- a/examples/angular/tsconfig.spec.json +++ /dev/null @@ -1,14 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "types": [ - "jasmine" - ], - "outDir": "./out-tsc/spec" - }, - "include": [ - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] -} From becfe7842f871855206479063c87a5c61dc9162f Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 29 Aug 2024 11:08:11 +0200 Subject: [PATCH 284/344] Add mtls support for cpp --- .../header/channel/ChannelFactory.h | 32 +++++ .../source/channel/ChannelFactory.cpp | 135 ++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h create mode 100644 packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp diff --git a/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h b/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h new file mode 100644 index 000000000..eeda8e5c3 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h @@ -0,0 +1,32 @@ +#pragma once + +#include "logger/formatter.h" +#include "logger/logger.h" +#include "logger/writer.h" +#include "utils/Configuration.h" +#include +#include +#include +#include + +namespace armonik { +namespace api { +namespace client { +class ChannelFactory { +public: + explicit ChannelFactory(armonik::api::common::utils::Configuration configuration, common::logger::Logger &logger); + + std::shared_ptr create_channel(); + + static bool ShutdownOnFailure(std::shared_ptr channel); + +private: + armonik::api::common::logger::LocalLogger logger_; + std::shared_ptr credentials_{nullptr}; + std::string endpoint_; + armonik::api::common::utils::Configuration configuration_; + bool is_secure_{false}; +}; +} // namespace client +} // namespace api +} // namespace armonik \ No newline at end of file diff --git a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp new file mode 100644 index 000000000..8f829be6d --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp @@ -0,0 +1,135 @@ +#include "channel/ChannelFactory.h" + +#include "options/ControlPlane.h" +#include "utils/ChannelArguments.h" +#include "exceptions/ArmoniKApiException.h" +#include +#include +#include + +#include +#include +#include + +namespace armonik { +namespace api { +namespace client { + +using namespace grpc::experimental; + +std::string get_key(const absl::string_view &path) { + std::ifstream file(path.data(), std::ios::in | std::ios::binary); + if (file.is_open()) { + std::ostringstream sstr; + sstr << file.rdbuf(); + return sstr.str(); + } else { + return {}; + } +} + +bool initialize_protocol_endpoint(const common::options::ControlPlane &controlPlane, std::string &endpoint) { + absl::string_view endpoint_view = controlPlane.getEndpoint(); + const auto delim = endpoint_view.find("://"); + if (delim != absl::string_view::npos) { + const auto tmp = endpoint_view.substr(delim + 3); + endpoint_view = endpoint_view.substr(0, delim); + endpoint = {tmp.cbegin(), tmp.cend()}; + } + return endpoint_view.back() == 's' || endpoint_view.back() == 'S'; +} + +std::shared_ptr create_certificate_provider(const std::string &rootCertificate, + const std::string &userPublicPem, + const std::string &userPrivatePem) { + if (rootCertificate.empty()) { + return std::make_shared( + std::vector{IdentityKeyCertPair{userPrivatePem, userPublicPem}}); + } else if (userPrivatePem.empty() || userPublicPem.empty()) { + return std::make_shared(rootCertificate); + } else { + return std::make_shared( + rootCertificate, std::vector{IdentityKeyCertPair{userPrivatePem, userPublicPem}}); + } +} + +std::shared_ptr ChannelFactory::create_channel(){ + auto channel = grpc::CreateCustomChannel(endpoint_, credentials_, common::utils::getChannelArguments(configuration_)); + logger_.log(common::logger::Level::Debug, "Created new channel "); + + if (channel != nullptr) { + if (ShutdownOnFailure(channel)) { + logger_.log(common::logger::Level::Debug, "Shutdown unhealthy channel"); + } else { + logger_.log(common::logger::Level::Debug, "Valid channel"); + } + } + return channel; +} + +ChannelFactory::ChannelFactory(armonik::api::common::utils::Configuration configuration, common::logger::Logger &logger) : logger_(logger.local()), configuration_(std::move(configuration)){ + const auto control_plane = configuration_.get_control_plane(); + const bool is_https = initialize_protocol_endpoint(control_plane, endpoint_); + + auto root_cert_pem = get_key(control_plane.getCaCertPemPath()); + auto user_private_pem = get_key(control_plane.getUserKeyPemPath()); + auto user_public_pem = get_key(control_plane.getUserCertPemPath()); + + if(is_https){ + if(!user_private_pem.empty() && !user_public_pem.empty()){ + if(control_plane.isSslValidation()){ + credentials_ = grpc::SslCredentials(grpc::SslCredentialsOptions{std::move(root_cert_pem), std::move(user_private_pem), std::move(user_public_pem)}); + }else{ + throw common::exceptions::ArmoniKApiException("mTLS without SSL validation is not supported."); + } + }else{ + if(control_plane.isSslValidation()){ + credentials_ = grpc::SslCredentials(grpc::SslCredentialsOptions{std::move(root_cert_pem)}); + } else{ + TlsChannelCredentialsOptions tls_options; + tls_options.set_certificate_provider(create_certificate_provider("", user_public_pem, user_private_pem)); + tls_options.set_verify_server_certs(control_plane.isSslValidation()); + credentials_ = TlsCredentials(tls_options); + } + + } + is_secure_ = true; + }else{ + credentials_ = grpc::InsecureChannelCredentials(); + } +} + +bool ChannelFactory::ShutdownOnFailure(std::shared_ptr channel) { + switch ((*channel).GetState(true)) { + case GRPC_CHANNEL_CONNECTING: + // std::cout << "CONNECTING" << std::endl; + break; + case GRPC_CHANNEL_IDLE: + // std::cout << "IDLE" << std::endl; + break; + + case GRPC_CHANNEL_SHUTDOWN: + // std::cout << "SHUTDOWN" << std::endl; + return true; + break; + + case GRPC_CHANNEL_TRANSIENT_FAILURE: + // std::cout << "TRANSIENT FAILURE" << std::endl; + channel.reset(); + return true; + break; + + case GRPC_CHANNEL_READY: + // std::cout << "READY" << std::endl; + break; + + default: + return false; + break; + } + return false; +} + +} // namespace client +} // namespace api +} // namespace armonik From 26122062233c026593d68ccf8a153263f1e5206d Mon Sep 17 00:00:00 2001 From: ereali-aneo Date: Fri, 23 Aug 2024 16:46:17 +0200 Subject: [PATCH 285/344] feat: add created by in task --- Protos/V1/tasks_common.proto | 2 ++ Protos/V1/tasks_fields.proto | 1 + 2 files changed, 3 insertions(+) diff --git a/Protos/V1/tasks_common.proto b/Protos/V1/tasks_common.proto index 692f3a405..169da9118 100644 --- a/Protos/V1/tasks_common.proto +++ b/Protos/V1/tasks_common.proto @@ -51,6 +51,7 @@ message TaskDetailed { google.protobuf.Duration received_to_end_duration = 23; /** The task calculated duration. Between the received date and the end date. */ string payload_id = 26; /** The ID of the Result that is used as a payload for this task. */ + string created_by = 27; /** The ID of the Task that as submitted this task empty if none.*/ /** * Represents the task output. @@ -102,6 +103,7 @@ message TaskSummary { google.protobuf.Duration received_to_end_duration = 24; /** The task calculated duration. Between the received date and the end date. */ string payload_id = 26; /** The ID of the Result that is used as a payload for this task. */ + string created_by = 27; /** The ID of the Task that as submitted this task empty if none.*/ string error = 8; /** The error message. Only set if task have failed. */ string pod_hostname = 17; /** The hostname of the container running the task. */ diff --git a/Protos/V1/tasks_fields.proto b/Protos/V1/tasks_fields.proto index 7e2dd6e6b..8ed611b75 100644 --- a/Protos/V1/tasks_fields.proto +++ b/Protos/V1/tasks_fields.proto @@ -29,6 +29,7 @@ enum TaskSummaryEnumField { TASK_SUMMARY_ENUM_FIELD_ERROR = 8; /** The error message. Only set if task have failed. */ TASK_SUMMARY_ENUM_FIELD_FETCHED_AT = 19; /** When task data are fetched by the agent. */ TASK_SUMMARY_ENUM_FIELD_PAYLOAD_ID = 20; /** The ID of the Result that is used as a payload for this task. */ + TASK_SUMMARY_ENUM_FIELD_CREATED_BY = 21; /** The ID of the Result that is used as a payload for this task. */ } /** From 9b51d00c066804e4e1b52806e72693ced17208f1 Mon Sep 17 00:00:00 2001 From: ereali-aneo Date: Fri, 23 Aug 2024 16:56:45 +0200 Subject: [PATCH 286/344] feat: add created by in results --- Protos/V1/results_common.proto | 1 + Protos/V1/results_fields.proto | 1 + 2 files changed, 2 insertions(+) diff --git a/Protos/V1/results_common.proto b/Protos/V1/results_common.proto index a19f1dd19..df4bd6e25 100644 --- a/Protos/V1/results_common.proto +++ b/Protos/V1/results_common.proto @@ -24,6 +24,7 @@ message ResultRaw { google.protobuf.Timestamp completed_at = 6; /** The result completion date. */ string result_id = 8; /** The result ID. Uniquely generated by the server. */ int64 size = 9; /** The size of the Result Data. */ + string created_by = 10; /** The ID of the Task that as submitted this result.*/ } /** diff --git a/Protos/V1/results_fields.proto b/Protos/V1/results_fields.proto index 25ee9f0c1..028d495eb 100644 --- a/Protos/V1/results_fields.proto +++ b/Protos/V1/results_fields.proto @@ -17,6 +17,7 @@ enum ResultRawEnumField { RESULT_RAW_ENUM_FIELD_COMPLETED_AT = 6; /** The result completion date. */ RESULT_RAW_ENUM_FIELD_RESULT_ID = 7; /** The result ID. */ RESULT_RAW_ENUM_FIELD_SIZE = 8; /** The size of the result. */ + RESULT_RAW_ENUM_FIELD_CREATED_BY = 9; /** The size of the result. */ } /** From b83356771ce11a4b0b541cda6be4437a8ada15d2 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 29 Aug 2024 15:20:08 +0200 Subject: [PATCH 287/344] Only link with grpc++ and not grpc++_unsecure --- packages/cpp/ArmoniK.Api.Client/CMakeLists.txt | 2 +- .../cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h | 6 +++--- packages/cpp/ArmoniK.Api.Common/CMakeLists.txt | 2 +- packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt index 27d3ccc5b..b84c0e2cb 100644 --- a/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Client/CMakeLists.txt @@ -77,7 +77,7 @@ protobuf_generate( set_source_files_properties(${PROTO_GENERATED_FILES} PROPERTIES SKIP_UNITY_BUILD_INCLUSION on) list(APPEND PROTO_GENERATED_FILES ${PROTO_GENERATED_MESSAGES}) -target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure ArmoniK.Api.Common) +target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++ ArmoniK.Api.Common) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) setup_options(${PROJECT_NAME}) diff --git a/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h b/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h index eeda8e5c3..7527c7483 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h +++ b/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h @@ -16,13 +16,13 @@ class ChannelFactory { public: explicit ChannelFactory(armonik::api::common::utils::Configuration configuration, common::logger::Logger &logger); - std::shared_ptr create_channel(); + std::shared_ptr<::grpc::Channel> create_channel(); - static bool ShutdownOnFailure(std::shared_ptr channel); + static bool ShutdownOnFailure(std::shared_ptr<::grpc::Channel> channel); private: armonik::api::common::logger::LocalLogger logger_; - std::shared_ptr credentials_{nullptr}; + std::shared_ptr<::grpc::ChannelCredentials> credentials_{nullptr}; std::string endpoint_; armonik::api::common::utils::Configuration configuration_; bool is_secure_{false}; diff --git a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt index b57c565c0..068f85419 100644 --- a/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Common/CMakeLists.txt @@ -69,7 +69,7 @@ file(MAKE_DIRECTORY ${PROJECT_BUILD_DIR}) add_library(${PROJECT_NAME} ${PROTO_GENERATED_FILES} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES} ${simdjson_SOURCE_DIR}/singleheader/simdjson.cpp ${simdjson_SOURCE_DIR}/singleheader/simdjson.h) -target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure) +target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++) target_compile_definitions(${PROJECT_NAME} PUBLIC FMT_HEADER_ONLY=1) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) diff --git a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt index 931ea3406..96f8c2678 100644 --- a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt @@ -17,7 +17,7 @@ add_executable(${PROJECT_NAME} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES}) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) -target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure ArmoniK.Api.Client ArmoniK.Api.Common GTest::gtest_main GTest::gmock_main) +target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++ ArmoniK.Api.Client ArmoniK.Api.Common GTest::gtest_main GTest::gmock_main) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4) From 6c35977474b89d0542c0c84f105a5d473f7bbc8e Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 29 Aug 2024 17:02:02 +0200 Subject: [PATCH 288/344] TLS support --- .../source/channel/ChannelFactory.cpp | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp index 8f829be6d..d669e0f5c 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp @@ -17,6 +17,34 @@ namespace client { using namespace grpc::experimental; +const std::string root_self_signed = R"(-----BEGIN CERTIFICATE REQUEST----- +MIIEhjCCAm4CAQAwQTELMAkGA1UEBhMCRlIxEzARBgNVBAgMClNvbWUtU3RhdGUx +DjAMBgNVBAcMBVBhcmlzMQ0wCwYDVQQKDARBbmVvMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA3lBl8so+JRen+tfbrytXMmYAvjt/WquctbkbFIN6prdp +uShiRb6kX9jobcOQCleQ08LBLPPoQ7AemymPxT0dq+YPFw33LgrIBpKe0JWYzujB +Ujj39b1EmKonnsx+C6DL2KSkIf7ayoBNdjDgunWkVC4M6hoJE7XYyZ78HKndfuvL +C4zs3o1EizvSpp+O/IzD/y5pnZEBoxMLCRNB8vD7w7mQMhx+6Amx7KkfCDKLOQO4 +/K2x8r4Y65+IvxFMyxUsR1Z5XPVv37u7u2akbh3HlUE+m0xzVOk+BmHFYxm/eEAF +4p1Jt3bZWu03eF4f8tmgN31Rv0uV+BRN7na44inXNnyd+2qczaCI1IQmsy23Vu0A +eX61Gu06ifViJAybbcWll3VQjWqj5XtsN2+yr2bGfZw8fpjGXVWTL0+nZSqZPWSo +IYlXMHjcygWyMJXTMVTTN+fV7dd9s1LFVnpdHFFOtmRzY8FlRRSpOoqG8XQXXsk0 +pE9904wHaXcwSEe4KtuzgZgNngRCtT61G6k+onhrGa6UVCKpfvMYtS3NEsMNNYsY +I5Hn7Unj/0xBO6IM5Os6PImWWMk8rLSXC3IdtEAHgShS+/xbh2ZVOveSeMXWaecm +u2RIe5wQa5ZXLr03XtkdMB1pebJbdoFrs0ev/sklk1dZfbX06vJSd8eokM9oIIcC +AwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQCr75dBYjypzqDqQ6TiKWuYO8rq6TIh +pdZHw5ystwvD6sn+tPbc7iNbnvDF6GeTgMdKAuwNz0YJMZq9v39hZzTCyMqRLNlT +TU3kYaTWGHDK0HE2O3pHKppHAc2YbAsSxuS8KMHx0wW0abVHiEeudc/nULJppX1/ +ObouzLGSJJwZctXEzk/Ye7bD1sneSqVnrdFD1IOBVQVRGoJznAt7WWxvGk9LPW51 ++MybzTilL4rk5+ezA4UCIMrQCDwZcI+UCcKqDajDz+7kn81f1K4g1G6dTh+M8qIV +lx6/Bfy3P6DHF1ww0i/hRQht1O9cyUo3mDZzAq20OsIDvkhjNGma/IEbkZ9z0P5C +/5YwAW+GuwG2GrD016y5OjZVrAG/KIfyS6FLQfgN/ww5Y9tK6vO5XkelED7zNPrq +em1zkId2H0Az5dIC2OpnAg3+NuGrehfIXziiY+8MGIivqI/Rulnv7m2l2vjHi66K +GztDm5ohMdfjitFIfPDFYPMH7KES4vivic8zlq9FJYNp8tUYEBR1wW7W03IJPm6e +pUwvXHPjId/qBjlBixZt2ZqC8X4S95wAfVjtS3O33Zsm4oevwlvywfYIK8nTG5SD +bDCNVTg3w/OQLQQdWUl6FunmYinukBgmqnsJnwgrhzBENbmgbgfOZZWGtG5ODENb +wc+KqiSg9c9iqA== +-----END CERTIFICATE REQUEST-----)"; + std::string get_key(const absl::string_view &path) { std::ifstream file(path.data(), std::ios::in | std::ios::binary); if (file.is_open()) { @@ -87,7 +115,7 @@ ChannelFactory::ChannelFactory(armonik::api::common::utils::Configuration config credentials_ = grpc::SslCredentials(grpc::SslCredentialsOptions{std::move(root_cert_pem)}); } else{ TlsChannelCredentialsOptions tls_options; - tls_options.set_certificate_provider(create_certificate_provider("", user_public_pem, user_private_pem)); + tls_options.set_certificate_provider(create_certificate_provider(root_self_signed, user_public_pem, user_private_pem)); tls_options.set_verify_server_certs(control_plane.isSslValidation()); credentials_ = TlsCredentials(tls_options); } From f603118e2d2b1c7c1f9263734a46c475374cbe62 Mon Sep 17 00:00:00 2001 From: ereali-aneo Date: Thu, 29 Aug 2024 15:16:04 +0200 Subject: [PATCH 289/344] feat: add CreatedBy in result and task python API --- .../python/src/armonik/common/filter/_filter_field.py | 4 ++++ packages/python/src/armonik/common/objects.py | 10 ++++++++++ packages/python/tests/test_tasks.py | 1 + 3 files changed, 15 insertions(+) diff --git a/packages/python/src/armonik/common/filter/_filter_field.py b/packages/python/src/armonik/common/filter/_filter_field.py index 87e4dc053..8a8427cd7 100644 --- a/packages/python/src/armonik/common/filter/_filter_field.py +++ b/packages/python/src/armonik/common/filter/_filter_field.py @@ -14,6 +14,7 @@ TASK_SUMMARY_ENUM_FIELD_SESSION_ID, TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID, TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID, + TASK_SUMMARY_ENUM_FIELD_CREATED_BY, TASK_SUMMARY_ENUM_FIELD_STATUS, TASK_SUMMARY_ENUM_FIELD_CREATED_AT, TASK_SUMMARY_ENUM_FIELD_SUBMITTED_AT, @@ -78,6 +79,7 @@ RESULT_RAW_ENUM_FIELD_COMPLETED_AT, RESULT_RAW_ENUM_FIELD_CREATED_AT, RESULT_RAW_ENUM_FIELD_SESSION_ID, + RESULT_RAW_ENUM_FIELD_CREATED_BY, RESULT_RAW_ENUM_FIELD_OWNER_TASK_ID, ) @@ -207,6 +209,7 @@ class TaskFilter(FilterWrapper): "session_id": (FType.STR, TASK_SUMMARY_ENUM_FIELD_SESSION_ID), "owner_pod_id": (FType.STR, TASK_SUMMARY_ENUM_FIELD_OWNER_POD_ID), "initial_task_id": (FType.STR, TASK_SUMMARY_ENUM_FIELD_INITIAL_TASK_ID), + "created_by": (FType.STR, TASK_SUMMARY_ENUM_FIELD_CREATED_BY), "parent_task_ids": (FType.NA, "parent_task_ids"), "data_dependencies": (FType.NA, "data_dependencies"), "expected_output_ids": (FType.NA, "expected_output_ids"), @@ -333,6 +336,7 @@ class ResultFilter(FilterWrapper): "completed_at": (FType.DATE, RESULT_RAW_ENUM_FIELD_COMPLETED_AT), "result_id": (FType.STR, RESULT_RAW_ENUM_FIELD_RESULT_ID), "size": (FType.NUM, RESULT_RAW_ENUM_FIELD_SIZE), + "created_by": (FType.STR, RESULT_RAW_ENUM_FIELD_CREATED_BY), "owner_task_id": (FType.STR, RESULT_RAW_ENUM_FIELD_OWNER_TASK_ID), } diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index a7ca8bda4..5b1ae3572 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -135,6 +135,7 @@ class Task: owner_pod_id = FilterDescriptor(_task_filter) initial_task_id = FilterDescriptor(_task_filter) + created_by = FilterDescriptor(_task_filter) parent_task_ids = FilterDescriptor(_task_filter) data_dependencies = FilterDescriptor(_task_filter) expected_output_ids = FilterDescriptor(_task_filter) @@ -169,6 +170,7 @@ def __init__( session_id: Optional[str] = None, owner_pod_id: Optional[str] = None, initial_task_id: Optional[str] = None, + created_by: Optional[str] = None, parent_task_ids: Optional[List[str]] = None, data_dependencies: Optional[List[str]] = None, expected_output_ids: Optional[List[str]] = None, @@ -196,6 +198,7 @@ def __init__( self.session_id = session_id self.owner_pod_id = owner_pod_id self.initial_task_id = initial_task_id + self.created_by = created_by self.parent_task_ids = parent_task_ids if parent_task_ids is not None else [] self.data_dependencies = data_dependencies if data_dependencies is not None else [] self.expected_output_ids = expected_output_ids if expected_output_ids is not None else [] @@ -230,6 +233,7 @@ def refresh(self, task_client) -> None: self.owner_pod_id = result.owner_pod_id self.initial_task_id = result.initial_task_id + self.created_by = result.created_by self.parent_task_ids = result.parent_task_ids self.data_dependencies = result.data_dependencies self.expected_output_ids = result.expected_output_ids @@ -266,6 +270,7 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": session_id=task_raw.session_id, owner_pod_id=task_raw.owner_pod_id, initial_task_id=task_raw.initial_task_id, + created_by=task_raw.created_by, parent_task_ids=list(task_raw.parent_task_ids), data_dependencies=list(task_raw.data_dependencies), expected_output_ids=list(task_raw.expected_output_ids), @@ -296,6 +301,7 @@ def __eq__(self, other: "Task") -> bool: and self.session_id == other.session_id and self.owner_pod_id == other.owner_pod_id and self.initial_task_id == other.initial_task_id + and self.created_by == other.created_by and self.parent_task_ids == other.parent_task_ids and self.data_dependencies == other.data_dependencies and self.expected_output_ids == other.expected_output_ids @@ -415,6 +421,7 @@ def __eq__(self, other: "Session") -> bool: class Result: session_id = FilterDescriptor(_resultFilter) name = FilterDescriptor(_resultFilter) + created_by = FilterDescriptor(_resultFilter) owner_task_id = FilterDescriptor(_resultFilter) status = FilterDescriptor(_resultFilter) created_at = FilterDescriptor(_resultFilter) @@ -426,6 +433,7 @@ def __init__( self, session_id: Optional[str] = None, name: Optional[str] = None, + created_by: Optional[str] = None, owner_task_id: Optional[str] = None, status: RawResultStatus = ResultStatus.UNSPECIFIED, created_at: Optional[datetime] = None, @@ -435,6 +443,7 @@ def __init__( ): self.session_id = session_id self.name = name + self.created_by = created_by self.owner_task_id = owner_task_id self.status = status self.created_at = created_at @@ -447,6 +456,7 @@ def from_message(cls, result_raw: ResultRaw) -> "Result": return cls( session_id=result_raw.session_id, name=result_raw.name, + created_by=result_raw.created_by, owner_task_id=result_raw.owner_task_id, status=result_raw.status, created_at=timestamp_to_datetime(result_raw.created_at), diff --git a/packages/python/tests/test_tasks.py b/packages/python/tests/test_tasks.py index 383fee529..0711cecf5 100644 --- a/packages/python/tests/test_tasks.py +++ b/packages/python/tests/test_tasks.py @@ -11,6 +11,7 @@ class TestArmoniKTasks: session_id="session-id", owner_pod_id="", initial_task_id="", + created_by="", parent_task_ids=[], data_dependencies=[], expected_output_ids=[], From e3aefe3223c8456e46b5bfb15b02c39131b6656a Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 12 Jul 2024 16:25:59 +0200 Subject: [PATCH 290/344] Removed Python examples --- examples/python/.gitignore | 1 - examples/python/Dockerfile | 14 ---- examples/python/client-requirements.txt | 0 examples/python/client.py | 89 ------------------------- examples/python/common.py | 54 --------------- examples/python/secure_grpc_client.py | 62 ----------------- examples/python/worker-requirements.txt | 0 examples/python/worker.py | 87 ------------------------ 8 files changed, 307 deletions(-) delete mode 100644 examples/python/.gitignore delete mode 100644 examples/python/Dockerfile delete mode 100644 examples/python/client-requirements.txt delete mode 100644 examples/python/client.py delete mode 100644 examples/python/common.py delete mode 100644 examples/python/secure_grpc_client.py delete mode 100644 examples/python/worker-requirements.txt delete mode 100644 examples/python/worker.py diff --git a/examples/python/.gitignore b/examples/python/.gitignore deleted file mode 100644 index b96da0420..000000000 --- a/examples/python/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.whl \ No newline at end of file diff --git a/examples/python/Dockerfile b/examples/python/Dockerfile deleted file mode 100644 index b4136e510..000000000 --- a/examples/python/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM python:3.7-slim AS builder -WORKDIR /app -RUN python -m venv .venv && .venv/bin/pip install --no-cache-dir -U pip setuptools -COPY worker-requirements.txt *.whl ./ -RUN .venv/bin/pip install --no-cache-dir $( ( find . -type f -name "*.whl" | grep . ) || echo armonik ) -r worker-requirements.txt && find /app/.venv \( -type d -a -name test -o -name tests \) -o \( -type f -a -name '*.pyc' -o -name '*.pyo' \) -exec rm -rf '{}' \+ - -FROM python:3.7-slim -WORKDIR /app -RUN groupadd --gid 5000 armonikuser && useradd --home-dir /home/armonikuser --create-home --uid 5000 --gid 5000 --shell /bin/sh --skel /dev/null armonikuser && mkdir /cache && chown armonikuser: /cache -USER armonikuser -ENV PATH="/app/.venv/bin:$PATH" PYTHONUNBUFFERED=1 -COPY --from=builder /app /app -COPY . . -ENTRYPOINT ["python", "worker.py"] \ No newline at end of file diff --git a/examples/python/client-requirements.txt b/examples/python/client-requirements.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/python/client.py b/examples/python/client.py deleted file mode 100644 index 399fc0018..000000000 --- a/examples/python/client.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python3 -import grpc -import argparse -from typing import cast -from armonik.client import ArmoniKSubmitter, ArmoniKResult, ArmoniKTasks -from armonik.client.tasks import TaskFieldFilter -from armonik.common import TaskDefinition, TaskOptions -from datetime import timedelta, datetime -from common import Payload, Result - - -def parse_arguments(): - parser = argparse.ArgumentParser("ArmoniK Example Client") - parser.add_argument("-e", "--endpoint", required=True, type=str, help="Control plane endpoint") - parser.add_argument("-p", "--partition", type=str, help="Partition used for the worker") - parser.add_argument("-v", "--values", type=float, help="List of values to compute instead of x in [0, n[", nargs='+') - parser.add_argument("-n", "--nfirst", type=int, help="Compute from 0 inclusive to n exclusive, n=10 by default", default=10) - parser.add_argument("-l", "--list", action="store_true", help="List tasks of the session at the end") - return parser.parse_args() - - -def main(): - args = parse_arguments() - print("Hello ArmoniK Python Example !") - # Open a channel to the control plane - with grpc.insecure_channel(args.endpoint) as channel: - # Create a task submitting client - client = ArmoniKSubmitter(channel) - # Create the results client - results_client = ArmoniKResult(channel) - # Default task options to be used in a session - default_task_options = TaskOptions(max_duration=timedelta(seconds=300), priority=1, max_retries=5, partition_id=args.partition) - # Create a session - session_id = client.create_session(default_task_options=default_task_options, partition_ids=[args.partition] if args.partition is not None else None) - print(f"Session {session_id} has been created") - try: - # Create the payload - payload = Payload([i for i in range(args.nfirst)] if args.values is None else args.values) - # Create the result - result_name = f"main_result_{int(datetime.now().timestamp())}" - result_id = results_client.get_results_ids(session_id, [result_name])[result_name] - # Define the task with the payload - task_definition = TaskDefinition(payload.serialize(), expected_output_ids=[result_id]) - # Submit the task - submitted_tasks, submission_errors = client.submit(session_id, [task_definition]) - for e in submission_errors: - print(f"Submission error : {e}") - - print(f"Main tasks have been sent") - - for t in submitted_tasks: - # Wait for the result to be available - reply = client.wait_for_availability(session_id, result_id=t.expected_output_ids[0]) - if reply is None: - # This should not happen - print("Result unexpectedly unavailable") - continue - if reply.is_available(): - # Result is available, get the result - result_payload = Result.deserialize(cast(bytes, client.get_result(session_id, result_id=t.expected_output_ids[0]))) - print(f"Result : {result_payload.value}") - else: - # Result is in error - errors = "\n".join(reply.errors) - print(f'Errors : {errors}') - - # List tasks - if args.list: - print(f"Listing tasks of session {session_id}") - # Create the tasks client - tasks_client = ArmoniKTasks(channel) - - # Request listing of tasks from the session - total_tasks, tasks = tasks_client.list_tasks(TaskFieldFilter.SESSION_ID == session_id) - print(f"Found {total_tasks} tasks in total for the session {session_id}") - - for t in tasks: - print(t) - - except KeyboardInterrupt: - # If we stop the script, cancel the session - client.cancel_session(session_id) - print("Session has been cancelled") - finally: - print("Good bye !") - - -if __name__ == "__main__": - main() diff --git a/examples/python/common.py b/examples/python/common.py deleted file mode 100644 index 423c8ca57..000000000 --- a/examples/python/common.py +++ /dev/null @@ -1,54 +0,0 @@ -from typing import List, Union -import json - - -class Payload: - def __init__(self, values: List[Union[float, str]], subtask_threshold=2): - """ - Creates a payload with a value list and a threshold - :param values: Values to compute if it's a list of float. If it's a list of strings, corresponds to the results' keys to aggregate - :param subtask_threshold: Maximum threshold at which the task is split. If number of values is less than this threshold, the task is computed - """ - self.values = values - self.subtask_threshold = subtask_threshold - - def serialize(self) -> bytes: - """ - Serializes the payload. Converts the attributes to json and return a byte array - :return: Serialized payload compatible with ArmoniK - """ - return json.dumps({"values": self.values, "subtask_threshold": self.subtask_threshold}).encode("utf-8") - - @classmethod - def deserialize(cls, payload: bytes) -> "Payload": - """ - Create a payload instance from the payload bytes received from ArmoniK - :param payload: Raw ArmoniK Payload - :return: Payload object - """ - return cls(**json.loads(payload.decode("utf-8"))) - - -class Result: - def __init__(self, value: float): - """ - Result of a task - :param value: Actual value - """ - self.value = value - - def serialize(self) -> bytes: - """ - Serializes the result. Converts the attributes to json and return a byte array - :return: Serialized result compatible with ArmoniK - """ - return json.dumps({"value": self.value}).encode("utf-8") - - @classmethod - def deserialize(cls, payload: bytes) -> "Result": - """ - Create a Result instance from the data dependency bytes received from ArmoniK - :param payload: Raw ArmoniK data dependency - :return: Result object - """ - return cls(**json.loads(payload.decode("utf-8"))) diff --git a/examples/python/secure_grpc_client.py b/examples/python/secure_grpc_client.py deleted file mode 100644 index c843fba21..000000000 --- a/examples/python/secure_grpc_client.py +++ /dev/null @@ -1,62 +0,0 @@ -import grpc -import argparse -from armonik.client.sessions import ArmoniKSessions, SessionFieldFilter -from armonik.common.enumwrapper import SESSION_STATUS_CANCELLED - -def parse_arguments(): - parser = argparse.ArgumentParser(description="ArmoniK Example for Client connection TLS or mutual TLS") - parser.add_argument("-v","--version", action="version", version="ArmoniK Admin CLI 0.0.1") - parser.add_argument("--endpoint", default="localhost:5001", help="ArmoniK control plane endpoint") - parser.add_argument("--ssl", help="Use this option to enable TLS for a secure channel.", action="store_true") - parser.add_argument("--ca", help="ca.crt path for TLS or mutual TLS") - parser.add_argument("--cert", help="client certificate path for mutual TLS") - parser.add_argument("--key", help="client key path for mutual TLS") - return parser.parse_args() - -def read_file(file_path: str) -> bytes: - with open(file_path, 'rb') as file: - return file.read() - -def create_channel(endpoint: str, ssl: bool, ca: str, key: str, cert: str) -> grpc.Channel: - """ - Create a gRPC channel for communication with the ArmoniK control plane - - Args: - ca (str): CA file path for TLS or mutual TLS - cert (str): Certificate file path for mutual TLS - key (str): Private key file path for mutual TLS - endpoint (str): ArmoniK control plane endpoint - - Returns: - grpc.Channel: gRPC channel for communication - """ - if ssl: - ca_data = read_file(ca) if ca else None - if cert and key: - cert_data = read_file(cert) if cert else None - key_data = read_file(key) if key else None - credentials = grpc.ssl_channel_credentials(root_certificates=ca_data, private_key=key_data, certificate_chain=cert_data) - print("Hello ArmoniK Python Example Using Mutual TLS !") - else: - credentials = grpc.ssl_channel_credentials(root_certificates=ca_data) - print("Hello ArmoniK Python Example Using TLS !") - return grpc.secure_channel(endpoint, credentials) - else: - print("Hello ArmoniK Python Example using Insecure Channel!") - return grpc.insecure_channel(endpoint) - - -def main(): - args = parse_arguments() - # Open a channel to the control plane - channel = create_channel(args.endpoint, args.ssl, args.ca, args.key, args.cert) - # Create the session client - client = ArmoniKSessions(channel) - # List numbers sessions with a cancelled status filter - sessions = client.list_sessions(SessionFieldFilter.STATUS == SESSION_STATUS_CANCELLED) - - print(f'\nNumber of sessions: {sessions[0]}\n') - - -if __name__ == "__main__": - main() diff --git a/examples/python/worker-requirements.txt b/examples/python/worker-requirements.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/python/worker.py b/examples/python/worker.py deleted file mode 100644 index 85dd54557..000000000 --- a/examples/python/worker.py +++ /dev/null @@ -1,87 +0,0 @@ -import logging -import os - -import grpc -from armonik.worker import ArmoniKWorker, TaskHandler, ClefLogger -from armonik.common import Output, TaskDefinition -from typing import List, Union, cast - -from common import Payload, Result - -ClefLogger.setup_logging(logging.INFO) - - -# Task processing -def processor(task_handler: TaskHandler) -> Output: - logger = ClefLogger.getLogger("ArmoniKWorker") - payload = Payload.deserialize(task_handler.payload) - # No values - if len(payload.values) == 0: - if task_handler.expected_results: - task_handler.send_result(task_handler.expected_results[0], Result(0.0).serialize()) - logger.info("No values") - return Output() - - if isinstance(payload.values[0], str): - # Aggregation task - results = [Result.deserialize(task_handler.data_dependencies[r]).value for r in cast(List[str], payload.values)] - task_handler.send_result(task_handler.expected_results[0], Result(aggregate(results)).serialize()) - logger.info(f"Aggregated {len(results)} values") - return Output() - - if len(payload.values) <= 1 or len(payload.values) <= payload.subtask_threshold: - # Compute - task_handler.send_result(task_handler.expected_results[0], Result(aggregate(cast(List[float], payload.values))).serialize()) - logger.info(f"Computed {len(payload.values)} values") - return Output() - - # Subtasking - pivot = len(payload.values) // 2 - # Split payload in half - lower = payload.values[:pivot] - upper = payload.values[pivot:] - # Create sub-results - subresults = task_handler.get_results_ids([f"{task_handler.task_id}_lower", f"{task_handler.task_id}_upper"]) - subtasks = [] - for result_id, vals in [(subresults[f"{task_handler.task_id}_lower"], lower), (subresults[f"{task_handler.task_id}_upper"],upper)]: - # Create new payloads and task definitions - new_payload = Payload(values=vals, subtask_threshold=payload.subtask_threshold).serialize() - subtasks.append(TaskDefinition(payload=new_payload, expected_output_ids=[result_id])) - # Create the aggregation task - aggregate_dependencies = [s.expected_output_ids[0] for s in subtasks] - subtasks.append(TaskDefinition(Payload(values=aggregate_dependencies).serialize(), expected_output_ids=task_handler.expected_results, data_dependencies=aggregate_dependencies)) - - # Submit tasks - submitted, errors = task_handler.create_tasks(subtasks) - if len(errors) > 0: - message = f"Errors while submitting subtasks : {', '.join(errors)}" - logger.error(message) - return Output(message) - logger.info(f"Submitted {len(submitted)} subtasks") - return Output() - - -def aggregate(values: List[Union[int, float]]) -> float: - return sum(values) - - -def main(): - # Create Seq compatible logger - logger = ClefLogger.getLogger("ArmoniKWorker") - # Define agent-worker communication endpoints - worker_scheme = "unix://" if os.getenv("ComputePlane__WorkerChannel__SocketType", "unixdomainsocket") == "unixdomainsocket" else "http://" - agent_scheme = "unix://" if os.getenv("ComputePlane__AgentChannel__SocketType", "unixdomainsocket") == "unixdomainsocket" else "http://" - worker_endpoint = worker_scheme+os.getenv("ComputePlane__WorkerChannel__Address", "/cache/armonik_worker.sock") - agent_endpoint = agent_scheme+os.getenv("ComputePlane__AgentChannel__Address", "/cache/armonik_agent.sock") - - # Start worker - logger.info("Worker Started") - # Use options to fix Unix socket connection on localhost (cf: ) - with grpc.insecure_channel(agent_endpoint, options=(('grpc.default_authority', 'localhost'),)) as agent_channel: - worker = ArmoniKWorker(agent_channel, processor, logger=logger) - logger.info("Worker Connected") - worker.start(worker_endpoint) - - -if __name__ == "__main__": - main() From 7dfb49e812fa52cb69da57edc747b94de0ce617a Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Thu, 29 Aug 2024 10:30:40 +0200 Subject: [PATCH 291/344] Channel helper --- .github/workflows/ci.yml | 69 ++++++++-- packages/python/.gitignore | 1 + packages/python/proto2python.sh | 2 +- packages/python/pyproject.toml | 3 +- packages/python/src/armonik/common/channel.py | 126 ++++++++++++++++++ packages/python/tests/conftest.py | 43 ++++-- packages/python/tests/test_worker.py | 33 ++++- scripts/certs.sh | 2 + 8 files changed, 251 insertions(+), 28 deletions(-) create mode 100644 packages/python/src/armonik/common/channel.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c8b0a6d55..500884229 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -281,19 +281,66 @@ jobs: - name: Install dependencies run: pip install "$(echo pkg/armonik*.whl)[tests]" - - name: Install .NET Core - uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 - with: - dotnet-version: 6.x - - - name: Start Mock server + - name: Generate certs + working-directory: packages/csharp/ + shell: bash + run: | + mkdir certs + cd certs + ../../../scripts/certs.sh + - name: Install certs + working-directory: packages/csharp/certs run: | - cd ../csharp/ArmoniK.Api.Mock - nohup dotnet run > /dev/null 2>&1 & - sleep 60 + sudo apt install ca-certificates + sudo mkdir -p /usr/local/share/ca-certificates/ + sudo cp server2-ca.pem /usr/local/share/ca-certificates/ca.crt + sudo update-ca-certificates + + - name: Build Mock server + working-directory: packages/csharp/ArmoniK.Api.Mock + shell: bash + run: | + dotnet publish -o ../out + [ -e ../out/ArmoniK.Api.Mock.exe ] || ln -s ArmoniK.Api.Mock ../out/ArmoniK.Api.Mock.exe - - name: Run tests - run: python -m pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-report xml:coverage.xml --cov-report html:coverage_report + - name: Test + working-directory: packages/python/ + shell: bash + run: | + set +e + set -x + export CertFolder="$PWD/../csharp/certs" + $PWD/../csharp/out/ArmoniK.Api.Mock.exe \ + grpc:port=5000 http:port=4999 logging:loglevel:default="Warning" \ + & notls_pid=$! + $PWD/../csharp/out/ArmoniK.Api.Mock.exe \ + grpc:port=5001 http:port=5001 logging:loglevel:default="Warning" \ + http:cert="$CertFolder/server1.pem" http:key="$CertFolder/server1.key" \ + & tls_pid=$! + $PWD/../csharp/out/ArmoniK.Api.Mock.exe \ + grpc:port=5002 http:port=5002 logging:loglevel:default="Warning" \ + http:cert="$CertFolder/server2.pem" http:key="$CertFolder/server2.key" \ + & tlsstore_pid=$! + $PWD/../csharp/out/ArmoniK.Api.Mock.exe \ + grpc:port=5003 http:port=5003 logging:loglevel:default="Warning" \ + http:cert="$CertFolder/server1.pem" http:key="$CertFolder/server1.key" http:clientcert="$CertFolder/client-ca.pem" \ + & mtls_pid=$! + $PWD/../csharp/out/ArmoniK.Api.Mock.exe \ + grpc:port=5004 http:port=5004 logging:loglevel:default="Warning" \ + http:cert="$CertFolder/server2.pem" http:key="$CertFolder/server2.key" http:clientcert="$CertFolder/client-ca.pem" \ + & mtlsstore_pid=$! + sleep 5 + set -e + Grpc__Endpoint=http://localhost:5000 Http__Endpoint=http://localhost:4999 pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing + Grpc__Endpoint=https://localhost:5001 Http__Endpoint=https://localhost:5001 Grpc__CaCert="$CertFolder/server1-ca.pem" pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-append + Grpc__Endpoint=https://localhost:5002 Http__Endpoint=https://localhost:5002 pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-append + Grpc__Endpoint=https://localhost:5003 Http__Endpoint=https://localhost:5003 Grpc__CaCert="$CertFolder/server1-ca.pem" Grpc__ClientCert="$CertFolder/client.pem" Grpc__ClientKey="$CertFolder/client.key" pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-append + Grpc__Endpoint=https://localhost:5004 Http__Endpoint=https://localhost:5004 Grpc__ClientCert="$CertFolder/client.pem" Grpc__ClientKey="$CertFolder/client.key" pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-append + Grpc__Endpoint=https://localhost:5004 Http__Endpoint=https://localhost:5004 Grpc__ClientCert="$CertFolder/client-client.pem" pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-append + Grpc__Endpoint=https://localhost:5004 Http__Endpoint=https://localhost:5004 Grpc__ClientCert="$CertFolder/client.p12" pytest tests --cov=armonik --cov-config=.coveragerc --cov-report=term-missing --cov-append --cov-report xml:coverage.xml --cov-report html:coverage_report + set +e + kill $notls_pid $tls_pid $tlsstore_pid $mtls_pid $mtlsstore_pid + exit $ret - name: Get Cover uses: orgoro/coverage@6d7a2607343d2abeab89ef40b54ec9785134e313 diff --git a/packages/python/.gitignore b/packages/python/.gitignore index 53df0df6c..ef891def6 100644 --- a/packages/python/.gitignore +++ b/packages/python/.gitignore @@ -4,3 +4,4 @@ build/ *.egg-info **/_version.py **/.pytest_cache +**/*.pem diff --git a/packages/python/proto2python.sh b/packages/python/proto2python.sh index bc00d0068..52b43902e 100755 --- a/packages/python/proto2python.sh +++ b/packages/python/proto2python.sh @@ -32,7 +32,7 @@ mkdir -p $ARMONIK_WORKER $ARMONIK_CLIENT $ARMONIK_COMMON $PACKAGE_PATH python -m venv $PYTHON_VENV source $PYTHON_VENV/bin/activate python -m pip install uv -python -m uv pip install build "grpcio==1.62.3" "grpcio-tools==1.62.3" setuptools_scm[toml] "setuptools>=61" deprecation +python -m uv pip install build "grpcio==1.62.3" "grpcio-tools==1.62.3" setuptools_scm[toml] "setuptools>=61" deprecation "cryptography>=36" unset proto_files for proto in ${armonik_worker_files[@]}; do diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index d860a9202..48e69c775 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -17,7 +17,8 @@ classifiers = [ dependencies = [ "grpcio==1.62.3", "grpcio-tools==1.62.3", - "deprecation" + "deprecation", + "cryptography>=36" ] [project.urls] "Homepage" = "https://github.com/aneoconsulting/ArmoniK.Api" diff --git a/packages/python/src/armonik/common/channel.py b/packages/python/src/armonik/common/channel.py new file mode 100644 index 000000000..276203395 --- /dev/null +++ b/packages/python/src/armonik/common/channel.py @@ -0,0 +1,126 @@ +import os +from os import PathLike +from typing import Union, Tuple, Optional +from urllib.parse import urlparse + +from grpc import Channel, secure_channel, insecure_channel, ssl_channel_credentials +from cryptography.hazmat.primitives.serialization import ( + pkcs12, + Encoding, + PrivateFormat, + NoEncryption, +) + + +def _read_file(path: Union[str, PathLike]) -> bytes: + with open(path, "rb") as f: + return f.read() + + +_ca_cert_locations = [ + "/etc/ssl/certs/ca-certificates.crt", # Debian/Ubuntu/Gentoo etc. + "/etc/pki/tls/certs/ca-bundle.crt", # Fedora/RHEL 6 + "/etc/ssl/ca-bundle.pem", # OpenSUSE + "/etc/pki/tls/cacert.pem", # OpenELEC + "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", # CentOS/RHEL 7 + "/etc/ssl/cert.pem", # Alpine Linux +] + +_cached_ca_cert_location: Optional[str] = "" + + +def _find_bundle_path() -> Optional[str]: + global _cached_ca_cert_location + if _cached_ca_cert_location is not None and len(_cached_ca_cert_location) > 0: + return _cached_ca_cert_location + # Look if one exists + for location in _ca_cert_locations: + if os.path.exists(location): + _cached_ca_cert_location = location + return location + # Not found, will use the default provided + _cached_ca_cert_location = None + + +def _load_certificates( + certificate_authority: Union[str, PathLike, bytes, None] = None, + client_certificate: Union[str, PathLike, bytes, None] = None, + client_key: Union[str, PathLike, bytes, None] = None, +) -> Tuple[bytes, bytes, bytes]: + if certificate_authority is None: + certificate_authority = _find_bundle_path() # Otherwise it uses the ca bundle of certifi. We want to find the installed ca bundle instead + + if certificate_authority is not None: + if not isinstance(certificate_authority, bytes): + certificate_authority = _read_file(certificate_authority) + + if client_certificate is not None: + if not isinstance(client_certificate, bytes): + client_certificate = _read_file(client_certificate) + if client_key is None: + # client and key are in the same file + try: + # Try to parse p12 if it's a p12 + pfx = pkcs12.load_pkcs12(client_certificate, b"") + client_certificate = pfx.cert.certificate.public_bytes(Encoding.PEM) + client_key = pfx.key.private_bytes( + Encoding.PEM, PrivateFormat.TraditionalOpenSSL, NoEncryption() + ) + except ValueError: + # Probably a PEM file + client_key = client_certificate + else: + if not isinstance(client_key, bytes): + client_key = _read_file(client_key) + + return certificate_authority, client_certificate, client_key + + +def create_channel( + uri: str, + *, + options: Union[Tuple[Tuple[str, str]]] = None, + certificate_authority: Union[str, PathLike, bytes, None] = None, + client_certificate: Union[str, PathLike, bytes, None] = None, + client_key: Union[str, PathLike, bytes, None] = None, +) -> Channel: + """ + Create a gRPC channel for communication with the ArmoniK control plane + Args: + uri: URI of the channel. Will start a secure channel if the scheme contains "https". If it contains "unix", uses a unix socket. + options: Options to pass to the channel + certificate_authority: Certificate authority path to read, or content as bytes + client_certificate: Client certificate path to read, or content as bytes + client_key: Client key path to read, or content as bytes. If set to None but client_certificate is not None, assumes the key is included with the certificate (p12 or PEM certificate) + Returns: + Channel: gRPC channel for communication + """ + parsed = urlparse(uri) + scheme = parsed.scheme if parsed.scheme != "" else "http" + endpoint = ( + parsed.netloc + parsed.path + ) # To support with or without scheme, and for paths for unix + + if "unix" in scheme: + # gRPC supports unix:path and the path is then relative, if the scheme is unix://, then the path is absolute + if endpoint.startswith("/"): + endpoint = "unix://" + endpoint + else: + endpoint = "unix:" + endpoint + + if "https" in scheme: + certificate_authority, client_certificate, client_key = _load_certificates( + certificate_authority, client_certificate, client_key + ) + + return secure_channel( + endpoint, + ssl_channel_credentials( + root_certificates=certificate_authority, + private_key=client_key, + certificate_chain=client_certificate, + ), + options=options, + ) + else: + return insecure_channel(endpoint, options=options) diff --git a/packages/python/tests/conftest.py b/packages/python/tests/conftest.py index 9741e0898..96f15a03d 100644 --- a/packages/python/tests/conftest.py +++ b/packages/python/tests/conftest.py @@ -1,4 +1,3 @@ -import grpc import os import pytest import requests @@ -12,16 +11,37 @@ ArmoniKTasks, ArmoniKVersions, ) +from armonik.common.channel import create_channel, _find_bundle_path, _load_certificates from armonik.protogen.worker.agent_service_pb2_grpc import AgentStub from typing import List, Union - +ca_cert = os.getenv("Grpc__CaCert") +client_cert = os.getenv("Grpc__ClientCert") +client_key = os.getenv("Grpc__ClientKey") +scheme = os.getenv("AK_SCHEME", "http") # Mock server endpoints used for the tests. -grpc_endpoint = "localhost:5001" -calls_endpoint = "http://localhost:5000/calls.json" -reset_endpoint = "http://localhost:5000/reset" +grpc_endpoint = os.getenv("Grpc__Endpoint", scheme + "://localhost:5001") +http_endpoint = os.getenv("Http__Endpoint", scheme + "://localhost:5000") +calls_endpoint = http_endpoint + "/calls.json" +reset_endpoint = http_endpoint + "/reset" data_folder = os.getcwd() +request_ca = ca_cert if ca_cert is not None else _find_bundle_path() +if client_cert is not None: + _, request_cert, request_key = _load_certificates(request_ca, client_cert, client_key) + cert_path, key_path = ( + os.path.join(data_folder, "cert.pem"), + os.path.join(data_folder, "key.pem"), + ) + with open(cert_path, "wb") as f: + f.write(request_cert) + with open(key_path, "wb") as f: + f.write(request_key) + + request_certs = (cert_path, key_path) +else: + request_certs = None + @pytest.fixture(scope="session", autouse=True) def clean_up(request): @@ -57,7 +77,7 @@ def clean_up(request): # Reset the mock server counters try: - response = requests.post(reset_endpoint) + response = requests.post(reset_endpoint, verify=request_ca, cert=request_certs) response.raise_for_status() print("\nMock server resetted.") except requests.exceptions.HTTPError as e: @@ -94,7 +114,12 @@ def get_client( >>> result_service = get_client("Results") >>> submitter_service = get_client("Submitter", "custom_endpoint") """ - channel = grpc.insecure_channel(endpoint).__enter__() + channel = create_channel( + endpoint, + certificate_authority=ca_cert, + client_certificate=client_cert, + client_key=client_key, + ).__enter__() if client_name == "Agent": return AgentStub(channel) if client_name == "Events": @@ -137,7 +162,7 @@ def rpc_called( >>> rpc_called("http://localhost:5000/calls.json", "Versions", "ListVersionss", 0) True """ - response = requests.get(endpoint) + response = requests.get(endpoint, verify=request_ca, cert=request_certs) response.raise_for_status() data = response.json() @@ -170,7 +195,7 @@ def all_rpc_called( >>> all_rpc_called("http://localhost:5000/calls.json", "Versions") False """ - response = requests.get(endpoint) + response = requests.get(endpoint, verify=request_ca, cert=request_certs) response.raise_for_status() data = response.json() diff --git a/packages/python/tests/test_worker.py b/packages/python/tests/test_worker.py index ef20fb1cf..fdac3f6a0 100644 --- a/packages/python/tests/test_worker.py +++ b/packages/python/tests/test_worker.py @@ -1,9 +1,10 @@ import datetime -import grpc import logging import os -from .conftest import data_folder, grpc_endpoint +from armonik.common.channel import create_channel + +from .conftest import data_folder, grpc_endpoint, ca_cert, client_cert, client_key from armonik.worker import ArmoniKWorker, TaskHandler, ClefLogger from armonik.common import Output, TaskOptions from armonik.protogen.common.objects_pb2 import Empty, Configuration @@ -43,7 +44,12 @@ class TestWorker: ) def test_do_nothing(self): - with grpc.insecure_channel(grpc_endpoint) as agent_channel: + with create_channel( + grpc_endpoint, + certificate_authority=ca_cert, + client_certificate=client_cert, + client_key=client_key, + ) as agent_channel: worker = ArmoniKWorker( agent_channel, do_nothing, @@ -56,7 +62,12 @@ def test_do_nothing(self): worker.HealthCheck(Empty(), None) def test_should_return_none(self): - with grpc.insecure_channel(grpc_endpoint) as agent_channel: + with create_channel( + grpc_endpoint, + certificate_authority=ca_cert, + client_certificate=client_cert, + client_key=client_key, + ) as agent_channel: worker = ArmoniKWorker( agent_channel, throw_error, @@ -66,7 +77,12 @@ def test_should_return_none(self): assert reply is None def test_should_error(self): - with grpc.insecure_channel(grpc_endpoint) as agent_channel: + with create_channel( + grpc_endpoint, + certificate_authority=ca_cert, + client_certificate=client_cert, + client_key=client_key, + ) as agent_channel: worker = ArmoniKWorker( agent_channel, return_error, @@ -80,7 +96,12 @@ def test_should_error(self): assert output.error == "TestError" def test_should_write_result(self): - with grpc.insecure_channel(grpc_endpoint) as agent_channel: + with create_channel( + grpc_endpoint, + certificate_authority=ca_cert, + client_certificate=client_cert, + client_key=client_key, + ) as agent_channel: worker = ArmoniKWorker( agent_channel, return_and_send, diff --git a/scripts/certs.sh b/scripts/certs.sh index 7893adf74..bbe79844b 100755 --- a/scripts/certs.sh +++ b/scripts/certs.sh @@ -38,6 +38,8 @@ EOF openssl req -config "$1.cnf" -new -key "$1".key -out "$1".csr ${2:+-extensions v3_req} openssl x509 -req -in "$1.csr" -CA "$1-ca.pem" -CAkey "$1-ca.key" -CAcreateserial -out "$1.pem" -days 3650 -extfile "$1.cnf" ${2:+-extensions v3_req} + openssl pkcs12 -export -out "$1.p12" -inkey "$1.key" -in "$1.pem" -passout pass: + openssl pkcs12 -in "$1.p12" -out "$1-client.pem" -nodes -passout pass: -passin pass:"" } chain server1 localhost From 2c176a16ed768d8c9157542b2a162e60b528186a Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 29 Aug 2024 19:32:50 +0200 Subject: [PATCH 292/344] Format --- .../source/channel/ChannelFactory.cpp | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp index d669e0f5c..e8d43a324 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp @@ -1,8 +1,8 @@ #include "channel/ChannelFactory.h" +#include "exceptions/ArmoniKApiException.h" #include "options/ControlPlane.h" #include "utils/ChannelArguments.h" -#include "exceptions/ArmoniKApiException.h" #include #include #include @@ -81,7 +81,7 @@ std::shared_ptr create_certificate_provider(const } } -std::shared_ptr ChannelFactory::create_channel(){ +std::shared_ptr ChannelFactory::create_channel() { auto channel = grpc::CreateCustomChannel(endpoint_, credentials_, common::utils::getChannelArguments(configuration_)); logger_.log(common::logger::Level::Debug, "Created new channel "); @@ -95,7 +95,8 @@ std::shared_ptr ChannelFactory::create_channel(){ return channel; } -ChannelFactory::ChannelFactory(armonik::api::common::utils::Configuration configuration, common::logger::Logger &logger) : logger_(logger.local()), configuration_(std::move(configuration)){ +ChannelFactory::ChannelFactory(armonik::api::common::utils::Configuration configuration, common::logger::Logger &logger) + : logger_(logger.local()), configuration_(std::move(configuration)) { const auto control_plane = configuration_.get_control_plane(); const bool is_https = initialize_protocol_endpoint(control_plane, endpoint_); @@ -103,26 +104,27 @@ ChannelFactory::ChannelFactory(armonik::api::common::utils::Configuration config auto user_private_pem = get_key(control_plane.getUserKeyPemPath()); auto user_public_pem = get_key(control_plane.getUserCertPemPath()); - if(is_https){ - if(!user_private_pem.empty() && !user_public_pem.empty()){ - if(control_plane.isSslValidation()){ - credentials_ = grpc::SslCredentials(grpc::SslCredentialsOptions{std::move(root_cert_pem), std::move(user_private_pem), std::move(user_public_pem)}); - }else{ + if (is_https) { + if (!user_private_pem.empty() && !user_public_pem.empty()) { + if (control_plane.isSslValidation()) { + credentials_ = grpc::SslCredentials(grpc::SslCredentialsOptions{ + std::move(root_cert_pem), std::move(user_private_pem), std::move(user_public_pem)}); + } else { throw common::exceptions::ArmoniKApiException("mTLS without SSL validation is not supported."); } - }else{ - if(control_plane.isSslValidation()){ + } else { + if (control_plane.isSslValidation()) { credentials_ = grpc::SslCredentials(grpc::SslCredentialsOptions{std::move(root_cert_pem)}); - } else{ + } else { TlsChannelCredentialsOptions tls_options; - tls_options.set_certificate_provider(create_certificate_provider(root_self_signed, user_public_pem, user_private_pem)); + tls_options.set_certificate_provider( + create_certificate_provider(root_self_signed, user_public_pem, user_private_pem)); tls_options.set_verify_server_certs(control_plane.isSslValidation()); credentials_ = TlsCredentials(tls_options); } - } is_secure_ = true; - }else{ + } else { credentials_ = grpc::InsecureChannelCredentials(); } } From 460e83eb84dbc5ccc6a6c5cb69b3de7b560a4145 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Fri, 30 Aug 2024 16:33:17 +0200 Subject: [PATCH 293/344] Add some docs in code --- .../header/channel/ChannelFactory.h | 18 +++-- .../source/channel/ChannelFactory.cpp | 72 ++++++++----------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h b/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h index 7527c7483..79f7585e3 100644 --- a/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h +++ b/packages/cpp/ArmoniK.Api.Client/header/channel/ChannelFactory.h @@ -1,24 +1,34 @@ #pragma once -#include "logger/formatter.h" #include "logger/logger.h" #include "logger/writer.h" #include "utils/Configuration.h" #include #include -#include -#include namespace armonik { namespace api { namespace client { class ChannelFactory { public: + /** + * @brief Creates a channel factory from the given configuration + * @param configuration The channel configuration + * @param logger The logger + */ explicit ChannelFactory(armonik::api::common::utils::Configuration configuration, common::logger::Logger &logger); + /** + * @brief Creates the new gRPC channel + * @return New channel + */ std::shared_ptr<::grpc::Channel> create_channel(); - static bool ShutdownOnFailure(std::shared_ptr<::grpc::Channel> channel); + /** + * + * @return A bool on whether the gRPC channel is secure or not + */ + bool isSecureChannel() const noexcept; private: armonik::api::common::logger::LocalLogger logger_; diff --git a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp index e8d43a324..dc109cf53 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp @@ -17,6 +17,10 @@ namespace client { using namespace grpc::experimental; +/** + * In TLS without SSL validation, this certificate is used for the function TlsCredentials options when a root + * certificate is not provided + */ const std::string root_self_signed = R"(-----BEGIN CERTIFICATE REQUEST----- MIIEhjCCAm4CAQAwQTELMAkGA1UEBhMCRlIxEzARBgNVBAgMClNvbWUtU3RhdGUx DjAMBgNVBAcMBVBhcmlzMQ0wCwYDVQQKDARBbmVvMIICIjANBgkqhkiG9w0BAQEF @@ -45,7 +49,12 @@ bDCNVTg3w/OQLQQdWUl6FunmYinukBgmqnsJnwgrhzBENbmgbgfOZZWGtG5ODENb wc+KqiSg9c9iqA== -----END CERTIFICATE REQUEST-----)"; -std::string get_key(const absl::string_view &path) { +/** + * + * @param path + * @return + */ +std::string read_file(const absl::string_view &path) { std::ifstream file(path.data(), std::ios::in | std::ios::binary); if (file.is_open()) { std::ostringstream sstr; @@ -56,6 +65,12 @@ std::string get_key(const absl::string_view &path) { } } +/** + * + * @param controlPlane The control plane object for the current configuration + * @param endpoint The endpoint + * @return a boolean on wether http or https connexion + */ bool initialize_protocol_endpoint(const common::options::ControlPlane &controlPlane, std::string &endpoint) { absl::string_view endpoint_view = controlPlane.getEndpoint(); const auto delim = endpoint_view.find("://"); @@ -67,6 +82,13 @@ bool initialize_protocol_endpoint(const common::options::ControlPlane &controlPl return endpoint_view.back() == 's' || endpoint_view.back() == 'S'; } +/** + * + * @param rootCertificate The root certificate to validate the server one against + * @param userPublicPem The client certificate for mTLS + * @param userPrivatePem The client key for mTLS + * @return a pointer to a certificate provider interface + */ std::shared_ptr create_certificate_provider(const std::string &rootCertificate, const std::string &userPublicPem, const std::string &userPrivatePem) { @@ -85,13 +107,6 @@ std::shared_ptr ChannelFactory::create_channel() { auto channel = grpc::CreateCustomChannel(endpoint_, credentials_, common::utils::getChannelArguments(configuration_)); logger_.log(common::logger::Level::Debug, "Created new channel "); - if (channel != nullptr) { - if (ShutdownOnFailure(channel)) { - logger_.log(common::logger::Level::Debug, "Shutdown unhealthy channel"); - } else { - logger_.log(common::logger::Level::Debug, "Valid channel"); - } - } return channel; } @@ -100,9 +115,9 @@ ChannelFactory::ChannelFactory(armonik::api::common::utils::Configuration config const auto control_plane = configuration_.get_control_plane(); const bool is_https = initialize_protocol_endpoint(control_plane, endpoint_); - auto root_cert_pem = get_key(control_plane.getCaCertPemPath()); - auto user_private_pem = get_key(control_plane.getUserKeyPemPath()); - auto user_public_pem = get_key(control_plane.getUserCertPemPath()); + auto root_cert_pem = read_file(control_plane.getCaCertPemPath()); + auto user_private_pem = read_file(control_plane.getUserKeyPemPath()); + auto user_public_pem = read_file(control_plane.getUserCertPemPath()); if (is_https) { if (!user_private_pem.empty() && !user_public_pem.empty()) { @@ -117,48 +132,23 @@ ChannelFactory::ChannelFactory(armonik::api::common::utils::Configuration config credentials_ = grpc::SslCredentials(grpc::SslCredentialsOptions{std::move(root_cert_pem)}); } else { TlsChannelCredentialsOptions tls_options; + // Set up TLS credentials options by setting root certificate to random certificate tls_options.set_certificate_provider( create_certificate_provider(root_self_signed, user_public_pem, user_private_pem)); + // Disable SSL certificate validation by setting verify_server to false tls_options.set_verify_server_certs(control_plane.isSslValidation()); + // Create TLS credentials with the specified options credentials_ = TlsCredentials(tls_options); } } is_secure_ = true; } else { + // Create gRPC insecure credentials credentials_ = grpc::InsecureChannelCredentials(); } } -bool ChannelFactory::ShutdownOnFailure(std::shared_ptr channel) { - switch ((*channel).GetState(true)) { - case GRPC_CHANNEL_CONNECTING: - // std::cout << "CONNECTING" << std::endl; - break; - case GRPC_CHANNEL_IDLE: - // std::cout << "IDLE" << std::endl; - break; - - case GRPC_CHANNEL_SHUTDOWN: - // std::cout << "SHUTDOWN" << std::endl; - return true; - break; - - case GRPC_CHANNEL_TRANSIENT_FAILURE: - // std::cout << "TRANSIENT FAILURE" << std::endl; - channel.reset(); - return true; - break; - - case GRPC_CHANNEL_READY: - // std::cout << "READY" << std::endl; - break; - - default: - return false; - break; - } - return false; -} +bool ChannelFactory::isSecureChannel() const noexcept { return is_secure_; } } // namespace client } // namespace api From 6c5be3f3445c9b0f2e70f3b3b3c825befd6f7dbc Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 30 Aug 2024 10:57:08 +0200 Subject: [PATCH 294/344] Fixed task from task summary --- packages/python/src/armonik/client/tasks.py | 4 +- packages/python/src/armonik/common/objects.py | 63 +++++++++++++++++-- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/packages/python/src/armonik/client/tasks.py b/packages/python/src/armonik/client/tasks.py index f88ed009e..baa68e3a5 100644 --- a/packages/python/src/armonik/client/tasks.py +++ b/packages/python/src/armonik/client/tasks.py @@ -114,7 +114,7 @@ def list_tasks( page_size: size of a page, defaults to 1000 sort_field: field on which to sort the resulting list, defaults to the task_id sort_direction: direction of the sort, defaults to ascending - detailed: Wether to retrieve the detailed description of the task. + detailed: Whether to retrieve the detailed description of the task. Returns: A tuple containing : @@ -134,7 +134,7 @@ def list_tasks( response: ListTasksDetailedResponse = self._client.ListTasksDetailed(request) return response.total, [Task.from_message(t) for t in response.tasks] response: ListTasksResponse = self._client.ListTasks(request) - return response.total, [Task.from_message(t) for t in response.tasks] + return response.total, [Task.from_summary(t) for t in response.tasks] def cancel_tasks(self, task_ids: List[str], chunk_size: Optional[int] = 500): """Cancel tasks. diff --git a/packages/python/src/armonik/common/objects.py b/packages/python/src/armonik/common/objects.py index 5b1ae3572..0eb96a817 100644 --- a/packages/python/src/armonik/common/objects.py +++ b/packages/python/src/armonik/common/objects.py @@ -8,7 +8,7 @@ from ..protogen.common.agent_common_pb2 import ResultMetaData from ..protogen.common.applications_common_pb2 import ApplicationRaw -from ..protogen.common.tasks_common_pb2 import TaskDetailed +from ..protogen.common.tasks_common_pb2 import TaskDetailed, TaskSummary from .filter import ( FilterDescriptor, GenericTaskOptionsFilter, @@ -199,10 +199,20 @@ def __init__( self.owner_pod_id = owner_pod_id self.initial_task_id = initial_task_id self.created_by = created_by - self.parent_task_ids = parent_task_ids if parent_task_ids is not None else [] - self.data_dependencies = data_dependencies if data_dependencies is not None else [] - self.expected_output_ids = expected_output_ids if expected_output_ids is not None else [] - self.retry_of_ids = retry_of_ids if retry_of_ids is not None else [] + self.parent_task_ids = parent_task_ids + self.count_parent_task_ids = ( + len(self.parent_task_ids) if self.parent_task_ids is not None else None + ) + self.data_dependencies = data_dependencies + self.count_data_dependencies = ( + len(self.data_dependencies) if self.data_dependencies is not None else None + ) + self.expected_output_ids = expected_output_ids + self.count_expected_output_ids = ( + len(self.expected_output_ids) if self.expected_output_ids is not None else None + ) + self.retry_of_ids = retry_of_ids + self.count_retry_of_ids = len(self.retry_of_ids) if self.retry_of_ids is not None else None self.status = status self.status_message = status_message self.options = options @@ -295,6 +305,49 @@ def from_message(cls, task_raw: TaskDetailed) -> "Task": payload_id=task_raw.payload_id, ) + @staticmethod + def from_summary(task_raw: TaskSummary) -> "Task": + task = Task( + id=task_raw.id, + session_id=task_raw.session_id, + owner_pod_id=task_raw.owner_pod_id, + initial_task_id=task_raw.initial_task_id, + created_by=task_raw.created_by, + parent_task_ids=None, + data_dependencies=None, + expected_output_ids=None, + retry_of_ids=None, + status=task_raw.status, + status_message=task_raw.status_message, + options=TaskOptions.from_message(task_raw.options), + created_at=timestamp_to_datetime(task_raw.created_at), + submitted_at=timestamp_to_datetime(task_raw.submitted_at), + received_at=timestamp_to_datetime(task_raw.received_at), + acquired_at=timestamp_to_datetime(task_raw.acquired_at), + fetched_at=timestamp_to_datetime(task_raw.fetched_at), + started_at=timestamp_to_datetime(task_raw.started_at), + processed_at=timestamp_to_datetime(task_raw.processed_at), + ended_at=timestamp_to_datetime(task_raw.ended_at), + pod_ttl=timestamp_to_datetime(task_raw.pod_ttl), + creation_to_end_duration=duration_to_timedelta(task_raw.creation_to_end_duration), + processing_to_end_duration=duration_to_timedelta(task_raw.processing_to_end_duration), + received_to_end_duration=duration_to_timedelta(task_raw.received_to_end_duration), + output=Output( + error=( + task_raw.error + if task_raw.error is not None and len(task_raw.error) > 0 + else None + ) + ), + pod_hostname=task_raw.pod_hostname, + payload_id=task_raw.payload_id, + ) + task.count_parent_task_ids = task_raw.count_parent_task_ids + task.count_data_dependencies = task_raw.count_data_dependencies + task.count_expected_output_ids = task_raw.count_expected_output_ids + task.count_retry_of_ids = task_raw.count_retry_of_ids + return task + def __eq__(self, other: "Task") -> bool: return ( self.id == other.id From f49315d9a0237bfde1b6c60bb869a7bef0fdf92c Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 30 Aug 2024 16:11:33 +0200 Subject: [PATCH 295/344] Fixed most ci warnings --- .github/workflows/ci.yml | 42 +++++++++---------- .github/workflows/deploy-docs.yml | 14 +++---- .github/workflows/publish-edge.yml | 26 ++++++------ .github/workflows/release.yml | 32 +++++++------- .github/workflows/semantic-pull-request.yml | 6 +-- .github/workflows/test.yml | 6 +-- .../workflows/validate-docs-generation.yml | 12 +++--- 7 files changed, 69 insertions(+), 69 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 500884229..b7de327be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,14 +13,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18.x cache: pnpm @@ -37,14 +37,14 @@ jobs: timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.ref }} fetch-depth: 0 submodules: true - name: Install .NET Core - uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 + uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee # v4 with: dotnet-version: 6.x @@ -83,7 +83,7 @@ jobs: run: working-directory: packages/python steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 @@ -132,7 +132,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.ref }} fetch-depth: 0 @@ -163,7 +163,7 @@ jobs: if: ${{ failure() && steps.check-diff.conclusion == 'failure' }} run: | git diff > patch-cpp.diff - - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 + - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a if: ${{ failure() && steps.check-diff.conclusion == 'failure' }} with: name: patch-cpp @@ -175,7 +175,7 @@ jobs: timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.ref }} fetch-depth: 0 @@ -188,12 +188,12 @@ jobs: name: Lint JS runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - run: npm install -g pnpm@9.1.4 - run: corepack enable - - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 20 cache: pnpm @@ -209,14 +209,14 @@ jobs: run: working-directory: packages/web steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18.x cache: pnpm @@ -240,14 +240,14 @@ jobs: run: working-directory: packages/angular steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18.x cache: pnpm @@ -271,7 +271,7 @@ jobs: run: working-directory: packages/python steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 @@ -343,19 +343,19 @@ jobs: exit $ret - name: Get Cover - uses: orgoro/coverage@6d7a2607343d2abeab89ef40b54ec9785134e313 + uses: orgoro/coverage@3f13a558c5af7376496aa4848bf0224aead366ac with: coverageFile: packages/python/coverage.xml token: ${{ secrets.GITHUB_TOKEN }} - name: Archive code coverage results html - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a with: name: code-coverage-report-html path: packages/python/coverage_report - name: Archive code coverage results xml - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a with: name: code-coverage-report-xml path: packages/python/coverage.xml @@ -369,7 +369,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.ref }} @@ -378,7 +378,7 @@ jobs: cd packages/cpp/tools/packaging ./make-${{ matrix.type }}.sh - name: Publish package as artefact - uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a with: if-no-files-found: error path: packages/cpp/tools/packaging/*.${{ matrix.type }} @@ -392,7 +392,7 @@ jobs: working-directory: packages/java steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - name: Set up java 17 diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index d9fee907b..4208e27a9 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -21,12 +21,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - run: npm i -g pnpm @antfu/ni - name: Setup Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: '18' cache: pnpm @@ -37,7 +37,7 @@ jobs: # This will be used to avoid the use of the docker image to generate the documentation if the proto files have not changed - name: Cache Generated Docs from Protos id: proto-cache - uses: actions/cache@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4 with: path: .docs/content/api/*.md key: proto-v1-${{ hashFiles('Protos/V1/**.proto') }} @@ -65,12 +65,12 @@ jobs: needs: [generate-proto-docs] steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 # Restore API proto documentation - name: Cache Generated Docs from Protos id: proto-cache - uses: actions/cache@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4 with: path: .docs/content/api/*.md key: proto-v1-${{ hashFiles('Protos/V1/**.proto') }} @@ -78,7 +78,7 @@ jobs: - run: npm i -g pnpm @antfu/ni - name: Setup Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: '18' cache: pnpm @@ -110,4 +110,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@decdde0ac072f6dcbe43649d82d9c635fff5b4e4 # v4 + uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4 diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index ebbcc9ec0..8b5da138d 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -17,7 +17,7 @@ jobs: version: ${{ steps.genver.outputs.version }} steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 @@ -51,14 +51,14 @@ jobs: - packages/csharp/ArmoniK.Api.Tests steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 # Install the .NET Core workload - name: Install .NET Core - uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 + uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee # v4 with: dotnet-version: 6.x @@ -91,13 +91,13 @@ jobs: - packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 - name: Install .NET Core - uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 + uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee # v4 with: dotnet-version: 6.x @@ -119,14 +119,14 @@ jobs: name: Release Angular Package runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 - run: npm i -g @antfu/ni pnpm - - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18 cache: pnpm @@ -158,14 +158,14 @@ jobs: name: Release Web Package runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.head_ref }} fetch-depth: 0 - run: npm i -g @antfu/ni pnpm - - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18 cache: pnpm @@ -203,7 +203,7 @@ jobs: run: working-directory: packages/python steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 @@ -211,7 +211,7 @@ jobs: run: bash proto2python.sh ~/pyvenv - name: Upload as artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a with: name: python-packages path: packages/python/pkg/ @@ -235,7 +235,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.ref }} @@ -244,7 +244,7 @@ jobs: cd packages/cpp/tools/packaging ./make-${{ matrix.type }}.sh - name: Publish package as artefact - uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a with: if-no-files-found: error path: packages/cpp/tools/packaging/*.${{ matrix.type }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b41e31fb0..b3aa48a47 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,14 +16,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - name: Setup Node.js - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18.x cache: pnpm @@ -49,12 +49,12 @@ jobs: - packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - name: Install .NET Core - uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 + uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee # v4 with: dotnet-version: 6.x @@ -75,7 +75,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 @@ -86,7 +86,7 @@ jobs: bash proto2python.sh ~/pyvenv - name: Upload as artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a with: name: python-packages path: packages/python/pkg/ @@ -104,20 +104,20 @@ jobs: uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_API_TOKEN }} - print_hash: true - packages_dir: packages/python/pkg/ + print-hash: true + packages-dir: packages/python/pkg/ release-angular-packages: needs: [verify-versions] runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18 cache: pnpm @@ -144,13 +144,13 @@ jobs: needs: [verify-versions] runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18 cache: pnpm @@ -186,7 +186,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: ref: ${{ github.ref }} @@ -195,7 +195,7 @@ jobs: cd packages/cpp/tools/packaging ./make-${{ matrix.type }}.sh - name: Publish package as artefact - uses: actions/upload-artifact@65d862660abb392b8c4a3d1195a2108db131dd05 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a with: if-no-files-found: error path: packages/cpp/tools/packaging/*.${{ matrix.type }} @@ -210,12 +210,12 @@ jobs: needs: [verify-versions] runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - name: Set node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18 diff --git a/.github/workflows/semantic-pull-request.yml b/.github/workflows/semantic-pull-request.yml index eb961627b..61a7e2056 100644 --- a/.github/workflows/semantic-pull-request.yml +++ b/.github/workflows/semantic-pull-request.yml @@ -17,12 +17,12 @@ jobs: name: Validate PR title runs-on: ubuntu-latest steps: - - uses: amannn/action-semantic-pull-request@c3cd5d1ea3580753008872425915e343e351ab54 # v5 + - uses: amannn/action-semantic-pull-request@0723387faaf9b38adef4775cd42cfd5155ed6017 # v5 id: lint_pr_title env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - uses: marocchino/sticky-pull-request-comment@efaaab3fd41a9c3de579aba759d2552635e590fd # v2 + - uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2 # When the previous steps fails, the workflow would stop. By adding this # condition you can continue the execution with the populated error message. if: always() && (steps.lint_pr_title.outputs.error_message != null) @@ -41,7 +41,7 @@ jobs: # Delete a previous comment when the issue has been resolved - if: ${{ steps.lint_pr_title.outputs.error_message == null }} - uses: marocchino/sticky-pull-request-comment@efaaab3fd41a9c3de579aba759d2552635e590fd # v2 + uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2 with: header: pr-title-lint-error delete: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9658ff6d7..be2d764e2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,7 +50,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 @@ -76,7 +76,7 @@ jobs: certutil -addstore -f "ROOT" server2-ca.pem - name: Install .NET Core - uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 + uses: actions/setup-dotnet@6bd8b7f7774af54e05809fcc5431931b3eb1ddee # v4 if: ${{ matrix.dotnet.version }} != "" with: dotnet-version: ${{ matrix.dotnet.version }} @@ -119,7 +119,7 @@ jobs: sleep 5 cd ArmoniK.Api.Client.Test - dotnet test --runtime ${{ matrix.platform.runtime }} -f ${{ matrix.dotnet.framework }} --logger "trx;LogFileName=test-results.trx"; ret=$? + dotnet test -f ${{ matrix.dotnet.framework }} --logger "trx;LogFileName=test-results.trx"; ret=$? kill $notls_pid $tls_pid $tlsstore_pid $mtls_pid $mtlsstore_pid exit $ret diff --git a/.github/workflows/validate-docs-generation.yml b/.github/workflows/validate-docs-generation.yml index da38ddb01..3d493e56f 100644 --- a/.github/workflows/validate-docs-generation.yml +++ b/.github/workflows/validate-docs-generation.yml @@ -15,12 +15,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - run: npm i -g pnpm @antfu/ni - name: Setup Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18 cache: pnpm @@ -39,11 +39,11 @@ jobs: name: Lint Markdown runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18 cache: pnpm @@ -57,11 +57,11 @@ jobs: name: Lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - run: npm i -g pnpm @antfu/ni - - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 + - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 with: node-version: 18 cache: pnpm From bb9b653811566099e0de59e563f4c4409cef0585 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Sun, 1 Sep 2024 12:35:11 +0200 Subject: [PATCH 296/344] Better handle of connexion types --- .../source/channel/ChannelFactory.cpp | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp index dc109cf53..ff83c8d1c 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp @@ -66,7 +66,7 @@ std::string read_file(const absl::string_view &path) { } /** - * + * @brief Check if it's https connexion * @param controlPlane The control plane object for the current configuration * @param endpoint The endpoint * @return a boolean on wether http or https connexion @@ -74,12 +74,29 @@ std::string read_file(const absl::string_view &path) { bool initialize_protocol_endpoint(const common::options::ControlPlane &controlPlane, std::string &endpoint) { absl::string_view endpoint_view = controlPlane.getEndpoint(); const auto delim = endpoint_view.find("://"); - if (delim != absl::string_view::npos) { - const auto tmp = endpoint_view.substr(delim + 3); - endpoint_view = endpoint_view.substr(0, delim); + const auto http_delim = endpoint_view.find("http://"); + const auto https_delim = endpoint_view.find("https://"); + if (endpoint_view.find("unix") == 0) { + if (endpoint_view[0] == '/') { + endpoint.insert(0, "unix://"); + } else { + endpoint.insert(0, "unix:"); + } + return false; + } + if (https_delim != absl::string_view::npos) { + const auto tmp = endpoint_view.substr(https_delim + 8); endpoint = {tmp.cbegin(), tmp.cend()}; + return true; + } else { + if (http_delim != absl::string_view::npos) { + const auto tmp = endpoint_view.substr(http_delim + 7); + endpoint = {tmp.cbegin(), tmp.cend()}; + } else { + endpoint = {endpoint_view.cbegin(), endpoint_view.cend()}; + } + return false; } - return endpoint_view.back() == 's' || endpoint_view.back() == 'S'; } /** From 66d43595dd09b8db3daeb73cf6373bf26f515129 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 2 Sep 2024 10:37:37 +0200 Subject: [PATCH 297/344] PR comments --- .../source/channel/ChannelFactory.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp index ff83c8d1c..e7090d539 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp @@ -51,8 +51,8 @@ wc+KqiSg9c9iqA== /** * - * @param path - * @return + * @param path The path to the file to be read + * @return content of the file as a std::string */ std::string read_file(const absl::string_view &path) { std::ifstream file(path.data(), std::ios::in | std::ios::binary); @@ -76,8 +76,10 @@ bool initialize_protocol_endpoint(const common::options::ControlPlane &controlPl const auto delim = endpoint_view.find("://"); const auto http_delim = endpoint_view.find("http://"); const auto https_delim = endpoint_view.find("https://"); - if (endpoint_view.find("unix") == 0) { - if (endpoint_view[0] == '/') { + if ((endpoint_view.find("unix") == 0) || + (endpoint_view[0] == '/' && endpoint_view.find(':') == absl::string_view::npos)) { + endpoint = {endpoint_view.cbegin(), endpoint_view.cend()}; + if (endpoint[0] == '/') { endpoint.insert(0, "unix://"); } else { endpoint.insert(0, "unix:"); From 00851773272ed8116d3d08f9c9e8bd9032f8013b Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 2 Sep 2024 13:16:10 +0200 Subject: [PATCH 298/344] Lazy load data in worker --- .../python/src/armonik/worker/taskhandler.py | 45 +++++++++++++++---- packages/python/tests/test_taskhandler.py | 13 +++++- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/packages/python/src/armonik/worker/taskhandler.py b/packages/python/src/armonik/worker/taskhandler.py index 4fa518f16..79ea09279 100644 --- a/packages/python/src/armonik/worker/taskhandler.py +++ b/packages/python/src/armonik/worker/taskhandler.py @@ -1,7 +1,8 @@ from __future__ import annotations import os -from typing import Optional, Dict, List, Union +from collections.abc import Mapping +from typing import Optional, Dict, List, Union, Iterator from ..common import TaskOptions, TaskDefinition, Result, Task from ..common.helpers import batched @@ -20,6 +21,32 @@ from ..protogen.worker.agent_service_pb2_grpc import AgentStub +class LazyLoadDict(Mapping): + def __init__(self, data_folder: str, ids: List[str]): + self.__data_folder = data_folder + self._data: Dict[str, Optional[bytes]] = {k: None for k in ids} + + def __iter__(self) -> Iterator[str, bytes]: + for k in self._data.keys(): + yield k, self[k] + + def keys(self): + # Overridden to prevent loading + for k in self._data.keys(): + yield k + + def __getitem__(self, __key) -> bytes: + if __key not in self._data: + raise KeyError(__key) + if self._data[__key] is None: + with open(os.path.join(self.__data_folder, __key), "rb") as f: + self._data[__key] = f.read() + return self._data[__key] + + def __len__(self) -> int: + return len(self._data) + + class TaskHandler: def __init__(self, request: ProcessRequest, agent_client: AgentStub): self._client: AgentStub = agent_client @@ -32,15 +59,15 @@ def __init__(self, request: ProcessRequest, agent_client: AgentStub): self.payload_id: str = request.payload_id self.data_folder: str = request.data_folder - # TODO: Lazy load - with open(os.path.join(self.data_folder, self.payload_id), "rb") as f: - self.payload = f.read() + self._payload = None + self.data_dependencies = LazyLoadDict(self.data_folder, list(request.data_dependencies)) - # TODO: Lazy load - self.data_dependencies: Dict[str, bytes] = {} - for dd in request.data_dependencies: - with open(os.path.join(self.data_folder, dd), "rb") as f: - self.data_dependencies[dd] = f.read() + @property + def payload(self) -> bytes: + if self._payload is None: + with open(os.path.join(self.data_folder, self.payload_id), "rb") as f: + self._payload = f.read() + return self._payload def submit_tasks( self, diff --git a/packages/python/tests/test_taskhandler.py b/packages/python/tests/test_taskhandler.py index bf602b530..d9bbcdbbd 100644 --- a/packages/python/tests/test_taskhandler.py +++ b/packages/python/tests/test_taskhandler.py @@ -50,7 +50,7 @@ def test_taskhandler_init(self): assert task_handler.payload_id == "payload-id" assert task_handler.data_folder == data_folder assert task_handler.payload == "payload".encode() - assert task_handler.data_dependencies == {"dd-id": "dd".encode()} + assert dict(task_handler.data_dependencies) == {"dd-id": "dd".encode()} def test_submit_tasks(self): task_handler = TaskHandler(self.request, get_client("Agent")) @@ -87,6 +87,17 @@ def test_create_results(self): assert rpc_called("Agent", "CreateResults") assert results == {} + def test_lazy_load(self): + handler = TaskHandler(self.request, None) + assert handler.data_dependencies._data["dd-id"] is None + assert len(handler.data_dependencies._data) == 1 + for _ in handler.data_dependencies.keys(): + pass + assert handler.data_dependencies._data["dd-id"] is None + for _ in handler.data_dependencies: + pass + assert handler.data_dependencies._data["dd-id"] == b"dd" + def test_service_fully_implemented(self): assert all_rpc_called( "Agent", missings=["CreateTask", "GetCommonData", "GetDirectData", "GetResourceData"] From b222a484e90204fe9b3aad7f8546d834ee7bb9da Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Tue, 3 Sep 2024 09:19:14 +0200 Subject: [PATCH 299/344] Adapt C++ tests to server mock --- .../cpp/ArmoniK.Api.Tests/header/common.h | 4 +- .../source/ChannelOptionsTest.cpp | 3 ++ .../source/EventsClientTest.cpp | 1 + .../source/PartitionsClientTest.cpp | 10 +--- .../source/ResultsClientTest.cpp | 47 +++++-------------- .../source/SessionClientTest.cpp | 19 ++------ .../source/SubmitterClientTest.cpp | 4 ++ .../source/TasksClientTest.cpp | 28 +++-------- .../source/VersionsClientTest.cpp | 3 -- .../cpp/ArmoniK.Api.Tests/source/common.cpp | 13 +++-- 10 files changed, 42 insertions(+), 90 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/header/common.h b/packages/cpp/ArmoniK.Api.Tests/header/common.h index ad7b3656c..558f207c5 100644 --- a/packages/cpp/ArmoniK.Api.Tests/header/common.h +++ b/packages/cpp/ArmoniK.Api.Tests/header/common.h @@ -1,6 +1,6 @@ #pragma once -#include "logger/base.h" +#include "logger/logger.h" #include "objects.pb.h" #include #include @@ -12,4 +12,4 @@ * @param default_task_options The default task options. */ void init(std::shared_ptr &channel, armonik::api::grpc::v1::TaskOptions &task_options, - armonik::api::common::logger::ILogger &logger); + armonik::api::common::logger::Logger &logger); diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp index bb322d23f..f86e345c1 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp @@ -25,6 +25,7 @@ armonik::api::grpc::v1::TaskOptions default_task_options() { } TEST(Options, no_options) { + GTEST_SKIP() << "Testing Mock server"; armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); @@ -35,6 +36,7 @@ TEST(Options, no_options) { } TEST(Options, default_options) { + GTEST_SKIP() << "Testing Mock server"; armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); @@ -46,6 +48,7 @@ TEST(Options, default_options) { } TEST(Options, test_timeout) { + GTEST_SKIP() << "Testing Mock server"; armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); diff --git a/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp index 6a998f49a..ea61341ae 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp @@ -13,6 +13,7 @@ using Logger = armonik::api::common::logger::Logger; TEST(Events, getEvents) { + GTEST_SKIP() << "Testing Mock server"; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; diff --git a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp index f5ea9eca2..3c81d108d 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp @@ -21,10 +21,6 @@ TEST(Partitions, can_get_partition) { armonik::api::grpc::v1::partitions::PartitionRaw partition; ASSERT_NO_THROW(partition = client.get_partition(task_options.partition_id())); - ASSERT_EQ(partition.id(), task_options.partition_id()); - ASSERT_EQ(partition.pod_max(), 100); - ASSERT_EQ(partition.pod_reserved(), 1); - ASSERT_EQ(partition.priority(), 1); } TEST(Partitions, can_list_partitions) { @@ -46,11 +42,9 @@ TEST(Partitions, can_list_partitions) { int total; - std::vector partitions = client.list_partitions(filters, total); + std::vector partitions; + ASSERT_NO_THROW(partitions = client.list_partitions(filters, total)); for (auto &&partition : partitions) { std::cout << *partition.mutable_id() << std::endl; } - ASSERT_TRUE(!partitions.empty()); - ASSERT_EQ(partitions.size(), 1); - ASSERT_EQ(partitions.size(), total); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp index e5231ec83..2f70a8d54 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp @@ -21,9 +21,7 @@ TEST(Results, test_results_created) { auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) .create_session(task_options); - auto map = client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3"}); - ASSERT_TRUE(!map.empty()); - ASSERT_EQ(map.size(), 4); + ASSERT_NO_THROW(client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3"})); } TEST(Results, test_results_list) { @@ -36,9 +34,7 @@ TEST(Results, test_results_list) { auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) .create_session(task_options); - auto map = client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3"}); - ASSERT_TRUE(!map.empty()); - ASSERT_EQ(map.size(), 4); + ASSERT_NO_THROW(client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3"})); armonik::api::grpc::v1::results::Filters filters; armonik::api::grpc::v1::results::FilterField filter_field; @@ -48,9 +44,7 @@ TEST(Results, test_results_list) { filter_field.mutable_filter_string()->set_operator_(armonik::api::grpc::v1::FILTER_STRING_OPERATOR_EQUAL); *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; int total; - auto list = client.list_results(filters, total); - ASSERT_EQ(list.size(), 4); - ASSERT_EQ(list.size(), total); + ASSERT_NO_THROW(client.list_results(filters, total)); } TEST(Results, test_results_list_small_page) { @@ -63,9 +57,7 @@ TEST(Results, test_results_list_small_page) { auto client = armonik::api::client::ResultsClient(armonik::api::grpc::v1::results::Results::NewStub(channel)); auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) .create_session(task_options); - auto map = client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3", "4"}); - ASSERT_TRUE(!map.empty()); - ASSERT_EQ(map.size(), 5); + ASSERT_NO_THROW(client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3", "4"})); armonik::api::grpc::v1::results::Filters filters; armonik::api::grpc::v1::results::FilterField filter_field; @@ -75,13 +67,9 @@ TEST(Results, test_results_list_small_page) { filter_field.mutable_filter_string()->set_operator_(armonik::api::grpc::v1::FILTER_STRING_OPERATOR_EQUAL); *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; int total; - auto list = client.list_results(filters, total, 0, 2); - ASSERT_EQ(list.size(), 2); - ASSERT_EQ(total, 5); + ASSERT_NO_THROW(client.list_results(filters, total, 0, 2)); - list = client.list_results(filters, total, -1, 2); - ASSERT_EQ(list.size(), 5); - ASSERT_EQ(total, 5); + ASSERT_NO_THROW(client.list_results(filters, total, -1, 2)); } TEST(Results, test_results_create_with_data_vector) { @@ -95,10 +83,7 @@ TEST(Results, test_results_create_with_data_vector) { auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) .create_session(task_options); std::vector> vec{{"0", "TestPayload"}}; - auto map = client.create_results(session_id, vec); - ASSERT_EQ(map.size(), 1); - ASSERT_NO_THROW(map.at("0")); - ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); + ASSERT_NO_THROW(client.create_results(session_id, vec)); } TEST(Results, test_results_create_with_data_map) { @@ -113,10 +98,7 @@ TEST(Results, test_results_create_with_data_map) { .create_session(task_options); std::map name_payload; name_payload["0"] = "TestPayload"; - auto map = client.create_results(session_id, std::move(name_payload)); - ASSERT_EQ(map.size(), 1); - ASSERT_NO_THROW(map.at("0")); - ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); + ASSERT_NO_THROW(client.create_results(session_id, std::move(name_payload))); } TEST(Results, test_results_create_with_data_unordered_map) { @@ -131,10 +113,7 @@ TEST(Results, test_results_create_with_data_unordered_map) { .create_session(task_options); std::unordered_map name_payload; name_payload["0"] = "TestPayload"; - auto map = client.create_results(session_id, std::move(name_payload)); - ASSERT_EQ(map.size(), 1); - ASSERT_NO_THROW(map.at("0")); - ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); + ASSERT_NO_THROW(client.create_results(session_id, std::move(name_payload))); } TEST(Results, test_results_create_with_data_string_view) { @@ -151,15 +130,11 @@ TEST(Results, test_results_create_with_data_string_view) { std::string fill_str = "TestPayloadTestPayload2"; name_payload.emplace_back("0", absl::string_view(fill_str.c_str(), 11)); name_payload.emplace_back("1", absl::string_view(fill_str.c_str() + 11, 12)); - auto map = client.create_results(session_id, name_payload.begin(), name_payload.end()); - ASSERT_EQ(map.size(), 2); - ASSERT_NO_THROW(map.at("0")); - ASSERT_NO_THROW(map.at("1")); - ASSERT_EQ(client.download_result_data(session_id, map.at("0")), std::string("TestPayload", 0, 11)); - ASSERT_EQ(client.download_result_data(session_id, map.at("1")), std::string("TestPayload2", 0, 12)); + ASSERT_NO_THROW(client.create_results(session_id, name_payload.begin(), name_payload.end())); } TEST(Results, test_results_upload_download) { + GTEST_SKIP() << "Testing Mock server"; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp index a48ba9829..8b5e54098 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp @@ -21,7 +21,6 @@ TEST(Sessions, can_create_session) { ASSERT_NO_THROW(response = client.create_session(task_options)); ASSERT_FALSE(response.empty()); - ASSERT_TRUE(client.get_session(response).status() == armonik::api::grpc::v1::session_status::SESSION_STATUS_RUNNING); } TEST(Sessions, can_cancel_session) { @@ -33,14 +32,10 @@ TEST(Sessions, can_cancel_session) { armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string session_id = client.create_session(task_options); - ASSERT_TRUE(client.get_session(session_id).status() == - armonik::api::grpc::v1::session_status::SESSION_STATUS_RUNNING); armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.cancel_session(session_id)); ASSERT_EQ(response.session_id(), session_id); - ASSERT_TRUE(client.get_session(session_id).status() == - armonik::api::grpc::v1::session_status::SESSION_STATUS_CANCELLED); } TEST(Sessions, can_get_session) { @@ -73,9 +68,7 @@ TEST(Sessions, can_list_sessions) { armonik::api::grpc::v1::sessions::Filters filters; int total; - auto list = client.list_sessions(filters, total); - ASSERT_GE(list.size(), expected_n_sessions); - ASSERT_GE(total, expected_n_sessions); + ASSERT_NO_THROW(client.list_sessions(filters, total)); } TEST(Sessions, can_list_sessions_small_page) { @@ -93,13 +86,9 @@ TEST(Sessions, can_list_sessions_small_page) { armonik::api::grpc::v1::sessions::Filters filters; int total; - auto list = client.list_sessions(filters, total, 0, 2); - ASSERT_EQ(list.size(), 2); - ASSERT_GE(total, expected_n_sessions); - - list = client.list_sessions(filters, total, -1, 2); - ASSERT_GE(list.size(), expected_n_sessions); - ASSERT_GE(total, expected_n_sessions); + // auto list = client.list_sessions(filters, total, 0, 2); + ASSERT_NO_THROW(client.list_sessions(filters, total, 0, 2)); + ASSERT_NO_THROW(client.list_sessions(filters, total, -1, 2)); } TEST(Sessions, can_pause_session) { diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index f603a578f..251feabd4 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -41,6 +41,7 @@ using ::testing::AtLeast; namespace logger = armonik::api::common::logger; TEST(testMock, createSession) { + GTEST_SKIP() << "Testing Mock server"; // MockStubInterface stub; std::shared_ptr channel; logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; @@ -67,6 +68,7 @@ TEST(testMock, createSession) { } TEST(testMock, submitTask) { + GTEST_SKIP() << "Testing Mock server"; logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; @@ -157,6 +159,7 @@ TEST(testMock, submitTask) { } TEST(testMock, testWorker) { + GTEST_SKIP() << "Testing Mock server"; logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; std::shared_ptr channel; @@ -210,6 +213,7 @@ TEST(testMock, testWorker) { } TEST(testMock, getResult) { + GTEST_SKIP() << "Testing Mock server"; logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; // MockStubInterface stub; std::shared_ptr channel; diff --git a/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp index bd8553e4b..8372e5b4e 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp @@ -48,29 +48,19 @@ TEST(Tasks, submit_tasks_test) { std::vector tasks_simple; ASSERT_NO_THROW(tasks_simple = client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}}})); - ASSERT_EQ(tasks_simple.size(), 1); + // ASSERT_EQ(tasks_simple.size(), 1); std::vector tasks_submit_override; ASSERT_NO_THROW(tasks_submit_override = client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}}}, task_options_submit)); - ASSERT_EQ(tasks_submit_override.size(), 1); + //ASSERT_EQ(tasks_submit_override.size(), 1); std::vector tasks_submit_unique_override; ASSERT_NO_THROW(tasks_submit_unique_override = client.submit_tasks( session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}, {}, task_options_unique}}, task_options_submit)); - ASSERT_NO_THROW(tasks_submit_unique_override.push_back(client.submit_tasks( - session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}, {}, task_options_unique}})[0])); - ASSERT_EQ(tasks_submit_unique_override.size(), 2); - - ASSERT_EQ(client.get_task(tasks_simple[0].task_id).options().priority(), task_options.priority()); - ASSERT_EQ(client.get_task(tasks_submit_override[0].task_id).options().priority(), task_options_submit.priority()); - ASSERT_EQ(client.get_task(tasks_submit_unique_override[0].task_id).options().priority(), - task_options_unique.priority()); - ASSERT_EQ(client.get_task(tasks_submit_unique_override[1].task_id).options().priority(), - task_options_unique.priority()); } TEST(Tasks, count_tasks_test) { @@ -92,23 +82,14 @@ TEST(Tasks, count_tasks_test) { std::map status_count; ASSERT_NO_THROW(status_count = client.count_tasks_by_status(filters)); - ASSERT_EQ(std::accumulate(status_count.begin(), status_count.end(), 0, - [](int a, std::pair p) { - return a + p.second; - }), - 0); client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}}}); ASSERT_NO_THROW(status_count = client.count_tasks_by_status(filters)); - ASSERT_EQ(std::accumulate(status_count.begin(), status_count.end(), 0, - [](int a, std::pair p) { - return a + p.second; - }), - 1); } TEST(Tasks, get_result_ids_test) { + GTEST_SKIP() << "Testing Mock server"; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -133,6 +114,7 @@ TEST(Tasks, get_result_ids_test) { } TEST(Tasks, get_task_test) { + GTEST_SKIP() << "Testing Mock server"; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -182,6 +164,7 @@ TEST(Tasks, cancel_tasks_test) { } TEST(Tasks, list_tasks_test) { + GTEST_SKIP() << "Testing Mock server"; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -204,6 +187,7 @@ TEST(Tasks, list_tasks_test) { } TEST(Tasks, list_tasks_detailed_test) { + GTEST_SKIP() << "Testing Mock server"; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; diff --git a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp index 5d98832cc..94ed0f825 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp @@ -22,7 +22,4 @@ TEST(Versions, can_list_versions) { std::cout << "API version: " << versions.api << "\n" << "Core version: " << versions.core << std::endl; - - ASSERT_NE(versions.api, "Unknown"); - ASSERT_NE(versions.core, "Unknown"); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/common.cpp b/packages/cpp/ArmoniK.Api.Tests/source/common.cpp index 0a404bc5c..08f007687 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/common.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/common.cpp @@ -1,6 +1,7 @@ #include "common.h" #include "utils/Configuration.h" #include +#include "channel/ChannelFactory.h" /** * @brief Initializes task options creates channel with server address @@ -9,18 +10,22 @@ * @param default_task_options The default task options. */ void init(std::shared_ptr<::grpc::Channel> &channel, armonik::api::grpc::v1::TaskOptions &default_task_options, - armonik::api::common::logger::ILogger &logger) { + armonik::api::common::logger::Logger &logger) { armonik::api::common::utils::Configuration configuration; // auto server = std::make_shared(configuration_t); configuration.add_json_configuration("appsettings.json").add_env_configuration(); - std::string server_address = configuration.get("Grpc__EndPoint"); + // std::string server_address = configuration.get("Grpc__EndPoint"); - logger.info(" Server address {address}", {{"address", server_address}}); + armonik::api::client::ChannelFactory channel_factory(configuration, logger); - channel = ::grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); + channel = channel_factory.create_channel(); + + logger.info(" Server address {address}", {{"address", configuration.get("Grpc__EndPoint")}}); + + // channel = ::grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); // stub_ = Submitter::NewStub(channel); From 7f6ffbbd9f586777aed7e7695b9de9fbd66c6259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gurhem?= Date: Tue, 3 Sep 2024 11:33:09 +0200 Subject: [PATCH 300/344] feat: add pending (waiting for dependencies) and paused statuses --- Protos/V1/task_status.proto | 2 ++ packages/python/src/armonik/common/enumwrapper.py | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Protos/V1/task_status.proto b/Protos/V1/task_status.proto index 9855c85f6..7f94a2904 100644 --- a/Protos/V1/task_status.proto +++ b/Protos/V1/task_status.proto @@ -23,4 +23,6 @@ enum TaskStatus { TASK_STATUS_PROCESSING = 9; /** Task is being processed. */ TASK_STATUS_PROCESSED = 10; /** Task is processed. */ TASK_STATUS_RETRIED = 11; /** Task is retried. */ + TASK_STATUS_PENDING = 12; /** Task is waiting for its dependencies before becoming executable. */ + TASK_STATUS_PAUSED = 13; /** Task is paused and will not be executed until session is resumed. */ } diff --git a/packages/python/src/armonik/common/enumwrapper.py b/packages/python/src/armonik/common/enumwrapper.py index 5868031f4..2911ac170 100644 --- a/packages/python/src/armonik/common/enumwrapper.py +++ b/packages/python/src/armonik/common/enumwrapper.py @@ -14,6 +14,8 @@ TASK_STATUS_PROCESSING, TASK_STATUS_PROCESSED, TASK_STATUS_RETRIED, + TASK_STATUS_PENDING, + TASK_STATUS_PAUSED, ) from ..protogen.common.events_common_pb2 import ( EVENTS_ENUM_UNSPECIFIED, @@ -69,6 +71,8 @@ class TaskStatus(IntEnum): PROCESSING = TASK_STATUS_PROCESSING PROCESSED = TASK_STATUS_PROCESSED RETRIED = TASK_STATUS_RETRIED + PENDING = TASK_STATUS_PENDING + PAUSED = TASK_STATUS_PAUSED class EventTypes: From 57c4df2f3c4f6dfd50a2d9b67b2669254f6b9185 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Fri, 30 Aug 2024 15:17:27 +0200 Subject: [PATCH 301/344] armonik_worker decorator --- packages/python/src/armonik/worker/worker.py | 91 +++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index 3596b80a6..03f16fba2 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -1,11 +1,16 @@ from __future__ import annotations + +import logging +import os import traceback from concurrent import futures -from typing import Callable, Union +from logging import Logger +from typing import Callable, Union, Optional, Tuple import grpc from grpc import Channel +from ..common.channel import create_channel from .seqlogger import ClefLogger from ..common import Output, HealthCheckStatus from ..protogen.common.objects_pb2 import Empty @@ -74,3 +79,87 @@ def Process(self, request: ProcessRequest, context) -> Union[ProcessReply, None] def HealthCheck(self, request: Empty, context) -> HealthCheckReply: return HealthCheckReply(status=self.health_check()) + + +def armonik_worker( + *, + autorun: bool = False, + logger: Optional[Logger] = None, + worker_endpoint: Optional[str] = None, + agent_endpoint: Optional[str] = None, + channel_options: Tuple[Tuple[str, str]] = (("grpc.default_authority", "localhost"),), +): + """ + Transforms the function into an ArmoniK Worker + Args: + autorun: if True, runs the processor instead of returning the function + logger: Logger to use, if None will use the default ClefLogger + worker_endpoint: Worker endpoint, if None will use the default from ComputePlane__WorkerChannel__SocketType and ComputePlane__WorkerChannel__Address + agent_endpoint: Agent endpoint, if None will use the default from ComputePlane__AgentChannel__SocketType and ComputePlane__AgentChannel__Address + channel_options: Options for the gRPC channel + + Returns: + Worker function + """ + if logger is None: + ClefLogger.setup_logging(logging.INFO) + logger = ClefLogger.getLogger("ArmoniKWorker") + if worker_endpoint is None: + worker_scheme = ( + "unix://" + if os.getenv("ComputePlane__WorkerChannel__SocketType", "unixdomainsocket") + == "unixdomainsocket" + else "http://" + ) + worker_endpoint = worker_scheme + os.getenv( + "ComputePlane__WorkerChannel__Address", "/cache/armonik_worker.sock" + ) + if agent_endpoint is None: + agent_scheme = ( + "unix://" + if os.getenv("ComputePlane__AgentChannel__SocketType", "unixdomainsocket") + == "unixdomainsocket" + else "http://" + ) + agent_endpoint = agent_scheme + os.getenv( + "ComputePlane__AgentChannel__Address", "/cache/armonik_agent.sock" + ) + + def decorator( + processor: Callable[[TaskHandler], Output], + ) -> Optional[Callable[[Optional[Channel]], None]]: + def run(channel: Optional[Channel] = None): + """ + Runs the worker + Args: + channel: gRPC channel to use, if None creates a channel + + Returns: + None + """ + # Start worker + logger.info("Worker Started") + # Use options to fix Unix socket connection on localhost (cf: ) + if channel is None: + channel_ = create_channel(agent_endpoint, options=channel_options).__enter__() + else: + channel_ = channel + try: + worker = ArmoniKWorker(channel_, processor, logger=logger) + logger.info("Worker Connected") + worker.start(worker_endpoint) + except Exception as e: + if channel is None: + channel_.__exit__(type(e), e, e.__traceback__) + channel_ = None + raise + finally: + if channel is None and channel_ is not None: + channel_.__exit__(None, None, None) + + if autorun: + run() + + return run + + return decorator From acc1e08bd50749685937c14408b3c6978b2872f1 Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Mon, 2 Sep 2024 10:43:45 +0200 Subject: [PATCH 302/344] Use wrapper class instead of function --- packages/python/src/armonik/worker/worker.py | 140 +++++++++++-------- 1 file changed, 83 insertions(+), 57 deletions(-) diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index 03f16fba2..36ffe26a8 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -73,7 +73,7 @@ def Process(self, request: ProcessRequest, context) -> Union[ProcessReply, None] return ProcessReply(output=self.processing_function(task_handler).to_message()) except Exception as e: self._logger.exception( - f"Failed task {''.join(traceback.format_exception(type(e) ,e, e.__traceback__))}", + f"Failed task {''.join(traceback.format_exception(type(e), e, e.__traceback__))}", exc_info=e, ) @@ -81,13 +81,79 @@ def HealthCheck(self, request: Empty, context) -> HealthCheckReply: return HealthCheckReply(status=self.health_check()) +_NOT_SET = object() + + +class ArmoniKWorkerWrapper: + def __init__( + self, + *, + processor: Callable[[TaskHandler], Output], + logger: Optional[Logger] = None, + worker_endpoint: Optional[str] = None, + agent_endpoint: Optional[str] = None, + channel_options: Optional[Tuple[Tuple[str, str]]] = _NOT_SET, + ): + if logger is None: + ClefLogger.setup_logging(logging.INFO) + logger = ClefLogger.getLogger("ArmoniKWorker") + if worker_endpoint is None: + worker_scheme = ( + "unix://" + if os.getenv("ComputePlane__WorkerChannel__SocketType", "unixdomainsocket") + == "unixdomainsocket" + else "http://" + ) + worker_endpoint = worker_scheme + os.getenv( + "ComputePlane__WorkerChannel__Address", "/cache/armonik_worker.sock" + ) + if agent_endpoint is None: + agent_scheme = ( + "unix://" + if os.getenv("ComputePlane__AgentChannel__SocketType", "unixdomainsocket") + == "unixdomainsocket" + else "http://" + ) + agent_endpoint = agent_scheme + os.getenv( + "ComputePlane__AgentChannel__Address", "/cache/armonik_agent.sock" + ) + if channel_options is _NOT_SET: + channel_options = (("grpc.default_authority", "localhost"),) + self.logger = logger + self.worker_endpoint = worker_endpoint + self.agent_endpoint = agent_endpoint + self.channel_options = channel_options + self.processor = processor + + def __call__(self, channel: Optional[Channel] = None): + # Start worker + self.logger.info("Worker Started") + # Use options to fix Unix socket connection on localhost (cf: ) + if channel is None: + channel_ = create_channel(self.agent_endpoint, options=self.channel_options).__enter__() + else: + channel_ = channel + try: + worker = ArmoniKWorker(channel_, self.processor, logger=self.logger) + self.logger.info("Worker Connected") + worker.start(self.worker_endpoint) + except Exception as e: + if channel is None: + channel_.__exit__(type(e), e, e.__traceback__) + channel_ = None + raise + finally: + if channel is None and channel_ is not None: + channel_.__exit__(None, None, None) + + def armonik_worker( *, autorun: bool = False, logger: Optional[Logger] = None, worker_endpoint: Optional[str] = None, agent_endpoint: Optional[str] = None, - channel_options: Tuple[Tuple[str, str]] = (("grpc.default_authority", "localhost"),), + channel_options: Tuple[Tuple[str, str]] = _NOT_SET, ): """ Transforms the function into an ArmoniK Worker @@ -100,66 +166,26 @@ def armonik_worker( Returns: Worker function + + Example: + >>> @armonik_worker() + >>> def processor(task_handler: TaskHandler) -> Output: + >>> ... + >>> return Output() """ - if logger is None: - ClefLogger.setup_logging(logging.INFO) - logger = ClefLogger.getLogger("ArmoniKWorker") - if worker_endpoint is None: - worker_scheme = ( - "unix://" - if os.getenv("ComputePlane__WorkerChannel__SocketType", "unixdomainsocket") - == "unixdomainsocket" - else "http://" - ) - worker_endpoint = worker_scheme + os.getenv( - "ComputePlane__WorkerChannel__Address", "/cache/armonik_worker.sock" - ) - if agent_endpoint is None: - agent_scheme = ( - "unix://" - if os.getenv("ComputePlane__AgentChannel__SocketType", "unixdomainsocket") - == "unixdomainsocket" - else "http://" - ) - agent_endpoint = agent_scheme + os.getenv( - "ComputePlane__AgentChannel__Address", "/cache/armonik_agent.sock" - ) def decorator( processor: Callable[[TaskHandler], Output], ) -> Optional[Callable[[Optional[Channel]], None]]: - def run(channel: Optional[Channel] = None): - """ - Runs the worker - Args: - channel: gRPC channel to use, if None creates a channel - - Returns: - None - """ - # Start worker - logger.info("Worker Started") - # Use options to fix Unix socket connection on localhost (cf: ) - if channel is None: - channel_ = create_channel(agent_endpoint, options=channel_options).__enter__() - else: - channel_ = channel - try: - worker = ArmoniKWorker(channel_, processor, logger=logger) - logger.info("Worker Connected") - worker.start(worker_endpoint) - except Exception as e: - if channel is None: - channel_.__exit__(type(e), e, e.__traceback__) - channel_ = None - raise - finally: - if channel is None and channel_ is not None: - channel_.__exit__(None, None, None) - + worker = ArmoniKWorkerWrapper( + processor=processor, + logger=logger, + worker_endpoint=worker_endpoint, + agent_endpoint=agent_endpoint, + channel_options=channel_options, + ) if autorun: - run() - - return run + worker() + return worker return decorator From 6b373bc0f8a0f38bd149fe81bfb0f049b0b1d87e Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 3 Sep 2024 11:43:40 +0200 Subject: [PATCH 303/344] PR suggestions --- packages/python/src/armonik/worker/worker.py | 53 +++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index 36ffe26a8..0d809f018 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -5,7 +5,7 @@ import traceback from concurrent import futures from logging import Logger -from typing import Callable, Union, Optional, Tuple +from typing import Callable, Union, Optional, Tuple, Iterable import grpc from grpc import Channel @@ -81,9 +81,6 @@ def HealthCheck(self, request: Empty, context) -> HealthCheckReply: return HealthCheckReply(status=self.health_check()) -_NOT_SET = object() - - class ArmoniKWorkerWrapper: def __init__( self, @@ -92,7 +89,7 @@ def __init__( logger: Optional[Logger] = None, worker_endpoint: Optional[str] = None, agent_endpoint: Optional[str] = None, - channel_options: Optional[Tuple[Tuple[str, str]]] = _NOT_SET, + channel_options: Optional[Iterable[Tuple[str, str]]] = None, ): if logger is None: ClefLogger.setup_logging(logging.INFO) @@ -117,7 +114,7 @@ def __init__( agent_endpoint = agent_scheme + os.getenv( "ComputePlane__AgentChannel__Address", "/cache/armonik_agent.sock" ) - if channel_options is _NOT_SET: + if channel_options is None: channel_options = (("grpc.default_authority", "localhost"),) self.logger = logger self.worker_endpoint = worker_endpoint @@ -125,25 +122,45 @@ def __init__( self.channel_options = channel_options self.processor = processor - def __call__(self, channel: Optional[Channel] = None): + def __call__(self, *args, **kwargs): + return self.processor(*args, **kwargs) + + def run( + self, + agent_channel: Optional[Channel] = None, + logger: Optional[Logger] = None, + worker_endpoint: Optional[str] = None, + ): + """ + Run the server + Args: + agent_channel: Agent channel + logger: Logger + worker_endpoint: Worker endpoint + + Returns: + None + """ + logger = self.logger if logger is None else logger + worker_endpoint = self.worker_endpoint if worker_endpoint is None else worker_endpoint # Start worker - self.logger.info("Worker Started") + logger.info("Worker Started") # Use options to fix Unix socket connection on localhost (cf: ) - if channel is None: + if agent_channel is None: channel_ = create_channel(self.agent_endpoint, options=self.channel_options).__enter__() else: - channel_ = channel + channel_ = agent_channel try: - worker = ArmoniKWorker(channel_, self.processor, logger=self.logger) - self.logger.info("Worker Connected") - worker.start(self.worker_endpoint) + worker = ArmoniKWorker(channel_, self.processor, logger=logger) + logger.info("Worker Connected") + worker.start(worker_endpoint) except Exception as e: - if channel is None: + if agent_channel is None: channel_.__exit__(type(e), e, e.__traceback__) channel_ = None raise finally: - if channel is None and channel_ is not None: + if agent_channel is None and channel_ is not None: channel_.__exit__(None, None, None) @@ -153,7 +170,7 @@ def armonik_worker( logger: Optional[Logger] = None, worker_endpoint: Optional[str] = None, agent_endpoint: Optional[str] = None, - channel_options: Tuple[Tuple[str, str]] = _NOT_SET, + channel_options: Optional[Iterable[Tuple[str, str]]] = None, ): """ Transforms the function into an ArmoniK Worker @@ -176,7 +193,7 @@ def armonik_worker( def decorator( processor: Callable[[TaskHandler], Output], - ) -> Optional[Callable[[Optional[Channel]], None]]: + ) -> ArmoniKWorkerWrapper: worker = ArmoniKWorkerWrapper( processor=processor, logger=logger, @@ -185,7 +202,7 @@ def decorator( channel_options=channel_options, ) if autorun: - worker() + worker.run() return worker return decorator From dd20869cb156ed2e98c672726ea5fee248eb493f Mon Sep 17 00:00:00 2001 From: Dylan Brasseur Date: Tue, 3 Sep 2024 12:34:00 +0200 Subject: [PATCH 304/344] Simplify context --- packages/python/src/armonik/worker/worker.py | 24 ++++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/packages/python/src/armonik/worker/worker.py b/packages/python/src/armonik/worker/worker.py index 0d809f018..5f0560624 100644 --- a/packages/python/src/armonik/worker/worker.py +++ b/packages/python/src/armonik/worker/worker.py @@ -4,6 +4,7 @@ import os import traceback from concurrent import futures +from contextlib import nullcontext from logging import Logger from typing import Callable, Union, Optional, Tuple, Iterable @@ -145,23 +146,16 @@ def run( worker_endpoint = self.worker_endpoint if worker_endpoint is None else worker_endpoint # Start worker logger.info("Worker Started") - # Use options to fix Unix socket connection on localhost (cf: ) - if agent_channel is None: - channel_ = create_channel(self.agent_endpoint, options=self.channel_options).__enter__() - else: - channel_ = agent_channel - try: - worker = ArmoniKWorker(channel_, self.processor, logger=logger) + agent_channel = ( + create_channel(self.agent_endpoint, options=self.channel_options) + if agent_channel is None + else nullcontext(agent_channel) + ) + + with agent_channel as channel: + worker = ArmoniKWorker(channel, self.processor, logger=logger) logger.info("Worker Connected") worker.start(worker_endpoint) - except Exception as e: - if agent_channel is None: - channel_.__exit__(type(e), e, e.__traceback__) - channel_ = None - raise - finally: - if agent_channel is None and channel_ is not None: - channel_.__exit__(None, None, None) def armonik_worker( From b4441dc48f218d2b1d66bf0bcc9497c77971a879 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Tue, 3 Sep 2024 17:01:04 +0200 Subject: [PATCH 305/344] chore: create version 3.20.0 --- package.json | 24 +- .../armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Tests.csproj | 4 +- .../ArmoniK.Api.Client.csproj | 4 +- .../ArmoniK.Api.Common.Channel.csproj | 4 +- .../ArmoniK.Api.Common.csproj | 4 +- .../ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 +- .../ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 +- .../ArmoniK.Api.Worker.Tests.csproj | 4 +- .../ArmoniK.Api.Worker.csproj | 4 +- packages/web/package.json | 2 +- pnpm-lock.yaml | 1877 +++++++++-------- 13 files changed, 982 insertions(+), 957 deletions(-) diff --git a/package.json b/package.json index 3f02901a4..dd2414cd7 100644 --- a/package.json +++ b/package.json @@ -10,19 +10,19 @@ "lint:fix": "eslint --fix ." }, "devDependencies": { - "@antfu/eslint-config": "^2.15.0", - "@typescript-eslint/eslint-plugin": "^7.7.0", + "@antfu/eslint-config": "^2.27.3", + "@typescript-eslint/eslint-plugin": "^7.18.0", "consola": "^3.2.3", - "eslint": "^9.0.0", + "eslint": "^9.9.1", "eslint-config-standard-with-typescript": "^43.0.1", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-n": "^17.2.1", - "eslint-plugin-promise": "^6.1.1", - "glob": "^10.3.3", - "jiti": "^1.19.3", - "pathe": "^1.1.1", - "tslib": "^2.6.2", - "typescript": "^5.2.2", - "zx": "^8.0.1" + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-n": "^17.10.2", + "eslint-plugin-promise": "^6.6.0", + "glob": "^10.4.5", + "jiti": "^1.21.6", + "pathe": "^1.1.2", + "tslib": "^2.7.0", + "typescript": "^5.5.4", + "zx": "^8.1.5" } } diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 69ca5e608..2ede19484 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.19.0", + "version": "3.20.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 3afd2550c..52916778d 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.19.0) +set(version 3.20.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index 02978a8a6..d58613bb3 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.19.0 - 3.19.0 + 3.20.0 + 3.20.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index 8694416de..eb5c71319 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.19.0 - 3.19.0 + 3.20.0 + 3.20.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index e4ceb467f..0f8ec4e5d 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.19.0 - 3.19.0 + 3.20.0 + 3.20.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index 62f5fb2ec..b1dbc3ac0 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.19.0 - 3.19.0 + 3.20.0 + 3.20.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index fbfd2f30f..bff023a18 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.19.0 - 3.19.0 + 3.20.0 + 3.20.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 53eec4677..2c651e6f5 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.19.0 - 3.19.0 + 3.20.0 + 3.20.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index 63cf58c90..f1ed44ede 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.19.0 - 3.19.0 + 3.20.0 + 3.20.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index 960ed6f7c..a5d471a04 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.19.0 - 3.19.0 + 3.20.0 + 3.20.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index a82a54414..a903e97ec 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.19.0", + "version": "3.20.0", "packageManager": "pnpm@9.1.4", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14fb302f7..a623af03c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,63 +9,60 @@ importers: .: devDependencies: '@antfu/eslint-config': - specifier: ^2.15.0 - version: 2.15.0(@vue/compiler-sfc@3.4.23)(eslint@9.0.0)(typescript@5.2.2) + specifier: ^2.27.3 + version: 2.27.3(@typescript-eslint/utils@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(@vue/compiler-sfc@3.4.23)(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) '@typescript-eslint/eslint-plugin': - specifier: ^7.7.0 - version: 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) + specifier: ^7.18.0 + version: 7.18.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) consola: specifier: ^3.2.3 version: 3.2.3 eslint: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^9.9.1 + version: 9.9.1(jiti@1.21.6) eslint-config-standard-with-typescript: specifier: ^43.0.1 - version: 43.0.1(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0)(typescript@5.2.2) + version: 43.0.1(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)))(eslint-plugin-n@17.10.2(eslint@9.9.1(jiti@1.21.6)))(eslint-plugin-promise@6.6.0(eslint@9.9.1(jiti@1.21.6)))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) eslint-plugin-import: - specifier: ^2.28.1 - version: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) + specifier: ^2.30.0 + version: 2.30.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)) eslint-plugin-n: - specifier: ^17.2.1 - version: 17.2.1(eslint@9.0.0) + specifier: ^17.10.2 + version: 17.10.2(eslint@9.9.1(jiti@1.21.6)) eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.1.1(eslint@9.0.0) + specifier: ^6.6.0 + version: 6.6.0(eslint@9.9.1(jiti@1.21.6)) glob: - specifier: ^10.3.3 - version: 10.3.3 + specifier: ^10.4.5 + version: 10.4.5 jiti: - specifier: ^1.19.3 - version: 1.19.3 + specifier: ^1.21.6 + version: 1.21.6 pathe: - specifier: ^1.1.1 - version: 1.1.1 + specifier: ^1.1.2 + version: 1.1.2 tslib: - specifier: ^2.6.2 - version: 2.6.2 + specifier: ^2.7.0 + version: 2.7.0 typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: ^5.5.4 + version: 5.5.4 zx: - specifier: ^8.0.1 - version: 8.0.1 + specifier: ^8.1.5 + version: 8.1.5 packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@antfu/eslint-config@2.15.0': - resolution: {integrity: sha512-qoqw+0N8bqz0vBIigGJamaIf1LdzXcmCDuleygJAF3EtACLieKyIMvpOdc2TU9AnuPbMBFCkN40340UWRChELw==} + '@antfu/eslint-config@2.27.3': + resolution: {integrity: sha512-Y2Vh/LvPAaYoyLwCiZHJ7p76LEIGg6debeUA4Qs+KOrlGuXLQWRmdZlC6SB33UDNzXqkFeaXAlEcYUqvYoiMKA==} hasBin: true peerDependencies: '@eslint-react/eslint-plugin': ^1.5.8 + '@prettier/plugin-xml': ^3.4.1 '@unocss/eslint-plugin': '>=0.50.0' - astro-eslint-parser: ^0.16.3 + astro-eslint-parser: ^1.0.2 eslint: '>=8.40.0' - eslint-plugin-astro: ^0.31.4 + eslint-plugin-astro: ^1.2.0 eslint-plugin-format: '>=0.1.0' eslint-plugin-react-hooks: ^4.6.0 eslint-plugin-react-refresh: ^0.4.4 @@ -73,10 +70,12 @@ packages: eslint-plugin-svelte: '>=2.35.1' prettier-plugin-astro: ^0.13.0 prettier-plugin-slidev: ^1.0.5 - svelte-eslint-parser: ^0.33.1 + svelte-eslint-parser: '>=0.37.0' peerDependenciesMeta: '@eslint-react/eslint-plugin': optional: true + '@prettier/plugin-xml': + optional: true '@unocss/eslint-plugin': optional: true astro-eslint-parser: @@ -100,32 +99,35 @@ packages: svelte-eslint-parser: optional: true - '@antfu/install-pkg@0.3.2': - resolution: {integrity: sha512-FFYqME8+UHlPnRlX/vn+8cTD4Wo/nG/lzRxpABs3XANBmdJdNImVz3QvjNAE/W3PSCNbG387FOz8o5WelnWOlg==} + '@antfu/install-pkg@0.4.1': + resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} - '@babel/code-frame@7.22.10': - resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.22.10': - resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.4': - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.24.0': - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} '@clack/core@0.3.4': @@ -136,49 +138,60 @@ packages: bundledDependencies: - is-unicode-supported - '@es-joy/jsdoccomment@0.42.0': - resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} + '@es-joy/jsdoccomment@0.43.1': + resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==} + engines: {node: '>=16'} + + '@es-joy/jsdoccomment@0.48.0': + resolution: {integrity: sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==} engines: {node: '>=16'} + '@eslint-community/eslint-plugin-eslint-comments@4.4.0': + resolution: {integrity: sha512-yljsWl5Qv3IkIRmJ38h3NrHXFCm4EUl55M8doGTF6hvzvFF8kRpextgSrg2dwHev9lzBZyafCr9RelGIyQm6fw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.0.2': - resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.0.0': - resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} + '@eslint/js@9.9.1': + resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@humanwhocodes/config-array@0.12.3': - resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} - engines: {node: '>=10.10.0'} + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -196,37 +209,24 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@stylistic/eslint-plugin-js@1.7.2': - resolution: {integrity: sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@stylistic/eslint-plugin-jsx@1.7.2': - resolution: {integrity: sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@stylistic/eslint-plugin-plus@1.7.2': - resolution: {integrity: sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==} - peerDependencies: - eslint: '*' - - '@stylistic/eslint-plugin-ts@1.7.2': - resolution: {integrity: sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@stylistic/eslint-plugin@2.7.2': + resolution: {integrity: sha512-3DVLU5HEuk2pQoBmXJlzvrxbKNpu2mJ0SRqz5O/CJjyNCr12ZiPcYMEtuArTyPOk5i7bsAU44nywh1rGfe3gKQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' - '@stylistic/eslint-plugin@1.7.2': - resolution: {integrity: sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' + '@types/eslint@8.56.12': + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} - '@types/eslint@8.56.9': - resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -240,26 +240,23 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonfile@6.1.1': - resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} - - '@types/mdast@3.0.12': - resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - '@types/node@20.12.7': - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@types/normalize-package-data@2.4.1': - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + '@types/node@22.5.2': + resolution: {integrity: sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/unist@2.0.7': - resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@typescript-eslint/eslint-plugin@7.7.0': - resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -269,6 +266,17 @@ packages: typescript: optional: true + '@typescript-eslint/eslint-plugin@8.4.0': + resolution: {integrity: sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/parser@6.21.0': resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -279,11 +287,11 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.7.0': - resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.4.0': + resolution: {integrity: sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -293,12 +301,16 @@ packages: resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/scope-manager@7.7.0': - resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.7.0': - resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} + '@typescript-eslint/scope-manager@8.4.0': + resolution: {integrity: sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -307,14 +319,27 @@ packages: typescript: optional: true + '@typescript-eslint/type-utils@8.4.0': + resolution: {integrity: sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/types@6.21.0': resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/types@7.7.0': - resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.4.0': + resolution: {integrity: sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@6.21.0': resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -324,8 +349,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.7.0': - resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -333,26 +358,54 @@ packages: typescript: optional: true - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/typescript-estree@8.4.0': + resolution: {integrity: sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@typescript-eslint/utils@7.7.0': - resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 + '@typescript-eslint/utils@8.4.0': + resolution: {integrity: sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/visitor-keys@6.21.0': resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/visitor-keys@7.7.0': - resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.4.0': + resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitest/eslint-plugin@1.1.0': + resolution: {integrity: sha512-Ur80Y27Wbw8gFHJ3cv6vypcjXmrx6QHfw+q435h6Q2L+tf+h4Xf5pJTCL4YU/Jps9EVeggQxS85OcUZU7sdXRw==} + peerDependencies: + '@typescript-eslint/utils': '>= 8.0' + eslint: '>= 8.57.0' + typescript: '>= 5.0.0' + vitest: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + typescript: + optional: true + vitest: + optional: true + '@vue/compiler-core@3.4.23': resolution: {integrity: sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==} @@ -373,8 +426,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true @@ -452,12 +505,12 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -473,8 +526,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001611: - resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} + caniuse-lite@1.0.30001655: + resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -532,8 +585,8 @@ packages: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} - core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + core-js-compat@3.38.1: + resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -564,8 +617,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -599,8 +652,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.741: - resolution: {integrity: sha512-AyTBZqDoS7/mvQK22gOQpjxbeV8iPeUBTvYlEh/1S9dKAHgQdxuF49g9rLbj0cRKtqH8PzLJzqT3nAdl+qoZTA==} + electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -608,8 +661,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -631,6 +684,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -646,8 +702,8 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -658,14 +714,14 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-compat-utils@0.5.0: - resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' - eslint-config-flat-gitignore@0.1.5: - resolution: {integrity: sha512-hEZLwuZjDBGDERA49c2q7vxc8sCGv8EdBp6PQYzGOMcHIgrfG9YOM6s/4jx24zhD+wnK9AI8mgN5RxSss5nClQ==} + eslint-config-flat-gitignore@0.1.8: + resolution: {integrity: sha512-OEUbS2wzzYtUfshjOqzFo4Bl4lHykXUdM08TCnYNl7ki+niW4Q1R0j0FDFDr0vjVsI5ZFOz5LvluxOP+Ew+dYw==} eslint-config-standard-with-typescript@43.0.1: resolution: {integrity: sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==} @@ -687,8 +743,8 @@ packages: eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 - eslint-flat-config-utils@0.2.3: - resolution: {integrity: sha512-tfrMNXZfuN4q7sFi1Cr//BN3qdI7c8fLJhbshlp8l9PZIqZ7eVeeyd2Regtu/P9kjOlv18lRlBALzsZaF7ByUg==} + eslint-flat-config-utils@0.3.1: + resolution: {integrity: sha512-eFT3EaoJN1hlN97xw4FIEX//h0TiFUobgl2l5uLkIwhVN9ahGq95Pbs+i1/B5UACA78LO3rco3JzuvxLdTUOPA==} eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -698,8 +754,8 @@ packages: peerDependencies: eslint: '*' - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + eslint-module-utils@2.9.0: + resolution: {integrity: sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -719,31 +775,30 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-antfu@2.1.2: - resolution: {integrity: sha512-s7ZTOM3uq0iqpp6gF0UEotnvup7f2PHBUftCytLZX0+6C9j9KadKZQh6bVVngAyFgsmeD9+gcBopOYLClb2oDg==} + eslint-plugin-antfu@2.3.6: + resolution: {integrity: sha512-31VwbU1Yd4BFNUUPQEazKyP79f3c+ohJtq5iZIuw38JjkRQdQAcF/31Kjr0DOKZXVDkeeNPrttKidrr3xhnhOA==} peerDependencies: eslint: '*' - eslint-plugin-es-x@7.6.0: - resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} - engines: {node: ^14.18.0 || >=16.0.0} + eslint-plugin-command@0.2.3: + resolution: {integrity: sha512-1bBYNfjZg60N2ZpLV5ATYSYyueIJ+zl5yKrTs0UFDdnyu07dNSZ7Xplnc+Wb6SXTdc1sIaoIrnuyhvztcltX6A==} peerDependencies: - eslint: '>=8' + eslint: '*' - eslint-plugin-eslint-comments@3.2.0: - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=4.19.1' + eslint: '>=8' - eslint-plugin-import-x@0.5.0: - resolution: {integrity: sha512-C7R8Z4IzxmsoOPMtSzwuOBW5FH6iRlxHR6iTks+MzVlrk3r3TUxokkWTx3ypdj9nGOEP+CG/5e6ebZzHbxgbbQ==} - engines: {node: '>=16'} + eslint-plugin-import-x@4.1.1: + resolution: {integrity: sha512-dBEM8fACIFNt4H7GoOaRmnH6evJW6JSTJTYYgmRd3vI4geBTjgDM/JyUDKUwIw0HDSyI+u7Vs3vFRXUo/BOAtA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 || ^9.0.0-0 + eslint: ^8.57.0 || ^9.0.0 - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.30.0: + resolution: {integrity: sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -752,41 +807,42 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsdoc@48.2.3: - resolution: {integrity: sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==} + eslint-plugin-jsdoc@50.2.2: + resolution: {integrity: sha512-i0ZMWA199DG7sjxlzXn5AeYZxpRfMJjDPUl7lL9eJJX8TPRoIaxJU4ys/joP5faM5AXE1eqW/dslCj3uj4Nqpg==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-jsonc@2.15.1: - resolution: {integrity: sha512-PVFrqIJa8BbM/e828RSn0SwB/Z5ye+2LDuy2XqG6AymNgPsfApRRcznsbxP7VrjdLEU4Nb+g9n/d6opyp0jp9A==} + eslint-plugin-jsonc@2.16.0: + resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' - eslint-plugin-markdown@4.0.1: - resolution: {integrity: sha512-5/MnGvYU0i8MbHH5cg8S+Vl3DL+bqRNYshk1xUO86DilNBaxtTkhH+5FD0/yO03AmlI6+lfNFdk2yOw72EPzpA==} + eslint-plugin-markdown@5.1.0: + resolution: {integrity: sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8' - eslint-plugin-n@17.2.1: - resolution: {integrity: sha512-uW1+df2bo06kR7ix6nB614RUlvjRPrYxlaX832O6e1MCJp4V7YozEdvMgCYuvn4ltnjPu1FVYhQ2KRrmTNoJfg==} + eslint-plugin-n@17.10.2: + resolution: {integrity: sha512-e+s4eAf5NtJaxPhTNu3qMO0Iz40WANS93w9LQgYcvuljgvDmWi/a3rh+OrNyMHeng6aOWGJO0rCg5lH4zi8yTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' - eslint-plugin-no-only-tests@3.1.0: - resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + eslint-plugin-no-only-tests@3.3.0: + resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} engines: {node: '>=5.0.0'} - eslint-plugin-perfectionist@2.9.0: - resolution: {integrity: sha512-ipFtDrqtF99qVVo+FE1fo6aHyLLp7hg6PNGfzY5KxQjcl0XCbyEFvjtR1NfkHDTN9rdFeEDxg59LLOv3VOAHAw==} + eslint-plugin-perfectionist@3.3.0: + resolution: {integrity: sha512-sGgShkEqDBqIZ3WlenGHwLe1cl3vHKTfeh9b1XXAamaxSC7AY4Os0jdNCXnGJW4l0TlpismT5t2r7CXY7sfKlw==} + engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - astro-eslint-parser: ^0.16.0 + astro-eslint-parser: ^1.0.2 eslint: '>=8.0.0' svelte: '>=3.0.0' - svelte-eslint-parser: ^0.33.0 + svelte-eslint-parser: ^0.41.0 vue-eslint-parser: '>=9.0.0' peerDependenciesMeta: astro-eslint-parser: @@ -798,49 +854,41 @@ packages: vue-eslint-parser: optional: true - eslint-plugin-promise@6.1.1: - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + eslint-plugin-promise@6.6.0: + resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-regexp@2.6.0: + resolution: {integrity: sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==} + engines: {node: ^18 || >=20} + peerDependencies: + eslint: '>=8.44.0' - eslint-plugin-toml@0.11.0: - resolution: {integrity: sha512-sau+YvPU4fWTjB+qtBt3n8WS87aoDCs+BVbSUAemGaIsRNbvR9uEk+Tt892iLHTGvp/DPWYoCX4/8DoyAbB+sQ==} + eslint-plugin-toml@0.11.1: + resolution: {integrity: sha512-Y1WuMSzfZpeMIrmlP1nUh3kT8p96mThIq4NnHrYUhg10IKQgGfBZjAWnrg9fBqguiX4iFps/x/3Hb5TxBisfdw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' - eslint-plugin-unicorn@52.0.0: - resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} - engines: {node: '>=16'} + eslint-plugin-unicorn@55.0.0: + resolution: {integrity: sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==} + engines: {node: '>=18.18'} peerDependencies: eslint: '>=8.56.0' - eslint-plugin-unused-imports@3.1.0: - resolution: {integrity: sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': 6 - 7 - eslint: '8' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - - eslint-plugin-vitest@0.5.3: - resolution: {integrity: sha512-D0iu6ppP6FmNSZP4cdhEXqyI+fuW6JwwWdECRrNymd1jiVgUmDgSvtryytonNxHQQWhGNmZM3V/qvpXttH1rRQ==} - engines: {node: ^18.0.0 || >= 20.0.0} + eslint-plugin-unused-imports@4.1.3: + resolution: {integrity: sha512-lqrNZIZjFMUr7P06eoKtQLwyVRibvG7N+LtfKtObYGizAAGrcqLkc3tDx+iAik2z7q0j/XI3ihjupIqxhFabFA==} peerDependencies: - '@typescript-eslint/eslint-plugin': '*' - eslint: ^8.57.0 || ^9.0.0 - vitest: '*' + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true - vitest: - optional: true - eslint-plugin-vue@9.25.0: - resolution: {integrity: sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==} + eslint-plugin-vue@9.28.0: + resolution: {integrity: sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -857,16 +905,12 @@ packages: '@vue/compiler-sfc': ^3.3.0 eslint: ^8.50.0 || ^9.0.0 - eslint-rule-composer@0.3.0: - resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} - engines: {node: '>=4.0.0'} - eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -877,21 +921,26 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.0.0: - resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} + eslint@9.9.1: + resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@10.0.1: - resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -909,10 +958,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -926,17 +971,21 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -945,10 +994,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -959,13 +1004,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -984,16 +1026,12 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.8.0: + resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1003,9 +1041,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.3: - resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} - engines: {node: '>=16 || 14 >=14.17'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true globals@13.24.0: @@ -1016,12 +1053,12 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.0.0: - resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} + globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} engines: {node: '>=18'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: @@ -1063,10 +1100,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1074,12 +1107,8 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -1126,11 +1155,9 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} @@ -1182,10 +1209,6 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -1207,12 +1230,11 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@2.3.0: - resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@1.19.3: - resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true js-tokens@4.0.0: @@ -1226,6 +1248,10 @@ packages: resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} engines: {node: '>=12.0.0'} + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -1277,26 +1303,17 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} mdast-util-from-markdown@0.8.5: resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} @@ -1304,9 +1321,6 @@ packages: mdast-util-to-string@2.0.0: resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1314,18 +1328,18 @@ packages: micromark@2.11.4: resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1333,19 +1347,19 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.0.3: - resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -1364,21 +1378,18 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -1400,12 +1411,8 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} p-limit@2.3.0: @@ -1416,10 +1423,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -1428,14 +1431,16 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + package-manager-detector@0.2.0: + resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1447,6 +1452,10 @@ packages: resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} engines: {node: '>=14'} + parse-imports@2.1.1: + resolution: {integrity: sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==} + engines: {node: '>= 18'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -1455,37 +1464,26 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1495,8 +1493,8 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pkg-types@1.1.0: - resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} + pkg-types@1.2.0: + resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} @@ -1506,20 +1504,20 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.4.44: + resolution: {integrity: sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} queue-microtask@1.2.3: @@ -1533,6 +1531,14 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} + refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -1556,8 +1562,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true reusify@1.0.4: @@ -1575,6 +1581,10 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -1583,8 +1593,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -1619,6 +1629,9 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slashes@3.0.12: + resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -1626,8 +1639,8 @@ packages: spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} @@ -1635,8 +1648,11 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -1669,10 +1685,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -1697,6 +1709,10 @@ packages: resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} engines: {node: '>=12.20'} + synckit@0.9.1: + resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + engines: {node: ^14.18.0 || >=16.0.0} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -1704,6 +1720,9 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -1712,8 +1731,8 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toml-eslint-parser@0.9.3: - resolution: {integrity: sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==} + toml-eslint-parser@0.10.0: + resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ts-api-utils@1.3.0: @@ -1725,8 +1744,8 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -1760,29 +1779,25 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -1796,8 +1811,8 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vue-eslint-parser@9.4.2: - resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==} + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' @@ -1814,6 +1829,10 @@ packages: engines: {node: '>= 8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1830,16 +1849,14 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml-eslint-parser@1.2.2: - resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} + yaml-eslint-parser@1.2.3: + resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==} engines: {node: ^14.17.0 || >=16.0.0} - yaml@2.2.2: - resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} engines: {node: '>= 14'} + hasBin: true yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} @@ -1853,136 +1870,146 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - - zx@8.0.1: - resolution: {integrity: sha512-Y+ITW1GQjADk7qgrbhnukMgoNsJmlyx53cUQ6/6NXU+BMBdCbTc6flTOHUctmzKvPjTmdwaddzJY/dbLie9sQg==} - engines: {node: '>= 16.0.0'} + zx@8.1.5: + resolution: {integrity: sha512-gvmiYPvDDEz2Gcc37x7pJkipTKcFIE18q9QlSI1p5qoPDtoSn3jmGuWD0eEb7HuxEH5aDD7N/RVgH8BqSxbKzA==} + engines: {node: '>= 12.17.0'} hasBin: true snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@antfu/eslint-config@2.15.0(@vue/compiler-sfc@3.4.23)(eslint@9.0.0)(typescript@5.2.2)': + '@antfu/eslint-config@2.27.3(@typescript-eslint/utils@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(@vue/compiler-sfc@3.4.23)(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@antfu/install-pkg': 0.3.2 + '@antfu/install-pkg': 0.4.1 '@clack/prompts': 0.7.0 - '@stylistic/eslint-plugin': 1.7.2(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - eslint-config-flat-gitignore: 0.1.5 - eslint-flat-config-utils: 0.2.3 - eslint-merge-processors: 0.1.0(eslint@9.0.0) - eslint-plugin-antfu: 2.1.2(eslint@9.0.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@9.0.0) - eslint-plugin-import-x: 0.5.0(eslint@9.0.0)(typescript@5.2.2) - eslint-plugin-jsdoc: 48.2.3(eslint@9.0.0) - eslint-plugin-jsonc: 2.15.1(eslint@9.0.0) - eslint-plugin-markdown: 4.0.1(eslint@9.0.0) - eslint-plugin-n: 17.2.1(eslint@9.0.0) - eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-perfectionist: 2.9.0(eslint@9.0.0)(typescript@5.2.2)(vue-eslint-parser@9.4.2(eslint@9.0.0)) - eslint-plugin-toml: 0.11.0(eslint@9.0.0) - eslint-plugin-unicorn: 52.0.0(eslint@9.0.0) - eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) - eslint-plugin-vitest: 0.5.3(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - eslint-plugin-vue: 9.25.0(eslint@9.0.0) - eslint-plugin-yml: 1.14.0(eslint@9.0.0) - eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.0.0) - globals: 15.0.0 + '@eslint-community/eslint-plugin-eslint-comments': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + '@stylistic/eslint-plugin': 2.7.2(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/parser': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@vitest/eslint-plugin': 1.1.0(@typescript-eslint/utils@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + eslint-config-flat-gitignore: 0.1.8 + eslint-flat-config-utils: 0.3.1 + eslint-merge-processors: 0.1.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-antfu: 2.3.6(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-command: 0.2.3(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-import-x: 4.1.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-jsdoc: 50.2.2(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-jsonc: 2.16.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-markdown: 5.1.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-n: 17.10.2(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-no-only-tests: 3.3.0 + eslint-plugin-perfectionist: 3.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)(vue-eslint-parser@9.4.3(eslint@9.9.1(jiti@1.21.6))) + eslint-plugin-regexp: 2.6.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-toml: 0.11.1(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-unicorn: 55.0.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-unused-imports: 4.1.3(@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-vue: 9.28.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-yml: 1.14.0(eslint@9.9.1(jiti@1.21.6)) + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.9.1(jiti@1.21.6)) + globals: 15.9.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.0 parse-gitignore: 2.0.0 - picocolors: 1.0.0 - toml-eslint-parser: 0.9.3 - vue-eslint-parser: 9.4.2(eslint@9.0.0) - yaml-eslint-parser: 1.2.2 + picocolors: 1.1.0 + toml-eslint-parser: 0.10.0 + vue-eslint-parser: 9.4.3(eslint@9.9.1(jiti@1.21.6)) + yaml-eslint-parser: 1.2.3 yargs: 17.7.2 transitivePeerDependencies: + - '@typescript-eslint/utils' - '@vue/compiler-sfc' - supports-color - svelte - typescript - vitest - '@antfu/install-pkg@0.3.2': + '@antfu/install-pkg@0.4.1': dependencies: - execa: 8.0.1 + package-manager-detector: 0.2.0 + tinyexec: 0.3.0 + + '@antfu/utils@0.7.10': {} - '@babel/code-frame@7.22.10': + '@babel/code-frame@7.24.7': dependencies: - '@babel/highlight': 7.22.10 - chalk: 2.4.2 + '@babel/highlight': 7.24.7 + picocolors: 1.1.0 - '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-string-parser@7.24.8': {} - '@babel/helper-validator-identifier@7.22.20': {} + '@babel/helper-validator-identifier@7.24.7': {} - '@babel/highlight@7.22.10': + '@babel/highlight@7.24.7': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.1.0 - '@babel/parser@7.24.4': + '@babel/parser@7.25.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.25.6 - '@babel/types@7.24.0': + '@babel/types@7.25.6': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@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 '@clack/core@0.3.4': dependencies: - picocolors: 1.0.0 + picocolors: 1.1.0 sisteransi: 1.0.5 '@clack/prompts@0.7.0': dependencies: '@clack/core': 0.3.4 - picocolors: 1.0.0 + picocolors: 1.1.0 sisteransi: 1.0.5 - '@es-joy/jsdoccomment@0.42.0': + '@es-joy/jsdoccomment@0.43.1': dependencies: + '@types/eslint': 8.56.12 + '@types/estree': 1.0.5 + '@typescript-eslint/types': 7.18.0 comment-parser: 1.4.1 - esquery: 1.5.0 + esquery: 1.6.0 jsdoc-type-pratt-parser: 4.0.0 - '@eslint-community/eslint-utils@4.4.0(eslint@9.0.0)': + '@es-joy/jsdoccomment@0.48.0': + dependencies: + comment-parser: 1.4.1 + esquery: 1.6.0 + jsdoc-type-pratt-parser: 4.1.0 + + '@eslint-community/eslint-plugin-eslint-comments@4.4.0(eslint@9.9.1(jiti@1.21.6))': + dependencies: + escape-string-regexp: 4.0.0 + eslint: 9.9.1(jiti@1.21.6) + ignore: 5.3.2 + + '@eslint-community/eslint-utils@4.4.0(eslint@9.9.1(jiti@1.21.6))': dependencies: - eslint: 9.0.0 + eslint: 9.9.1(jiti@1.21.6) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.11.0': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.18.0': dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 + '@eslint/object-schema': 2.1.4 + debug: 4.3.6 minimatch: 3.1.2 - strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.0.2': + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.4 - espree: 10.0.1 + debug: 4.3.6 + espree: 10.1.0 globals: 14.0.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -1990,19 +2017,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.0.0': {} + '@eslint/js@9.9.1': {} - '@humanwhocodes/config-array@0.12.3': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@eslint/object-schema@2.1.4': {} '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.0': {} '@isaacs/cliui@8.0.2': dependencies: @@ -2013,7 +2034,7 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2025,60 +2046,34 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.17.1 '@pkgjs/parseargs@0.11.0': optional: true - '@stylistic/eslint-plugin-js@1.7.2(eslint@9.0.0)': - dependencies: - '@types/eslint': 8.56.9 - acorn: 8.11.3 - escape-string-regexp: 4.0.0 - eslint: 9.0.0 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + '@pkgr/core@0.1.1': {} + + '@rtsao/scc@1.1.0': {} - '@stylistic/eslint-plugin-jsx@1.7.2(eslint@9.0.0)': + '@stylistic/eslint-plugin@2.7.2(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) - '@types/eslint': 8.56.9 - eslint: 9.0.0 + '@types/eslint': 9.6.1 + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 estraverse: 5.3.0 picomatch: 4.0.2 - - '@stylistic/eslint-plugin-plus@1.7.2(eslint@9.0.0)(typescript@5.2.2)': - dependencies: - '@types/eslint': 8.56.9 - '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 transitivePeerDependencies: - supports-color - typescript - '@stylistic/eslint-plugin-ts@1.7.2(eslint@9.0.0)(typescript@5.2.2)': + '@types/eslint@8.56.12': dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) - '@types/eslint': 8.56.9 - '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@stylistic/eslint-plugin@1.7.2(eslint@9.0.0)(typescript@5.2.2)': - dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) - '@stylistic/eslint-plugin-jsx': 1.7.2(eslint@9.0.0) - '@stylistic/eslint-plugin-plus': 1.7.2(eslint@9.0.0)(typescript@5.2.2) - '@stylistic/eslint-plugin-ts': 1.7.2(eslint@9.0.0)(typescript@5.2.2) - '@types/eslint': 8.56.9 - eslint: 9.0.0 - transitivePeerDependencies: - - supports-color - - typescript + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 - '@types/eslint@8.56.9': + '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -2087,77 +2082,91 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: - '@types/jsonfile': 6.1.1 - '@types/node': 20.12.7 + '@types/jsonfile': 6.1.4 + '@types/node': 22.5.2 optional: true '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/jsonfile@6.1.1': + '@types/jsonfile@6.1.4': dependencies: - '@types/node': 20.12.7 + '@types/node': 22.5.2 optional: true - '@types/mdast@3.0.12': + '@types/mdast@3.0.15': dependencies: - '@types/unist': 2.0.7 + '@types/unist': 2.0.11 - '@types/node@20.12.7': + '@types/node@22.5.2': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 optional: true - '@types/normalize-package-data@2.4.1': {} + '@types/normalize-package-data@2.4.4': {} - '@types/semver@7.5.8': {} + '@types/unist@2.0.11': {} - '@types/unist@2.0.7': {} + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 9.9.1(jiti@1.21.6) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/type-utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4 - eslint: 9.0.0 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/type-utils': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.4.0 + eslint: 9.9.1(jiti@1.21.6) graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.2.2) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/parser@6.21.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 - eslint: 9.0.0 + debug: 4.3.6 + eslint: 9.9.1(jiti@1.21.6) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4 - eslint: 9.0.0 + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.4.0 + debug: 4.3.6 + eslint: 9.9.1(jiti@1.21.6) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -2166,81 +2175,109 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/scope-manager@7.7.0': + '@typescript-eslint/scope-manager@7.18.0': dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/scope-manager@8.4.0': dependencies: - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 9.0.0 - ts-api-utils: 1.3.0(typescript@5.2.2) + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/visitor-keys': 8.4.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + debug: 4.3.6 + eslint: 9.9.1(jiti@1.21.6) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + debug: 4.3.6 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - eslint + - supports-color + '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/types@7.7.0': {} + '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.2.2)': + '@typescript-eslint/types@8.4.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.2.2) + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.7.0(typescript@5.2.2)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.2.2) + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/typescript-estree@8.4.0(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) - eslint: 9.0.0 - semver: 7.6.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/visitor-keys': 8.4.0 + debug: 4.3.6 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.7.0(eslint@9.0.0)(typescript@5.2.2)': + '@typescript-eslint/utils@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.2.2) - eslint: 9.0.0 - semver: 7.6.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript @@ -2250,14 +2287,26 @@ snapshots: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.7.0': + '@typescript-eslint/visitor-keys@7.18.0': dependencies: - '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.4.0': + dependencies: + '@typescript-eslint/types': 8.4.0 + eslint-visitor-keys: 3.4.3 + + '@vitest/eslint-plugin@1.1.0(@typescript-eslint/utils@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + eslint: 9.9.1(jiti@1.21.6) + optionalDependencies: + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + typescript: 5.5.4 + '@vue/compiler-core@3.4.23': dependencies: - '@babel/parser': 7.24.4 + '@babel/parser': 7.25.6 '@vue/shared': 3.4.23 entities: 4.5.0 estree-walker: 2.0.2 @@ -2270,14 +2319,14 @@ snapshots: '@vue/compiler-sfc@3.4.23': dependencies: - '@babel/parser': 7.24.4 + '@babel/parser': 7.25.6 '@vue/compiler-core': 3.4.23 '@vue/compiler-dom': 3.4.23 '@vue/compiler-ssr': 3.4.23 '@vue/shared': 3.4.23 estree-walker: 2.0.2 - magic-string: 0.30.10 - postcss: 8.4.38 + magic-string: 0.30.11 + postcss: 8.4.44 source-map-js: 1.2.0 '@vue/compiler-ssr@3.4.23': @@ -2287,11 +2336,11 @@ snapshots: '@vue/shared@3.4.23': {} - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 - acorn@8.11.3: {} + acorn@8.12.1: {} ajv@6.12.6: dependencies: @@ -2385,16 +2434,16 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 - browserslist@4.23.0: + browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001611 - electron-to-chromium: 1.4.741 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + caniuse-lite: 1.0.30001655 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) builtin-modules@3.3.0: {} @@ -2408,7 +2457,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001611: {} + caniuse-lite@1.0.30001655: {} chalk@2.4.2: dependencies: @@ -2459,9 +2508,9 @@ snapshots: consola@3.2.3: {} - core-js-compat@3.37.0: + core-js-compat@3.38.1: dependencies: - browserslist: 4.23.0 + browserslist: 4.23.3 cross-spawn@7.0.3: dependencies: @@ -2493,7 +2542,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4: + debug@4.3.6: dependencies: ms: 2.1.2 @@ -2525,13 +2574,13 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.741: {} + electron-to-chromium@1.5.13: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - enhanced-resolve@5.16.0: + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -2559,7 +2608,7 @@ snapshots: function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.3 + globalthis: 1.0.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 @@ -2575,7 +2624,7 @@ snapshots: is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.13.1 + object-inspect: 1.13.2 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 @@ -2597,6 +2646,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.5.4: {} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -2617,114 +2668,118 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - escalade@3.1.2: {} + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.0(eslint@9.0.0): + eslint-compat-utils@0.5.1(eslint@9.9.1(jiti@1.21.6)): dependencies: - eslint: 9.0.0 - semver: 7.6.0 + eslint: 9.9.1(jiti@1.21.6) + semver: 7.6.3 - eslint-config-flat-gitignore@0.1.5: + eslint-config-flat-gitignore@0.1.8: dependencies: - find-up: 7.0.0 + find-up-simple: 1.0.0 parse-gitignore: 2.0.0 - eslint-config-standard-with-typescript@43.0.1(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0)(typescript@5.2.2): + eslint-config-standard-with-typescript@43.0.1(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)))(eslint-plugin-n@17.10.2(eslint@9.9.1(jiti@1.21.6)))(eslint-plugin-promise@6.6.0(eslint@9.9.1(jiti@1.21.6)))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.21.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) - eslint-plugin-n: 17.2.1(eslint@9.0.0) - eslint-plugin-promise: 6.1.1(eslint@9.0.0) - typescript: 5.2.2 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/parser': 6.21.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + eslint-config-standard: 17.1.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)))(eslint-plugin-n@17.10.2(eslint@9.9.1(jiti@1.21.6)))(eslint-plugin-promise@6.6.0(eslint@9.9.1(jiti@1.21.6)))(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-n: 17.10.2(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-promise: 6.6.0(eslint@9.9.1(jiti@1.21.6)) + typescript: 5.5.4 transitivePeerDependencies: - supports-color - eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0))(eslint-plugin-n@17.2.1(eslint@9.0.0))(eslint-plugin-promise@6.1.1(eslint@9.0.0))(eslint@9.0.0): + eslint-config-standard@17.1.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)))(eslint-plugin-n@17.10.2(eslint@9.9.1(jiti@1.21.6)))(eslint-plugin-promise@6.6.0(eslint@9.9.1(jiti@1.21.6)))(eslint@9.9.1(jiti@1.21.6)): dependencies: - eslint: 9.0.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0) - eslint-plugin-n: 17.2.1(eslint@9.0.0) - eslint-plugin-promise: 6.1.1(eslint@9.0.0) + eslint: 9.9.1(jiti@1.21.6) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-n: 17.10.2(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-promise: 6.6.0(eslint@9.9.1(jiti@1.21.6)) - eslint-flat-config-utils@0.2.3: + eslint-flat-config-utils@0.3.1: dependencies: - '@types/eslint': 8.56.9 + '@types/eslint': 9.6.1 pathe: 1.1.2 eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.4 + is-core-module: 2.15.1 + resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-merge-processors@0.1.0(eslint@9.0.0): + eslint-merge-processors@0.1.0(eslint@9.9.1(jiti@1.21.6)): dependencies: - eslint: 9.0.0 + eslint: 9.9.1(jiti@1.21.6) - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@9.0.0): + eslint-module-utils@2.9.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.9.1(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 + '@typescript-eslint/parser': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-antfu@2.1.2(eslint@9.0.0): + eslint-plugin-antfu@2.3.6(eslint@9.9.1(jiti@1.21.6)): dependencies: - eslint: 9.0.0 + '@antfu/utils': 0.7.10 + eslint: 9.9.1(jiti@1.21.6) - eslint-plugin-es-x@7.6.0(eslint@9.0.0): + eslint-plugin-command@0.2.3(eslint@9.9.1(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@eslint-community/regexpp': 4.10.0 - eslint: 9.0.0 - eslint-compat-utils: 0.5.0(eslint@9.0.0) + '@es-joy/jsdoccomment': 0.43.1 + eslint: 9.9.1(jiti@1.21.6) - eslint-plugin-eslint-comments@3.2.0(eslint@9.0.0): + eslint-plugin-es-x@7.8.0(eslint@9.9.1(jiti@1.21.6)): dependencies: - escape-string-regexp: 1.0.5 - eslint: 9.0.0 - ignore: 5.3.1 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + '@eslint-community/regexpp': 4.11.0 + eslint: 9.9.1(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.9.1(jiti@1.21.6)) - eslint-plugin-import-x@0.5.0(eslint@9.0.0)(typescript@5.2.2): + eslint-plugin-import-x@4.1.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): dependencies: - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + debug: 4.3.6 doctrine: 3.0.0 - eslint: 9.0.0 + eslint: 9.9.1(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - get-tsconfig: 4.7.3 + get-tsconfig: 4.8.0 is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.0 + minimatch: 9.0.5 + semver: 7.6.3 + stable-hash: 0.0.4 + tslib: 2.7.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)): dependencies: + '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.0.0 + eslint: 9.9.1(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@9.0.0) + eslint-module-utils: 2.9.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.9.1(jiti@1.21.6)) hasown: 2.0.2 - is-core-module: 2.13.1 + is-core-module: 2.15.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -2733,95 +2788,109 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.2.2) + '@typescript-eslint/parser': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@48.2.3(eslint@9.0.0): + eslint-plugin-jsdoc@50.2.2(eslint@9.9.1(jiti@1.21.6)): dependencies: - '@es-joy/jsdoccomment': 0.42.0 + '@es-joy/jsdoccomment': 0.48.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.3.4 + debug: 4.3.6 escape-string-regexp: 4.0.0 - eslint: 9.0.0 - esquery: 1.5.0 - is-builtin-module: 3.2.1 - semver: 7.6.0 + eslint: 9.9.1(jiti@1.21.6) + espree: 10.1.0 + esquery: 1.6.0 + parse-imports: 2.1.1 + semver: 7.6.3 spdx-expression-parse: 4.0.0 + synckit: 0.9.1 transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.15.1(eslint@9.0.0): + eslint-plugin-jsonc@2.16.0(eslint@9.9.1(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - eslint: 9.0.0 - eslint-compat-utils: 0.5.0(eslint@9.0.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + eslint: 9.9.1(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.9.1(jiti@1.21.6)) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 synckit: 0.6.2 - eslint-plugin-markdown@4.0.1(eslint@9.0.0): + eslint-plugin-markdown@5.1.0(eslint@9.9.1(jiti@1.21.6)): dependencies: - eslint: 9.0.0 + eslint: 9.9.1(jiti@1.21.6) mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - eslint-plugin-n@17.2.1(eslint@9.0.0): + eslint-plugin-n@17.10.2(eslint@9.9.1(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - enhanced-resolve: 5.16.0 - eslint: 9.0.0 - eslint-plugin-es-x: 7.6.0(eslint@9.0.0) - get-tsconfig: 4.7.3 - globals: 14.0.0 - ignore: 5.3.1 - minimatch: 9.0.3 - semver: 7.6.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + enhanced-resolve: 5.17.1 + eslint: 9.9.1(jiti@1.21.6) + eslint-plugin-es-x: 7.8.0(eslint@9.9.1(jiti@1.21.6)) + get-tsconfig: 4.8.0 + globals: 15.9.0 + ignore: 5.3.2 + minimatch: 9.0.5 + semver: 7.6.3 - eslint-plugin-no-only-tests@3.1.0: {} + eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-perfectionist@2.9.0(eslint@9.0.0)(typescript@5.2.2)(vue-eslint-parser@9.4.2(eslint@9.0.0)): + eslint-plugin-perfectionist@3.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)(vue-eslint-parser@9.4.3(eslint@9.9.1(jiti@1.21.6))): dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 - minimatch: 9.0.3 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + minimatch: 10.0.1 natural-compare-lite: 1.4.0 optionalDependencies: - vue-eslint-parser: 9.4.2(eslint@9.0.0) + vue-eslint-parser: 9.4.3(eslint@9.9.1(jiti@1.21.6)) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-promise@6.1.1(eslint@9.0.0): + eslint-plugin-promise@6.6.0(eslint@9.9.1(jiti@1.21.6)): + dependencies: + eslint: 9.9.1(jiti@1.21.6) + + eslint-plugin-regexp@2.6.0(eslint@9.9.1(jiti@1.21.6)): dependencies: - eslint: 9.0.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + '@eslint-community/regexpp': 4.11.0 + comment-parser: 1.4.1 + eslint: 9.9.1(jiti@1.21.6) + jsdoc-type-pratt-parser: 4.1.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scslre: 0.3.0 - eslint-plugin-toml@0.11.0(eslint@9.0.0): + eslint-plugin-toml@0.11.1(eslint@9.9.1(jiti@1.21.6)): dependencies: - debug: 4.3.4 - eslint: 9.0.0 - eslint-compat-utils: 0.5.0(eslint@9.0.0) + debug: 4.3.6 + eslint: 9.9.1(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.9.1(jiti@1.21.6)) lodash: 4.17.21 - toml-eslint-parser: 0.9.3 + toml-eslint-parser: 0.10.0 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@52.0.0(eslint@9.0.0): + eslint-plugin-unicorn@55.0.0(eslint@9.9.1(jiti@1.21.6)): dependencies: - '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@eslint/eslintrc': 2.1.4 + '@babel/helper-validator-identifier': 7.24.7 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) ci-info: 4.0.0 clean-regexp: 1.0.0 - core-js-compat: 3.37.0 - eslint: 9.0.0 - esquery: 1.5.0 + core-js-compat: 3.38.1 + eslint: 9.9.1(jiti@1.21.6) + esquery: 1.6.0 + globals: 15.9.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 jsesc: 3.0.2 @@ -2829,66 +2898,51 @@ snapshots: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.6.0 + semver: 7.6.3 strip-indent: 3.0.0 - transitivePeerDependencies: - - supports-color - - eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0): - dependencies: - eslint: 9.0.0 - eslint-rule-composer: 0.3.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - eslint-plugin-vitest@0.5.3(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2): + eslint-plugin-unused-imports@4.1.3(@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)): dependencies: - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.2.2) - eslint: 9.0.0 + eslint: 9.9.1(jiti@1.21.6) optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.2.2))(eslint@9.0.0)(typescript@5.2.2) - transitivePeerDependencies: - - supports-color - - typescript + '@typescript-eslint/eslint-plugin': 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) - eslint-plugin-vue@9.25.0(eslint@9.0.0): + eslint-plugin-vue@9.28.0(eslint@9.9.1(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - eslint: 9.0.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + eslint: 9.9.1(jiti@1.21.6) globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.0.16 - semver: 7.6.0 - vue-eslint-parser: 9.4.2(eslint@9.0.0) + postcss-selector-parser: 6.1.2 + semver: 7.6.3 + vue-eslint-parser: 9.4.3(eslint@9.9.1(jiti@1.21.6)) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-yml@1.14.0(eslint@9.0.0): + eslint-plugin-yml@1.14.0(eslint@9.9.1(jiti@1.21.6)): dependencies: - debug: 4.3.4 - eslint: 9.0.0 - eslint-compat-utils: 0.5.0(eslint@9.0.0) + debug: 4.3.6 + eslint: 9.9.1(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.9.1(jiti@1.21.6)) lodash: 4.17.21 natural-compare: 1.4.0 - yaml-eslint-parser: 1.2.2 + yaml-eslint-parser: 1.2.3 transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.0.0): + eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.23)(eslint@9.9.1(jiti@1.21.6)): dependencies: '@vue/compiler-sfc': 3.4.23 - eslint: 9.0.0 - - eslint-rule-composer@0.3.0: {} + eslint: 9.9.1(jiti@1.21.6) eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-scope@8.0.1: + eslint-scope@8.0.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -2897,31 +2951,31 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.0.0: + eslint@9.9.1(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 3.0.2 - '@eslint/js': 9.0.0 - '@humanwhocodes/config-array': 0.12.3 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.18.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.9.1 '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.6 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 + eslint-scope: 8.0.2 eslint-visitor-keys: 4.0.0 - espree: 10.0.1 - esquery: 1.5.0 + espree: 10.1.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2930,25 +2984,27 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 transitivePeerDependencies: - supports-color - espree@10.0.1: + espree@10.1.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 4.0.0 espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -2962,18 +3018,6 @@ snapshots: esutils@2.0.3: {} - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -2982,13 +3026,13 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fastq@1.15.0: + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -2996,10 +3040,12 @@ snapshots: dependencies: flat-cache: 4.0.1 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + find-up-simple@1.0.0: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -3010,12 +3056,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@7.0.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - unicorn-magic: 0.1.0 - flat-cache@4.0.1: dependencies: flatted: 3.3.1 @@ -3027,13 +3067,11 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - function-bind@1.1.1: {} - function-bind@1.1.2: {} function.prototype.name@1.1.6: @@ -3055,15 +3093,13 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-stream@8.0.1: {} - get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.3: + get-tsconfig@4.8.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -3075,13 +3111,14 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.3: + glob@10.4.5: dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.0 - minimatch: 9.0.3 - minipass: 7.0.3 - path-scurry: 1.10.1 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 globals@13.24.0: dependencies: @@ -3089,18 +3126,19 @@ snapshots: globals@14.0.0: {} - globals@15.0.0: {} + globals@15.9.0: {} - globalthis@1.0.3: + globalthis@1.0.4: dependencies: define-properties: 1.2.1 + gopd: 1.0.1 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -3130,19 +3168,13 @@ snapshots: dependencies: has-symbols: 1.0.3 - has@1.0.3: - dependencies: - function-bind: 1.1.1 - hasown@2.0.2: dependencies: function-bind: 1.1.2 hosted-git-info@2.8.9: {} - human-signals@5.0.0: {} - - ignore@5.3.1: {} + ignore@5.3.2: {} import-fresh@3.3.0: dependencies: @@ -3188,11 +3220,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.13.0: - dependencies: - has: 1.0.3 - - is-core-module@2.13.1: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -3235,8 +3263,6 @@ snapshots: dependencies: call-bind: 1.0.7 - is-stream@3.0.0: {} - is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -3257,13 +3283,13 @@ snapshots: isexe@2.0.0: {} - jackspeak@2.3.0: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@1.19.3: {} + jiti@1.21.6: {} js-tokens@4.0.0: {} @@ -3273,6 +3299,8 @@ snapshots: jsdoc-type-pratt-parser@4.0.0: {} + jsdoc-type-pratt-parser@4.1.0: {} + jsesc@0.5.0: {} jsesc@3.0.2: {} @@ -3291,10 +3319,10 @@ snapshots: jsonc-eslint-parser@2.4.0: dependencies: - acorn: 8.11.3 + acorn: 8.12.1 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.6.0 + semver: 7.6.3 keyv@4.5.4: dependencies: @@ -3309,8 +3337,8 @@ snapshots: local-pkg@0.5.0: dependencies: - mlly: 1.6.1 - pkg-types: 1.1.0 + mlly: 1.7.1 + pkg-types: 1.2.0 locate-path@5.0.0: dependencies: @@ -3320,27 +3348,19 @@ snapshots: dependencies: p-locate: 5.0.0 - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - lodash.merge@4.6.2: {} lodash@4.17.21: {} - lru-cache@10.0.1: {} + lru-cache@10.4.3: {} - lru-cache@6.0.0: + magic-string@0.30.11: dependencies: - yallist: 4.0.0 - - magic-string@0.30.10: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 mdast-util-from-markdown@0.8.5: dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.15 mdast-util-to-string: 2.0.0 micromark: 2.11.4 parse-entities: 2.0.0 @@ -3350,26 +3370,26 @@ snapshots: mdast-util-to-string@2.0.0: {} - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromark@2.11.4: dependencies: - debug: 4.3.4 + debug: 4.3.6 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color - micromatch@4.0.5: + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 - mimic-fn@4.0.0: {} - min-indent@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -3378,20 +3398,20 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 minimist@1.2.8: {} - minipass@7.0.3: {} + minipass@7.1.2: {} - mlly@1.6.1: + mlly@1.7.1: dependencies: - acorn: 8.11.3 + acorn: 8.12.1 pathe: 1.1.2 - pkg-types: 1.1.0 - ufo: 1.5.3 + pkg-types: 1.2.0 + ufo: 1.5.4 ms@2.1.2: {} @@ -3403,24 +3423,20 @@ snapshots: natural-compare@1.4.0: {} - node-releases@2.0.14: {} + node-releases@2.0.18: {} normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.4 + resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 - object-inspect@1.13.1: {} + object-inspect@1.13.2: {} object-keys@1.1.1: {} @@ -3450,18 +3466,14 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 p-limit@2.3.0: dependencies: @@ -3471,10 +3483,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.0.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -3483,12 +3491,12 @@ snapshots: dependencies: p-limit: 3.1.0 - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - p-try@2.2.0: {} + package-json-from-dist@1.0.0: {} + + package-manager-detector@0.2.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -3504,64 +3512,63 @@ snapshots: parse-gitignore@2.0.0: {} + parse-imports@2.1.1: + dependencies: + es-module-lexer: 1.5.4 + slashes: 3.0.12 + parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 path-exists@4.0.0: {} - path-exists@5.0.0: {} - path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} - path-scurry@1.10.1: + path-scurry@1.11.1: dependencies: - lru-cache: 10.0.1 - minipass: 7.0.3 + lru-cache: 10.4.3 + minipass: 7.1.2 path-type@4.0.0: {} - pathe@1.1.1: {} - pathe@1.1.2: {} - picocolors@1.0.0: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} picomatch@4.0.2: {} - pkg-types@1.1.0: + pkg-types@1.2.0: dependencies: confbox: 0.1.7 - mlly: 1.6.1 + mlly: 1.7.1 pathe: 1.1.2 pluralize@8.0.0: {} possible-typed-array-names@1.0.0: {} - postcss-selector-parser@6.0.16: + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.38: + postcss@8.4.44: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.1.0 source-map-js: 1.2.0 prelude-ls@1.2.1: {} - punycode@2.3.0: {} + punycode@2.3.1: {} queue-microtask@1.2.3: {} @@ -3573,11 +3580,20 @@ snapshots: read-pkg@5.2.0: dependencies: - '@types/normalize-package-data': 2.4.1 + '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 + refa@0.12.1: + dependencies: + '@eslint-community/regexpp': 4.11.0 + + regexp-ast-analysis@0.7.1: + dependencies: + '@eslint-community/regexpp': 4.11.0 + refa: 0.12.1 + regexp-tree@0.1.27: {} regexp.prototype.flags@1.5.2: @@ -3597,9 +3613,9 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.4: + resolve@1.22.8: dependencies: - is-core-module: 2.13.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -3622,13 +3638,17 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 + scslre@0.3.0: + dependencies: + '@eslint-community/regexpp': 4.11.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + semver@5.7.2: {} semver@6.3.1: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.3: {} set-function-length@1.2.2: dependencies: @@ -3657,7 +3677,7 @@ snapshots: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.2 signal-exit@4.1.0: {} @@ -3665,26 +3685,30 @@ snapshots: slash@3.0.0: {} + slashes@3.0.12: {} + source-map-js@1.2.0: {} spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.20 - spdx-exceptions@2.3.0: {} + spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 spdx-expression-parse@4.0.0: dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 - spdx-license-ids@3.0.13: {} + spdx-license-ids@3.0.20: {} + + stable-hash@0.0.4: {} string-width@4.2.3: dependencies: @@ -3727,8 +3751,6 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@3.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -3747,25 +3769,32 @@ snapshots: synckit@0.6.2: dependencies: - tslib: 2.6.2 + tslib: 2.7.0 + + synckit@0.9.1: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.7.0 tapable@2.2.1: {} text-table@0.2.0: {} + tinyexec@0.3.0: {} + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toml-eslint-parser@0.9.3: + toml-eslint-parser@0.10.0: dependencies: eslint-visitor-keys: 3.4.3 - ts-api-utils@1.3.0(typescript@5.2.2): + ts-api-utils@1.3.0(typescript@5.5.4): dependencies: - typescript: 5.2.2 + typescript: 5.5.4 tsconfig-paths@3.15.0: dependencies: @@ -3774,7 +3803,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@2.6.2: {} + tslib@2.7.0: {} type-check@0.4.0: dependencies: @@ -3818,9 +3847,9 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript@5.2.2: {} + typescript@5.5.4: {} - ufo@1.5.3: {} + ufo@1.5.4: {} unbox-primitive@1.0.2: dependencies: @@ -3829,24 +3858,22 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@5.26.5: + undici-types@6.19.8: optional: true - unicorn-magic@0.1.0: {} - unist-util-stringify-position@2.0.3: dependencies: - '@types/unist': 2.0.7 + '@types/unist': 2.0.11 - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 + browserslist: 4.23.3 + escalade: 3.2.0 + picocolors: 1.1.0 uri-js@4.4.1: dependencies: - punycode: 2.3.0 + punycode: 2.3.1 util-deprecate@1.0.2: {} @@ -3855,16 +3882,16 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vue-eslint-parser@9.4.2(eslint@9.0.0): + vue-eslint-parser@9.4.3(eslint@9.9.1(jiti@1.21.6)): dependencies: - debug: 4.3.4 - eslint: 9.0.0 + debug: 4.3.6 + eslint: 9.9.1(jiti@1.21.6) eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 lodash: 4.17.21 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -3888,6 +3915,8 @@ snapshots: dependencies: isexe: 2.0.0 + word-wrap@1.2.5: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -3904,22 +3933,20 @@ snapshots: y18n@5.0.8: {} - yallist@4.0.0: {} - - yaml-eslint-parser@1.2.2: + yaml-eslint-parser@1.2.3: dependencies: eslint-visitor-keys: 3.4.3 lodash: 4.17.21 - yaml: 2.2.2 + yaml: 2.5.0 - yaml@2.2.2: {} + yaml@2.5.0: {} yargs-parser@21.1.1: {} yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -3928,9 +3955,7 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} - - zx@8.0.1: + zx@8.1.5: optionalDependencies: '@types/fs-extra': 11.0.4 - '@types/node': 20.12.7 + '@types/node': 22.5.2 From 0bdba49e0afdbfd0376336fb83db96bbbfdffd88 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 4 Sep 2024 10:07:15 +0200 Subject: [PATCH 306/344] Adding RPC calls check for c++ --- packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt | 4 +- .../cpp/ArmoniK.Api.Tests/header/common.h | 25 ++++ .../cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 123 ++++++++++++++++++ .../cpp/ArmoniK.Api.Tests/source/common.cpp | 2 +- 4 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp diff --git a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt index 96f8c2678..46156ec52 100644 --- a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt @@ -4,6 +4,8 @@ set(PROJECT_NAME ArmoniK.Api.Tests) find_package(Protobuf REQUIRED) find_package(gRPC CONFIG REQUIRED) find_package(Threads) +find_package(CURL REQUIRED) +find_package(jsoncpp REQUIRED) SET(SOURCES_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/source") SET(HEADER_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/header") @@ -17,7 +19,7 @@ add_executable(${PROJECT_NAME} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES}) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) -target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++ ArmoniK.Api.Client ArmoniK.Api.Common GTest::gtest_main GTest::gmock_main) +target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++ ArmoniK.Api.Client ArmoniK.Api.Common GTest::gtest_main GTest::gmock_main CURL::libcurl jsoncpp_lib) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4) diff --git a/packages/cpp/ArmoniK.Api.Tests/header/common.h b/packages/cpp/ArmoniK.Api.Tests/header/common.h index 558f207c5..6847c3f20 100644 --- a/packages/cpp/ArmoniK.Api.Tests/header/common.h +++ b/packages/cpp/ArmoniK.Api.Tests/header/common.h @@ -13,3 +13,28 @@ */ void init(std::shared_ptr &channel, armonik::api::grpc::v1::TaskOptions &task_options, armonik::api::common::logger::Logger &logger); + +/** + * + * @param service_name the name of the service providing the rpc methods + * @param rpc_name the specific rpc to be checked + * @param endpoint the call endpoint + * @param num_calls the number of call of rpc + * @return + */ +bool rpcCalled(const std::string &service_name, const std::string &rpc_name, + const std::string &endpoint = "http://localhost:4999/calls.json", int num_calls = 1); + +/** + * + * @param service_name the service name + * @param endpoint the call endpoint + * @return + */ +bool all_rpc_called(const std::string &service_name, const std::string &endpoint = "http://localhost:4999/calls.json"); + +/** + * + * @param endpoint The reset endpoint + */ +void clean_up(const std::string &endpoint = "http://localhost:4999/reset"); diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp new file mode 100644 index 000000000..8e83b8ccb --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -0,0 +1,123 @@ +#include +#include +#include +#include + +#include "common.h" +#include "exceptions/ArmoniKApiException.h" +#include "logger/formatter.h" +#include "logger/logger.h" +#include "logger/writer.h" + +#include "channel/ChannelFactory.h" +#include "sessions/SessionsClient.h" + +using Logger = armonik::api::common::logger::Logger; + +size_t WriteCallback(void *ptr, size_t size, size_t num_elt, std::string *data) { + data->append((char *)ptr, size * num_elt); + return size * num_elt; +} + +bool rpcCalled(const std::string &service_name, const std::string &rpc_name, const std::string &endpoint, + int num_calls) { + + auto curl = curl_easy_init(); + std::string read_buffer; + std::cout << endpoint << std::endl; + if (curl) { + curl_easy_setopt(curl, CURLOPT_URL, endpoint.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer); + + auto res = curl_easy_perform(curl); + + if (res != CURLE_OK) { + std::cout << "Request failed: " << curl_easy_strerror(res) << std::endl; + } + curl_easy_cleanup(curl); + } + + Json::CharReaderBuilder readerBuilder; + Json::Value response_json; + std::istringstream jsonStream(read_buffer); + std::string errs; + + bool res = Json::parseFromStream(readerBuilder, jsonStream, &response_json, &errs); + if (!res) { + std::cerr << "Failed to parse JSON: " << errs << std::endl; + } + if (response_json[service_name][rpc_name] >= num_calls) { + return true; + } + return false; +} + +bool all_rpc_called(const std::string &service_name, const std::string &endpoint) { + auto curl = curl_easy_init(); + std::string read_buffer; + std::cout << endpoint << std::endl; + if (curl) { + curl_easy_setopt(curl, CURLOPT_URL, endpoint.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer); + + auto res = curl_easy_perform(curl); + + if (res != CURLE_OK) { + std::cout << "Request failed: " << curl_easy_strerror(res) << std::endl; + } + curl_easy_cleanup(curl); + } + + Json::CharReaderBuilder readerBuilder; + Json::Value response_json; + std::istringstream jsonStream(read_buffer); + std::string errs; + + bool res = Json::parseFromStream(readerBuilder, jsonStream, &response_json, &errs); + if (!res) { + std::cerr << "Failed to parse JSON: " << errs << std::endl; + } + + std::vector missing_rpcs; + for (auto &rpc_name : response_json[service_name].getMemberNames()) { + if (response_json[service_name][rpc_name] == 0) { + missing_rpcs.push_back(rpc_name); + } + } + if (!missing_rpcs.empty()) { + std::cout << "RPCs not implemented in " << service_name << " service: \n"; + for (const auto &str : missing_rpcs) { + std::cout << str << '\n'; + } + return false; + } + return true; +} + +using Logger = armonik::api::common::logger::Logger; + +TEST(tls_mtls, connect) { + Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; + std::shared_ptr<::grpc::Channel> channel; + armonik::api::grpc::v1::TaskOptions task_options; + armonik::api::common::utils::Configuration configuration; + // auto server = std::make_shared(configuration_t); + + configuration.add_json_configuration("appsettings.json").add_env_configuration(); + + std::string server_address = configuration.get("Grpc__EndPoint"); + + armonik::api::client::ChannelFactory channel_factory(configuration, log); + + channel = channel_factory.create_channel(); + + clean_up(); + armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); + + std::string response; + ASSERT_NO_THROW(response = client.create_session(task_options)); + ASSERT_FALSE(response.empty()); + ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); +} \ No newline at end of file diff --git a/packages/cpp/ArmoniK.Api.Tests/source/common.cpp b/packages/cpp/ArmoniK.Api.Tests/source/common.cpp index 08f007687..b21155eeb 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/common.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/common.cpp @@ -1,7 +1,7 @@ #include "common.h" +#include "channel/ChannelFactory.h" #include "utils/Configuration.h" #include -#include "channel/ChannelFactory.h" /** * @brief Initializes task options creates channel with server address From c9e3ed259cc639d276c1963e79b144bbe3cea07f Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 4 Sep 2024 10:08:43 +0200 Subject: [PATCH 307/344] Adapt test to check rpc calls --- .../source/ChannelOptionsTest.cpp | 6 ++-- .../source/EventsClientTest.cpp | 5 +++- .../source/PartitionsClientTest.cpp | 4 +++ .../source/ResultsClientTest.cpp | 11 ++++++- .../source/SessionClientTest.cpp | 14 ++++++++- .../source/SubmitterClientTest.cpp | 2 +- .../source/TasksClientTest.cpp | 29 ++++++++++--------- .../source/VersionsClientTest.cpp | 3 ++ packages/cpp/tools/BuildEnv.Dockerfile | 2 ++ 9 files changed, 55 insertions(+), 21 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp index f86e345c1..21bc5d217 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp @@ -25,7 +25,6 @@ armonik::api::grpc::v1::TaskOptions default_task_options() { } TEST(Options, no_options) { - GTEST_SKIP() << "Testing Mock server"; armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); @@ -33,10 +32,10 @@ TEST(Options, no_options) { auto channel = ::grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); ASSERT_NO_THROW(client.create_session(default_task_options(), {})); + ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); } TEST(Options, default_options) { - GTEST_SKIP() << "Testing Mock server"; armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); @@ -45,10 +44,10 @@ TEST(Options, default_options) { auto channel = ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), args); armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); ASSERT_NO_THROW(client.create_session(default_task_options(), {})); + ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); } TEST(Options, test_timeout) { - GTEST_SKIP() << "Testing Mock server"; armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); @@ -64,4 +63,5 @@ TEST(Options, test_timeout) { ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), armonik::api::common::utils::getChannelArguments(configuration)))); ASSERT_NO_THROW(client.create_session(default_task_options(), {})); + ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp index ea61341ae..38a58a89d 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp @@ -13,7 +13,7 @@ using Logger = armonik::api::common::logger::Logger; TEST(Events, getEvents) { - GTEST_SKIP() << "Testing Mock server"; + GTEST_SKIP() << "Mock server must return something "; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -32,4 +32,7 @@ TEST(Events, getEvents) { ASSERT_NO_THROW(result_client.upload_result_data(session_id, result_id, "name")); ASSERT_NO_THROW(client.wait_for_result_availability(session_id, {result_id, payload_id})); ASSERT_EQ(result_client.download_result_data(session_id, result_id), "name"); + ASSERT_TRUE(rpcCalled("Events", "GetEvents")); } + +TEST(Events, service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Events")); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp index 3c81d108d..d23d8c739 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp @@ -21,6 +21,7 @@ TEST(Partitions, can_get_partition) { armonik::api::grpc::v1::partitions::PartitionRaw partition; ASSERT_NO_THROW(partition = client.get_partition(task_options.partition_id())); + ASSERT_TRUE(rpcCalled("Partitions", "GetPartition")); } TEST(Partitions, can_list_partitions) { @@ -47,4 +48,7 @@ TEST(Partitions, can_list_partitions) { for (auto &&partition : partitions) { std::cout << *partition.mutable_id() << std::endl; } + ASSERT_TRUE(rpcCalled("Partitions", "ListPartitions")); } + +TEST(Partitions, service_fully_implemented) { all_rpc_called("Partitions"); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp index 2f70a8d54..4fe40aff8 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp @@ -22,6 +22,7 @@ TEST(Results, test_results_created) { auto session_id = armonik::api::client::SessionsClient(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)) .create_session(task_options); ASSERT_NO_THROW(client.create_results_metadata(session_id, std::vector{"0", "1", "2", "3"})); + ASSERT_TRUE(rpcCalled("Results", "CreateResultsMetaData")); } TEST(Results, test_results_list) { @@ -45,6 +46,7 @@ TEST(Results, test_results_list) { *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; int total; ASSERT_NO_THROW(client.list_results(filters, total)); + ASSERT_TRUE(rpcCalled("Results", "ListResults")); } TEST(Results, test_results_list_small_page) { @@ -70,6 +72,7 @@ TEST(Results, test_results_list_small_page) { ASSERT_NO_THROW(client.list_results(filters, total, 0, 2)); ASSERT_NO_THROW(client.list_results(filters, total, -1, 2)); + ASSERT_TRUE(rpcCalled("Results", "ListResults")); } TEST(Results, test_results_create_with_data_vector) { @@ -84,6 +87,7 @@ TEST(Results, test_results_create_with_data_vector) { .create_session(task_options); std::vector> vec{{"0", "TestPayload"}}; ASSERT_NO_THROW(client.create_results(session_id, vec)); + ASSERT_TRUE(rpcCalled("Results", "CreateResults")); } TEST(Results, test_results_create_with_data_map) { @@ -99,6 +103,7 @@ TEST(Results, test_results_create_with_data_map) { std::map name_payload; name_payload["0"] = "TestPayload"; ASSERT_NO_THROW(client.create_results(session_id, std::move(name_payload))); + ASSERT_TRUE(rpcCalled("Results", "CreateResults")); } TEST(Results, test_results_create_with_data_unordered_map) { @@ -114,6 +119,7 @@ TEST(Results, test_results_create_with_data_unordered_map) { std::unordered_map name_payload; name_payload["0"] = "TestPayload"; ASSERT_NO_THROW(client.create_results(session_id, std::move(name_payload))); + ASSERT_TRUE(rpcCalled("Results", "CreateResults")); } TEST(Results, test_results_create_with_data_string_view) { @@ -131,10 +137,11 @@ TEST(Results, test_results_create_with_data_string_view) { name_payload.emplace_back("0", absl::string_view(fill_str.c_str(), 11)); name_payload.emplace_back("1", absl::string_view(fill_str.c_str() + 11, 12)); ASSERT_NO_THROW(client.create_results(session_id, name_payload.begin(), name_payload.end())); + ASSERT_TRUE(rpcCalled("Results", "CreateResults")); } TEST(Results, test_results_upload_download) { - GTEST_SKIP() << "Testing Mock server"; + GTEST_SKIP() << "Mock server must return something "; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -150,3 +157,5 @@ TEST(Results, test_results_upload_download) { ASSERT_NO_THROW(client.upload_result_data(session_id, map.at("0"), "TestPayload")); ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); } + +TEST(Results, service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Results")); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp index 8b5e54098..df4f9814d 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp @@ -20,7 +20,7 @@ TEST(Sessions, can_create_session) { std::string response; ASSERT_NO_THROW(response = client.create_session(task_options)); ASSERT_FALSE(response.empty()); - + ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); } TEST(Sessions, can_cancel_session) { @@ -36,6 +36,7 @@ TEST(Sessions, can_cancel_session) { armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.cancel_session(session_id)); ASSERT_EQ(response.session_id(), session_id); + ASSERT_TRUE(rpcCalled("Sessions", "CancelSession")); } TEST(Sessions, can_get_session) { @@ -51,6 +52,7 @@ TEST(Sessions, can_get_session) { armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.get_session(session_id)); ASSERT_EQ(response.session_id(), session_id); + ASSERT_TRUE(rpcCalled("Sessions", "GetSession")); } TEST(Sessions, can_list_sessions) { @@ -69,6 +71,7 @@ TEST(Sessions, can_list_sessions) { armonik::api::grpc::v1::sessions::Filters filters; int total; ASSERT_NO_THROW(client.list_sessions(filters, total)); + ASSERT_TRUE(rpcCalled("Sessions", "ListSessions")); } TEST(Sessions, can_list_sessions_small_page) { @@ -89,6 +92,7 @@ TEST(Sessions, can_list_sessions_small_page) { // auto list = client.list_sessions(filters, total, 0, 2); ASSERT_NO_THROW(client.list_sessions(filters, total, 0, 2)); ASSERT_NO_THROW(client.list_sessions(filters, total, -1, 2)); + ASSERT_TRUE(rpcCalled("Sessions", "ListSessions")); } TEST(Sessions, can_pause_session) { @@ -104,6 +108,7 @@ TEST(Sessions, can_pause_session) { armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.pause_session(session_id)); ASSERT_EQ(response.session_id(), session_id); + ASSERT_TRUE(rpcCalled("Sessions", "PauseSession")); } TEST(Sessions, can_resume_session) { @@ -121,6 +126,7 @@ TEST(Sessions, can_resume_session) { armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.resume_session(session_id)); ASSERT_EQ(response.session_id(), session_id); + ASSERT_TRUE(rpcCalled("Sessions", "ResumeSession")); } TEST(Sessions, can_purge_session) { @@ -138,6 +144,7 @@ TEST(Sessions, can_purge_session) { armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.purge_session(session_id)); ASSERT_EQ(response.session_id(), session_id); + ASSERT_TRUE(rpcCalled("Sessions", "PurgeSession")); } TEST(Sessions, can_delete_session) { @@ -153,6 +160,7 @@ TEST(Sessions, can_delete_session) { armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.delete_session(session_id)); ASSERT_EQ(response.session_id(), session_id); + ASSERT_TRUE(rpcCalled("Sessions", "DeleteSession")); } TEST(Sessions, can_stop_submission) { @@ -168,6 +176,7 @@ TEST(Sessions, can_stop_submission) { armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.stop_submission_session(session_id)); ASSERT_EQ(response.session_id(), session_id); + ASSERT_TRUE(rpcCalled("Sessions", "StopSubmission")); } TEST(Sessions, can_close_session) { @@ -183,4 +192,7 @@ TEST(Sessions, can_close_session) { armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.close_session(session_id)); ASSERT_EQ(response.session_id(), session_id); + ASSERT_TRUE(rpcCalled("Sessions", "CloseSession")); } + +TEST(Sessions, service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Sessions")); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index 251feabd4..61438a01d 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -41,7 +41,6 @@ using ::testing::AtLeast; namespace logger = armonik::api::common::logger; TEST(testMock, createSession) { - GTEST_SKIP() << "Testing Mock server"; // MockStubInterface stub; std::shared_ptr channel; logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; @@ -65,6 +64,7 @@ TEST(testMock, createSession) { std::cout << "create_session response: " << session_id << std::endl; ASSERT_FALSE(session_id.empty()); + ASSERT_TRUE(rpcCalled("Submitter", "CreateSession")); } TEST(testMock, submitTask) { diff --git a/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp index 8372e5b4e..17d5344fc 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp @@ -54,13 +54,14 @@ TEST(Tasks, submit_tasks_test) { ASSERT_NO_THROW(tasks_submit_override = client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}}}, task_options_submit)); - //ASSERT_EQ(tasks_submit_override.size(), 1); + // ASSERT_EQ(tasks_submit_override.size(), 1); std::vector tasks_submit_unique_override; ASSERT_NO_THROW(tasks_submit_unique_override = client.submit_tasks( session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}, {}, task_options_unique}}, task_options_submit)); + ASSERT_TRUE(rpcCalled("Tasks", "SubmitTasks")); } TEST(Tasks, count_tasks_test) { @@ -86,10 +87,10 @@ TEST(Tasks, count_tasks_test) { client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}}}); ASSERT_NO_THROW(status_count = client.count_tasks_by_status(filters)); + ASSERT_TRUE(rpcCalled("Tasks", "CountTasksByStatus")); } TEST(Tasks, get_result_ids_test) { - GTEST_SKIP() << "Testing Mock server"; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -104,17 +105,14 @@ TEST(Tasks, get_result_ids_test) { auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; auto client = armonik::api::client::TasksClient(armonik::api::grpc::v1::tasks::Tasks::NewStub(channel)); - auto task_id = - client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {result_id}}})[0].task_id; + auto task_id = client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {result_id}}}); std::map> tid_rids; - ASSERT_NO_THROW(tid_rids = client.get_result_ids({task_id})); - ASSERT_EQ(tid_rids.at(task_id).size(), 1); - ASSERT_EQ(tid_rids.at(task_id).at(0), result_id); + ASSERT_NO_THROW(tid_rids = client.get_result_ids({"task_id"})); + ASSERT_TRUE(rpcCalled("Tasks", "GetResultIds")); } TEST(Tasks, get_task_test) { - GTEST_SKIP() << "Testing Mock server"; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -129,12 +127,11 @@ TEST(Tasks, get_task_test) { auto result_id = result_client.create_results_metadata(session_id, {"result"})["result"]; auto client = armonik::api::client::TasksClient(armonik::api::grpc::v1::tasks::Tasks::NewStub(channel)); - auto task_id = - client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {result_id}}})[0].task_id; + auto task_id = client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {result_id}}}); armonik::api::grpc::v1::tasks::TaskDetailed details; - ASSERT_NO_THROW(details = client.get_task(task_id)); - ASSERT_EQ(details.id(), task_id); + ASSERT_NO_THROW(details = client.get_task("task_id")); + ASSERT_TRUE(rpcCalled("Tasks", "GetTask")); } TEST(Tasks, cancel_tasks_test) { @@ -164,7 +161,7 @@ TEST(Tasks, cancel_tasks_test) { } TEST(Tasks, list_tasks_test) { - GTEST_SKIP() << "Testing Mock server"; + GTEST_SKIP() << "Mock must return something "; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -184,10 +181,11 @@ TEST(Tasks, list_tasks_test) { int total; ASSERT_EQ(client.list_tasks(get_session_id_filter(session_id), total).size(), 1); ASSERT_EQ(total, 1); + ASSERT_TRUE(rpcCalled("Tasks", "ListTasks")); } TEST(Tasks, list_tasks_detailed_test) { - GTEST_SKIP() << "Testing Mock server"; + GTEST_SKIP() << "Mock must return something "; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -207,4 +205,7 @@ TEST(Tasks, list_tasks_detailed_test) { int total; ASSERT_EQ(client.list_tasks_detailed(get_session_id_filter(session_id), total).size(), 1); ASSERT_EQ(total, 1); + ASSERT_TRUE(rpcCalled("Tasks", "ListTasksDetailed")); } + +TEST(Tasks, service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Tasks")); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp index 94ed0f825..73d49482b 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp @@ -22,4 +22,7 @@ TEST(Versions, can_list_versions) { std::cout << "API version: " << versions.api << "\n" << "Core version: " << versions.core << std::endl; + ASSERT_TRUE(rpcCalled("Versions", "ListVersions")); } + +TEST(Versions, service_fully_implemented) { all_rpc_called("Versions"); } diff --git a/packages/cpp/tools/BuildEnv.Dockerfile b/packages/cpp/tools/BuildEnv.Dockerfile index 30cea8377..0d3621d58 100644 --- a/packages/cpp/tools/BuildEnv.Dockerfile +++ b/packages/cpp/tools/BuildEnv.Dockerfile @@ -20,6 +20,8 @@ RUN apt-get update && DEBIAN_FRONTEND="noninteractive" TZ="Europe/London" apt-ge libgrpc++-dev \ libprotobuf-dev \ libfmt-dev \ + libcurl4-openssl-dev \ + libjsoncpp-dev \ && apt-get clean ENV protobuf_BUILD_TESTS=OFF From eba64d8321568eb452224fae0a72105c137ef021 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 4 Sep 2024 18:08:55 +0200 Subject: [PATCH 308/344] Add test rpc call and clean up request for json file --- .../cpp/ArmoniK.Api.Tests/header/common.h | 23 ++++++-- .../source/ChannelOptionsTest.cpp | 22 +++++--- .../source/EventsClientTest.cpp | 12 ++++- .../cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 31 ++++++++--- .../source/PartitionsClientTest.cpp | 11 ++-- .../source/ResultsClientTest.cpp | 49 +++++++++++------ .../source/SessionClientTest.cpp | 54 +++++++++++++------ .../source/SubmitterClientTest.cpp | 13 +++-- .../source/TasksClientTest.cpp | 27 ++++++---- .../source/VersionsClientTest.cpp | 9 +++- 10 files changed, 184 insertions(+), 67 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/header/common.h b/packages/cpp/ArmoniK.Api.Tests/header/common.h index 6847c3f20..a5b519e25 100644 --- a/packages/cpp/ArmoniK.Api.Tests/header/common.h +++ b/packages/cpp/ArmoniK.Api.Tests/header/common.h @@ -3,6 +3,7 @@ #include "logger/logger.h" #include "objects.pb.h" #include +#include #include /** @@ -22,8 +23,8 @@ void init(std::shared_ptr &channel, armonik::api::grpc::v1::TaskO * @param num_calls the number of call of rpc * @return */ -bool rpcCalled(const std::string &service_name, const std::string &rpc_name, - const std::string &endpoint = "http://localhost:4999/calls.json", int num_calls = 1); +bool rpcCalled(const std::string &service_name, const std::string &rpc_name, int num_calls = 1, + const std::string &endpoint = "http://localhost:4999/calls.json"); /** * @@ -31,10 +32,26 @@ bool rpcCalled(const std::string &service_name, const std::string &rpc_name, * @param endpoint the call endpoint * @return */ -bool all_rpc_called(const std::string &service_name, const std::string &endpoint = "http://localhost:4999/calls.json"); +bool all_rpc_called(const std::string &service_name, const std::vector &missings = {}, + const std::string &endpoint = "http://localhost:4999/calls.json"); /** * * @param endpoint The reset endpoint */ void clean_up(const std::string &endpoint = "http://localhost:4999/reset"); + +/** + * A fixture class to reset the RPC calls + */ +class MockFixture : public ::testing::Test { +protected: + static void TearDownTestSuite() { clean_up(); } + + /** + * Clean up the calls.json file + */ + void TearDown() override { + // clean_up(); + } +}; diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp index 21bc5d217..f7179c85b 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp @@ -24,7 +24,14 @@ armonik::api::grpc::v1::TaskOptions default_task_options() { return default_task_options; } -TEST(Options, no_options) { +size_t num_create_session_submitter = 0; + +/** + * Fixture class for Options, inherit from MockFixture + */ +class Options : public MockFixture {}; + +TEST_F(Options, no_options) { armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); @@ -32,10 +39,11 @@ TEST(Options, no_options) { auto channel = ::grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); ASSERT_NO_THROW(client.create_session(default_task_options(), {})); - ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); + num_create_session_submitter++; + ASSERT_TRUE(rpcCalled("Submitter", "CreateSession", num_create_session_submitter)); } -TEST(Options, default_options) { +TEST_F(Options, default_options) { armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); @@ -44,10 +52,11 @@ TEST(Options, default_options) { auto channel = ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), args); armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); ASSERT_NO_THROW(client.create_session(default_task_options(), {})); - ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); + num_create_session_submitter++; + ASSERT_TRUE(rpcCalled("Submitter", "CreateSession", num_create_session_submitter)); } -TEST(Options, test_timeout) { +TEST_F(Options, test_timeout) { armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); @@ -63,5 +72,6 @@ TEST(Options, test_timeout) { ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), armonik::api::common::utils::getChannelArguments(configuration)))); ASSERT_NO_THROW(client.create_session(default_task_options(), {})); - ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); + num_create_session_submitter++; + ASSERT_TRUE(rpcCalled("Submitter", "CreateSession", num_create_session_submitter)); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp index 38a58a89d..fb538f990 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp @@ -12,7 +12,12 @@ using Logger = armonik::api::common::logger::Logger; -TEST(Events, getEvents) { +/** + * Fixture class for versions, inherit from MockFixture + */ +class Events : public MockFixture {}; + +TEST_F(Events, getEvents) { GTEST_SKIP() << "Mock server must return something "; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; @@ -35,4 +40,7 @@ TEST(Events, getEvents) { ASSERT_TRUE(rpcCalled("Events", "GetEvents")); } -TEST(Events, service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Events")); } +TEST_F(MockFixture, event_service_fully_implemented) { + std::vector missing_rpcs{"GetEvents"}; + ASSERT_TRUE(all_rpc_called("Events", missing_rpcs)); +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp index 8e83b8ccb..6c20cd4f0 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -19,8 +19,8 @@ size_t WriteCallback(void *ptr, size_t size, size_t num_elt, std::string *data) return size * num_elt; } -bool rpcCalled(const std::string &service_name, const std::string &rpc_name, const std::string &endpoint, - int num_calls) { +bool rpcCalled(const std::string &service_name, const std::string &rpc_name, int num_calls, + const std::string &endpoint) { auto curl = curl_easy_init(); std::string read_buffer; @@ -47,13 +47,16 @@ bool rpcCalled(const std::string &service_name, const std::string &rpc_name, con if (!res) { std::cerr << "Failed to parse JSON: " << errs << std::endl; } - if (response_json[service_name][rpc_name] >= num_calls) { + if (response_json[service_name][rpc_name] == num_calls) { return true; } + std::cout << "Given num calls: " << num_calls << std::endl; + std::cout << "Actual num calls: " << response_json[service_name][rpc_name] << std::endl; return false; } -bool all_rpc_called(const std::string &service_name, const std::string &endpoint) { +bool all_rpc_called(const std::string &service_name, const std::vector &missings, + const std::string &endpoint) { auto curl = curl_easy_init(); std::string read_buffer; std::cout << endpoint << std::endl; @@ -87,6 +90,9 @@ bool all_rpc_called(const std::string &service_name, const std::string &endpoint } } if (!missing_rpcs.empty()) { + if (missing_rpcs == missings) { + return true; + } std::cout << "RPCs not implemented in " << service_name << " service: \n"; for (const auto &str : missing_rpcs) { std::cout << str << '\n'; @@ -96,9 +102,23 @@ bool all_rpc_called(const std::string &service_name, const std::string &endpoint return true; } +void clean_up(const std::string &endpoint) { + auto curl = curl_easy_init(); + std::string read_buffer; + if (curl) { + curl_easy_setopt(curl, CURLOPT_URL, endpoint.c_str()); + curl_easy_setopt(curl, CURLOPT_POST, 1L); + auto res = curl_easy_perform(curl); + if (res != CURLE_OK) { + std::cout << "Request failed: " << curl_easy_strerror(res) << std::endl; + } + curl_easy_cleanup(curl); + } +} + using Logger = armonik::api::common::logger::Logger; -TEST(tls_mtls, connect) { +TEST_F(MockFixture, connect) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -113,7 +133,6 @@ TEST(tls_mtls, connect) { channel = channel_factory.create_channel(); - clean_up(); armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string response; diff --git a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp index d23d8c739..c57a43fc5 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp @@ -10,7 +10,12 @@ using Logger = armonik::api::common::logger::Logger; -TEST(Partitions, can_get_partition) { +/** + * Fixture class for partition, inherit from MockFixture + */ +class Partitions : public MockFixture {}; + +TEST_F(Partitions, can_get_partition) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -24,7 +29,7 @@ TEST(Partitions, can_get_partition) { ASSERT_TRUE(rpcCalled("Partitions", "GetPartition")); } -TEST(Partitions, can_list_partitions) { +TEST_F(Partitions, can_list_partitions) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -51,4 +56,4 @@ TEST(Partitions, can_list_partitions) { ASSERT_TRUE(rpcCalled("Partitions", "ListPartitions")); } -TEST(Partitions, service_fully_implemented) { all_rpc_called("Partitions"); } +// TEST_F(MockFixture, partitions_service_fully_implemented) { all_rpc_called("Partitions"); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp index 4fe40aff8..123556abb 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp @@ -11,7 +11,15 @@ using Logger = armonik::api::common::logger::Logger; -TEST(Results, test_results_created) { +size_t num_list_result = 0; +size_t num_create_result = 0; + +/** + * Fixture class for result, inherit from MockFixture + */ +class Results : public MockFixture {}; + +TEST_F(Results, test_results_created) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -25,7 +33,7 @@ TEST(Results, test_results_created) { ASSERT_TRUE(rpcCalled("Results", "CreateResultsMetaData")); } -TEST(Results, test_results_list) { +TEST_F(Results, test_results_list) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -46,10 +54,11 @@ TEST(Results, test_results_list) { *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; int total; ASSERT_NO_THROW(client.list_results(filters, total)); - ASSERT_TRUE(rpcCalled("Results", "ListResults")); + num_list_result++; + ASSERT_TRUE(rpcCalled("Results", "ListResults", num_list_result)); } -TEST(Results, test_results_list_small_page) { +TEST_F(Results, test_results_list_small_page) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -70,12 +79,15 @@ TEST(Results, test_results_list_small_page) { *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; int total; ASSERT_NO_THROW(client.list_results(filters, total, 0, 2)); + num_list_result++; ASSERT_NO_THROW(client.list_results(filters, total, -1, 2)); - ASSERT_TRUE(rpcCalled("Results", "ListResults")); + num_list_result++; + + ASSERT_TRUE(rpcCalled("Results", "ListResults", num_list_result)); } -TEST(Results, test_results_create_with_data_vector) { +TEST_F(Results, test_results_create_with_data_vector) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -87,10 +99,11 @@ TEST(Results, test_results_create_with_data_vector) { .create_session(task_options); std::vector> vec{{"0", "TestPayload"}}; ASSERT_NO_THROW(client.create_results(session_id, vec)); - ASSERT_TRUE(rpcCalled("Results", "CreateResults")); + num_create_result++; + ASSERT_TRUE(rpcCalled("Results", "CreateResults", num_create_result)); } -TEST(Results, test_results_create_with_data_map) { +TEST_F(Results, test_results_create_with_data_map) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -103,10 +116,11 @@ TEST(Results, test_results_create_with_data_map) { std::map name_payload; name_payload["0"] = "TestPayload"; ASSERT_NO_THROW(client.create_results(session_id, std::move(name_payload))); - ASSERT_TRUE(rpcCalled("Results", "CreateResults")); + num_create_result++; + ASSERT_TRUE(rpcCalled("Results", "CreateResults", num_create_result)); } -TEST(Results, test_results_create_with_data_unordered_map) { +TEST_F(Results, test_results_create_with_data_unordered_map) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -119,10 +133,11 @@ TEST(Results, test_results_create_with_data_unordered_map) { std::unordered_map name_payload; name_payload["0"] = "TestPayload"; ASSERT_NO_THROW(client.create_results(session_id, std::move(name_payload))); - ASSERT_TRUE(rpcCalled("Results", "CreateResults")); + num_create_result++; + ASSERT_TRUE(rpcCalled("Results", "CreateResults", num_create_result)); } -TEST(Results, test_results_create_with_data_string_view) { +TEST_F(Results, test_results_create_with_data_string_view) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -137,10 +152,11 @@ TEST(Results, test_results_create_with_data_string_view) { name_payload.emplace_back("0", absl::string_view(fill_str.c_str(), 11)); name_payload.emplace_back("1", absl::string_view(fill_str.c_str() + 11, 12)); ASSERT_NO_THROW(client.create_results(session_id, name_payload.begin(), name_payload.end())); - ASSERT_TRUE(rpcCalled("Results", "CreateResults")); + num_create_result++; + ASSERT_TRUE(rpcCalled("Results", "CreateResults", num_create_result)); } -TEST(Results, test_results_upload_download) { +TEST_F(Results, test_results_upload_download) { GTEST_SKIP() << "Mock server must return something "; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; @@ -158,4 +174,7 @@ TEST(Results, test_results_upload_download) { ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); } -TEST(Results, service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Results")); } +// TEST_F(Results, result_service_fully_implemented) { +// std::vector missing_rpcs{"DeleteResultsData", "DownloadResultData", "GetOwnerTaskId", "GetResult", +// "GetServiceConfiguration", "UploadResultData", "WatchResults"}; ASSERT_TRUE(all_rpc_called("Results", missing_rpcs)); +// } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp index df4f9814d..db8b2d795 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp @@ -9,7 +9,15 @@ using Logger = armonik::api::common::logger::Logger; -TEST(Sessions, can_create_session) { +size_t num_create_session = 0; +size_t num_list_session = 0; + +/** + * Fixture class for session, inherit from MockFixture + */ +class Sessions : public MockFixture {}; + +TEST_F(Sessions, can_create_session) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -19,11 +27,12 @@ TEST(Sessions, can_create_session) { std::string response; ASSERT_NO_THROW(response = client.create_session(task_options)); + num_create_session++; ASSERT_FALSE(response.empty()); - ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); + ASSERT_TRUE(rpcCalled("Sessions", "CreateSession", num_create_session)); } -TEST(Sessions, can_cancel_session) { +TEST_F(Sessions, can_cancel_session) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -32,6 +41,7 @@ TEST(Sessions, can_cancel_session) { armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string session_id = client.create_session(task_options); + num_create_session++; armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.cancel_session(session_id)); @@ -39,7 +49,7 @@ TEST(Sessions, can_cancel_session) { ASSERT_TRUE(rpcCalled("Sessions", "CancelSession")); } -TEST(Sessions, can_get_session) { +TEST_F(Sessions, can_get_session) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -48,6 +58,7 @@ TEST(Sessions, can_get_session) { armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string session_id = client.create_session(task_options); + num_create_session++; armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.get_session(session_id)); @@ -55,7 +66,7 @@ TEST(Sessions, can_get_session) { ASSERT_TRUE(rpcCalled("Sessions", "GetSession")); } -TEST(Sessions, can_list_sessions) { +TEST_F(Sessions, can_list_sessions) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -66,15 +77,17 @@ TEST(Sessions, can_list_sessions) { size_t expected_n_sessions = 5; for (size_t i = 0; i < expected_n_sessions; i++) { ASSERT_NO_THROW(client.create_session(task_options)); + num_create_session++; } armonik::api::grpc::v1::sessions::Filters filters; int total; ASSERT_NO_THROW(client.list_sessions(filters, total)); - ASSERT_TRUE(rpcCalled("Sessions", "ListSessions")); + num_list_session++; + ASSERT_TRUE(rpcCalled("Sessions", "ListSessions", num_list_session)); } -TEST(Sessions, can_list_sessions_small_page) { +TEST_F(Sessions, can_list_sessions_small_page) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -85,17 +98,20 @@ TEST(Sessions, can_list_sessions_small_page) { size_t expected_n_sessions = 5; for (size_t i = 0; i < expected_n_sessions; i++) { ASSERT_NO_THROW(client.create_session(task_options)); + num_create_session++; } armonik::api::grpc::v1::sessions::Filters filters; int total; // auto list = client.list_sessions(filters, total, 0, 2); ASSERT_NO_THROW(client.list_sessions(filters, total, 0, 2)); + num_list_session++; ASSERT_NO_THROW(client.list_sessions(filters, total, -1, 2)); - ASSERT_TRUE(rpcCalled("Sessions", "ListSessions")); + num_list_session++; + ASSERT_TRUE(rpcCalled("Sessions", "ListSessions", num_list_session)); } -TEST(Sessions, can_pause_session) { +TEST_F(Sessions, can_pause_session) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -104,6 +120,7 @@ TEST(Sessions, can_pause_session) { armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string session_id = client.create_session(task_options); + num_create_session++; armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.pause_session(session_id)); @@ -111,7 +128,7 @@ TEST(Sessions, can_pause_session) { ASSERT_TRUE(rpcCalled("Sessions", "PauseSession")); } -TEST(Sessions, can_resume_session) { +TEST_F(Sessions, can_resume_session) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -120,6 +137,7 @@ TEST(Sessions, can_resume_session) { armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string session_id = client.create_session(task_options); + num_create_session++; ASSERT_NO_THROW(client.pause_session(session_id)); @@ -129,7 +147,7 @@ TEST(Sessions, can_resume_session) { ASSERT_TRUE(rpcCalled("Sessions", "ResumeSession")); } -TEST(Sessions, can_purge_session) { +TEST_F(Sessions, can_purge_session) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -138,6 +156,7 @@ TEST(Sessions, can_purge_session) { armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string session_id = client.create_session(task_options); + num_create_session++; ASSERT_NO_THROW(client.close_session(session_id)); @@ -147,7 +166,7 @@ TEST(Sessions, can_purge_session) { ASSERT_TRUE(rpcCalled("Sessions", "PurgeSession")); } -TEST(Sessions, can_delete_session) { +TEST_F(Sessions, can_delete_session) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -156,6 +175,7 @@ TEST(Sessions, can_delete_session) { armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string session_id = client.create_session(task_options); + num_create_session++; armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.delete_session(session_id)); @@ -163,7 +183,7 @@ TEST(Sessions, can_delete_session) { ASSERT_TRUE(rpcCalled("Sessions", "DeleteSession")); } -TEST(Sessions, can_stop_submission) { +TEST_F(Sessions, can_stop_submission) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -172,6 +192,7 @@ TEST(Sessions, can_stop_submission) { armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string session_id = client.create_session(task_options); + num_create_session++; armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.stop_submission_session(session_id)); @@ -179,7 +200,7 @@ TEST(Sessions, can_stop_submission) { ASSERT_TRUE(rpcCalled("Sessions", "StopSubmission")); } -TEST(Sessions, can_close_session) { +TEST_F(Sessions, can_close_session) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -188,11 +209,12 @@ TEST(Sessions, can_close_session) { armonik::api::client::SessionsClient client(armonik::api::grpc::v1::sessions::Sessions::NewStub(channel)); std::string session_id = client.create_session(task_options); + num_create_session++; armonik::api::grpc::v1::sessions::SessionRaw response; ASSERT_NO_THROW(response = client.close_session(session_id)); ASSERT_EQ(response.session_id(), session_id); - ASSERT_TRUE(rpcCalled("Sessions", "CloseSession")); + ASSERT_TRUE(rpcCalled("Sessions", "CloseSession", 2)); } -TEST(Sessions, service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Sessions")); } +// TEST_F(Sessions, session_service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Sessions")); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp index 61438a01d..2cd0001f3 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SubmitterClientTest.cpp @@ -40,7 +40,12 @@ using ::testing::AtLeast; namespace logger = armonik::api::common::logger; -TEST(testMock, createSession) { +/** + * Fixture class for submitter, inherit from MockFixture + */ +class testMock : public MockFixture {}; + +TEST_F(testMock, createSessionSubmitter) { // MockStubInterface stub; std::shared_ptr channel; logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; @@ -67,7 +72,7 @@ TEST(testMock, createSession) { ASSERT_TRUE(rpcCalled("Submitter", "CreateSession")); } -TEST(testMock, submitTask) { +TEST_F(testMock, submitTask) { GTEST_SKIP() << "Testing Mock server"; logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; @@ -158,7 +163,7 @@ TEST(testMock, submitTask) { log.info("Stopping client...OK"); } -TEST(testMock, testWorker) { +TEST_F(testMock, testWorker) { GTEST_SKIP() << "Testing Mock server"; logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; std::shared_ptr channel; @@ -212,7 +217,7 @@ TEST(testMock, testWorker) { ASSERT_TRUE(!result_payload.empty()); } -TEST(testMock, getResult) { +TEST_F(testMock, getResult) { GTEST_SKIP() << "Testing Mock server"; logger::Logger log{logger::writer_console(), logger::formatter_plain(true)}; // MockStubInterface stub; diff --git a/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp index 17d5344fc..00ff89836 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp @@ -25,7 +25,12 @@ armonik::api::grpc::v1::tasks::Filters get_session_id_filter(std::string session return filters; } -TEST(Tasks, submit_tasks_test) { +/** + * Fixture class for task, inherit from MockFixture + */ +class Tasks : public MockFixture {}; + +TEST_F(Tasks, submit_tasks_test) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -61,10 +66,10 @@ TEST(Tasks, submit_tasks_test) { session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}, {}, task_options_unique}}, task_options_submit)); - ASSERT_TRUE(rpcCalled("Tasks", "SubmitTasks")); + ASSERT_TRUE(rpcCalled("Tasks", "SubmitTasks", 3)); } -TEST(Tasks, count_tasks_test) { +TEST_F(Tasks, count_tasks_test) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -87,10 +92,10 @@ TEST(Tasks, count_tasks_test) { client.submit_tasks(session_id, {armonik::api::common::TaskCreation{payload_id, {{result_id}}}}); ASSERT_NO_THROW(status_count = client.count_tasks_by_status(filters)); - ASSERT_TRUE(rpcCalled("Tasks", "CountTasksByStatus")); + ASSERT_TRUE(rpcCalled("Tasks", "CountTasksByStatus", 2)); } -TEST(Tasks, get_result_ids_test) { +TEST_F(Tasks, get_result_ids_test) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -112,7 +117,7 @@ TEST(Tasks, get_result_ids_test) { ASSERT_TRUE(rpcCalled("Tasks", "GetResultIds")); } -TEST(Tasks, get_task_test) { +TEST_F(Tasks, get_task_test) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -134,7 +139,7 @@ TEST(Tasks, get_task_test) { ASSERT_TRUE(rpcCalled("Tasks", "GetTask")); } -TEST(Tasks, cancel_tasks_test) { +TEST_F(Tasks, cancel_tasks_test) { GTEST_SKIP() << "Core bug #523"; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; @@ -160,7 +165,7 @@ TEST(Tasks, cancel_tasks_test) { ASSERT_EQ(client.cancel_tasks({task_id}).at(0).status(), armonik::api::grpc::v1::task_status::TASK_STATUS_CANCELLED); } -TEST(Tasks, list_tasks_test) { +TEST_F(Tasks, list_tasks_test) { GTEST_SKIP() << "Mock must return something "; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; @@ -184,7 +189,7 @@ TEST(Tasks, list_tasks_test) { ASSERT_TRUE(rpcCalled("Tasks", "ListTasks")); } -TEST(Tasks, list_tasks_detailed_test) { +TEST_F(Tasks, list_tasks_detailed_test) { GTEST_SKIP() << "Mock must return something "; Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; @@ -208,4 +213,6 @@ TEST(Tasks, list_tasks_detailed_test) { ASSERT_TRUE(rpcCalled("Tasks", "ListTasksDetailed")); } -TEST(Tasks, service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Tasks")); } +// TEST_F(MockFixture, task_service_fully_implemented) { +// std::vector missing_rpcs{"CancelTasks", "ListTasks", "ListTasksDetailed"}; +// ASSERT_TRUE(all_rpc_called("Tasks", missing_rpcs)); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp index 73d49482b..cdd57449b 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp @@ -9,7 +9,12 @@ using Logger = armonik::api::common::logger::Logger; -TEST(Versions, can_list_versions) { +/** + * Fixture class for versions, inherit from MockFixture + */ +class Versions : public MockFixture {}; + +TEST_F(Versions, can_list_versions) { Logger log{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; std::shared_ptr<::grpc::Channel> channel; armonik::api::grpc::v1::TaskOptions task_options; @@ -25,4 +30,4 @@ TEST(Versions, can_list_versions) { ASSERT_TRUE(rpcCalled("Versions", "ListVersions")); } -TEST(Versions, service_fully_implemented) { all_rpc_called("Versions"); } +// TEST_F(MockFixture, version_service_fully_implemented) { all_rpc_called("Versions"); } From 04f431d25cb976d012466d4e44eb7ea201a70183 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 5 Sep 2024 11:30:21 +0200 Subject: [PATCH 309/344] Use simdjson to handle JSON --- packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt | 3 +- .../cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 67 +++++++++---------- packages/cpp/tools/BuildEnv.Dockerfile | 1 - 3 files changed, 34 insertions(+), 37 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt index 46156ec52..aaa9820c5 100644 --- a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt @@ -5,7 +5,6 @@ find_package(Protobuf REQUIRED) find_package(gRPC CONFIG REQUIRED) find_package(Threads) find_package(CURL REQUIRED) -find_package(jsoncpp REQUIRED) SET(SOURCES_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/source") SET(HEADER_FILES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/header") @@ -19,7 +18,7 @@ add_executable(${PROJECT_NAME} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES}) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) -target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++ ArmoniK.Api.Client ArmoniK.Api.Common GTest::gtest_main GTest::gmock_main CURL::libcurl jsoncpp_lib) +target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++ ArmoniK.Api.Client ArmoniK.Api.Common GTest::gtest_main GTest::gmock_main CURL::libcurl) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp index 6c20cd4f0..79ae2b37d 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include "common.h" #include "exceptions/ArmoniKApiException.h" @@ -13,6 +13,7 @@ #include "sessions/SessionsClient.h" using Logger = armonik::api::common::logger::Logger; +using namespace simdjson; size_t WriteCallback(void *ptr, size_t size, size_t num_elt, std::string *data) { data->append((char *)ptr, size * num_elt); @@ -38,20 +39,17 @@ bool rpcCalled(const std::string &service_name, const std::string &rpc_name, int curl_easy_cleanup(curl); } - Json::CharReaderBuilder readerBuilder; - Json::Value response_json; - std::istringstream jsonStream(read_buffer); - std::string errs; + dom::parser parser; - bool res = Json::parseFromStream(readerBuilder, jsonStream, &response_json, &errs); - if (!res) { - std::cerr << "Failed to parse JSON: " << errs << std::endl; - } - if (response_json[service_name][rpc_name] == num_calls) { - return true; + try { + dom::element response_json = parser.parse(read_buffer); + if (response_json[service_name][rpc_name].get_int64() == num_calls) { + return true; + } + } catch (const simdjson_error &e) { + std::cerr << "Failed to parse JSON: " << e.what() << std::endl; } - std::cout << "Given num calls: " << num_calls << std::endl; - std::cout << "Actual num calls: " << response_json[service_name][rpc_name] << std::endl; + return false; } @@ -73,31 +71,32 @@ bool all_rpc_called(const std::string &service_name, const std::vector missing_rpcs; - for (auto &rpc_name : response_json[service_name].getMemberNames()) { - if (response_json[service_name][rpc_name] == 0) { - missing_rpcs.push_back(rpc_name); - } - } - if (!missing_rpcs.empty()) { - if (missing_rpcs == missings) { - return true; + dom::array rpcs = response_json[service_name]; + + std::vector missing_rpcs; + for (auto rpc_name : response_json[service_name].get_array()) { + if (response_json[service_name][rpc_name].get_int64() == 0) { + missing_rpcs.emplace_back(rpc_name.get_string().value().data()); + } } - std::cout << "RPCs not implemented in " << service_name << " service: \n"; - for (const auto &str : missing_rpcs) { - std::cout << str << '\n'; + if (!missing_rpcs.empty()) { + if (missing_rpcs == missings) { + return true; + } + std::cout << "RPCs not implemented in " << service_name << " service: \n"; + for (const auto &str : missing_rpcs) { + std::cout << str << '\n'; + } + return false; } - return false; + + } catch (const simdjson_error &e) { + std::cerr << "Failed to parse JSON: " << e.what() << std::endl; } return true; } diff --git a/packages/cpp/tools/BuildEnv.Dockerfile b/packages/cpp/tools/BuildEnv.Dockerfile index 0d3621d58..5a4fe4d3b 100644 --- a/packages/cpp/tools/BuildEnv.Dockerfile +++ b/packages/cpp/tools/BuildEnv.Dockerfile @@ -21,7 +21,6 @@ RUN apt-get update && DEBIAN_FRONTEND="noninteractive" TZ="Europe/London" apt-ge libprotobuf-dev \ libfmt-dev \ libcurl4-openssl-dev \ - libjsoncpp-dev \ && apt-get clean ENV protobuf_BUILD_TESTS=OFF From ce83958ee272f1c08d614e521c48ccc7f6f80768 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Fri, 6 Sep 2024 09:56:58 +0200 Subject: [PATCH 310/344] Add test for all rpc calls --- .../ArmoniK.Api.Tests/source/EventsClientTest.cpp | 5 ++++- packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 2 +- .../source/PartitionsClientTest.cpp | 5 ++++- .../ArmoniK.Api.Tests/source/ResultsClientTest.cpp | 12 ++++++++---- .../ArmoniK.Api.Tests/source/SessionClientTest.cpp | 5 ++++- .../cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp | 10 +++++++--- .../ArmoniK.Api.Tests/source/VersionsClientTest.cpp | 5 ++++- 7 files changed, 32 insertions(+), 12 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp index fb538f990..df3cb26f5 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/EventsClientTest.cpp @@ -40,7 +40,10 @@ TEST_F(Events, getEvents) { ASSERT_TRUE(rpcCalled("Events", "GetEvents")); } -TEST_F(MockFixture, event_service_fully_implemented) { +/** + * This test should be the last to run in the suit, which is why its name is prefixed with "z". + */ +TEST_F(Events, z_service_fully_implemented) { std::vector missing_rpcs{"GetEvents"}; ASSERT_TRUE(all_rpc_called("Events", missing_rpcs)); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp index 79ae2b37d..669ecc32e 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -138,4 +138,4 @@ TEST_F(MockFixture, connect) { ASSERT_NO_THROW(response = client.create_session(task_options)); ASSERT_FALSE(response.empty()); ASSERT_TRUE(rpcCalled("Sessions", "CreateSession")); -} \ No newline at end of file +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp index c57a43fc5..333c49dd7 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/PartitionsClientTest.cpp @@ -56,4 +56,7 @@ TEST_F(Partitions, can_list_partitions) { ASSERT_TRUE(rpcCalled("Partitions", "ListPartitions")); } -// TEST_F(MockFixture, partitions_service_fully_implemented) { all_rpc_called("Partitions"); } +/** + * This test should be the last to run in the suit, which is why its name is prefixed with "z". + */ +TEST_F(Partitions, z_service_fully_implemented) { all_rpc_called("Partitions"); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp index 123556abb..4b798f776 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ResultsClientTest.cpp @@ -174,7 +174,11 @@ TEST_F(Results, test_results_upload_download) { ASSERT_EQ(client.download_result_data(session_id, map.at("0")), "TestPayload"); } -// TEST_F(Results, result_service_fully_implemented) { -// std::vector missing_rpcs{"DeleteResultsData", "DownloadResultData", "GetOwnerTaskId", "GetResult", -// "GetServiceConfiguration", "UploadResultData", "WatchResults"}; ASSERT_TRUE(all_rpc_called("Results", missing_rpcs)); -// } +/** + * This test should be the last to run in the suit, which is why its name is prefixed with "z". + */ +TEST_F(Results, z_service_fully_implemented) { + std::vector missing_rpcs{"DeleteResultsData", "DownloadResultData", "GetOwnerTaskId", "GetResult", + "GetServiceConfiguration", "UploadResultData", "WatchResults"}; + ASSERT_TRUE(all_rpc_called("Results", missing_rpcs)); +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp index db8b2d795..657d9a1e9 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/SessionClientTest.cpp @@ -217,4 +217,7 @@ TEST_F(Sessions, can_close_session) { ASSERT_TRUE(rpcCalled("Sessions", "CloseSession", 2)); } -// TEST_F(Sessions, session_service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Sessions")); } +/** + * This test should be the last to run in the suit, which is why its name is prefixed with "z". + */ +TEST_F(Sessions, z_service_fully_implemented) { ASSERT_TRUE(all_rpc_called("Sessions")); } diff --git a/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp index 00ff89836..52c7a505d 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/TasksClientTest.cpp @@ -213,6 +213,10 @@ TEST_F(Tasks, list_tasks_detailed_test) { ASSERT_TRUE(rpcCalled("Tasks", "ListTasksDetailed")); } -// TEST_F(MockFixture, task_service_fully_implemented) { -// std::vector missing_rpcs{"CancelTasks", "ListTasks", "ListTasksDetailed"}; -// ASSERT_TRUE(all_rpc_called("Tasks", missing_rpcs)); } +/** + * This test should be the last to run in the suit, which is why its name is prefixed with "z". + */ +TEST_F(Tasks, z_service_fully_implemented) { + std::vector missing_rpcs{"CancelTasks", "ListTasks", "ListTasksDetailed"}; + ASSERT_TRUE(all_rpc_called("Tasks", missing_rpcs)); +} diff --git a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp index cdd57449b..90f5b9c0a 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/VersionsClientTest.cpp @@ -30,4 +30,7 @@ TEST_F(Versions, can_list_versions) { ASSERT_TRUE(rpcCalled("Versions", "ListVersions")); } -// TEST_F(MockFixture, version_service_fully_implemented) { all_rpc_called("Versions"); } +/** + * This test should be the last to run in the suit, which is why its name is prefixed with "z". + */ +TEST_F(Versions, z_service_fully_implemented) { all_rpc_called("Versions"); } From d749f1960b809718b93e41cd18311c7ad59d2b13 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 9 Sep 2024 12:13:45 +0200 Subject: [PATCH 311/344] Fix worker build for alpine --- packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt index 9f0821f53..4a1523e48 100644 --- a/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Worker/CMakeLists.txt @@ -33,7 +33,8 @@ endif() find_package(gRPC CONFIG REQUIRED) find_package(Threads) -target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++_unsecure ArmoniK.Api.Common ${PROTO_TARGET}) +target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++ ArmoniK.Api.Common ${PROTO_TARGET}) +target_link_options(${PROJECT_NAME} PUBLIC "-Wl,--copy-dt-needed-entries") target_include_directories(${PROJECT_NAME} PUBLIC From ce74217d806facf5b91b4bcf205ff9eb54afb785 Mon Sep 17 00:00:00 2001 From: Nicolas Gruel Date: Tue, 10 Sep 2024 09:44:46 +0200 Subject: [PATCH 312/344] chore: create version 3.21.0 --- .../aneoconsultingfr/armonik.api.angular/package.json | 2 +- packages/cpp/CMakeLists.txt | 2 +- .../ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj | 4 ++-- .../ArmoniK.Api.Common.Channel.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj | 4 ++-- .../csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj | 4 ++-- packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj | 4 ++-- packages/web/package.json | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json index 2ede19484..0a0ef39e3 100644 --- a/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json +++ b/packages/angular/projects/aneoconsultingfr/armonik.api.angular/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api.angular", - "version": "3.20.0", + "version": "3.21.0", "description": "gRPC API to interact with ArmoniK built for Angular", "license": "Apache-2.0", "homepage": "https://github.com/aneoconsulting/ArmoniK.Api#readme", diff --git a/packages/cpp/CMakeLists.txt b/packages/cpp/CMakeLists.txt index 52916778d..4f2a366af 100644 --- a/packages/cpp/CMakeLists.txt +++ b/packages/cpp/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) if (POLICY CMP0135) cmake_policy(SET CMP0135 OLD) endif () -set(version 3.20.0) +set(version 3.21.0) string(REGEX MATCHALL "[0-9]+" version_list ${version}) list(GET version_list 0 version_major) list(GET version_list 1 version_minor) diff --git a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj index d58613bb3..b8f03cdc7 100644 --- a/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Client.Test/ArmoniK.Api.Client.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.20.0 - 3.20.0 + 3.21.0 + 3.21.0 enable diff --git a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj index eb5c71319..2059af2b0 100644 --- a/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj +++ b/packages/csharp/ArmoniK.Api.Client/ArmoniK.Api.Client.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.20.0 - 3.20.0 + 3.21.0 + 3.21.0 True diff --git a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj index 0f8ec4e5d..2dd059c97 100644 --- a/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj +++ b/packages/csharp/ArmoniK.Api.Common.Channel/ArmoniK.Api.Common.Channel.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - 3.20.0 - 3.20.0 + 3.21.0 + 3.21.0 ../publish True True diff --git a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj index b1dbc3ac0..b33ccad13 100755 --- a/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj +++ b/packages/csharp/ArmoniK.Api.Common/ArmoniK.Api.Common.csproj @@ -14,8 +14,8 @@ enable ../kp.snk true - 3.20.0 - 3.20.0 + 3.21.0 + 3.21.0 True diff --git a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj index bff023a18..769dd499e 100644 --- a/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj +++ b/packages/csharp/ArmoniK.Api.Core/ArmoniK.Api.Core.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.20.0 - 3.20.0 + 3.21.0 + 3.21.0 True True diff --git a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj index 2c651e6f5..8de682a2a 100644 --- a/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj +++ b/packages/csharp/ArmoniK.Api.Mock/ArmoniK.Api.Mock.csproj @@ -14,8 +14,8 @@ true snupkg ../kp.snk - 3.20.0 - 3.20.0 + 3.21.0 + 3.21.0 True diff --git a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj index f1ed44ede..81746bcfa 100644 --- a/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj +++ b/packages/csharp/ArmoniK.Api.Tests/ArmoniK.Api.Worker.Tests.csproj @@ -9,8 +9,8 @@ true Embedded true - 3.20.0 - 3.20.0 + 3.21.0 + 3.21.0 diff --git a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj index a5d471a04..97333af55 100644 --- a/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj +++ b/packages/csharp/ArmoniK.Api.Worker/ArmoniK.Api.Worker.csproj @@ -16,8 +16,8 @@ true snupkg ../kp.snk - 3.20.0 - 3.20.0 + 3.21.0 + 3.21.0 True True diff --git a/packages/web/package.json b/packages/web/package.json index a903e97ec..36ee298aa 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@aneoconsultingfr/armonik.api", - "version": "3.20.0", + "version": "3.21.0", "packageManager": "pnpm@9.1.4", "description": "gRPC API to interact with ArmoniK built for the web", "license": "Apache-2.0", From 37188cd339dd2e2c000fbd21a543f30db25a3558 Mon Sep 17 00:00:00 2001 From: sboukhetta Date: Wed, 11 Sep 2024 16:11:40 +0200 Subject: [PATCH 313/344] Handle versions for java --- scripts/update-versions.ts | 5 +++++ scripts/verify-versions.ts | 4 ++++ scripts/versions/_contants.ts | 3 +++ 3 files changed, 12 insertions(+) diff --git a/scripts/update-versions.ts b/scripts/update-versions.ts index 05a55f902..ec9ee28f6 100644 --- a/scripts/update-versions.ts +++ b/scripts/update-versions.ts @@ -9,6 +9,8 @@ import { csharpPatternVersion, jsFiles, jsPattern, + javaFiles, + javaPattern, } from './versions/_contants' const [, , ...args] = process.argv @@ -36,3 +38,6 @@ jsFiles.forEach(_readAndReplace(jsPattern, `"version": "${version}"`)) consola.info('Updating cpp projects to ', version) cppFiles.forEach(_readAndReplace(cppPattern, `set(version ${version})`)) + +consola.info('Updating java projects to ', version) +javaFiles.forEach(_readAndReplace(javaPattern, `${version}`)) diff --git a/scripts/verify-versions.ts b/scripts/verify-versions.ts index ae7b4ef02..9b0660c96 100644 --- a/scripts/verify-versions.ts +++ b/scripts/verify-versions.ts @@ -8,6 +8,8 @@ import { csharpPatternVersion, jsFiles, jsPattern, + javaFiles, + javaPattern, } from './versions/_contants' import { _readAndFind } from './versions/_readAndFind' @@ -22,6 +24,8 @@ consola.info('Finding C# projects versions') csharpFiles.forEach(_readAndFind(csharpPatternVersion, versions)) consola.info('Finding Cpp projects versions') cppFiles.forEach(_readAndFind(cppPattern, versions)) +consola.info('Finding java projects versions') +javaFiles.forEach(_readAndFind(javaPattern, versions)) const versionsArray = [...versions.values()] const uniqueVersions = [...new Set(versionsArray)] diff --git a/scripts/versions/_contants.ts b/scripts/versions/_contants.ts index 268e4bb8d..8dd403904 100644 --- a/scripts/versions/_contants.ts +++ b/scripts/versions/_contants.ts @@ -12,3 +12,6 @@ export const jsFiles = ['packages/angular/projects/aneoconsultingfr/armonik.api. export const cppPattern = /set\(version (?.*)\)/ export const cppFiles = ['packages/cpp/CMakeLists.txt'] + +export const javaPattern = /(?.*)<\/version>/ +export const javaFiles = ['packages/java/pom.xml'] From fc0eaac77187f6544b60fbc5be618577290db4aa Mon Sep 17 00:00:00 2001 From: sboukhetta Date: Wed, 11 Sep 2024 16:41:58 +0200 Subject: [PATCH 314/344] Fix: correct java version and lintJS --- packages/java/pom.xml | 2 +- scripts/update-versions.ts | 4 ++-- scripts/verify-versions.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/java/pom.xml b/packages/java/pom.xml index 9508a3dde..d7ed30526 100644 --- a/packages/java/pom.xml +++ b/packages/java/pom.xml @@ -7,7 +7,7 @@ fr.aneo armonik-java GRPC java binding for the Armonik orchestrator API - 3.19.0 + 3.21.0 armonik-java https://github.com/aneoconsulting/ArmoniK.Api diff --git a/scripts/update-versions.ts b/scripts/update-versions.ts index ec9ee28f6..01f6fd26d 100644 --- a/scripts/update-versions.ts +++ b/scripts/update-versions.ts @@ -7,10 +7,10 @@ import { csharpFiles, csharpPatternPackageVersion, csharpPatternVersion, - jsFiles, - jsPattern, javaFiles, javaPattern, + jsFiles, + jsPattern, } from './versions/_contants' const [, , ...args] = process.argv diff --git a/scripts/verify-versions.ts b/scripts/verify-versions.ts index 9b0660c96..dc51ada28 100644 --- a/scripts/verify-versions.ts +++ b/scripts/verify-versions.ts @@ -6,10 +6,10 @@ import { csharpFiles, csharpPatternPackageVersion, csharpPatternVersion, - jsFiles, - jsPattern, javaFiles, javaPattern, + jsFiles, + jsPattern, } from './versions/_contants' import { _readAndFind } from './versions/_readAndFind' From 6a60974f9add26006c1903f721849d1d66058a3f Mon Sep 17 00:00:00 2001 From: Junior Dongo Date: Fri, 13 Sep 2024 11:44:43 +0200 Subject: [PATCH 315/344] fix package version not set --- .github/workflows/publish-edge.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-edge.yml b/.github/workflows/publish-edge.yml index 46da5378e..78f560c6b 100644 --- a/.github/workflows/publish-edge.yml +++ b/.github/workflows/publish-edge.yml @@ -271,7 +271,9 @@ jobs: gpg-private-key: ${{ secrets.GPG_SIGNING_KEY }} gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Publish package - run: mvn --batch-mode deploy versions:set -DnewVersion=${{ needs.version.outputs.version }} + run: | + mvn versions:set -DnewVersion=${{ needs.version.outputs.version }} + mvn --batch-mode deploy -DskipTests env: MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} From 21640117bafcf428223a1e6ffeba564334101f03 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 16 Sep 2024 09:11:04 +0200 Subject: [PATCH 316/344] Handle event stream reading --- .../source/events/EventsClient.cpp | 95 +++++++++++-------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp index 84ffe4e81..1f9bd52d2 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp @@ -1,3 +1,5 @@ +#include + #include "events/EventsClient.h" #include "events_common.pb.h" #include "events_service.grpc.pb.h" @@ -16,63 +18,82 @@ namespace client { void EventsClient::wait_for_result_availability(std::string session_id, std::vector result_ids) { ::grpc::ClientContext context; + // context.set_deadline(std::chrono::system_clock::now() + std::chrono::seconds(30)); EventSubscriptionRequest request; EventSubscriptionResponse response; armonik::api::grpc::v1::results::Filters filters; - armonik::api::grpc::v1::results::FilterField filter_field; - filter_field.mutable_field()->mutable_result_raw_field()->set_field( - armonik::api::grpc::v1::results::RESULT_RAW_ENUM_FIELD_RESULT_ID); - filter_field.mutable_filter_string()->set_operator_(grpc::v1::FILTER_STRING_OPERATOR_EQUAL); + for (auto &&result_id : result_ids) { + armonik::api::grpc::v1::results::FilterField filter_field; + filter_field.mutable_field()->mutable_result_raw_field()->set_field( + armonik::api::grpc::v1::results::RESULT_RAW_ENUM_FIELD_RESULT_ID); + filter_field.mutable_filter_string()->set_operator_(grpc::v1::FILTER_STRING_OPERATOR_EQUAL); filter_field.mutable_filter_string()->set_value(result_id); *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; } *request.mutable_session_id() = std::move(session_id); *request.mutable_results_filters() = filters; - request.add_returned_events(static_cast(EventSubscriptionResponse::UpdateCase::kResultStatusUpdate)); - request.add_returned_events(static_cast(EventSubscriptionResponse::UpdateCase::kNewResult)); + request.mutable_returned_events()->Add(EventsEnum::EVENTS_ENUM_RESULT_STATUS_UPDATE); + request.mutable_returned_events()->Add(EventsEnum::EVENTS_ENUM_NEW_RESULT); + // request.add_returned_events(static_cast(EventSubscriptionResponse::UpdateCase::kResultStatusUpdate)); + // request.add_returned_events(static_cast(EventSubscriptionResponse::UpdateCase::kNewResult)); + + for (const auto &event : request.returned_events()) { + std::cout << "Captured event: " << static_cast(event) << std::endl; + } auto stream = stub->GetEvents(&context, request); if (!stream) { - throw armonik::api::common::exceptions::ArmoniKApiException("Result has been aborted"); + throw armonik::api::common::exceptions::ArmoniKApiException("Could not get events "); } while (stream->Read(&response)) { - std::string update_or_new; - switch (response.update_case()) { - case EventSubscriptionResponse::UpdateCase::kResultStatusUpdate: - switch (response.mutable_result_status_update()->status()) { - case ResultStatus::RESULT_STATUS_COMPLETED: - update_or_new = response.mutable_result_status_update()->result_id(); - break; - case ResultStatus::RESULT_STATUS_ABORTED: - throw armonik::api::common::exceptions::ArmoniKApiException("Result has been aborted"); - default: - break; - } - break; - case EventSubscriptionResponse::UpdateCase::kNewResult: - switch (response.mutable_new_result()->status()) { - case ResultStatus::RESULT_STATUS_COMPLETED: - update_or_new = response.mutable_new_result()->result_id(); - break; - case ResultStatus::RESULT_STATUS_ABORTED: - throw armonik::api::common::exceptions::ArmoniKApiException("Result has been aborted"); - default: - break; + try { + std::cout << response.DebugString() << std::endl; + std::string update_or_new; + if (response.update_case() == EventSubscriptionResponse::UpdateCase::kResultStatusUpdate) { + std::cout << "Result update case completed " << std::endl; + if (response.mutable_result_status_update()->status() == ResultStatus::RESULT_STATUS_COMPLETED) { + update_or_new = response.mutable_result_status_update()->result_id(); + std::cout << "Result update case completed " << std::endl; + printf("f Result update case completed "); + // if (!update_or_new.empty()) { + result_ids.erase( + std::remove(result_ids.begin(), result_ids.end(), response.mutable_result_status_update()->result_id()), + result_ids.end()); + if (result_ids.empty()) { + break; + } + //} + } + if (response.mutable_result_status_update()->status() == ResultStatus::RESULT_STATUS_ABORTED) { + throw armonik::api::common::exceptions::ArmoniKApiException( + "Result " + response.mutable_result_status_update()->result_id() + " has been aborted"); + } } - break; - default: - break; - } - if (!update_or_new.empty()) { - result_ids.erase(std::remove(result_ids.begin(), result_ids.end(), update_or_new), result_ids.end()); - if (result_ids.empty()) { - break; + if (response.update_case() == EventSubscriptionResponse::UpdateCase::kNewResult) { + if (response.mutable_new_result()->status() == ResultStatus::RESULT_STATUS_COMPLETED) { + update_or_new = response.mutable_new_result()->result_id(); + std::cout << "New result case completed " << std::endl; + // if (!update_or_new.empty()) { + result_ids.erase( + std::remove(result_ids.begin(), result_ids.end(), response.mutable_new_result()->result_id()), + result_ids.end()); + if (result_ids.empty()) { + break; + } + // } + if (response.mutable_new_result()->status() == ResultStatus::RESULT_STATUS_ABORTED) { + throw armonik::api::common::exceptions::ArmoniKApiException( + "Result " + response.mutable_new_result()->result_id() + " has been aborted"); + } + } } + } catch (const std::exception &e) { + std::cerr << "Error while reading event response: " << e.what() << std::endl; } } } From 69ef9ad5e5f804ff4e271bf9d9e993413c5ada65 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 23 Sep 2024 11:26:37 +0200 Subject: [PATCH 317/344] Using the right enum --- .../source/events/EventsClient.cpp | 74 ++++++++----------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp index 1f9bd52d2..3c71def7f 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp @@ -18,18 +18,17 @@ namespace client { void EventsClient::wait_for_result_availability(std::string session_id, std::vector result_ids) { ::grpc::ClientContext context; - // context.set_deadline(std::chrono::system_clock::now() + std::chrono::seconds(30)); EventSubscriptionRequest request; EventSubscriptionResponse response; armonik::api::grpc::v1::results::Filters filters; + armonik::api::grpc::v1::results::FilterField filter_field; + filter_field.mutable_field()->mutable_result_raw_field()->set_field( + armonik::api::grpc::v1::results::RESULT_RAW_ENUM_FIELD_RESULT_ID); + filter_field.mutable_filter_string()->set_operator_(grpc::v1::FILTER_STRING_OPERATOR_EQUAL); for (auto &&result_id : result_ids) { - armonik::api::grpc::v1::results::FilterField filter_field; - filter_field.mutable_field()->mutable_result_raw_field()->set_field( - armonik::api::grpc::v1::results::RESULT_RAW_ENUM_FIELD_RESULT_ID); - filter_field.mutable_filter_string()->set_operator_(grpc::v1::FILTER_STRING_OPERATOR_EQUAL); filter_field.mutable_filter_string()->set_value(result_id); *filters.mutable_or_()->Add()->mutable_and_()->Add() = filter_field; } @@ -38,12 +37,6 @@ void EventsClient::wait_for_result_availability(std::string session_id, std::vec *request.mutable_results_filters() = filters; request.mutable_returned_events()->Add(EventsEnum::EVENTS_ENUM_RESULT_STATUS_UPDATE); request.mutable_returned_events()->Add(EventsEnum::EVENTS_ENUM_NEW_RESULT); - // request.add_returned_events(static_cast(EventSubscriptionResponse::UpdateCase::kResultStatusUpdate)); - // request.add_returned_events(static_cast(EventSubscriptionResponse::UpdateCase::kNewResult)); - - for (const auto &event : request.returned_events()) { - std::cout << "Captured event: " << static_cast(event) << std::endl; - } auto stream = stub->GetEvents(&context, request); if (!stream) { @@ -52,44 +45,39 @@ void EventsClient::wait_for_result_availability(std::string session_id, std::vec while (stream->Read(&response)) { try { - std::cout << response.DebugString() << std::endl; std::string update_or_new; - if (response.update_case() == EventSubscriptionResponse::UpdateCase::kResultStatusUpdate) { - std::cout << "Result update case completed " << std::endl; - if (response.mutable_result_status_update()->status() == ResultStatus::RESULT_STATUS_COMPLETED) { + switch (response.update_case()) { + case EventSubscriptionResponse::UpdateCase::kResultStatusUpdate: + switch (response.mutable_result_status_update()->status()) { + case ResultStatus::RESULT_STATUS_COMPLETED: update_or_new = response.mutable_result_status_update()->result_id(); - std::cout << "Result update case completed " << std::endl; - printf("f Result update case completed "); - // if (!update_or_new.empty()) { - result_ids.erase( - std::remove(result_ids.begin(), result_ids.end(), response.mutable_result_status_update()->result_id()), - result_ids.end()); - if (result_ids.empty()) { - break; - } - //} - } - if (response.mutable_result_status_update()->status() == ResultStatus::RESULT_STATUS_ABORTED) { + break; + case ResultStatus::RESULT_STATUS_ABORTED: throw armonik::api::common::exceptions::ArmoniKApiException( "Result " + response.mutable_result_status_update()->result_id() + " has been aborted"); + default: + break; } - } - if (response.update_case() == EventSubscriptionResponse::UpdateCase::kNewResult) { - if (response.mutable_new_result()->status() == ResultStatus::RESULT_STATUS_COMPLETED) { + break; + case EventSubscriptionResponse::UpdateCase::kNewResult: + switch (response.mutable_new_result()->status()) { + case ResultStatus::RESULT_STATUS_COMPLETED: update_or_new = response.mutable_new_result()->result_id(); - std::cout << "New result case completed " << std::endl; - // if (!update_or_new.empty()) { - result_ids.erase( - std::remove(result_ids.begin(), result_ids.end(), response.mutable_new_result()->result_id()), - result_ids.end()); - if (result_ids.empty()) { - break; - } - // } - if (response.mutable_new_result()->status() == ResultStatus::RESULT_STATUS_ABORTED) { - throw armonik::api::common::exceptions::ArmoniKApiException( - "Result " + response.mutable_new_result()->result_id() + " has been aborted"); - } + break; + case ResultStatus::RESULT_STATUS_ABORTED: + throw armonik::api::common::exceptions::ArmoniKApiException( + "Result " + response.mutable_new_result()->result_id() + " has been aborted"); + default: + break; + } + break; + default: + break; + } + if (!update_or_new.empty()) { + result_ids.erase(std::remove(result_ids.begin(), result_ids.end(), update_or_new), result_ids.end()); + if (result_ids.empty()) { + break; } } } catch (const std::exception &e) { From a3232a0505c766bae41524ec6c0375c2bf3bdf0f Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 23 Sep 2024 13:46:28 +0200 Subject: [PATCH 318/344] Remove unused haeder --- packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp index 3c71def7f..f224a0d3e 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/events/EventsClient.cpp @@ -1,5 +1,3 @@ -#include - #include "events/EventsClient.h" #include "events_common.pb.h" #include "events_service.grpc.pb.h" From 26e6cb7e2f10a92c292c18b90a945a34aa3d7ae7 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 30 Sep 2024 17:07:59 +0200 Subject: [PATCH 319/344] Using string_view instead of const string reference --- .../source/channel/ChannelFactory.cpp | 13 ++++++----- .../cpp/ArmoniK.Api.Tests/header/common.h | 10 ++++---- .../cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 23 +++++++++---------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp index e7090d539..e2155367b 100644 --- a/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp +++ b/packages/cpp/ArmoniK.Api.Client/source/channel/ChannelFactory.cpp @@ -108,17 +108,18 @@ bool initialize_protocol_endpoint(const common::options::ControlPlane &controlPl * @param userPrivatePem The client key for mTLS * @return a pointer to a certificate provider interface */ -std::shared_ptr create_certificate_provider(const std::string &rootCertificate, - const std::string &userPublicPem, - const std::string &userPrivatePem) { +std::shared_ptr create_certificate_provider(absl::string_view rootCertificate, + absl::string_view userPublicPem, + absl::string_view userPrivatePem) { if (rootCertificate.empty()) { return std::make_shared( - std::vector{IdentityKeyCertPair{userPrivatePem, userPublicPem}}); + std::vector{IdentityKeyCertPair{userPrivatePem.data(), userPublicPem.data()}}); } else if (userPrivatePem.empty() || userPublicPem.empty()) { - return std::make_shared(rootCertificate); + return std::make_shared(rootCertificate.data()); } else { return std::make_shared( - rootCertificate, std::vector{IdentityKeyCertPair{userPrivatePem, userPublicPem}}); + rootCertificate.data(), + std::vector{IdentityKeyCertPair{userPrivatePem.data(), userPublicPem.data()}}); } } diff --git a/packages/cpp/ArmoniK.Api.Tests/header/common.h b/packages/cpp/ArmoniK.Api.Tests/header/common.h index a5b519e25..f763a1079 100644 --- a/packages/cpp/ArmoniK.Api.Tests/header/common.h +++ b/packages/cpp/ArmoniK.Api.Tests/header/common.h @@ -23,8 +23,8 @@ void init(std::shared_ptr &channel, armonik::api::grpc::v1::TaskO * @param num_calls the number of call of rpc * @return */ -bool rpcCalled(const std::string &service_name, const std::string &rpc_name, int num_calls = 1, - const std::string &endpoint = "http://localhost:4999/calls.json"); +bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int num_calls = 1, + absl::string_view endpoint = "http://localhost:4999/calls.json"); /** * @@ -32,14 +32,14 @@ bool rpcCalled(const std::string &service_name, const std::string &rpc_name, int * @param endpoint the call endpoint * @return */ -bool all_rpc_called(const std::string &service_name, const std::vector &missings = {}, - const std::string &endpoint = "http://localhost:4999/calls.json"); +bool all_rpc_called(absl::string_view service_name, const std::vector &missings = {}, + absl::string_view endpoint = "http://localhost:4999/calls.json"); /** * * @param endpoint The reset endpoint */ -void clean_up(const std::string &endpoint = "http://localhost:4999/reset"); +void clean_up(absl::string_view endpoint = "http://localhost:4999/reset"); /** * A fixture class to reset the RPC calls diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp index 669ecc32e..a874dec70 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -20,14 +20,13 @@ size_t WriteCallback(void *ptr, size_t size, size_t num_elt, std::string *data) return size * num_elt; } -bool rpcCalled(const std::string &service_name, const std::string &rpc_name, int num_calls, - const std::string &endpoint) { +bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int num_calls, absl::string_view endpoint) { auto curl = curl_easy_init(); std::string read_buffer; std::cout << endpoint << std::endl; if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, endpoint.c_str()); + curl_easy_setopt(curl, CURLOPT_URL, endpoint.data()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer); @@ -43,7 +42,7 @@ bool rpcCalled(const std::string &service_name, const std::string &rpc_name, int try { dom::element response_json = parser.parse(read_buffer); - if (response_json[service_name][rpc_name].get_int64() == num_calls) { + if (response_json[service_name.data()][rpc_name.data()].get_int64() == num_calls) { return true; } } catch (const simdjson_error &e) { @@ -53,13 +52,13 @@ bool rpcCalled(const std::string &service_name, const std::string &rpc_name, int return false; } -bool all_rpc_called(const std::string &service_name, const std::vector &missings, - const std::string &endpoint) { +bool all_rpc_called(absl::string_view service_name, const std::vector &missings, + absl::string_view endpoint) { auto curl = curl_easy_init(); std::string read_buffer; std::cout << endpoint << std::endl; if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, endpoint.c_str()); + curl_easy_setopt(curl, CURLOPT_URL, endpoint.data()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer); @@ -76,11 +75,11 @@ bool all_rpc_called(const std::string &service_name, const std::vector missing_rpcs; - for (auto rpc_name : response_json[service_name].get_array()) { - if (response_json[service_name][rpc_name].get_int64() == 0) { + for (auto rpc_name : response_json[service_name.data()].get_array()) { + if (response_json[service_name.data()][rpc_name].get_int64() == 0) { missing_rpcs.emplace_back(rpc_name.get_string().value().data()); } } @@ -101,11 +100,11 @@ bool all_rpc_called(const std::string &service_name, const std::vector Date: Tue, 27 Aug 2024 19:17:35 +0200 Subject: [PATCH 320/344] Add Mock server test for cpp --- .github/workflows/ci.yml | 28 ++++++++++++- packages/cpp/ArmoniK.Api.Tests/Dockerfile | 50 +++++++++++++++++++++++ packages/cpp/tools/run_test.sh | 5 +++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 packages/cpp/ArmoniK.Api.Tests/Dockerfile create mode 100644 packages/cpp/tools/run_test.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 89c98a0d7..efea7efe7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -360,7 +360,7 @@ jobs: name: code-coverage-report-xml path: packages/python/coverage.xml - build-cpp-packages: + build-test-cpp: strategy: fail-fast: false matrix: @@ -384,6 +384,32 @@ jobs: path: packages/cpp/tools/packaging/*.${{ matrix.type }} name: libarmonik.${{ matrix.type }} + - name: Install .NET Core + uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 + with: + dotnet-version: 8.x + + - name: Build Mock server + working-directory: packages/csharp/ArmoniK.Api.Mock + shell: bash + run: | + dotnet publish -o ../out + [ -e ../out/ArmoniK.Api.Mock.exe ] || ln -s ArmoniK.Api.Mock ../out/ArmoniK.Api.Mock.exe + + - name: Build and Run Test + working-directory: packages/csharp/ + shell: bash + run: | + set +e + set -x + ./out/ArmoniK.Api.Mock.exe \ + grpc:port=5000 http:port=4999 \ + sleep 5 + + cd ../cpp/tools + ./run_test.sh + docker run --rm -t --network host -e Grpc__EndPoint=http://localhost:5000 + build-java-packages: name: Build Java runs-on: ubuntu-latest diff --git a/packages/cpp/ArmoniK.Api.Tests/Dockerfile b/packages/cpp/ArmoniK.Api.Tests/Dockerfile new file mode 100644 index 000000000..d255cf082 --- /dev/null +++ b/packages/cpp/ArmoniK.Api.Tests/Dockerfile @@ -0,0 +1,50 @@ +# Start with the latest Alpine base image for the build stage +FROM alpine:3.18.6 AS builder + +# Install all the necessary dependencies required for the build process +# These include tools and libraries for building and compiling the source code +RUN apk update && apk add --no-cache \ + git \ + gcc \ + g++ \ + build-base \ + libtool \ + curl \ + c-ares \ + c-ares-dev \ + make \ + cmake \ + linux-headers \ + grpc \ + grpc-dev \ + protobuf \ + protobuf-dev + +# Set environment variables for protobuf +ENV protobuf_BUILD_TESTS=OFF + +# Update PATH with the new directories +ENV PATH="/app/install/lib:$PATH" +ENV PATH="/app/install/bin:$PATH" + +# Print the PATH variable +RUN echo $PATH + +# Copy the application source files into the image +WORKDIR /app/source +COPY packages/cpp/tools/packaging/common/. ./tools/packaging/common/ +COPY Protos/V1/. ./Protos/ +COPY packages/cpp/ArmoniK.Api.Common/. ./ArmoniK.Api.Common/ +COPY packages/cpp/ArmoniK.Api.Client/. ./ArmoniK.Api.Client/ +COPY packages/cpp/ArmoniK.Api.Tests/. ./ArmoniK.Api.Tests/ +COPY packages/cpp/CMakeLists.txt . +COPY packages/cpp/Packaging.cmake . +COPY packages/cpp/Dependencies.cmake . + +WORKDIR /app/build +RUN cmake -DCMAKE_BUILD_TYPE=Debug -DPROTO_FILES_DIR=/app/source/Protos -DCMAKE_INSTALL_PREFIX=/app/install -DBUILD_WORKER=OFF -DBUILD_TEST=ON /app/source/ && make -j $(nproc) install +# Set the default command to build the client using CMake and make +# CMD ["sh", "-c", "cmake -DCMAKE_BUILD_TYPE=Debug -DPROTO_FILES_DIR=/app/proto -DCMAKE_INSTALL_PREFIX=/app/install -DBUILD_TEST=OFF /app/source/ -DCPACK_GENERATOR=TGZ && make -j $(nproc) install && make package -j"] + +# Uncomment the line below if you want the container to start in the bash shell by default +ENTRYPOINT ["/app/install/bin/ArmoniK.Api.Tests"] diff --git a/packages/cpp/tools/run_test.sh b/packages/cpp/tools/run_test.sh new file mode 100644 index 000000000..266d6b7d6 --- /dev/null +++ b/packages/cpp/tools/run_test.sh @@ -0,0 +1,5 @@ +script_path="$(dirname "${BASH_SOURCE:-$0}")" +working_dir="$(realpath "${script_path}/../../../" )" +dockerfile="${1:-"${working_dir}/packages/cpp/ArmoniK.Api.Tests/Dockerfile"}" +image_tag="${2:-"armonik-api-cpp:0.1.0"}" +docker build --rm -t "$image_tag" -f "$dockerfile" --progress plain "$working_dir" \ No newline at end of file From feb0f3adc5cbfc8998c212357d4ce339720e2c50 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 28 Aug 2024 09:24:18 +0200 Subject: [PATCH 321/344] Fix linter --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index efea7efe7..e1169986a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -388,7 +388,7 @@ jobs: uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 with: dotnet-version: 8.x - + - name: Build Mock server working-directory: packages/csharp/ArmoniK.Api.Mock shell: bash @@ -408,7 +408,7 @@ jobs: cd ../cpp/tools ./run_test.sh - docker run --rm -t --network host -e Grpc__EndPoint=http://localhost:5000 + docker run --rm -t --network host -e Grpc__EndPoint=http://localhost:5000 "armonik-api-cpp:0.1.0" build-java-packages: name: Build Java From 08c6b28024bff688f6420e67eb228b7c5dcd7fa9 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 28 Aug 2024 09:47:50 +0200 Subject: [PATCH 322/344] Mock server with no tls --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1169986a..0a2768aa7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -404,6 +404,7 @@ jobs: set -x ./out/ArmoniK.Api.Mock.exe \ grpc:port=5000 http:port=4999 \ + & notls_pid=$! sleep 5 cd ../cpp/tools From 3c232addefb8f659723d30684c8552263f9cbad5 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 28 Aug 2024 09:55:21 +0200 Subject: [PATCH 323/344] Check image build --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a2768aa7..b1f9d2b05 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -409,6 +409,7 @@ jobs: cd ../cpp/tools ./run_test.sh + docker images docker run --rm -t --network host -e Grpc__EndPoint=http://localhost:5000 "armonik-api-cpp:0.1.0" build-java-packages: From af4a8daf502ee1b3e31268ae7a0f20e4b9798111 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 28 Aug 2024 09:57:46 +0200 Subject: [PATCH 324/344] Change script permission --- packages/cpp/tools/run_test.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 packages/cpp/tools/run_test.sh diff --git a/packages/cpp/tools/run_test.sh b/packages/cpp/tools/run_test.sh old mode 100644 new mode 100755 From 3c1137887ffd50e9cd59d692b0efadd3b2b6fd08 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 5 Sep 2024 15:55:03 +0200 Subject: [PATCH 325/344] Separate jobs for build and test --- .github/workflows/ci.yml | 30 +------------------------- .github/workflows/test.yml | 39 ++++++++++++++++++++++++++++++++++ packages/cpp/tools/run_test.sh | 2 +- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b1f9d2b05..89c98a0d7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -360,7 +360,7 @@ jobs: name: code-coverage-report-xml path: packages/python/coverage.xml - build-test-cpp: + build-cpp-packages: strategy: fail-fast: false matrix: @@ -384,34 +384,6 @@ jobs: path: packages/cpp/tools/packaging/*.${{ matrix.type }} name: libarmonik.${{ matrix.type }} - - name: Install .NET Core - uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 - with: - dotnet-version: 8.x - - - name: Build Mock server - working-directory: packages/csharp/ArmoniK.Api.Mock - shell: bash - run: | - dotnet publish -o ../out - [ -e ../out/ArmoniK.Api.Mock.exe ] || ln -s ArmoniK.Api.Mock ../out/ArmoniK.Api.Mock.exe - - - name: Build and Run Test - working-directory: packages/csharp/ - shell: bash - run: | - set +e - set -x - ./out/ArmoniK.Api.Mock.exe \ - grpc:port=5000 http:port=4999 \ - & notls_pid=$! - sleep 5 - - cd ../cpp/tools - ./run_test.sh - docker images - docker run --rm -t --network host -e Grpc__EndPoint=http://localhost:5000 "armonik-api-cpp:0.1.0" - build-java-packages: name: Build Java runs-on: ubuntu-latest diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index be2d764e2..1060fde1f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -131,3 +131,42 @@ jobs: name: ConnectivityTests ${{ matrix.platform.os }} ${{ matrix.dotnet.framework }} ${{ matrix.handler }} path: ./packages/csharp/ArmoniK.Api.Client.Test/TestResults/test-results.trx reporter: dotnet-trx + + cpp: + strategy: + fail-fast: false + name: Test C++ + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + ref: ${{ github.ref }} + + - name: Install .NET Core + uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 + with: + dotnet-version: 8.x + + - name: Build Mock server + working-directory: packages/csharp/ArmoniK.Api.Mock + shell: bash + run: | + dotnet publish -o ../out + [ -e ../out/ArmoniK.Api.Mock.exe ] || ln -s ArmoniK.Api.Mock ../out/ArmoniK.Api.Mock.exe + + - name: Build and Run Test + working-directory: packages/csharp/ + shell: bash + run: | + set +e + set -x + ./out/ArmoniK.Api.Mock.exe \ + grpc:port=5000 http:port=4999 \ + & notls_pid=$! + sleep 5 + + cd ../cpp/tools + ./run_test.sh + docker images + docker run --rm -t --network host -e Grpc__EndPoint=http://localhost:5000 "armonik-api-cpp:0.1.0" diff --git a/packages/cpp/tools/run_test.sh b/packages/cpp/tools/run_test.sh index 266d6b7d6..eec1ff249 100755 --- a/packages/cpp/tools/run_test.sh +++ b/packages/cpp/tools/run_test.sh @@ -2,4 +2,4 @@ script_path="$(dirname "${BASH_SOURCE:-$0}")" working_dir="$(realpath "${script_path}/../../../" )" dockerfile="${1:-"${working_dir}/packages/cpp/ArmoniK.Api.Tests/Dockerfile"}" image_tag="${2:-"armonik-api-cpp:0.1.0"}" -docker build --rm -t "$image_tag" -f "$dockerfile" --progress plain "$working_dir" \ No newline at end of file +docker build --rm -t "$image_tag" -f "$dockerfile" --progress plain "$working_dir" From 33bae6f2c3ca4aa525dc22d11de2b7c7bbb10e4d Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 5 Sep 2024 16:12:15 +0200 Subject: [PATCH 326/344] Add tls mtls servers in ci --- .github/workflows/test.yml | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1060fde1f..ea3126274 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -143,6 +143,21 @@ jobs: with: ref: ${{ github.ref }} + - name: Generate certs + working-directory: packages/cpp/ + shell: bash + run: | + mkdir certs + cd certs + ../../../scripts/certs.sh + - name: Install certs + working-directory: packages/cpp/certs + run: | + sudo apt install ca-certificates + sudo mkdir -p /usr/local/share/ca-certificates/ + sudo cp server2-ca.pem /usr/local/share/ca-certificates/ca.crt + sudo update-ca-certificate + - name: Install .NET Core uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 with: @@ -164,9 +179,17 @@ jobs: ./out/ArmoniK.Api.Mock.exe \ grpc:port=5000 http:port=4999 \ & notls_pid=$! + ./out/ArmoniK.Api.Mock.exe \ + grpc:port=5001 http:port=5001 \ + http:cert="$CertFolder/server1.pem" http:key="$CertFolder/server1.key" \ + & tls_pid=$! + ./out/ArmoniK.Api.Mock.exe \ + grpc:port=5003 http:port=5003 \ + http:cert="$CertFolder/server1.pem" http:key="$CertFolder/server1.key" http:clientcert="$CertFolder/client-ca.pem" \ + & mtls_pid=$! sleep 5 cd ../cpp/tools ./run_test.sh docker images - docker run --rm -t --network host -e Grpc__EndPoint=http://localhost:5000 "armonik-api-cpp:0.1.0" + docker run --rm -t --network host -e Grpc__EndPoint=localhost:5000 "armonik-api-cpp:0.1.0" From 2b27c58667ea75070dc2bcee4488f684b1b50dad Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 9 Sep 2024 16:44:13 +0200 Subject: [PATCH 327/344] Add curl to image --- packages/cpp/ArmoniK.Api.Tests/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/Dockerfile b/packages/cpp/ArmoniK.Api.Tests/Dockerfile index d255cf082..b2e766c92 100644 --- a/packages/cpp/ArmoniK.Api.Tests/Dockerfile +++ b/packages/cpp/ArmoniK.Api.Tests/Dockerfile @@ -18,7 +18,8 @@ RUN apk update && apk add --no-cache \ grpc \ grpc-dev \ protobuf \ - protobuf-dev + protobuf-dev \ + curl-dev # Set environment variables for protobuf ENV protobuf_BUILD_TESTS=OFF From 1d5d0e3475c304051341750fc0c936127986a342 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 12 Sep 2024 16:03:01 +0200 Subject: [PATCH 328/344] TLS and mTLS working ci --- .github/workflows/test.yml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ea3126274..b873d92c1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -150,13 +150,6 @@ jobs: mkdir certs cd certs ../../../scripts/certs.sh - - name: Install certs - working-directory: packages/cpp/certs - run: | - sudo apt install ca-certificates - sudo mkdir -p /usr/local/share/ca-certificates/ - sudo cp server2-ca.pem /usr/local/share/ca-certificates/ca.crt - sudo update-ca-certificate - name: Install .NET Core uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 @@ -191,5 +184,6 @@ jobs: cd ../cpp/tools ./run_test.sh - docker images - docker run --rm -t --network host -e Grpc__EndPoint=localhost:5000 "armonik-api-cpp:0.1.0" + docker run --rm -t --network host -e Grpc__EndPoint=localhost:5000 -e Http__EndPoint="localhost:4999" "armonik-api-cpp:0.1.0" + docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5001 -e Http__EndPoint="https://localhost:5001" -e Grpc__CaCert="/app/source/certs/server1-ca.pem" "armonik-api-cpp:0.1.0" + docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5003 -e Http__EndPoint="https://localhost:5003" -e Grpc__SSLValidation="enable" -e Grpc__mTLS="true" -e Grpc__CaCert="/app/source/certs/server1.pem" -e Grpc__ClientCert="/app/source/certs/client.pem" -e Grpc__ClientKey="/app/source/certs/client.key" "armonik-api-cpp:0.1.0" From 3480a62d34b3476c2cf3b2adf2840a1e5a2de198 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 12 Sep 2024 16:05:12 +0200 Subject: [PATCH 329/344] Fix curl request for all tests unsecure tls mtls --- packages/cpp/ArmoniK.Api.Tests/Dockerfile | 1 + .../source/ChannelOptionsTest.cpp | 26 ++++++++++---- .../cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 35 +++++++++++++++---- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/Dockerfile b/packages/cpp/ArmoniK.Api.Tests/Dockerfile index b2e766c92..cea0fb358 100644 --- a/packages/cpp/ArmoniK.Api.Tests/Dockerfile +++ b/packages/cpp/ArmoniK.Api.Tests/Dockerfile @@ -41,6 +41,7 @@ COPY packages/cpp/ArmoniK.Api.Tests/. ./ArmoniK.Api.Tests/ COPY packages/cpp/CMakeLists.txt . COPY packages/cpp/Packaging.cmake . COPY packages/cpp/Dependencies.cmake . +COPY packages/cpp/certs ./certs/ WORKDIR /app/build RUN cmake -DCMAKE_BUILD_TYPE=Debug -DPROTO_FILES_DIR=/app/source/Protos -DCMAKE_INSTALL_PREFIX=/app/install -DBUILD_WORKER=OFF -DBUILD_TEST=ON /app/source/ && make -j $(nproc) install diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp index f7179c85b..19ff4b39d 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp @@ -1,4 +1,8 @@ +#include "channel/ChannelFactory.h" #include "common.h" +#include "logger/formatter.h" +#include "logger/logger.h" +#include "logger/writer.h" #include "options/ControlPlane.h" #include "utils/Configuration.h" #include @@ -7,6 +11,8 @@ #include "submitter/SubmitterClient.h" #include "utils/ChannelArguments.h" +using Logger = armonik::api::common::logger::Logger; + armonik::api::grpc::v1::TaskOptions default_task_options() { armonik::api::grpc::v1::TaskOptions default_task_options; default_task_options.mutable_options()->insert({"key1", "value1"}); @@ -32,11 +38,16 @@ size_t num_create_session_submitter = 0; class Options : public MockFixture {}; TEST_F(Options, no_options) { + Logger logger{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); std::string server_address = configuration.get("Grpc__EndPoint"); - auto channel = ::grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials()); + // auto args = armonik::api::common::utils::getChannelArguments(configuration); + // auto channel = ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), args); + armonik::api::client::ChannelFactory channel_factory(configuration, logger); + + auto channel = channel_factory.create_channel(); armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); ASSERT_NO_THROW(client.create_session(default_task_options(), {})); num_create_session_submitter++; @@ -44,12 +55,16 @@ TEST_F(Options, no_options) { } TEST_F(Options, default_options) { + Logger logger{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); std::string server_address = configuration.get("Grpc__EndPoint"); auto args = armonik::api::common::utils::getChannelArguments(configuration); - auto channel = ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), args); + // auto channel = ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), args); + armonik::api::client::ChannelFactory channel_factory(configuration, logger); + + auto channel = channel_factory.create_channel(); armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub(channel)); ASSERT_NO_THROW(client.create_session(default_task_options(), {})); num_create_session_submitter++; @@ -57,20 +72,19 @@ TEST_F(Options, default_options) { } TEST_F(Options, test_timeout) { + Logger logger{armonik::api::common::logger::writer_console(), armonik::api::common::logger::formatter_plain(true)}; armonik::api::common::utils::Configuration configuration; configuration.add_json_configuration("appsettings.json").add_env_configuration(); std::string server_address = configuration.get("Grpc__EndPoint"); configuration.set(armonik::api::common::options::ControlPlane::RequestTimeoutKey, "0:0:0.001"); // 1ms, way too short armonik::api::client::SubmitterClient client(armonik::api::grpc::v1::submitter::Submitter::NewStub( - ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), - armonik::api::common::utils::getChannelArguments(configuration)))); + armonik::api::client::ChannelFactory(configuration, logger).create_channel())); ASSERT_ANY_THROW(client.create_session(default_task_options(), {})); configuration.set(armonik::api::common::options::ControlPlane::RequestTimeoutKey, "0:0:10"); // 10s, should have finished by now client = armonik::api::client::SubmitterClient(armonik::api::grpc::v1::submitter::Submitter::NewStub( - ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), - armonik::api::common::utils::getChannelArguments(configuration)))); + armonik::api::client::ChannelFactory(configuration, logger).create_channel())); ASSERT_NO_THROW(client.create_session(default_task_options(), {})); num_create_session_submitter++; ASSERT_TRUE(rpcCalled("Submitter", "CreateSession", num_create_session_submitter)); diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp index a874dec70..efa46f009 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -22,11 +22,19 @@ size_t WriteCallback(void *ptr, size_t size, size_t num_elt, std::string *data) bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int num_calls, absl::string_view endpoint) { + armonik::api::common::utils::Configuration config; + config.add_json_configuration("appsettings.json").add_env_configuration(); + std::string call_endpoint = config.get("Http__EndPoint") + "/calls.json"; auto curl = curl_easy_init(); std::string read_buffer; std::cout << endpoint << std::endl; + std::cout << call_endpoint << std::endl; if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, endpoint.data()); + curl_easy_setopt(curl, CURLOPT_URL, call_endpoint.c_str()); + curl_easy_setopt(curl, CURLOPT_CAINFO, config.get("Grpc__CaCert").c_str()); + curl_easy_setopt(curl, CURLOPT_SSLCERT, config.get("Grpc__ClientCert").c_str()); + curl_easy_setopt(curl, CURLOPT_SSLKEY, config.get("Grpc__ClientKey").c_str()); + curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer); @@ -45,20 +53,28 @@ bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int n if (response_json[service_name.data()][rpc_name.data()].get_int64() == num_calls) { return true; } + std::cout << "Given number of RPC calls " << num_calls << std::endl; + std::cout << "Actual number of RPC calls " << response_json[service_name][rpc_name] << std::endl; } catch (const simdjson_error &e) { std::cerr << "Failed to parse JSON: " << e.what() << std::endl; } - return false; } bool all_rpc_called(absl::string_view service_name, const std::vector &missings, absl::string_view endpoint) { + armonik::api::common::utils::Configuration config; + config.add_json_configuration("appsettings.json").add_env_configuration(); + std::string call_endpoint = config.get("Http__EndPoint") + "/calls.json"; auto curl = curl_easy_init(); std::string read_buffer; std::cout << endpoint << std::endl; if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, endpoint.data()); + curl_easy_setopt(curl, CURLOPT_URL, call_endpoint.c_str()); + curl_easy_setopt(curl, CURLOPT_CAINFO, config.get("Grpc__CaCert").c_str()); + curl_easy_setopt(curl, CURLOPT_SSLCERT, config.get("Grpc__ClientCert").c_str()); + curl_easy_setopt(curl, CURLOPT_SSLKEY, config.get("Grpc__ClientKey").c_str()); + curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer); @@ -75,8 +91,6 @@ bool all_rpc_called(absl::string_view service_name, const std::vector missing_rpcs; for (auto rpc_name : response_json[service_name.data()].get_array()) { if (response_json[service_name.data()][rpc_name].get_int64() == 0) { @@ -100,12 +114,19 @@ bool all_rpc_called(absl::string_view service_name, const std::vector Date: Thu, 12 Sep 2024 16:21:25 +0200 Subject: [PATCH 330/344] Kill mock process --- .github/workflows/test.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b873d92c1..8680b67d8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -181,9 +181,12 @@ jobs: http:cert="$CertFolder/server1.pem" http:key="$CertFolder/server1.key" http:clientcert="$CertFolder/client-ca.pem" \ & mtls_pid=$! sleep 5 - + set -e cd ../cpp/tools ./run_test.sh docker run --rm -t --network host -e Grpc__EndPoint=localhost:5000 -e Http__EndPoint="localhost:4999" "armonik-api-cpp:0.1.0" docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5001 -e Http__EndPoint="https://localhost:5001" -e Grpc__CaCert="/app/source/certs/server1-ca.pem" "armonik-api-cpp:0.1.0" docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5003 -e Http__EndPoint="https://localhost:5003" -e Grpc__SSLValidation="enable" -e Grpc__mTLS="true" -e Grpc__CaCert="/app/source/certs/server1.pem" -e Grpc__ClientCert="/app/source/certs/client.pem" -e Grpc__ClientKey="/app/source/certs/client.key" "armonik-api-cpp:0.1.0" + set +e + kill $notls_pid $tls_pid $mtls_pid + exit $ret From c7154f3115075b712d847a8a2459d004c4d7420c Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 12 Sep 2024 16:29:46 +0200 Subject: [PATCH 331/344] Install certs --- .github/workflows/test.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8680b67d8..db13bd9be 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -151,6 +151,14 @@ jobs: cd certs ../../../scripts/certs.sh + - name: Install certs + working-directory: packages/cpp/certs + run: | + sudo apt install ca-certificates + sudo mkdir -p /usr/local/share/ca-certificates/ + sudo cp server2-ca.pem /usr/local/share/ca-certificates/ca.crt + sudo update-ca-certificates + - name: Install .NET Core uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4 with: @@ -184,8 +192,6 @@ jobs: set -e cd ../cpp/tools ./run_test.sh - docker run --rm -t --network host -e Grpc__EndPoint=localhost:5000 -e Http__EndPoint="localhost:4999" "armonik-api-cpp:0.1.0" - docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5001 -e Http__EndPoint="https://localhost:5001" -e Grpc__CaCert="/app/source/certs/server1-ca.pem" "armonik-api-cpp:0.1.0" docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5003 -e Http__EndPoint="https://localhost:5003" -e Grpc__SSLValidation="enable" -e Grpc__mTLS="true" -e Grpc__CaCert="/app/source/certs/server1.pem" -e Grpc__ClientCert="/app/source/certs/client.pem" -e Grpc__ClientKey="/app/source/certs/client.key" "armonik-api-cpp:0.1.0" set +e kill $notls_pid $tls_pid $mtls_pid From e87f3e625c700b13832beece67d6c04d3d841d4c Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Thu, 12 Sep 2024 18:03:00 +0200 Subject: [PATCH 332/344] Fix TLS certs authentication --- .github/workflows/test.yml | 3 +++ .../cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index db13bd9be..f2cec177f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -177,6 +177,7 @@ jobs: run: | set +e set -x + export CertFolder="$PWD/../cpp/certs" ./out/ArmoniK.Api.Mock.exe \ grpc:port=5000 http:port=4999 \ & notls_pid=$! @@ -192,6 +193,8 @@ jobs: set -e cd ../cpp/tools ./run_test.sh + docker run --rm -t --network host -e Grpc__EndPoint=http://localhost:5000 -e Http__EndPoint="http://localhost:4999" "armonik-api-cpp:0.1.0" + docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5001 -e Http__EndPoint="https://localhost:5001" -e Grpc__SSLValidation="enable" -e Grpc__CaCert="/app/source/certs/server1-ca.pem" "armonik-api-cpp:0.1.0" docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5003 -e Http__EndPoint="https://localhost:5003" -e Grpc__SSLValidation="enable" -e Grpc__mTLS="true" -e Grpc__CaCert="/app/source/certs/server1.pem" -e Grpc__ClientCert="/app/source/certs/client.pem" -e Grpc__ClientKey="/app/source/certs/client.key" "armonik-api-cpp:0.1.0" set +e kill $notls_pid $tls_pid $mtls_pid diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp index efa46f009..185e9077a 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -31,9 +31,12 @@ bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int n std::cout << call_endpoint << std::endl; if (curl) { curl_easy_setopt(curl, CURLOPT_URL, call_endpoint.c_str()); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_CAINFO, config.get("Grpc__CaCert").c_str()); - curl_easy_setopt(curl, CURLOPT_SSLCERT, config.get("Grpc__ClientCert").c_str()); - curl_easy_setopt(curl, CURLOPT_SSLKEY, config.get("Grpc__ClientKey").c_str()); + if(config.get("Grpc__mTLS") == "true"){ + curl_easy_setopt(curl, CURLOPT_SSLCERT, config.get("Grpc__ClientCert").c_str()); + curl_easy_setopt(curl, CURLOPT_SSLKEY, config.get("Grpc__ClientKey").c_str()); + } curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer); @@ -72,8 +75,10 @@ bool all_rpc_called(absl::string_view service_name, const std::vector Date: Fri, 13 Sep 2024 09:59:05 +0200 Subject: [PATCH 333/344] Format --- packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp index 185e9077a..9405708d8 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -27,13 +27,11 @@ bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int n std::string call_endpoint = config.get("Http__EndPoint") + "/calls.json"; auto curl = curl_easy_init(); std::string read_buffer; - std::cout << endpoint << std::endl; - std::cout << call_endpoint << std::endl; if (curl) { curl_easy_setopt(curl, CURLOPT_URL, call_endpoint.c_str()); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_CAINFO, config.get("Grpc__CaCert").c_str()); - if(config.get("Grpc__mTLS") == "true"){ + if (config.get("Grpc__mTLS") == "true") { curl_easy_setopt(curl, CURLOPT_SSLCERT, config.get("Grpc__ClientCert").c_str()); curl_easy_setopt(curl, CURLOPT_SSLKEY, config.get("Grpc__ClientKey").c_str()); } @@ -71,11 +69,10 @@ bool all_rpc_called(absl::string_view service_name, const std::vector Date: Wed, 18 Sep 2024 16:37:50 +0200 Subject: [PATCH 334/344] Remove unusefull comments --- packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp index 19ff4b39d..608b4c309 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/ChannelOptionsTest.cpp @@ -43,8 +43,6 @@ TEST_F(Options, no_options) { configuration.add_json_configuration("appsettings.json").add_env_configuration(); std::string server_address = configuration.get("Grpc__EndPoint"); - // auto args = armonik::api::common::utils::getChannelArguments(configuration); - // auto channel = ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), args); armonik::api::client::ChannelFactory channel_factory(configuration, logger); auto channel = channel_factory.create_channel(); @@ -60,8 +58,6 @@ TEST_F(Options, default_options) { configuration.add_json_configuration("appsettings.json").add_env_configuration(); std::string server_address = configuration.get("Grpc__EndPoint"); - auto args = armonik::api::common::utils::getChannelArguments(configuration); - // auto channel = ::grpc::CreateCustomChannel(server_address, grpc::InsecureChannelCredentials(), args); armonik::api::client::ChannelFactory channel_factory(configuration, logger); auto channel = channel_factory.create_channel(); From 00f555812baec58aecbaf56ce5f2c3d6080fb2d4 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 23 Sep 2024 15:35:33 +0200 Subject: [PATCH 335/344] Run test using github matrix --- .github/workflows/test.yml | 50 +++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f2cec177f..b0e651aaa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -135,6 +135,12 @@ jobs: cpp: strategy: fail-fast: false + matrix: + endpoint: + - {grpc_port: 5000, http_port: 4999, ssl_validation: '', client_cert: ''} + - {grpc_port: 5001, http_port: 5001, ssl_validation: enable, client_cert: ''} + - {grpc_port: 5003, http_port: 5003, ssl_validation: enable, client_cert: 'true'} + name: Test C++ runs-on: ubuntu-latest steps: @@ -171,31 +177,31 @@ jobs: dotnet publish -o ../out [ -e ../out/ArmoniK.Api.Mock.exe ] || ln -s ArmoniK.Api.Mock ../out/ArmoniK.Api.Mock.exe - - name: Build and Run Test + - name: Run Mock servers working-directory: packages/csharp/ shell: bash run: | - set +e - set -x - export CertFolder="$PWD/../cpp/certs" - ./out/ArmoniK.Api.Mock.exe \ - grpc:port=5000 http:port=4999 \ - & notls_pid=$! - ./out/ArmoniK.Api.Mock.exe \ - grpc:port=5001 http:port=5001 \ - http:cert="$CertFolder/server1.pem" http:key="$CertFolder/server1.key" \ - & tls_pid=$! ./out/ArmoniK.Api.Mock.exe \ - grpc:port=5003 http:port=5003 \ - http:cert="$CertFolder/server1.pem" http:key="$CertFolder/server1.key" http:clientcert="$CertFolder/client-ca.pem" \ - & mtls_pid=$! + grpc:port=${{ matrix.endpoint.grpc_port }} http:port=${{ matrix.endpoint.http_port }} \ + $([[ "${{ matrix.endpoint.ssl_validation }}" == "enable" ]] && echo "http:cert=$CertFolder/server1.pem http:key=$CertFolder/server1.key") \ + $([[ "${{ matrix.endpoint.client_cert }}" == "true" ]] && echo "http:clientcert=$CertFolder/client-ca.pem") \ + & server_pid=$! sleep 5 - set -e - cd ../cpp/tools + + - name: Build Test + working-directory: packages/cpp/tools + run: | ./run_test.sh - docker run --rm -t --network host -e Grpc__EndPoint=http://localhost:5000 -e Http__EndPoint="http://localhost:4999" "armonik-api-cpp:0.1.0" - docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5001 -e Http__EndPoint="https://localhost:5001" -e Grpc__SSLValidation="enable" -e Grpc__CaCert="/app/source/certs/server1-ca.pem" "armonik-api-cpp:0.1.0" - docker run --rm -t --network host -e Grpc__EndPoint=https://localhost:5003 -e Http__EndPoint="https://localhost:5003" -e Grpc__SSLValidation="enable" -e Grpc__mTLS="true" -e Grpc__CaCert="/app/source/certs/server1.pem" -e Grpc__ClientCert="/app/source/certs/client.pem" -e Grpc__ClientKey="/app/source/certs/client.key" "armonik-api-cpp:0.1.0" - set +e - kill $notls_pid $tls_pid $mtls_pid - exit $ret + + - name: Run Test + run: | + docker run --rm -t --network host \ + -e Grpc__EndPoint=$( [ ${{ matrix.endpoint.grpc_port }} -eq 5000 ] && echo "http" || echo "https" )://localhost:${{ matrix.endpoint.grpc_port }} \ + -e Http__EndPoint=$( [ ${{ matrix.endpoint.grpc_port }} -eq 5000 ] && echo "http" || echo "https" )://localhost:${{ matrix.endpoint.http_port }} \ + $([[ "${{ matrix.endpoint.ssl_validation }}" == "enable" ]] && echo "-e Grpc__SSLValidation=enable") \ + $([[ "${{ matrix.endpoint.grpc_port }}" == "5003" ]] && echo "-e Grpc__mTLS=true -e Grpc__ClientCert=/app/source/certs/client.pem -e Grpc__ClientKey=/app/source/certs/client.key") \ + "armonik-api-cpp:0.1.0" + + - name: Stop Mock Server + run: | + ps -p $server_pid > /dev/null && kill $server_pid From 5fa653882ac8558ce4133a1b1a6d8a34f212a020 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Tue, 24 Sep 2024 14:19:16 +0200 Subject: [PATCH 336/344] Fix matrix run --- .github/workflows/test.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b0e651aaa..bab04250f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -181,11 +181,12 @@ jobs: working-directory: packages/csharp/ shell: bash run: | + export CertFolder="$PWD/../cpp/certs" ./out/ArmoniK.Api.Mock.exe \ grpc:port=${{ matrix.endpoint.grpc_port }} http:port=${{ matrix.endpoint.http_port }} \ $([[ "${{ matrix.endpoint.ssl_validation }}" == "enable" ]] && echo "http:cert=$CertFolder/server1.pem http:key=$CertFolder/server1.key") \ $([[ "${{ matrix.endpoint.client_cert }}" == "true" ]] && echo "http:clientcert=$CertFolder/client-ca.pem") \ - & server_pid=$! + & echo "server_pid=$!" >> $GITHUB_ENV sleep 5 - name: Build Test @@ -198,8 +199,8 @@ jobs: docker run --rm -t --network host \ -e Grpc__EndPoint=$( [ ${{ matrix.endpoint.grpc_port }} -eq 5000 ] && echo "http" || echo "https" )://localhost:${{ matrix.endpoint.grpc_port }} \ -e Http__EndPoint=$( [ ${{ matrix.endpoint.grpc_port }} -eq 5000 ] && echo "http" || echo "https" )://localhost:${{ matrix.endpoint.http_port }} \ - $([[ "${{ matrix.endpoint.ssl_validation }}" == "enable" ]] && echo "-e Grpc__SSLValidation=enable") \ - $([[ "${{ matrix.endpoint.grpc_port }}" == "5003" ]] && echo "-e Grpc__mTLS=true -e Grpc__ClientCert=/app/source/certs/client.pem -e Grpc__ClientKey=/app/source/certs/client.key") \ + $([[ "${{ matrix.endpoint.ssl_validation }}" == "enable" ]] && echo "-e Grpc__SSLValidation=enable -e Grpc__CaCert=/app/source/certs/server1-ca.pem") \ + $([[ "${{ matrix.endpoint.grpc_port }}" == "5003" ]] && echo "-e Grpc__mTLS=true -e Grpc__CaCert=/app/source/certs/server1.pem -e Grpc__ClientCert=/app/source/certs/client.pem -e Grpc__ClientKey=/app/source/certs/client.key") \ "armonik-api-cpp:0.1.0" - name: Stop Mock Server From 086aea1085b4726630cd226f2b5baa063c7c7943 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Tue, 24 Sep 2024 17:53:30 +0200 Subject: [PATCH 337/344] Remove condition in matrix execution ci --- .github/workflows/test.yml | 93 ++++++++++++++++++++++++++++++++------ 1 file changed, 80 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bab04250f..70ec40d45 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -133,13 +133,79 @@ jobs: reporter: dotnet-trx cpp: + env: + CertFolder: "$PWD/../cpp/certs" strategy: fail-fast: false matrix: endpoint: - - {grpc_port: 5000, http_port: 4999, ssl_validation: '', client_cert: ''} - - {grpc_port: 5001, http_port: 5001, ssl_validation: enable, client_cert: ''} - - {grpc_port: 5003, http_port: 5003, ssl_validation: enable, client_cert: 'true'} + - mock_env: + Grpc__Port: 5000 + Http_Port: 4999 + test_env: + Grpc__Endpoint: http://localhost:5000 + Http__Endpoint: http://localhost:4999 + - mock_env: + Grpc__Port: 5001 + Http_Port: 5001 + Http__Cert: ../cpp/certs/server1.pem + Http__Key: ../cpp/certs/server1.key + test_env: + Grpc__Endpoint: https://localhost:5001 + Grpc__SSLValidation: enable + Grpc__CaCert: /app/source/certs/server1-ca.pem + - mock_env: + Grpc__Port: 5002 + Http_Port: 5002 + Http__Cert: ../cpp/certs/server2.pem + Http__Key: ../cpp/certs/server2.key + test_env: + Grpc__Endpoint: https://localhost:5002 + Grpc__SSLValidation: enable + - mock_env: + Grpc__Port: 5003 + Http_Port: 5003 + Http__Cert: ../cpp/certs/server1.pem + Http__Key: ../cpp/certs/server1.key + Client__Cert: ../cpp/certs/client-ca.pem + test_env: + Grpc__Endpoint: https://localhost:5003 + Grpc__SSLValidation: enable + Grpc__CaCert: /app/source/certs/server1-ca.pem + Grpc__ClientCert: /app/source/certs/client.pem + Grpc__ClientKey: /app/source/certs/client.key + - mock_env: + Grpc__Port: 5004 + Http_Port: 5004 + Http__Cert: ../cpp/certs/server2.pem + Http__Key: ../cpp/certs/server2.key + Client__Cert: ../cpp/certs/client-ca.pem + test_env: + Grpc__Endpoint: https://localhost:5004 + Grpc__SSLValidation: enable + Grpc__ClientCert: /app/source/certs/client.pem + Grpc__ClientKey: /app/source/certs/client.key + - mock_env: + Grpc__Port: 5004 + Http_Port: 5004 + Http__Cert: ../cpp/certs/server2.pem + Http__Key: ../cpp/certs/server2.key + Client__Cert: ../cpp/certs/client-ca.pem + test_env: + Grpc__Endpoint: https://localhost:5004 + Grpc__SSLValidation: enable + Grpc__ClientCert: /app/source/certs/client-client.pem + + - mock_env: + Grpc__Port: 5004 + Http_Port: 5004 + Http__Cert: ../cpp/certs/server2.pem + Http__Key: ../cpp/certs/server2.key + Client__Cert: ../cpp/certs/client-ca.pem + test_env: + Grpc__Endpoint: https://localhost:5004 + Grpc__SSLValidation: enable + Grpc__ClientCert: /app/source/certs/client.p12 name: Test C++ runs-on: ubuntu-latest @@ -180,13 +246,12 @@ jobs: - name: Run Mock servers working-directory: packages/csharp/ shell: bash + env: ${{ matrix.endpoint.mock_env }} run: | + env export CertFolder="$PWD/../cpp/certs" - ./out/ArmoniK.Api.Mock.exe \ - grpc:port=${{ matrix.endpoint.grpc_port }} http:port=${{ matrix.endpoint.http_port }} \ - $([[ "${{ matrix.endpoint.ssl_validation }}" == "enable" ]] && echo "http:cert=$CertFolder/server1.pem http:key=$CertFolder/server1.key") \ - $([[ "${{ matrix.endpoint.client_cert }}" == "true" ]] && echo "http:clientcert=$CertFolder/client-ca.pem") \ - & echo "server_pid=$!" >> $GITHUB_ENV + ./out/ArmoniK.Api.Mock.exe grpc:port=$Grpc__Port http:port=$Http_Port & + echo "server_pid=$!" >> $GITHUB_ENV sleep 5 - name: Build Test @@ -195,14 +260,16 @@ jobs: ./run_test.sh - name: Run Test + env: ${{ matrix.endpoint.test_env }} run: | + env docker run --rm -t --network host \ - -e Grpc__EndPoint=$( [ ${{ matrix.endpoint.grpc_port }} -eq 5000 ] && echo "http" || echo "https" )://localhost:${{ matrix.endpoint.grpc_port }} \ - -e Http__EndPoint=$( [ ${{ matrix.endpoint.grpc_port }} -eq 5000 ] && echo "http" || echo "https" )://localhost:${{ matrix.endpoint.http_port }} \ - $([[ "${{ matrix.endpoint.ssl_validation }}" == "enable" ]] && echo "-e Grpc__SSLValidation=enable -e Grpc__CaCert=/app/source/certs/server1-ca.pem") \ - $([[ "${{ matrix.endpoint.grpc_port }}" == "5003" ]] && echo "-e Grpc__mTLS=true -e Grpc__CaCert=/app/source/certs/server1.pem -e Grpc__ClientCert=/app/source/certs/client.pem -e Grpc__ClientKey=/app/source/certs/client.key") \ + -e Grpc__EndPoint=$Grpc__Endpoint \ + -e Http__EndPoint=${Http__Endpoint:-$Grpc__Endpoint} \ + -e Grpc__SSLValidation=$Grpc__SSLValidation -e Grpc__CaCert=$Grpc__CaCert \ + -e Grpc__mTLS=$Grpc__mTLS -e Grpc__ClientCert=$Grpc__ClientCert -e Grpc__ClientKey=$Grpc__ClientKey \ "armonik-api-cpp:0.1.0" - name: Stop Mock Server run: | - ps -p $server_pid > /dev/null && kill $server_pid + kill $server_pid || true From 7225f086193fd25550be944ea26fb9c0e64d73f3 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 25 Sep 2024 12:16:55 +0200 Subject: [PATCH 338/344] Select system certificate when no certificat is provided --- .../cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp index 9405708d8..39869f46f 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -30,7 +30,11 @@ bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int n if (curl) { curl_easy_setopt(curl, CURLOPT_URL, call_endpoint.c_str()); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - curl_easy_setopt(curl, CURLOPT_CAINFO, config.get("Grpc__CaCert").c_str()); + if (!config.get("Grpc__CaCert").empty()) { + curl_easy_setopt(curl, CURLOPT_CAINFO, config.get("Grpc__CaCert").c_str()); + } else { + curl_easy_setopt(curl, CURLOPT_CAINFO, NULL); + } if (config.get("Grpc__mTLS") == "true") { curl_easy_setopt(curl, CURLOPT_SSLCERT, config.get("Grpc__ClientCert").c_str()); curl_easy_setopt(curl, CURLOPT_SSLKEY, config.get("Grpc__ClientKey").c_str()); @@ -71,7 +75,11 @@ bool all_rpc_called(absl::string_view service_name, const std::vector Date: Wed, 25 Sep 2024 14:46:55 +0200 Subject: [PATCH 339/344] Adding shebang --- packages/cpp/tools/run_test.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/cpp/tools/run_test.sh b/packages/cpp/tools/run_test.sh index eec1ff249..b829bad2e 100755 --- a/packages/cpp/tools/run_test.sh +++ b/packages/cpp/tools/run_test.sh @@ -1,3 +1,5 @@ +#! /bin/sh + script_path="$(dirname "${BASH_SOURCE:-$0}")" working_dir="$(realpath "${script_path}/../../../" )" dockerfile="${1:-"${working_dir}/packages/cpp/ArmoniK.Api.Tests/Dockerfile"}" From 87a40c4aec29a95c12388f6feaa1e3c859f20cc9 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 25 Sep 2024 14:50:26 +0200 Subject: [PATCH 340/344] PR comments --- .github/workflows/test.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 70ec40d45..4bb03a4eb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -264,10 +264,13 @@ jobs: run: | env docker run --rm -t --network host \ - -e Grpc__EndPoint=$Grpc__Endpoint \ - -e Http__EndPoint=${Http__Endpoint:-$Grpc__Endpoint} \ - -e Grpc__SSLValidation=$Grpc__SSLValidation -e Grpc__CaCert=$Grpc__CaCert \ - -e Grpc__mTLS=$Grpc__mTLS -e Grpc__ClientCert=$Grpc__ClientCert -e Grpc__ClientKey=$Grpc__ClientKey \ + -e Grpc__EndPoint="$Grpc__Endpoint" \ + -e Http__EndPoint="${Http__Endpoint:-$Grpc__Endpoint}" \ + -e Grpc__SSLValidation="$Grpc__SSLValidation" \ + -e Grpc__CaCert="$Grpc__CaCert" \ + -e Grpc__mTLS="$Grpc__mTLS" \ + -e Grpc__ClientCert="$Grpc__ClientCert" \ + -e Grpc__ClientKey="$Grpc__ClientKey" \ "armonik-api-cpp:0.1.0" - name: Stop Mock Server From 42618882770c64cc6eafc1751b0e4315427b13b5 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 25 Sep 2024 14:59:17 +0200 Subject: [PATCH 341/344] Change client cert name --- .github/workflows/test.yml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4bb03a4eb..2dd4082aa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -167,7 +167,7 @@ jobs: Http_Port: 5003 Http__Cert: ../cpp/certs/server1.pem Http__Key: ../cpp/certs/server1.key - Client__Cert: ../cpp/certs/client-ca.pem + Http__ClientCert: ../cpp/certs/client-ca.pem test_env: Grpc__Endpoint: https://localhost:5003 Grpc__SSLValidation: enable @@ -179,7 +179,7 @@ jobs: Http_Port: 5004 Http__Cert: ../cpp/certs/server2.pem Http__Key: ../cpp/certs/server2.key - Client__Cert: ../cpp/certs/client-ca.pem + Http__ClientCert: ../cpp/certs/client-ca.pem test_env: Grpc__Endpoint: https://localhost:5004 Grpc__SSLValidation: enable @@ -190,7 +190,7 @@ jobs: Http_Port: 5004 Http__Cert: ../cpp/certs/server2.pem Http__Key: ../cpp/certs/server2.key - Client__Cert: ../cpp/certs/client-ca.pem + Http__ClientCert: ../cpp/certs/client-ca.pem test_env: Grpc__Endpoint: https://localhost:5004 Grpc__SSLValidation: enable @@ -201,7 +201,7 @@ jobs: Http_Port: 5004 Http__Cert: ../cpp/certs/server2.pem Http__Key: ../cpp/certs/server2.key - Client__Cert: ../cpp/certs/client-ca.pem + Http__ClientCert: ../cpp/certs/client-ca.pem test_env: Grpc__Endpoint: https://localhost:5004 Grpc__SSLValidation: enable @@ -264,13 +264,10 @@ jobs: run: | env docker run --rm -t --network host \ - -e Grpc__EndPoint="$Grpc__Endpoint" \ - -e Http__EndPoint="${Http__Endpoint:-$Grpc__Endpoint}" \ - -e Grpc__SSLValidation="$Grpc__SSLValidation" \ - -e Grpc__CaCert="$Grpc__CaCert" \ - -e Grpc__mTLS="$Grpc__mTLS" \ - -e Grpc__ClientCert="$Grpc__ClientCert" \ - -e Grpc__ClientKey="$Grpc__ClientKey" \ + -e Grpc__EndPoint=$Grpc__Endpoint \ + -e Http__EndPoint=${Http__Endpoint:-$Grpc__Endpoint} \ + -e Grpc__SSLValidation=$Grpc__SSLValidation -e Grpc__CaCert=$Grpc__CaCert \ + -e Grpc__mTLS=$Grpc__mTLS -e Grpc__ClientCert=$Grpc__ClientCert -e Grpc__ClientKey=$Grpc__ClientKey \ "armonik-api-cpp:0.1.0" - name: Stop Mock Server From c73b2c932bc0bbe0a1fe657c16cb194710eface6 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Wed, 25 Sep 2024 15:13:54 +0200 Subject: [PATCH 342/344] Re-test tls and mtlsstore --- .github/workflows/test.yml | 60 +++++++++-------------- packages/cpp/ArmoniK.Api.Tests/Dockerfile | 6 +-- 2 files changed, 25 insertions(+), 41 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2dd4082aa..67351d933 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -133,21 +133,19 @@ jobs: reporter: dotnet-trx cpp: - env: - CertFolder: "$PWD/../cpp/certs" strategy: fail-fast: false matrix: endpoint: - mock_env: Grpc__Port: 5000 - Http_Port: 4999 + Http__Port: 4999 test_env: Grpc__Endpoint: http://localhost:5000 Http__Endpoint: http://localhost:4999 - mock_env: Grpc__Port: 5001 - Http_Port: 5001 + Http__Port: 5001 Http__Cert: ../cpp/certs/server1.pem Http__Key: ../cpp/certs/server1.key test_env: @@ -156,7 +154,7 @@ jobs: Grpc__CaCert: /app/source/certs/server1-ca.pem - mock_env: Grpc__Port: 5002 - Http_Port: 5002 + Http__Port: 5002 Http__Cert: ../cpp/certs/server2.pem Http__Key: ../cpp/certs/server2.key test_env: @@ -164,48 +162,29 @@ jobs: Grpc__SSLValidation: enable - mock_env: Grpc__Port: 5003 - Http_Port: 5003 + Http__Port: 5003 Http__Cert: ../cpp/certs/server1.pem Http__Key: ../cpp/certs/server1.key Http__ClientCert: ../cpp/certs/client-ca.pem test_env: Grpc__Endpoint: https://localhost:5003 Grpc__SSLValidation: enable + Grpc__mTLS: true Grpc__CaCert: /app/source/certs/server1-ca.pem Grpc__ClientCert: /app/source/certs/client.pem Grpc__ClientKey: /app/source/certs/client.key - mock_env: Grpc__Port: 5004 - Http_Port: 5004 + Http__Port: 5004 Http__Cert: ../cpp/certs/server2.pem Http__Key: ../cpp/certs/server2.key Http__ClientCert: ../cpp/certs/client-ca.pem test_env: Grpc__Endpoint: https://localhost:5004 Grpc__SSLValidation: enable + Grpc__mTLS: true Grpc__ClientCert: /app/source/certs/client.pem Grpc__ClientKey: /app/source/certs/client.key - - mock_env: - Grpc__Port: 5004 - Http_Port: 5004 - Http__Cert: ../cpp/certs/server2.pem - Http__Key: ../cpp/certs/server2.key - Http__ClientCert: ../cpp/certs/client-ca.pem - test_env: - Grpc__Endpoint: https://localhost:5004 - Grpc__SSLValidation: enable - Grpc__ClientCert: /app/source/certs/client-client.pem - - - mock_env: - Grpc__Port: 5004 - Http_Port: 5004 - Http__Cert: ../cpp/certs/server2.pem - Http__Key: ../cpp/certs/server2.key - Http__ClientCert: ../cpp/certs/client-ca.pem - test_env: - Grpc__Endpoint: https://localhost:5004 - Grpc__SSLValidation: enable - Grpc__ClientCert: /app/source/certs/client.p12 name: Test C++ runs-on: ubuntu-latest @@ -248,28 +227,33 @@ jobs: shell: bash env: ${{ matrix.endpoint.mock_env }} run: | - env export CertFolder="$PWD/../cpp/certs" - ./out/ArmoniK.Api.Mock.exe grpc:port=$Grpc__Port http:port=$Http_Port & + ./out/ArmoniK.Api.Mock.exe > mock.log 2>&1 & echo "server_pid=$!" >> $GITHUB_ENV sleep 5 - name: Build Test - working-directory: packages/cpp/tools + working-directory: packages/cpp run: | - ./run_test.sh + ./tools/run_test.sh - name: Run Test env: ${{ matrix.endpoint.test_env }} run: | - env - docker run --rm -t --network host \ - -e Grpc__EndPoint=$Grpc__Endpoint \ - -e Http__EndPoint=${Http__Endpoint:-$Grpc__Endpoint} \ - -e Grpc__SSLValidation=$Grpc__SSLValidation -e Grpc__CaCert=$Grpc__CaCert \ - -e Grpc__mTLS=$Grpc__mTLS -e Grpc__ClientCert=$Grpc__ClientCert -e Grpc__ClientKey=$Grpc__ClientKey \ + echo "$PWD/packages/cpp/certs" + docker run --rm -t --network host -v "$PWD/packages/cpp/certs:/app/source/certs" -v "/usr/local/share/ca-certificates/:/usr/local/share/ca-certificates" \ + -e Grpc__EndPoint="$Grpc__Endpoint" \ + -e Http__EndPoint="${Http__Endpoint:-$Grpc__Endpoint}" \ + ${Grpc__SSLValidation:+-e Grpc__SSLValidation="$Grpc__SSLValidation"} \ + ${Grpc__CaCert:+-e Grpc__CaCert="$Grpc__CaCert"} \ + ${Grpc__mTLS:+-e Grpc__mTLS="$Grpc__mTLS"} \ + ${Grpc__ClientCert:+-e Grpc__ClientCert="$Grpc__ClientCert"} \ + ${Grpc__ClientKey:+-e Grpc__ClientKey="$Grpc__ClientKey"} \ "armonik-api-cpp:0.1.0" - name: Stop Mock Server + if: always() + working-directory: packages/csharp/ run: | kill $server_pid || true + cat mock.log diff --git a/packages/cpp/ArmoniK.Api.Tests/Dockerfile b/packages/cpp/ArmoniK.Api.Tests/Dockerfile index cea0fb358..abdeb309f 100644 --- a/packages/cpp/ArmoniK.Api.Tests/Dockerfile +++ b/packages/cpp/ArmoniK.Api.Tests/Dockerfile @@ -19,7 +19,8 @@ RUN apk update && apk add --no-cache \ grpc-dev \ protobuf \ protobuf-dev \ - curl-dev + curl-dev \ + ca-certificates # Set environment variables for protobuf ENV protobuf_BUILD_TESTS=OFF @@ -41,7 +42,6 @@ COPY packages/cpp/ArmoniK.Api.Tests/. ./ArmoniK.Api.Tests/ COPY packages/cpp/CMakeLists.txt . COPY packages/cpp/Packaging.cmake . COPY packages/cpp/Dependencies.cmake . -COPY packages/cpp/certs ./certs/ WORKDIR /app/build RUN cmake -DCMAKE_BUILD_TYPE=Debug -DPROTO_FILES_DIR=/app/source/Protos -DCMAKE_INSTALL_PREFIX=/app/install -DBUILD_WORKER=OFF -DBUILD_TEST=ON /app/source/ && make -j $(nproc) install @@ -49,4 +49,4 @@ RUN cmake -DCMAKE_BUILD_TYPE=Debug -DPROTO_FILES_DIR=/app/source/Protos -DCMAKE_ # CMD ["sh", "-c", "cmake -DCMAKE_BUILD_TYPE=Debug -DPROTO_FILES_DIR=/app/proto -DCMAKE_INSTALL_PREFIX=/app/install -DBUILD_TEST=OFF /app/source/ -DCPACK_GENERATOR=TGZ && make -j $(nproc) install && make package -j"] # Uncomment the line below if you want the container to start in the bash shell by default -ENTRYPOINT ["/app/install/bin/ArmoniK.Api.Tests"] +ENTRYPOINT ["sh", "-c", "update-ca-certificates && /app/install/bin/ArmoniK.Api.Tests"] From 03c556ccab6803b54391c61fcf684f8e610b35f5 Mon Sep 17 00:00:00 2001 From: Daouda Diakite Date: Mon, 7 Oct 2024 18:26:54 +0200 Subject: [PATCH 343/344] Clean after rebase --- packages/cpp/ArmoniK.Api.Tests/header/common.h | 8 +++----- packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp | 7 +++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/cpp/ArmoniK.Api.Tests/header/common.h b/packages/cpp/ArmoniK.Api.Tests/header/common.h index f763a1079..225b661f7 100644 --- a/packages/cpp/ArmoniK.Api.Tests/header/common.h +++ b/packages/cpp/ArmoniK.Api.Tests/header/common.h @@ -23,8 +23,7 @@ void init(std::shared_ptr &channel, armonik::api::grpc::v1::TaskO * @param num_calls the number of call of rpc * @return */ -bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int num_calls = 1, - absl::string_view endpoint = "http://localhost:4999/calls.json"); +bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int num_calls = 1); /** * @@ -32,14 +31,13 @@ bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int n * @param endpoint the call endpoint * @return */ -bool all_rpc_called(absl::string_view service_name, const std::vector &missings = {}, - absl::string_view endpoint = "http://localhost:4999/calls.json"); +bool all_rpc_called(absl::string_view service_name, const std::vector &missings = {}); /** * * @param endpoint The reset endpoint */ -void clean_up(absl::string_view endpoint = "http://localhost:4999/reset"); +void clean_up(); /** * A fixture class to reset the RPC calls diff --git a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp index 39869f46f..f14895b17 100644 --- a/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp +++ b/packages/cpp/ArmoniK.Api.Tests/source/MockTest.cpp @@ -20,7 +20,7 @@ size_t WriteCallback(void *ptr, size_t size, size_t num_elt, std::string *data) return size * num_elt; } -bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int num_calls, absl::string_view endpoint) { +bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int num_calls) { armonik::api::common::utils::Configuration config; config.add_json_configuration("appsettings.json").add_env_configuration(); @@ -59,15 +59,14 @@ bool rpcCalled(absl::string_view service_name, absl::string_view rpc_name, int n return true; } std::cout << "Given number of RPC calls " << num_calls << std::endl; - std::cout << "Actual number of RPC calls " << response_json[service_name][rpc_name] << std::endl; + std::cout << "Actual number of RPC calls " << response_json[service_name.data()][rpc_name.data()] << std::endl; } catch (const simdjson_error &e) { std::cerr << "Failed to parse JSON: " << e.what() << std::endl; } return false; } -bool all_rpc_called(absl::string_view service_name, const std::vector &missings, - absl::string_view endpoint) { +bool all_rpc_called(absl::string_view service_name, const std::vector &missings) { armonik::api::common::utils::Configuration config; config.add_json_configuration("appsettings.json").add_env_configuration(); std::string call_endpoint = config.get("Http__EndPoint") + "/calls.json"; From b97920bdbdf00849ced4b6766b83429f88d14f8a Mon Sep 17 00:00:00 2001 From: ddiakiteaneo <127390724+ddiakiteaneo@users.noreply.github.com> Date: Fri, 11 Oct 2024 14:05:00 +0200 Subject: [PATCH 344/344] Handle build in ci for absl --- packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt index aaa9820c5..87880979e 100644 --- a/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt +++ b/packages/cpp/ArmoniK.Api.Tests/CMakeLists.txt @@ -19,6 +19,7 @@ add_executable(${PROJECT_NAME} ${SRC_CLIENT_FILES} ${HEADER_CLIENT_FILES}) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) target_link_libraries(${PROJECT_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++ ArmoniK.Api.Client ArmoniK.Api.Common GTest::gtest_main GTest::gmock_main CURL::libcurl) +target_link_options(${PROJECT_NAME} PUBLIC "-Wl,--copy-dt-needed-entries") if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4)