From c7a94893a2d46758512260a725bdde8d813e508d Mon Sep 17 00:00:00 2001 From: Manuel Date: Thu, 28 Aug 2025 16:01:55 +0200 Subject: [PATCH 01/11] redo --- back/.program_data/app.db-shm | Bin 32768 -> 0 bytes back/.program_data/app.db-wal | Bin 78312 -> 0 bytes back/.program_data/imgs/systemkey.lock | 4 +- back/DTO/UserDto.cs | 4 +- back/DataModels/Event.cs | 4 +- back/DataModels/Gallery.cs | 2 +- back/DataModels/Permission.cs | 34 ++++++- back/DataModels/Person.cs | 4 +- back/DataModels/Photo.cs | 4 +- back/DataModels/Role.cs | 39 ++++++- back/DataModels/User.cs | 6 +- back/Program.cs | 8 +- back/ServicesExtensions/ServicesExtensions.cs | 4 +- back/appsettings.Development.json | 11 +- back/back.csproj | 5 +- back/back.sln | 12 +-- back/controllers/AuthController.cs | 44 ++++++++ back/controllers/UsersController.cs | 8 +- .../options/HealthChecksConfigs.cs | 6 +- back/healthchecks/sqlite.cs | 14 +-- back/persistance/blob/IBlobStorageService.cs | 2 +- back/persistance/data/DataContext.cs | 9 -- .../Abstracts/IPermissionRepository.cs | 10 ++ .../Abstracts/IPersonRepository.cs | 4 +- .../Abstracts/IPhotoRepository.cs | 6 +- .../repositories/Abstracts/IRoleRepository.cs | 10 ++ .../repositories/Abstracts/IUserRepository.cs | 4 +- .../data/repositories/PermissionRepository.cs | 34 +++++++ .../data/repositories/PersonRepository.cs | 2 +- .../data/repositories/PhotoRepository.cs | 2 +- .../data/repositories/RoleRepository.cs | 27 +++++ .../data/repositories/UserRepository.cs | 33 +++--- .../data/seeders/PermissionSeeder.cs | 42 ++++---- back/persistance/data/seeders/RoleSeeder.cs | 28 ++--- .../data/seeders/SystemUserSeeder.cs | 24 ++--- .../bussines/PhotoService/IPhotoService.cs | 2 +- .../bussines/UserService/IUserService.cs | 2 +- .../bussines/UserService/UserService.cs | 5 +- back/services/engine/Crypto/ICryptoService.cs | 2 +- .../engine/ImageResizer/IImageResizer.cs | 2 +- .../PasswordGenerator/IPasswordGenerator.cs | 2 +- .../engine/SystemUser/ISystemUserGenerator.cs | 2 +- .../engine/SystemUser/SystemUserGenerator.cs | 13 ++- back/services/engine/mailing/IEmailService.cs | 2 +- .../Controllers/AuthController.cs | 8 ++ .../Responses/ExecutionError.cs | 6 ++ .../Infraestructura/Responses/Response.cs | 29 ++++++ .../Responses/ValidationError.cs | 7 ++ backend/Presentation/Presentation.csproj | 34 +++++++ backend/Presentation/Program.cs | 96 ++++++++++++++++++ .../Properties/launchSettings.json | 23 +++++ .../Presentation/appsettings.Development.json | 8 ++ backend/Presentation/appsettings.json | 9 ++ .../admin-panel-link/admin-panel-link.html | 9 +- .../admin-panel-link/admin-panel-link.ts | 9 +- .../content-manager-panel-link.html | 9 +- .../content-manager-panel-link.ts | 9 +- .../app/global-components/header/header.ts | 1 - .../user-galleries-link.html | 9 +- .../user-galleries-link.ts | 11 +- .../app/services/userService/userService.ts | 7 +- front/v2/src/models/roleModel.ts | 7 ++ front/v2/src/models/userModel.ts | 60 ++++++----- 63 files changed, 633 insertions(+), 200 deletions(-) delete mode 100644 back/.program_data/app.db-shm delete mode 100644 back/.program_data/app.db-wal create mode 100644 back/controllers/AuthController.cs create mode 100644 back/persistance/data/repositories/Abstracts/IPermissionRepository.cs create mode 100644 back/persistance/data/repositories/Abstracts/IRoleRepository.cs create mode 100644 back/persistance/data/repositories/PermissionRepository.cs create mode 100644 back/persistance/data/repositories/RoleRepository.cs create mode 100644 backend/Presentation/Controllers/AuthController.cs create mode 100644 backend/Presentation/Infraestructura/Responses/ExecutionError.cs create mode 100644 backend/Presentation/Infraestructura/Responses/Response.cs create mode 100644 backend/Presentation/Infraestructura/Responses/ValidationError.cs create mode 100644 backend/Presentation/Presentation.csproj create mode 100644 backend/Presentation/Program.cs create mode 100644 backend/Presentation/Properties/launchSettings.json create mode 100644 backend/Presentation/appsettings.Development.json create mode 100644 backend/Presentation/appsettings.json diff --git a/back/.program_data/app.db-shm b/back/.program_data/app.db-shm deleted file mode 100644 index fbabe1e9ab2a6b057cd8411f2829a4662061f017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI*F-pT=7zW_4)wV_)s#Du5h)XGS=wZBtlSl9Z^$w0Y30}b6vEb$`LeZi9{*WPy zgIh7r3vco#goN)oz@N$cRg?^}y@>H?o>$rD#ohMjW_|zg`t|+!@wB{sd^y{^U0+WA z_|-Sax+HMirD4rVfB*pk1pcW&*^^ZW5FkK+009C72oNAZ wfB*pk1PBlyK!5-N0t5&UAV8o92CF0ir7}O#lD@ diff --git a/back/.program_data/app.db-wal b/back/.program_data/app.db-wal deleted file mode 100644 index 9157b2c1dc667b412aaecad52baee15b02d19c49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78312 zcmeI*O{^Aj)O}~!jfA`GfOSBD5a}Tts{dM zx2-<%&*}HQce}vbM;G2c;KlJP5P$##AOHafKmY;|fB*y_009WZUf}%sqZ{`_9$!cB z?=J90<4Zr@Ui`onTt^W5KOY8!00bZa0SG_<0uX=z1Rwx`mH`f>j+MC0e!lBMA8dCKo^Ml;=*_kfB*y_009U<00Izz z00bZqdx3+xKzBe-QdFfvNt`8a^#wVU8Q<=CY<0FYHCkq6@@+ zd0{{ZKmY;|fB*y_009U<00Iz*xxhhPz?_7%H(656L5mwXo>fXVy8S9Al7S$3TQO96 zO_leiq$HTRq+Q_IMP@r%7bonPDsc{_PlOhq>9z@JS@S(v*)eTvROgk`U4Y3FXYLnB zJ@N8~?WbS77hNFciwomH00Izz00bZa0SG_<0uX>e>;(?$0%O__194#WMy+IvX@sqN=+m3CKuW^MHxpfRb zKV((=L>EY9X(CIqXYCjG>o=I^AAfB97P>&}mlp5EC zZO~BJ?ao~n-R{JiFxpO%#ylq#Pjvy7%F?N`y1-YSx%J@(&S&pN7l`@d!gvsX00bZa z0SG_<0uX=z1RxN5frGk0y{rVi8LzIzR-&BNnB<_}EobJF1A)jW&>M_!WOA0B3sF?Evr&Bgo+Xl`;)MFx(jew z^33}V{^<3eef8P5?sy1YAm)n;<3Rud5P$##AOHafKmY;|fI#d84(b98Qy7>7n)> z%NhIKmOIwHMW>;x^BiZWCfk&WiYEq?#OFL-(RpXBPA8iVUuTF(o=H`8Q?xB0}?zu>-uv0q&n5CRZ@00bZa0SG_<0uX=z z1mZ4mP#4$^HdfW*qFsHhSM#N6Crxr1CxxAHLZzpAVV2BfrYTkSwPtRjY>22Z$h(mu zxm6*sQhm>3O^%uhgHoU~8{cdyW~F8sCqIvX%Tnb2aaI@j!+m%E^5NU>yo~(InYvQ0j5^cZio%}q4eHX}N*)u<< z@Ubrz?s@bl-0#r^;=Z~t9|Rx(0SG_<0uX=z1Rwwb2*h3Bur8nr8L!NTE)|q!lI+rH zGE!AFaF@*npKRACt3Kg35;j$)pQ(Uz6QUNOkGdvOmx(rOcwt zPSp1NcV^wfB*y_009U<00Izz00bZqcY%Yt zKxxyN3~W{Q7EvLU6So2>dvW=;xXe&`uCbK?F2=`2HKN%pMk2=q5!_{Yazy7wt`fw-?O%m)Do zKmY;|fB*y_009U<00MCrIH(KwqC?THvKUd*O1ovK`EAXp7!(~Xonl%_wE18r=G#V( zSZ#6<=_!u2lm|nr9=Y7aXojIvY7_;RDD&DRy_EE2fzfnVU!3j&OqM0i>H;s`p8ego zuRQt)xCe+A PxXSs+U?$6erGsH?O+ diff --git a/back/.program_data/imgs/systemkey.lock b/back/.program_data/imgs/systemkey.lock index 92b2ff1..6012986 100644 --- a/back/.program_data/imgs/systemkey.lock +++ b/back/.program_data/imgs/systemkey.lock @@ -1,5 +1,5 @@ { "email": "sys@t.em", - "key": "aa0e0979-99db-42e7-8b60-91c2d055b9d0", - "password": "+z1L[oYUupZ>L{4a" + "key": "b60e166e-d4a5-416e-a7c9-142d05fb7f31", + "password": "8C3,uTÑ Roles { get; set; } = []; + public ICollection Roles { get; set; } = []; } diff --git a/back/DataModels/Event.cs b/back/DataModels/Event.cs index 81c9219..85d833c 100644 --- a/back/DataModels/Event.cs +++ b/back/DataModels/Event.cs @@ -1,6 +1,6 @@ -using System.ComponentModel.DataAnnotations; +using MCVIngenieros.Transactional.Abstractions; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using Transactional.Abstractions; namespace back.DataModels; diff --git a/back/DataModels/Gallery.cs b/back/DataModels/Gallery.cs index b540d8e..246f750 100644 --- a/back/DataModels/Gallery.cs +++ b/back/DataModels/Gallery.cs @@ -1,6 +1,6 @@ +using MCVIngenieros.Transactional.Abstractions; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using Transactional.Abstractions; namespace back.DataModels; diff --git a/back/DataModels/Permission.cs b/back/DataModels/Permission.cs index 6fa6251..11de19f 100644 --- a/back/DataModels/Permission.cs +++ b/back/DataModels/Permission.cs @@ -1,10 +1,16 @@ +using MCVIngenieros.Transactional.Abstractions.Interfaces; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace back.DataModels; +public record PermissionDto +{ + public string Id { get; set; } = null!; +} + [Table("Permissions")] -public partial class Permission: IEquatable +public partial class Permission : IEntity { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public string Id { get; set; } = null!; @@ -26,6 +32,32 @@ public partial class Permission: IEquatable Id == other.Id || GetHashCode() == other.GetHashCode(); } + public bool IsNull => this is null; + + public object Clone() => (Permission)MemberwiseClone(); + + public int CompareTo(object? obj) + { + if (obj is null) return 1; + if (obj is not Permission other) throw new ArgumentException("Object is not a Person"); + return CompareTo(other); + } + + public int CompareTo(Permission? other) + { + if (other is null) return 1; + if (ReferenceEquals(this, other)) return 0; + return string.Compare(Id, other.Id, StringComparison.OrdinalIgnoreCase); + } + + public PermissionDto ToDto() + { + return new PermissionDto + { + Id = Id + }; + } + // Static permissions public static readonly Permission ViewContentPermission = new() { Id = "1", Name = "VIEW_CONTENT", Description = "Permission to view content" }; public static readonly Permission LikeContentPermission = new() { Id = "2", Name = "LIKE_CONTENT", Description = "Permission to like content" }; diff --git a/back/DataModels/Person.cs b/back/DataModels/Person.cs index 1c10a4b..61bdfaa 100644 --- a/back/DataModels/Person.cs +++ b/back/DataModels/Person.cs @@ -1,7 +1,7 @@ +using MCVIngenieros.Transactional.Abstractions; +using MCVIngenieros.Transactional.Abstractions.Interfaces; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using Transactional.Abstractions; -using Transactional.Abstractions.Interfaces; namespace back.DataModels; diff --git a/back/DataModels/Photo.cs b/back/DataModels/Photo.cs index 694ee86..fb7af91 100644 --- a/back/DataModels/Photo.cs +++ b/back/DataModels/Photo.cs @@ -1,6 +1,6 @@ -using System.ComponentModel.DataAnnotations; +using MCVIngenieros.Transactional.Abstractions.Interfaces; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using Transactional.Abstractions.Interfaces; namespace back.DataModels; diff --git a/back/DataModels/Role.cs b/back/DataModels/Role.cs index a0466ad..b1dba06 100644 --- a/back/DataModels/Role.cs +++ b/back/DataModels/Role.cs @@ -1,10 +1,17 @@ +using MCVIngenieros.Transactional.Abstractions.Interfaces; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace back.DataModels; +public class RoleDto +{ + public string Id { get; set; } = null!; + public List Permissions { get; set; } = []; +} + [Table("Roles")] -public partial class Role : IEquatable +public partial class Role : IEntity { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public string Id { get; set; } = null!; @@ -18,7 +25,6 @@ public partial class Role : IEquatable public virtual ICollection Permissions { get; set; } = new HashSet(); public virtual ICollection Users { get; set; } = []; - public bool IsAdmin() => BaseRoleModel != null ? BaseRoleModel.IsAdmin() : Id == AdminRole.Id; public bool IsContentManager() => BaseRoleModel != null ? BaseRoleModel.IsContentManager() : Id == ContentManagerRole.Id; public bool IsUser() => BaseRoleModel != null ? BaseRoleModel.IsUser() : Id == UserRole.Id; @@ -43,7 +49,7 @@ public partial class Role : IEquatable BaseRoleModelId = baseRoleModel.Id; foreach (var permission in baseRoleModel.Permissions) { - if (!Permissions.Any(p => p.Id == permission.Id)) + if (!Permissions.Any(p => p.Id == permission.Id)) { Permissions.Add(permission); } @@ -62,6 +68,33 @@ public partial class Role : IEquatable return Id == other.Id || GetHashCode() == other.GetHashCode(); } + public bool IsNull => this is null; + + public object Clone() => (Role)MemberwiseClone(); + + public int CompareTo(object? obj) + { + if (obj is null) return 1; + if (obj is not Role other) throw new ArgumentException("Object is not a Person"); + return CompareTo(other); + } + + public int CompareTo(Role? other) + { + if (other is null) return 1; + if (ReferenceEquals(this, other)) return 0; + return string.Compare(Id, other.Id, StringComparison.OrdinalIgnoreCase); + } + + public RoleDto ToDto() + { + return new RoleDto + { + Id = Id, + Permissions = [.. Permissions.Select(p => p.ToDto())] + }; + } + public static readonly Role UserRole = new( "1", "User", "Role for regular users", [ diff --git a/back/DataModels/User.cs b/back/DataModels/User.cs index 5dbd692..0bbcb94 100644 --- a/back/DataModels/User.cs +++ b/back/DataModels/User.cs @@ -1,7 +1,7 @@ using back.DTO; +using MCVIngenieros.Transactional.Abstractions.Interfaces; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using Transactional.Abstractions.Interfaces; namespace back.DataModels; @@ -36,7 +36,7 @@ public class User : IEntity public UserDto ToDto() => new() { Id = Id, - Roles = Roles + Roles = [.. Roles.Select(r => r.ToDto())] }; public bool IsAdmin() => Roles.Any(r => r.IsAdmin()); @@ -80,7 +80,7 @@ public class User : IEntity password: "", createdAt: DateTime.UtcNow ) - { + { Roles = [Role.AdminRole, Role.ContentManagerRole, Role.UserRole] }; } \ No newline at end of file diff --git a/back/Program.cs b/back/Program.cs index 61028ea..00c7195 100644 --- a/back/Program.cs +++ b/back/Program.cs @@ -1,5 +1,5 @@ using back.ServicesExtensions; -using healthchecks; +using MCVIngenieros.Healthchecks; namespace back; @@ -13,11 +13,7 @@ public class Program builder.Services.AddControllers(); - builder.Services.AddHealthChecks(options => { - options.CacheDuration = TimeSpan.FromMinutes(30); - options.Timeout = TimeSpan.FromSeconds(5); - options.AssembliesToScan = [typeof(Program).Assembly]; - }).DiscoverHealthChecks(); + builder.Services.AddHealthChecksSupport().DiscoverHealthChecks(); // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddSwaggerGen(); diff --git a/back/ServicesExtensions/ServicesExtensions.cs b/back/ServicesExtensions/ServicesExtensions.cs index 00101c8..a797685 100644 --- a/back/ServicesExtensions/ServicesExtensions.cs +++ b/back/ServicesExtensions/ServicesExtensions.cs @@ -3,8 +3,8 @@ using System.Text.Json.Serialization; using back.services.engine.SystemUser; using DependencyInjector; using System.Text.Json; -using Transactional.Abstractions.Interfaces; -using Transactional.Implementations.EntityFramework; +using MCVIngenieros.Transactional.Abstractions.Interfaces; +using MCVIngenieros.Transactional.Implementations.EntityFramework; namespace back.ServicesExtensions; diff --git a/back/appsettings.Development.json b/back/appsettings.Development.json index 46009f1..8f113a3 100644 --- a/back/appsettings.Development.json +++ b/back/appsettings.Development.json @@ -19,10 +19,15 @@ "EnableSsl": true }, "HealthChecksConfigs": { + "CacheDuration": "00:30:00", + "Timeout": "00:00:05", + "AssembliesToScan": [ + "back" + ], "Sqlite": { - "RetryAttempts" : 2, - "Timeout" : "00:05:00", - "RetryDelay" : "00:00:10", + "RetryAttempts": 2, + "Timeout": "00:05:00", + "RetryDelay": "00:00:10", "Severity": "Info" } } diff --git a/back/back.csproj b/back/back.csproj index f2b09dd..5c70458 100644 --- a/back/back.csproj +++ b/back/back.csproj @@ -12,6 +12,7 @@ + @@ -33,7 +34,6 @@ - @@ -48,8 +48,7 @@ - - + diff --git a/back/back.sln b/back/back.sln index 65a05f5..8823921 100644 --- a/back/back.sln +++ b/back/back.sln @@ -5,11 +5,11 @@ VisualStudioVersion = 17.14.36401.2 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "back", "back.csproj", "{392278F3-4B36-47F4-AD31-5FBFCC181AD4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Transactional", "..\..\nuget\Transactional\Transactional.csproj", "{ED76105A-5E6F-4997-86FE-6A7902A2AEBA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MCVIngenieros.Transactional", "..\..\nuget\Transactional\MCVIngenieros.Transactional.csproj", "{ED76105A-5E6F-4997-86FE-6A7902A2AEBA}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DependencyInjector", "..\..\nuget\DependencyInjector\DependencyInjector.csproj", "{DBDF84A4-235C-4F29-8626-5BD1DC255970}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "healthchecks", "..\..\nuget\healthchecks\healthchecks.csproj", "{B21E2BEF-17B7-4981-9843-C0CC36D67010}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Presentation", "..\backend\Presentation\Presentation.csproj", "{F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -29,10 +29,10 @@ Global {DBDF84A4-235C-4F29-8626-5BD1DC255970}.Debug|Any CPU.Build.0 = Debug|Any CPU {DBDF84A4-235C-4F29-8626-5BD1DC255970}.Release|Any CPU.ActiveCfg = Release|Any CPU {DBDF84A4-235C-4F29-8626-5BD1DC255970}.Release|Any CPU.Build.0 = Release|Any CPU - {B21E2BEF-17B7-4981-9843-C0CC36D67010}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B21E2BEF-17B7-4981-9843-C0CC36D67010}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B21E2BEF-17B7-4981-9843-C0CC36D67010}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B21E2BEF-17B7-4981-9843-C0CC36D67010}.Release|Any CPU.Build.0 = Release|Any CPU + {F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/back/controllers/AuthController.cs b/back/controllers/AuthController.cs new file mode 100644 index 0000000..6f761d5 --- /dev/null +++ b/back/controllers/AuthController.cs @@ -0,0 +1,44 @@ +using Microsoft.AspNetCore.Mvc; + +namespace back.controllers; + +public class ValidationErrors +{ + public string? Field { get; set; } + public string? Message { get; set; } +} + +public class ExecutionErrors +{ + public Exception? Exception { get; set; } + public string? Message { get; set; } +} + +public abstract class ResponseBase +{ + public object? Data { get; set; } + public string? Message { get; set; } + public bool Success { get; set; } + public int StatusCode { get; set; } + public ValidationErrors[] ValidationErrors { get; set; } + public ExecutionErrors[] ExecutionErrors { get; set; } +} + +public record LoginRequest(string Username, string Password); + +[ApiController, Route("api/[controller]")] +public class AuthController(IAuthService authService) : ControllerBase +{ + + private readonly IAuthService _authService = authService; + + [HttpPost, Route("login")] + public async Task Login([FromBody] LoginRequest loginRequest) + { + // validar que el usuario y la contraseña sean correctos + // obtener el token JWT encriptado + // obtener el refresh token + // devolver el token JWT y el refresh token en los headers de las respuestas + // devolver datos del usuario en el body de la respuesta + } +} diff --git a/back/controllers/UsersController.cs b/back/controllers/UsersController.cs index 1568056..b35d60a 100644 --- a/back/controllers/UsersController.cs +++ b/back/controllers/UsersController.cs @@ -1,8 +1,6 @@ using back.DataModels; -using back.DTO; using back.services.bussines; using back.services.bussines.UserService; -using Mapster; using Microsoft.AspNetCore.Mvc; namespace back.controllers; @@ -46,14 +44,14 @@ public class UsersController(IUserService user) : ControllerBase if (user == null || string.IsNullOrEmpty(user.Email) || string.IsNullOrEmpty(user.Password)) return BadRequest(Errors.BadRequest.Description); - if (user.Email.Equals(DataModels.User.SystemUser.Email, StringComparison.InvariantCultureIgnoreCase)) + if (user.Email.Equals(DataModels.User.SystemUser.Email, StringComparison.InvariantCultureIgnoreCase)) { if (string.IsNullOrEmpty(user.SystemKey)) return Unauthorized(Errors.Unauthorized.Description); var systemUser = await _user.ValidateSystemUser(user.Email, user.Password, user.SystemKey, clientId); if (systemUser == null) return Unauthorized(Errors.Unauthorized.Description); - return Ok(systemUser.Adapt()); + return Ok(systemUser.ToDto()); } var existingUser = await _user.Login(user.Email, user.Password, clientId); @@ -74,7 +72,7 @@ public class UsersController(IUserService user) : ControllerBase // POST api/ [HttpPost("[action]")] public async Task Register( - [FromHeader(Name = "X-client-thumbprint")] string clientId, + [FromHeader(Name = "X-client-thumbprint")] string clientId, [FromBody] RegisterFromModel user) { if (user == null) diff --git a/back/healthchecks/options/HealthChecksConfigs.cs b/back/healthchecks/options/HealthChecksConfigs.cs index 2c432ac..88fa79b 100644 --- a/back/healthchecks/options/HealthChecksConfigs.cs +++ b/back/healthchecks/options/HealthChecksConfigs.cs @@ -1,8 +1,6 @@ -using HealthChecksConfigsBase = healthchecks.Options.HealthChecksConfigs; +namespace back.healthchecks.Options; -namespace back.healthchecks.Options; - -public partial class HealthChecksConfigs : HealthChecksConfigsBase +public partial class HealthChecksConfigs : MCVIngenieros.Healthchecks.Options.HealthChecksConfigs { public const string Sqlite = "Sqlite"; } diff --git a/back/healthchecks/sqlite.cs b/back/healthchecks/sqlite.cs index 5f22ce3..f825a40 100644 --- a/back/healthchecks/sqlite.cs +++ b/back/healthchecks/sqlite.cs @@ -1,12 +1,12 @@ -using back.Options; -using healthchecks; -using healthchecks.Abstracts; -using back.healthchecks.Options; +using back.healthchecks.Options; +using back.Options; +using MCVIngenieros.Healthchecks; +using MCVIngenieros.Healthchecks.Abstracts; using Microsoft.Extensions.Options; namespace back.healthchecks; -public class SqliteHealthCheck(IOptionsMonitor databaseConfig, IOptionsMonitor healthchecksConfig) : IHealthCheck +public class SqliteHealthCheck(IOptionsMonitor databaseConfig, IOptionsMonitor healthchecksConfig) : HealthCheck { private readonly DatabaseConfig databaseConfig = databaseConfig.Get(DatabaseConfig.DataStorage); private readonly HealthChecksConfigs hcConfig = healthchecksConfig.Get(HealthChecksConfigs.Sqlite); @@ -17,7 +17,7 @@ public class SqliteHealthCheck(IOptionsMonitor databaseConfig, I public TimeSpan? RetryDelay => hcConfig.RetryDelay ?? TimeSpan.FromSeconds(1); public HealthCheckSeverity? Severity => hcConfig.Severity ?? HealthCheckSeverity.Critical; - public Task CheckAsync(CancellationToken cancellationToken = default) + public override Task CheckAsync(CancellationToken cancellationToken = default) { var isHealthy = false; var details = string.Empty; @@ -43,7 +43,7 @@ public class SqliteHealthCheck(IOptionsMonitor databaseConfig, I details = $"Failed to connect to SQLite database: {ex.Message}"; } - return Task.FromResult(new HealthCheckResult(isHealthy, null) + return Task.FromResult(new HealthCheckResult(isHealthy) { Details = details, Severity = isHealthy ? HealthCheckSeverity.Info : HealthCheckSeverity.Critical diff --git a/back/persistance/blob/IBlobStorageService.cs b/back/persistance/blob/IBlobStorageService.cs index 1ca5f14..d9138af 100644 --- a/back/persistance/blob/IBlobStorageService.cs +++ b/back/persistance/blob/IBlobStorageService.cs @@ -1,4 +1,4 @@ -using DependencyInjector.Lifetimes; +using DependencyInjector.Abstractions.Lifetimes; namespace back.persistance.blob; diff --git a/back/persistance/data/DataContext.cs b/back/persistance/data/DataContext.cs index 5e32618..7dc197e 100644 --- a/back/persistance/data/DataContext.cs +++ b/back/persistance/data/DataContext.cs @@ -49,15 +49,6 @@ public partial class DataContext : DbContext relationEstablisher?.EstablishRelation(modelBuilder); }); - //typeof(ISeeder).Assembly.GetExportedTypes() - // .Where(t => typeof(ISeeder).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract) - // .ToList() - // .ForEach(seederType => - // { - // var seeder = (ISeeder?)Activator.CreateInstance(seederType); - // seeder?.Seed(modelBuilder); - // }); - OnModelCreatingPartial(modelBuilder); } diff --git a/back/persistance/data/repositories/Abstracts/IPermissionRepository.cs b/back/persistance/data/repositories/Abstracts/IPermissionRepository.cs new file mode 100644 index 0000000..e85d8e1 --- /dev/null +++ b/back/persistance/data/repositories/Abstracts/IPermissionRepository.cs @@ -0,0 +1,10 @@ +using back.DataModels; +using DependencyInjector.Abstractions.Lifetimes; +using MCVIngenieros.Transactional.Abstractions.Interfaces; + +namespace back.persistance.data.repositories.Abstracts; + +public interface IPermissionRepository : IRepository, IScoped +{ + Task SeedDefaultPermissions(); +} diff --git a/back/persistance/data/repositories/Abstracts/IPersonRepository.cs b/back/persistance/data/repositories/Abstracts/IPersonRepository.cs index 3820ccf..f28dcf3 100644 --- a/back/persistance/data/repositories/Abstracts/IPersonRepository.cs +++ b/back/persistance/data/repositories/Abstracts/IPersonRepository.cs @@ -1,6 +1,6 @@ using back.DataModels; -using DependencyInjector.Lifetimes; -using Transactional.Abstractions.Interfaces; +using DependencyInjector.Abstractions.Lifetimes; +using MCVIngenieros.Transactional.Abstractions.Interfaces; namespace back.persistance.data.repositories.Abstracts; diff --git a/back/persistance/data/repositories/Abstracts/IPhotoRepository.cs b/back/persistance/data/repositories/Abstracts/IPhotoRepository.cs index b3cb733..ed03f6b 100644 --- a/back/persistance/data/repositories/Abstracts/IPhotoRepository.cs +++ b/back/persistance/data/repositories/Abstracts/IPhotoRepository.cs @@ -1,8 +1,8 @@ using back.DataModels; -using DependencyInjector.Lifetimes; -using Transactional.Abstractions.Interfaces; +using DependencyInjector.Abstractions.Lifetimes; +using MCVIngenieros.Transactional.Abstractions.Interfaces; namespace back.persistance.data.repositories.Abstracts; -public interface IPhotoRepository : IRepository, IScoped +public interface IPhotoRepository : IRepository, IScoped { } diff --git a/back/persistance/data/repositories/Abstracts/IRoleRepository.cs b/back/persistance/data/repositories/Abstracts/IRoleRepository.cs new file mode 100644 index 0000000..35b8b34 --- /dev/null +++ b/back/persistance/data/repositories/Abstracts/IRoleRepository.cs @@ -0,0 +1,10 @@ +using back.DataModels; +using DependencyInjector.Abstractions.Lifetimes; +using MCVIngenieros.Transactional.Abstractions.Interfaces; + +namespace back.persistance.data.repositories.Abstracts; + +public interface IRoleRepository : IRepository, IScoped +{ + Task SeedDefaultRoles(); +} diff --git a/back/persistance/data/repositories/Abstracts/IUserRepository.cs b/back/persistance/data/repositories/Abstracts/IUserRepository.cs index b5d8aab..6d39852 100644 --- a/back/persistance/data/repositories/Abstracts/IUserRepository.cs +++ b/back/persistance/data/repositories/Abstracts/IUserRepository.cs @@ -1,6 +1,6 @@ using back.DataModels; -using DependencyInjector.Lifetimes; -using Transactional.Abstractions.Interfaces; +using DependencyInjector.Abstractions.Lifetimes; +using MCVIngenieros.Transactional.Abstractions.Interfaces; namespace back.persistance.data.repositories.Abstracts; diff --git a/back/persistance/data/repositories/PermissionRepository.cs b/back/persistance/data/repositories/PermissionRepository.cs new file mode 100644 index 0000000..3425e17 --- /dev/null +++ b/back/persistance/data/repositories/PermissionRepository.cs @@ -0,0 +1,34 @@ +using back.DataModels; +using back.persistance.data.repositories.Abstracts; +using MCVIngenieros.Transactional.Implementations.EntityFramework; + +namespace back.persistance.data.repositories; + +public class PermissionRepository(DataContext context) : ReadWriteRepository(context), IPermissionRepository +{ + // Implement methods specific to Photo repository if needed + public async Task SeedDefaultPermissions() + { + var defaultPermissions = new List + { + Permission.ViewContentPermission, + Permission.LikeContentPermission, + Permission.EditContentPermission, + Permission.DeleteContentPermission, + Permission.CreateContentPermission, + Permission.EditUserPermission, + Permission.DeleteUserPermission, + Permission.DisableUserPermission, + Permission.CreateUserPermission, + Permission.EditWebConfigPermission + }; + foreach (var permission in defaultPermissions) + { + if (!Entities.Any(p => p.Id == permission.Id)) + { + Entities.Add(permission); + } + } + await SaveChanges(); + } +} diff --git a/back/persistance/data/repositories/PersonRepository.cs b/back/persistance/data/repositories/PersonRepository.cs index 0d834b3..b5e4def 100644 --- a/back/persistance/data/repositories/PersonRepository.cs +++ b/back/persistance/data/repositories/PersonRepository.cs @@ -1,6 +1,6 @@ using back.DataModels; using back.persistance.data.repositories.Abstracts; -using Transactional.Implementations.EntityFramework; +using MCVIngenieros.Transactional.Implementations.EntityFramework; namespace back.persistance.data.repositories; diff --git a/back/persistance/data/repositories/PhotoRepository.cs b/back/persistance/data/repositories/PhotoRepository.cs index d7c4084..36aee8a 100644 --- a/back/persistance/data/repositories/PhotoRepository.cs +++ b/back/persistance/data/repositories/PhotoRepository.cs @@ -1,6 +1,6 @@ using back.DataModels; using back.persistance.data.repositories.Abstracts; -using Transactional.Implementations.EntityFramework; +using MCVIngenieros.Transactional.Implementations.EntityFramework; namespace back.persistance.data.repositories; diff --git a/back/persistance/data/repositories/RoleRepository.cs b/back/persistance/data/repositories/RoleRepository.cs new file mode 100644 index 0000000..206e31f --- /dev/null +++ b/back/persistance/data/repositories/RoleRepository.cs @@ -0,0 +1,27 @@ +using back.DataModels; +using back.persistance.data.repositories.Abstracts; +using MCVIngenieros.Transactional.Implementations.EntityFramework; + +namespace back.persistance.data.repositories; + +public class RoleRepository(DataContext context) : ReadWriteRepository(context), IRoleRepository +{ + // Implement methods specific to Photo repository if needed + public async Task SeedDefaultRoles() + { + var defaultRoles = new List + { + Role.AdminRole, + Role.UserRole, + Role.ContentManagerRole + }; + foreach (var role in defaultRoles) + { + if (!Entities.Any(p => p.Id == role.Id)) + { + Entities.Add(role); + } + } + await SaveChanges(); + } +} diff --git a/back/persistance/data/repositories/UserRepository.cs b/back/persistance/data/repositories/UserRepository.cs index 0a1bc8c..0892aa0 100644 --- a/back/persistance/data/repositories/UserRepository.cs +++ b/back/persistance/data/repositories/UserRepository.cs @@ -1,20 +1,22 @@ using back.DataModels; using back.persistance.data.repositories.Abstracts; +using MCVIngenieros.Transactional.Implementations.EntityFramework; using Microsoft.EntityFrameworkCore; -using Transactional.Implementations.EntityFramework; namespace back.persistance.data.repositories; -public class UserRepository(DataContext context) : ReadWriteRepository(context), IUserRepository +public class UserRepository( + DataContext context + ) : ReadWriteRepository(context), IUserRepository { public async Task GetByEmail(string email) { - try + try { if (string.IsNullOrEmpty(email)) return null; return await Entities.FirstOrDefaultAsync(u => u.Email == email); } - catch + catch { return null; } @@ -37,26 +39,29 @@ public class UserRepository(DataContext context) : ReadWriteRepository(con public async Task Login(string email, string password) { if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password)) return null; - try + try { - return await Entities.FirstOrDefaultAsync(u => u.Email == email && u.Password == password); + return await Entities + .Include(u => u.Roles) + .ThenInclude(r => r.Permissions) + .FirstOrDefaultAsync(u => u.Email == email && u.Password == password); } - catch + catch { - return null; + return null; } } - + public async Task ExistsByEmail(string email) { - try + try { if (string.IsNullOrEmpty(email)) return false; return await Entities.AnyAsync(u => u.Email == email); - } - catch - { - return false; + } + catch + { + return false; } } diff --git a/back/persistance/data/seeders/PermissionSeeder.cs b/back/persistance/data/seeders/PermissionSeeder.cs index 638e3e0..ab777ae 100644 --- a/back/persistance/data/seeders/PermissionSeeder.cs +++ b/back/persistance/data/seeders/PermissionSeeder.cs @@ -1,23 +1,23 @@ -//using back.DataModels; -//using Microsoft.EntityFrameworkCore; +using back.DataModels; +using Microsoft.EntityFrameworkCore; -//namespace back.persistance.data.seeders; +namespace back.persistance.data.seeders; -//public class PermissionSeeder : ISeeder -//{ -// public void Seed(ModelBuilder modelBuilder) -// { -// modelBuilder.Entity().HasData( -// Permission.ViewContentPermission, -// Permission.LikeContentPermission, -// Permission.EditContentPermission, -// Permission.DeleteContentPermission, -// Permission.CreateContentPermission, -// Permission.EditUserPermission, -// Permission.DeleteUserPermission, -// Permission.DisableUserPermission, -// Permission.CreateUserPermission, -// Permission.EditWebConfigPermission -// ); -// } -//} \ No newline at end of file +public class PermissionSeeder : ISeeder +{ + public void Seed(ModelBuilder modelBuilder) + { + modelBuilder.Entity().HasData( + Permission.ViewContentPermission, + Permission.LikeContentPermission, + Permission.EditContentPermission, + Permission.DeleteContentPermission, + Permission.CreateContentPermission, + Permission.EditUserPermission, + Permission.DeleteUserPermission, + Permission.DisableUserPermission, + Permission.CreateUserPermission, + Permission.EditWebConfigPermission + ); + } +} \ No newline at end of file diff --git a/back/persistance/data/seeders/RoleSeeder.cs b/back/persistance/data/seeders/RoleSeeder.cs index 3da6ac9..06fcc86 100644 --- a/back/persistance/data/seeders/RoleSeeder.cs +++ b/back/persistance/data/seeders/RoleSeeder.cs @@ -1,16 +1,16 @@ -//using back.DataModels; -//using Microsoft.EntityFrameworkCore; +using back.DataModels; +using Microsoft.EntityFrameworkCore; -//namespace back.persistance.data.seeders; +namespace back.persistance.data.seeders; -//public class RoleSeeder : ISeeder -//{ -// public void Seed(ModelBuilder modelBuilder) -// { -// modelBuilder.Entity().HasData( -// new Role { Id = "1", Name = "User", Description = "Role for regular users", BaseRoleModelId = null }, -// new Role { Id = "2", Name = "Content Manager", Description = "Role for managing content", BaseRoleModelId = "1" }, -// new Role { Id = "3", Name = "Admin", Description = "Administrator role with full permissions", BaseRoleModelId = "2" } -// ); -// } -//} \ No newline at end of file +public class RoleSeeder : ISeeder +{ + public void Seed(ModelBuilder modelBuilder) + { + modelBuilder.Entity().HasData( + new Role { Id = "1", Name = "User", Description = "Role for regular users", BaseRoleModelId = null }, + new Role { Id = "2", Name = "Content Manager", Description = "Role for managing content", BaseRoleModelId = "1" }, + new Role { Id = "3", Name = "Admin", Description = "Administrator role with full permissions", BaseRoleModelId = "2" } + ); + } +} \ No newline at end of file diff --git a/back/persistance/data/seeders/SystemUserSeeder.cs b/back/persistance/data/seeders/SystemUserSeeder.cs index b5cb27e..0f7ae32 100644 --- a/back/persistance/data/seeders/SystemUserSeeder.cs +++ b/back/persistance/data/seeders/SystemUserSeeder.cs @@ -1,14 +1,14 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; +//using back.DataModels; +//using Microsoft.EntityFrameworkCore; -namespace back.persistance.data.seeders; +//namespace back.persistance.data.seeders; -public class SystemUserSeeder : ISeeder -{ - public void Seed(ModelBuilder modelBuilder) - { - modelBuilder.Entity().HasData( - User.SystemUser - ); - } -} \ No newline at end of file +//public class SystemUserSeeder : ISeeder +//{ +// public void Seed(ModelBuilder modelBuilder) +// { +// modelBuilder.Entity().HasData( +// User.SystemUser +// ); +// } +//} \ No newline at end of file diff --git a/back/services/bussines/PhotoService/IPhotoService.cs b/back/services/bussines/PhotoService/IPhotoService.cs index 8d045bb..c7f725f 100644 --- a/back/services/bussines/PhotoService/IPhotoService.cs +++ b/back/services/bussines/PhotoService/IPhotoService.cs @@ -1,6 +1,6 @@ using back.DataModels; using back.DTO; -using DependencyInjector.Lifetimes; +using DependencyInjector.Abstractions.Lifetimes; namespace back.services.bussines.PhotoService; diff --git a/back/services/bussines/UserService/IUserService.cs b/back/services/bussines/UserService/IUserService.cs index ec9bc48..0d576af 100644 --- a/back/services/bussines/UserService/IUserService.cs +++ b/back/services/bussines/UserService/IUserService.cs @@ -1,5 +1,5 @@ using back.DataModels; -using DependencyInjector.Lifetimes; +using DependencyInjector.Abstractions.Lifetimes; namespace back.services.bussines.UserService; diff --git a/back/services/bussines/UserService/UserService.cs b/back/services/bussines/UserService/UserService.cs index 472dc7c..6f2e4f0 100644 --- a/back/services/bussines/UserService/UserService.cs +++ b/back/services/bussines/UserService/UserService.cs @@ -68,7 +68,7 @@ public class UserService( return existingUser; } - public async Task Login(string email, string decryptedPass) + public async Task Login(string email, string decryptedPass) { var salt = await _repository.GetUserSaltByEmail(email); var hashedPassword = _cryptoService.HashPassword(decryptedPass, salt); @@ -136,6 +136,7 @@ public class UserService( { return null; } - return await Login(user.Email!, decryptedPassword); + var loggedUser = await Login(user.Email!, decryptedPassword); + return loggedUser; } } diff --git a/back/services/engine/Crypto/ICryptoService.cs b/back/services/engine/Crypto/ICryptoService.cs index 2a957fd..224a286 100644 --- a/back/services/engine/Crypto/ICryptoService.cs +++ b/back/services/engine/Crypto/ICryptoService.cs @@ -1,4 +1,4 @@ -using DependencyInjector.Lifetimes; +using DependencyInjector.Abstractions.Lifetimes; namespace back.services.engine.Crypto; diff --git a/back/services/engine/ImageResizer/IImageResizer.cs b/back/services/engine/ImageResizer/IImageResizer.cs index dbb82a2..02f6de5 100644 --- a/back/services/engine/ImageResizer/IImageResizer.cs +++ b/back/services/engine/ImageResizer/IImageResizer.cs @@ -1,4 +1,4 @@ -using DependencyInjector.Lifetimes; +using DependencyInjector.Abstractions.Lifetimes; namespace back.services.engine.ImageResizer; diff --git a/back/services/engine/PasswordGenerator/IPasswordGenerator.cs b/back/services/engine/PasswordGenerator/IPasswordGenerator.cs index aef6e6c..bcc7d97 100644 --- a/back/services/engine/PasswordGenerator/IPasswordGenerator.cs +++ b/back/services/engine/PasswordGenerator/IPasswordGenerator.cs @@ -1,4 +1,4 @@ -using DependencyInjector.Lifetimes; +using DependencyInjector.Abstractions.Lifetimes; namespace back.services.engine.PasswordGenerator; diff --git a/back/services/engine/SystemUser/ISystemUserGenerator.cs b/back/services/engine/SystemUser/ISystemUserGenerator.cs index c148ec4..01cb831 100644 --- a/back/services/engine/SystemUser/ISystemUserGenerator.cs +++ b/back/services/engine/SystemUser/ISystemUserGenerator.cs @@ -1,4 +1,4 @@ -using DependencyInjector.Lifetimes; +using DependencyInjector.Abstractions.Lifetimes; namespace back.services.engine.SystemUser; diff --git a/back/services/engine/SystemUser/SystemUserGenerator.cs b/back/services/engine/SystemUser/SystemUserGenerator.cs index 8f81afa..dd704b9 100644 --- a/back/services/engine/SystemUser/SystemUserGenerator.cs +++ b/back/services/engine/SystemUser/SystemUserGenerator.cs @@ -4,8 +4,8 @@ using back.persistance.data; using back.persistance.data.repositories.Abstracts; using back.services.engine.Crypto; using back.services.engine.PasswordGenerator; +using MCVIngenieros.Transactional.Abstractions.Interfaces; using System.Text.Json; -using Transactional.Abstractions.Interfaces; namespace back.services.engine.SystemUser; @@ -14,17 +14,20 @@ public class SystemUserGenerator( JsonSerializerOptions jsonSerializerOptions, IUserRepository userRepository, IPersonRepository personRepository, + IRoleRepository roleRepository, + IPermissionRepository permissionRepository, ICryptoService cryptoService, IBlobStorageService blobStorageService, IPasswordGenerator passwordGenerator) : ISystemUserGenerator { public async Task GenerateAsync() { - var systemKey = new SystemKey() { + var systemKey = new SystemKey() + { Password = passwordGenerator.Generate(16), }; var systemKeyJson = JsonSerializer.Serialize(systemKey, options: jsonSerializerOptions); - + using Stream stream = new MemoryStream(new System.Text.UTF8Encoding(true).GetBytes(systemKeyJson)); await blobStorageService.Delete("systemkey.lock"); @@ -42,11 +45,13 @@ public class SystemUserGenerator( { await transactional.DoTransaction(async () => { + await permissionRepository.SeedDefaultPermissions(); + await roleRepository.SeedDefaultRoles(); await personRepository.Insert(Person.SystemPerson); await userRepository.Insert(User.SystemUser); }); } - else + else { await userRepository.Update(User.SystemUser); await userRepository.SaveChanges(); diff --git a/back/services/engine/mailing/IEmailService.cs b/back/services/engine/mailing/IEmailService.cs index b8242bf..ecfec68 100644 --- a/back/services/engine/mailing/IEmailService.cs +++ b/back/services/engine/mailing/IEmailService.cs @@ -1,4 +1,4 @@ -using DependencyInjector.Lifetimes; +using DependencyInjector.Abstractions.Lifetimes; namespace back.services.engine.mailing; diff --git a/backend/Presentation/Controllers/AuthController.cs b/backend/Presentation/Controllers/AuthController.cs new file mode 100644 index 0000000..aa5a22e --- /dev/null +++ b/backend/Presentation/Controllers/AuthController.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Mvc; + +namespace Presentation.Controllers; + +public class AuthController : Controller +{ + +} diff --git a/backend/Presentation/Infraestructura/Responses/ExecutionError.cs b/backend/Presentation/Infraestructura/Responses/ExecutionError.cs new file mode 100644 index 0000000..61c9d3a --- /dev/null +++ b/backend/Presentation/Infraestructura/Responses/ExecutionError.cs @@ -0,0 +1,6 @@ +namespace Presentation.Infraestructura.Responses; + +public sealed class ExecutionError(string message) +{ + public string Message { get; set; } = message; +} diff --git a/backend/Presentation/Infraestructura/Responses/Response.cs b/backend/Presentation/Infraestructura/Responses/Response.cs new file mode 100644 index 0000000..7c896cd --- /dev/null +++ b/backend/Presentation/Infraestructura/Responses/Response.cs @@ -0,0 +1,29 @@ +using System.Net; + +namespace Presentation.Infraestructura.Responses; + +public sealed class Response +{ + public bool IsSuccess { get; set; } + public HttpStatusCode StatusCode { get; set; } + public T? Data { get; set; } + public ValidationError[]? ValidationErrors { get; set; } + public ExecutionError[]? ExecutionErrors { get; set; } + + public static Response Success(T result, HttpStatusCode statusCode = HttpStatusCode.OK) => + new() + { + IsSuccess = true, + StatusCode = statusCode, + Data = result + }; + + public static Response Failure(HttpStatusCode statusCode = HttpStatusCode.InternalServerError, ValidationError[]? validationErrors = null, ExecutionError[]? executionErrors = null) => + new() + { + IsSuccess = false, + StatusCode = statusCode, + ValidationErrors = validationErrors, + ExecutionErrors = executionErrors + }; +} \ No newline at end of file diff --git a/backend/Presentation/Infraestructura/Responses/ValidationError.cs b/backend/Presentation/Infraestructura/Responses/ValidationError.cs new file mode 100644 index 0000000..fea7ef2 --- /dev/null +++ b/backend/Presentation/Infraestructura/Responses/ValidationError.cs @@ -0,0 +1,7 @@ +namespace Presentation.Infraestructura.Responses; + +public sealed class ValidationError(string fieldName, string message) +{ + public string Field { get; set; } = fieldName; + public string Message { get; set; } = message; +} diff --git a/backend/Presentation/Presentation.csproj b/backend/Presentation/Presentation.csproj new file mode 100644 index 0000000..f1ec019 --- /dev/null +++ b/backend/Presentation/Presentation.csproj @@ -0,0 +1,34 @@ + + + + net9.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/Presentation/Program.cs b/backend/Presentation/Program.cs new file mode 100644 index 0000000..e95a90f --- /dev/null +++ b/backend/Presentation/Program.cs @@ -0,0 +1,96 @@ +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; +using Serilog; +using Serilog.Events; +using Serilog.Sinks.OpenTelemetry; + +namespace Presentation +{ + public class Program + { + public static void Main(string[] args) + { + // Configura Serilog como logger global antes de crear el builder + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .Enrich.FromLogContext() + .WriteTo.Console() + .WriteTo.OpenTelemetry(options => + { + options.Endpoint = "http://localhost:4317"; // OTLP endpoint + options.Protocol = OtlpProtocol.Grpc; + options.ResourceAttributes = new Dictionary + { + ["service.name"] = "mmorales.photo-backend" + }; + }) + .CreateLogger(); + + try + { + Log.Information("Starting up"); + var builder = WebApplication.CreateBuilder(args); + builder.Host.UseSerilog(); // Usa Serilog como proveedor de logs por defecto + + builder.Services.AddProblemDetails(options => + options.CustomizeProblemDetails = + ctx => ctx.ProblemDetails.Extensions.Add("traceId", ctx.HttpContext.TraceIdentifier) + ); + builder.Services.AddOpenTelemetry() + .WithTracing(tracerProviderBuilder => + { + tracerProviderBuilder + .SetResourceBuilder(ResourceBuilder.CreateDefault() + .AddService(builder.Environment.ApplicationName)) + .AddAspNetCoreInstrumentation() // Traza todas las peticiones HTTP entrantes + .AddHttpClientInstrumentation() // Traza las llamadas HttpClient salientes + .AddOtlpExporter(opt => + { + opt.Endpoint = new Uri("http://localhost:4317"); // Direccin del colector OTel + }) + .AddConsoleExporter(); // Exporta trazas tambin a consola para desarrollo + }); + // Add services to the container. + + builder.Services.AddControllers(); + // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi + builder.Services.AddOpenApi(); + + var app = builder.Build(); + if (!app.Environment.IsDevelopment()) + { + app.UseExceptionHandler(); + app.UseHsts(); + } + app.UseStatusCodePages(); + + app.UseAuthentication(); // Habilita autenticacin + app.UseAuthorization(); // Habilita autorizacin + + // Configure the HTTP request pipeline. + if (app.Environment.IsDevelopment()) + { + app.MapOpenApi(); + } + + app.UseHttpsRedirection(); + + app.UseAuthorization(); + + + app.MapControllers(); + + app.Run(); + } + catch (Exception ex) + { + Log.Fatal(ex, "Application start-up failed"); + throw; + } + finally + { + Log.CloseAndFlush(); + } + } + } +} diff --git a/backend/Presentation/Properties/launchSettings.json b/backend/Presentation/Properties/launchSettings.json new file mode 100644 index 0000000..64271a2 --- /dev/null +++ b/backend/Presentation/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5101", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7265;http://localhost:5101", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/backend/Presentation/appsettings.Development.json b/backend/Presentation/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/backend/Presentation/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/backend/Presentation/appsettings.json b/backend/Presentation/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/backend/Presentation/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.html b/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.html index 262a792..620d350 100644 --- a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.html +++ b/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.html @@ -1,3 +1,6 @@ - + diff --git a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.ts b/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.ts index d3c5734..ed05c1a 100644 --- a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.ts +++ b/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.ts @@ -1,11 +1,10 @@ import { Component } from '@angular/core'; +import { SvgButton } from '../../../utils/svg-button/svg-button'; @Component({ selector: 'admin-panel-link', - imports: [], + imports: [SvgButton], templateUrl: './admin-panel-link.html', - styleUrl: './admin-panel-link.scss' + styleUrl: './admin-panel-link.scss', }) -export class AdminPanelLink { - -} +export class AdminPanelLink {} diff --git a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.html b/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.html index 2f4b699..3b5fdc2 100644 --- a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.html +++ b/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.html @@ -1,3 +1,6 @@ - + diff --git a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.ts b/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.ts index 4b70f8d..be62e25 100644 --- a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.ts +++ b/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.ts @@ -1,11 +1,10 @@ import { Component } from '@angular/core'; +import { SvgButton } from '../../../utils/svg-button/svg-button'; @Component({ selector: 'content-manager-panel-link', - imports: [], + imports: [SvgButton], templateUrl: './content-manager-panel-link.html', - styleUrl: './content-manager-panel-link.scss' + styleUrl: './content-manager-panel-link.scss', }) -export class ContentManagerPanelLink { - -} +export class ContentManagerPanelLink {} diff --git a/front/v2/src/app/global-components/header/header.ts b/front/v2/src/app/global-components/header/header.ts index 4435ced..224b338 100644 --- a/front/v2/src/app/global-components/header/header.ts +++ b/front/v2/src/app/global-components/header/header.ts @@ -12,7 +12,6 @@ import { OnInit } from '@angular/core'; import { userModel } from '../../../models/userModel'; import { ServicesLink } from '../services-link/services-link'; import { Router, NavigationEnd } from '@angular/router'; -import { R } from '@angular/cdk/keycodes'; @Component({ selector: 'custom-header', diff --git a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.html b/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.html index 755c6e1..78af224 100644 --- a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.html +++ b/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.html @@ -1,3 +1,6 @@ - + diff --git a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.ts b/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.ts index 7c5520a..bbbb0a0 100644 --- a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.ts +++ b/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.ts @@ -1,11 +1,10 @@ -import { Component } from '@angular/core'; +import { Component, inject, signal } from '@angular/core'; +import { SvgButton } from '../../../utils/svg-button/svg-button'; @Component({ selector: 'user-galleries-link', - imports: [], + imports: [SvgButton], templateUrl: './user-galleries-link.html', - styleUrl: './user-galleries-link.scss' + styleUrl: './user-galleries-link.scss', }) -export class UserGalleriesLink { - -} +export class UserGalleriesLink {} diff --git a/front/v2/src/app/services/userService/userService.ts b/front/v2/src/app/services/userService/userService.ts index fdb7035..4634ebc 100644 --- a/front/v2/src/app/services/userService/userService.ts +++ b/front/v2/src/app/services/userService/userService.ts @@ -39,9 +39,10 @@ export class userService { systemKey: encryptedSystemKey, }) .then((response) => { - const { jwt, refresh, usermodel } = response.data; - localStorage.setItem('jwt', jwt); - localStorage.setItem('refresh', refresh); + const { id, roles } = response.data; + const usermodel = new userModel(id, roles, true); + // localStorage.setItem('jwt', jwt); + // localStorage.setItem('refresh', refresh); this.setUser(usermodel); return usermodel; }); diff --git a/front/v2/src/models/roleModel.ts b/front/v2/src/models/roleModel.ts index 141f445..05ddb4d 100644 --- a/front/v2/src/models/roleModel.ts +++ b/front/v2/src/models/roleModel.ts @@ -8,6 +8,13 @@ export class roleModel { public permissions: permissionModel[] = [], public baseRoleModel: roleModel | null = null ) { + this.id = id; + this.name = name; + this.description = description; + this.permissions = []; + for (const p of permissions) { + this.permissions.push(new permissionModel(p.id, '', '')); + } if (baseRoleModel) { this.permissions = baseRoleModel.permissions.concat(this.permissions); } diff --git a/front/v2/src/models/userModel.ts b/front/v2/src/models/userModel.ts index 5ceebe4..4b41793 100644 --- a/front/v2/src/models/userModel.ts +++ b/front/v2/src/models/userModel.ts @@ -11,47 +11,59 @@ enum SigningMethods { Microsoft = 'microsoft', } -class userModel extends personModel { +class userModel { constructor( - public override id: string, - public email: string, - public password: string, - public override name: string, + public id: string, public role: roleModel[], - public createdAt: Date, - public updatedAt: Date, - public isLoggedIn: boolean, - public preferredSigningMethod: SigningMethods = SigningMethods.Password + public isLoggedIn: boolean ) { - super({ - id, - name, - profilePicture: null, - avatar: null, - socialMedia: null, - }); + this.id = id; + for (const r of role) { + this.role.push(new roleModel(r.id, '', '', r.permissions, null)); + } + this.isLoggedIn = isLoggedIn; } + // constructor( + // public override id: string, + // public email: string, + // public password: string, + // public override name: string, + // public role: roleModel[], + // public createdAt: Date, + // public updatedAt: Date, + // public isLoggedIn: boolean, + // public preferredSigningMethod: SigningMethods = SigningMethods.Password + // ) { + // super({ + // id, + // name, + // profilePicture: null, + // avatar: null, + // socialMedia: null, + // }); + // } + get isAdmin(): boolean { - return this.role.some((role) => role.isAdmin); + return this.role.some((r) => r.isAdmin); } get isContentManager(): boolean { - return this.role.some((role) => role.isContentManager); + return this.role.some((r) => r.isContentManager); } get isUser(): boolean { - return this.role.some((role) => role.isUser); + return this.role.some((r) => r.isUser); } public static readonly DefaultUser: userModel = new userModel( '0', - 'default@example.com', - '', - 'Default User', + // 'default@example.com', + // '', + // 'Default User', [roleModel.UserRole], - new Date(), - new Date(), + // new Date(), + // new Date(), false ); } From 86810561399f0686b159501f64f4f01bc4d7948c Mon Sep 17 00:00:00 2001 From: Manuel Date: Thu, 28 Aug 2025 16:54:27 +0200 Subject: [PATCH 02/11] docu --- .vscode/launch.json | 46 - .vscode/tasks.json | 37 - README.md | 213 - back/.config/dotnet-tools.json | 13 - back/.program_data/imgs/systemkey.lock | 5 - back/DTO/PhotoFormModel.cs | 14 - back/DTO/UserDto.cs | 9 - back/DataModels/EfmigrationsLock.cs | 8 - back/DataModels/Event.cs | 44 - back/DataModels/Gallery.cs | 44 - back/DataModels/Permission.cs | 72 - back/DataModels/Person.cs | 70 - back/DataModels/Photo.cs | 66 - back/DataModels/Ranking.cs | 119 - back/DataModels/Role.cs | 127 - back/DataModels/SocialMedia.cs | 33 - back/DataModels/SystemKey.cs | 15 - back/DataModels/Tag.cs | 32 - back/DataModels/User.cs | 86 - back/Options/DatabaseConfig.cs | 14 - back/Options/Databases.cs | 6 - back/Options/MailServerOptions.cs | 10 - back/Program.cs | 48 - back/Properties/launchSettings.json | 24 - back/ServicesExtensions/DatabaseContexts.cs | 49 - .../DdContextOptionsBuilderExtensions.cs | 92 - back/ServicesExtensions/Options.cs | 76 - back/ServicesExtensions/ServicesExtensions.cs | 49 - back/appsettings.Development.json | 34 - back/appsettings.Production.json | 18 - back/appsettings.json | 9 - back/back.csproj | 54 - back/back.sln | 43 - back/controllers/AuthController.cs | 44 - back/controllers/CryptoController.cs | 21 - back/controllers/PhotosController.cs | 67 - back/controllers/UsersController.cs | 90 - .../options/HealthChecksConfigs.cs | 6 - back/healthchecks/sqlite.cs | 52 - .../blob/FileSystemImageStorageService.cs | 111 - back/persistance/blob/IBlobStorageService.cs | 13 - back/persistance/data/DataContext.cs | 56 - .../20250824120656_InitialSetup.Designer.cs | 752 -- .../migrations/20250824120656_InitialSetup.cs | 583 - .../migrations/DataContextModelSnapshot.cs | 749 -- .../data/migrations/sqlite/tables.sql | 200 - .../relations/EventRelationEstablisher.cs | 28 - .../relations/GalleryRelationEstablisher.cs | 68 - .../data/relations/IRelationEstablisher.cs | 8 - .../relations/PersonRelationEstablisher.cs | 68 - .../data/relations/PhotoContext.cs | 307 - .../relations/PhotoRelationEstablisher.cs | 15 - .../persistance/data/relations/RoleContext.cs | 25 - .../data/relations/RoleRelationEstablisher.cs | 30 - .../data/relations/SeedingDbContext.cs | 40 - .../data/relations/TagRelationEstablisher.cs | 15 - .../data/relations/UserRelationEstablisher.cs | 32 - .../Abstracts/IPermissionRepository.cs | 10 - .../Abstracts/IPersonRepository.cs | 10 - .../Abstracts/IPhotoRepository.cs | 8 - .../repositories/Abstracts/IRoleRepository.cs | 10 - .../repositories/Abstracts/IUserRepository.cs | 14 - .../data/repositories/PermissionRepository.cs | 34 - .../data/repositories/PersonRepository.cs | 10 - .../data/repositories/PhotoRepository.cs | 10 - .../data/repositories/RoleRepository.cs | 27 - .../data/repositories/UserRepository.cs | 75 - back/persistance/data/seeders/ISeeder.cs | 8 - .../data/seeders/PermissionSeeder.cs | 23 - back/persistance/data/seeders/RoleSeeder.cs | 16 - .../data/seeders/SystemUserSeeder.cs | 14 - back/services/bussines/Errors.cs | 11 - back/services/bussines/HttpErrorMap.cs | 5 - .../bussines/PhotoService/IPhotoService.cs | 15 - .../bussines/PhotoService/PhotoService.cs | 82 - .../bussines/UserService/IUserService.cs | 13 - .../bussines/UserService/UserService.cs | 142 - back/services/engine/Crypto/CryptoService.cs | 175 - back/services/engine/Crypto/ICryptoService.cs | 16 - .../engine/ImageResizer/IImageResizer.cs | 8 - .../engine/ImageResizer/ImageResizer.cs | 23 - .../PasswordGenerator/IPasswordGenerator.cs | 8 - .../PasswordGenerator/PasswordGenerator.cs | 40 - .../engine/SystemUser/ISystemUserGenerator.cs | 8 - .../engine/SystemUser/SystemUserGenerator.cs | 60 - back/services/engine/mailing/EmailService.cs | 66 - back/services/engine/mailing/IEmailService.cs | 9 - .../Controllers/AuthController.cs | 8 - .../Responses/ExecutionError.cs | 6 - .../Infraestructura/Responses/Response.cs | 29 - .../Responses/ValidationError.cs | 7 - backend/Presentation/Presentation.csproj | 34 - backend/Presentation/Program.cs | 96 - .../Properties/launchSettings.json | 23 - .../Presentation/appsettings.Development.json | 8 - backend/Presentation/appsettings.json | 9 - bd/.gitkeep => docs/analisis-funcional.md | 0 .../analisis-tecnico.md | 0 .../cronograma.md | 0 docs/front/frontend-documentation.md | 69 - .../events-link.scss => docs/index.md | 0 docs/introduccion.md | 56 + .../manual-usuario.md | 0 .../tags-link.scss => docs/plan-proyecto.md | 0 .../pruebas.md | 0 .../admin-view.scss => docs/requisitos.md | 0 .../root/architecturalComponentLayout.svg | 1 - front/v1/.editorconfig | 17 - front/v1/.gitignore | 42 - front/v1/.vscode/extensions.json | 4 - front/v1/.vscode/launch.json | 20 - front/v1/.vscode/tasks.json | 42 - front/v1/README.md | 59 - front/v1/angular.json | 98 - front/v1/package-lock.json | 9738 ----------------- front/v1/package.json | 37 - front/v1/public/assets/config.json | 3 - .../v1/public/assets/icons/_fix-svg-stroke.js | 12 - .../assets/icons/add-square-svgrepo-com.svg | 26 - .../public/assets/icons/add-svgrepo-com.svg | 24 - .../assets/icons/alert-square-svgrepo-com.svg | 26 - .../icons/align-justify-svgrepo-com.svg | 28 - .../assets/icons/align-left-svgrepo-com.svg | 28 - .../assets/icons/align-right-svgrepo-com.svg | 28 - .../icons/arrow-down-left-svgrepo-com.svg | 24 - .../icons/arrow-down-right-svgrepo-com.svg | 24 - .../assets/icons/arrow-down-svgrepo-com.svg | 24 - .../assets/icons/arrow-left-svgrepo-com.svg | 24 - .../assets/icons/arrow-right-svgrepo-com.svg | 24 - .../icons/arrow-up-left-svgrepo-com.svg | 24 - .../icons/arrow-up-right-svgrepo-com.svg | 24 - .../assets/icons/arrow-up-svgrepo-com.svg | 24 - .../public/assets/icons/bell-svgrepo-com.svg | 24 - .../assets/icons/browsers-svgrepo-com.svg | 24 - .../icons/bubble-square-svgrepo-com.svg | 18 - .../assets/icons/cart-minus-svgrepo-com.svg | 4 - .../assets/icons/cart-plus-svgrepo-com.svg | 4 - .../icons/cart-shopping-fast-svgrepo-com.svg | 4 - .../assets/icons/cart-xmark-svgrepo-com.svg | 4 - .../assets/icons/chevron-down-svgrepo-com.svg | 18 - .../assets/icons/chevron-left-svgrepo-com.svg | 18 - .../icons/chevron-right-svgrepo-com.svg | 18 - .../assets/icons/circle-svgrepo-com.svg | 18 - .../public/assets/icons/clock-svgrepo-com.svg | 24 - .../public/assets/icons/code-svgrepo-com.svg | 24 - .../public/assets/icons/disc-svgrepo-com.svg | 24 - .../assets/icons/download-svgrepo-com.svg | 30 - .../public/assets/icons/edit-svgrepo-com.svg | 24 - .../assets/icons/expand-svgrepo-com.svg | 28 - .../assets/icons/file-add-svgrepo-com.svg | 26 - .../assets/icons/file-remove-svgrepo-com.svg | 28 - .../assets/icons/file-text-svgrepo-com.svg | 32 - .../assets/icons/fingerprint-svgrepo-com.svg | 4 - .../assets/icons/folder-svgrepo-com.svg | 18 - .../public/assets/icons/grid-svgrepo-com.svg | 28 - .../assets/icons/id-badge-svgrepo-com.svg | 4 - .../assets/icons/info-circle-svgrepo-com.svg | 26 - .../assets/icons/info-square-svgrepo-com.svg | 26 - .../public/assets/icons/lock-svgrepo-com.svg | 24 - .../assets/icons/mail-read-svgrepo-com.svg | 26 - .../public/assets/icons/mail-svgrepo-com.svg | 24 - .../assets/icons/maximize-svgrepo-com.svg | 28 - .../public/assets/icons/menu-svgrepo-com.svg | 3 - .../assets/icons/minimize-svgrepo-com.svg | 28 - .../public/assets/icons/minus-svgrepo-com.svg | 18 - .../icons/more-horizontal-svgrepo-com.svg | 18 - .../icons/more-vertical-svgrepo-com.svg | 18 - .../icons/navigation-ne-svgrepo-com.svg | 18 - .../icons/navigation-nw-svgrepo-com.svg | 18 - .../assets/icons/navigation-svgrepo-com.svg | 18 - .../icons/optimized_svg/share_social.svg | 16 - .../assets/icons/push-down-svgrepo-com.svg | 28 - .../assets/icons/push-left-svgrepo-com.svg | 28 - .../assets/icons/push-right-svgrepo-com.svg | 28 - .../assets/icons/push-up-svgrepo-com.svg | 28 - .../assets/icons/search-alt-1-svgrepo-com.svg | 4 - .../assets/icons/search-svgrepo-com.svg | 3 - .../assets/icons/send-alt-2-svgrepo-com.svg | 4 - .../icons/sidebar-bottom-svgrepo-com.svg | 24 - .../assets/icons/sidebar-left-svgrepo-com.svg | 24 - .../icons/sidebar-right-svgrepo-com.svg | 24 - .../assets/icons/sidebar-top-svgrepo-com.svg | 24 - .../assets/icons/signal-svgrepo-com.svg | 24 - .../assets/icons/stopwatch-svgrepo-com.svg | 26 - .../assets/icons/support-svgrepo-com.svg | 32 - .../assets/icons/thumbs-down-svgrepo-com.svg | 18 - .../assets/icons/thumbs-up-svgrepo-com.svg | 18 - .../public/assets/icons/tick-svgrepo-com.svg | 18 - .../assets/icons/unlock-svgrepo-com.svg | 24 - .../assets/icons/upload-svgrepo-com.svg | 30 - .../assets/icons/user-add-svgrepo-com.svg | 28 - .../assets/icons/user-remove-svgrepo-com.svg | 26 - .../public/assets/icons/user-svgrepo-com.svg | 24 - .../assets/icons/user-x-svgrepo-com.svg | 28 - .../assets/icons/volume-down-svgrepo-com.svg | 24 - .../assets/icons/volume-mute-svgrepo-com.svg | 18 - .../assets/icons/volume-off-svgrepo-com.svg | 30 - .../assets/icons/volume-up-svgrepo-com.svg | 22 - .../assets/icons/x-circle-svgrepo-com.svg | 26 - .../assets/icons/x-square-svgrepo-com.svg | 26 - .../public/assets/icons/xmark-svgrepo-com.svg | 4 - .../assets/icons/zoom-out-svgrepo-com.svg | 26 - front/v1/public/favicon.ico | Bin 15086 -> 0 bytes front/v1/src/app/_index.scss | 4 - front/v1/src/app/_variables.scss | 15 - front/v1/src/app/app.config.ts | 12 - front/v1/src/app/app.html | 98 - front/v1/src/app/app.routes.ts | 3 - front/v1/src/app/app.scss | 215 - front/v1/src/app/app.spec.ts | 23 - front/v1/src/app/app.ts | 115 - front/v1/src/app/button/button.html | 14 - front/v1/src/app/button/button.scss | 130 - front/v1/src/app/button/button.spec.ts | 23 - front/v1/src/app/button/button.ts | 19 - front/v1/src/app/gallery/gallery.html | 17 - front/v1/src/app/gallery/gallery.scss | 49 - front/v1/src/app/gallery/gallery.spec.ts | 23 - front/v1/src/app/gallery/gallery.ts | 104 - .../src/app/low-res-image/low-res-image.html | 3 - .../src/app/low-res-image/low-res-image.scss | 44 - .../app/low-res-image/low-res-image.spec.ts | 23 - .../v1/src/app/low-res-image/low-res-image.ts | 27 - .../src/app/mid-res-image/mid-res-image.html | 97 - .../src/app/mid-res-image/mid-res-image.scss | 541 - .../app/mid-res-image/mid-res-image.spec.ts | 23 - .../v1/src/app/mid-res-image/mid-res-image.ts | 173 - front/v1/src/app/svg/svg.ts | 43 - front/v1/src/app/upload-image-form/photo.ts | 17 - .../upload-image-form/upload-image-form.html | 70 - .../upload-image-form/upload-image-form.scss | 200 - .../upload-image-form.spec.ts | 23 - .../upload-image-form/upload-image-form.ts | 52 - front/v1/src/index.html | 13 - front/v1/src/main.ts | 12 - front/v1/src/styles.scss | 39 - front/v1/tsconfig.app.json | 15 - front/v1/tsconfig.json | 34 - front/v1/tsconfig.spec.json | 14 - front/v2/.editorconfig | 17 - front/v2/.gitignore | 42 - front/v2/.vscode/extensions.json | 4 - front/v2/.vscode/launch.json | 38 - front/v2/.vscode/tasks.json | 21 - front/v2/README.md | 59 - front/v2/angular.json | 92 - front/v2/package-lock.json | 9733 ---------------- front/v2/package.json | 40 - .../assets/external/apple-original-logo.svg | 71 - .../google-original-wordmark-logo.svg | 62 - front/v2/public/assets/external/meta-logo.svg | 21 - .../public/assets/external/microsoft-logo.svg | 12 - front/v2/public/assets/favicon.ico | Bin 12158 -> 0 bytes front/v2/public/assets/favicon.png | Bin 5098 -> 0 bytes .../v2/public/assets/icons/_fix-svg-stroke.js | 12 - .../assets/icons/add-square-svgrepo-com.svg | 26 - .../public/assets/icons/add-svgrepo-com.svg | 24 - .../assets/icons/alert-square-svgrepo-com.svg | 26 - .../icons/align-justify-svgrepo-com.svg | 28 - .../assets/icons/align-left-svgrepo-com.svg | 28 - .../assets/icons/align-right-svgrepo-com.svg | 28 - .../icons/arrow-down-left-svgrepo-com.svg | 24 - .../icons/arrow-down-right-svgrepo-com.svg | 24 - .../assets/icons/arrow-down-svgrepo-com.svg | 24 - .../assets/icons/arrow-left-svgrepo-com.svg | 24 - .../assets/icons/arrow-right-svgrepo-com.svg | 24 - .../icons/arrow-up-left-svgrepo-com.svg | 24 - .../icons/arrow-up-right-svgrepo-com.svg | 24 - .../assets/icons/arrow-up-svgrepo-com.svg | 24 - .../public/assets/icons/bell-svgrepo-com.svg | 24 - .../assets/icons/book-section-svgrepo-com.svg | 4 - .../assets/icons/browsers-svgrepo-com.svg | 24 - .../icons/bubble-square-svgrepo-com.svg | 18 - .../assets/icons/calendar-day-svgrepo-com.svg | 4 - .../assets/icons/cart-minus-svgrepo-com.svg | 4 - .../assets/icons/cart-plus-svgrepo-com.svg | 4 - .../icons/cart-shopping-fast-svgrepo-com.svg | 4 - .../assets/icons/cart-xmark-svgrepo-com.svg | 4 - .../assets/icons/chevron-down-svgrepo-com.svg | 18 - .../assets/icons/chevron-left-svgrepo-com.svg | 18 - .../icons/chevron-right-svgrepo-com.svg | 18 - .../assets/icons/circle-svgrepo-com.svg | 18 - front/v2/public/assets/icons/clean_svgs.bat | 2 - .../public/assets/icons/clock-svgrepo-com.svg | 24 - .../public/assets/icons/code-svgrepo-com.svg | 24 - .../icons/compress-alt-2-svgrepo-com.svg | 4 - .../public/assets/icons/disc-svgrepo-com.svg | 24 - .../assets/icons/door-open-svgrepo-com.svg | 4 - .../assets/icons/download-svgrepo-com.svg | 30 - .../public/assets/icons/edit-svgrepo-com.svg | 24 - .../assets/icons/engine-svgrepo-com.svg | 4 - .../assets/icons/expand-svgrepo-com.svg | 28 - .../assets/icons/file-add-svgrepo-com.svg | 26 - .../assets/icons/file-remove-svgrepo-com.svg | 28 - .../assets/icons/file-text-svgrepo-com.svg | 32 - .../assets/icons/fingerprint-svgrepo-com.svg | 4 - .../assets/icons/folder-svgrepo-com.svg | 18 - .../assets/icons/gauge-high-svgrepo-com.svg | 4 - .../public/assets/icons/gear-svgrepo-com.svg | 5 - .../assets/icons/grid-plus-svgrepo-com.svg | 4 - .../assets/icons/grid-search-svgrepo-com.svg | 4 - .../public/assets/icons/grid-svgrepo-com.svg | 28 - .../assets/icons/id-badge-svgrepo-com.svg | 4 - .../assets/icons/info-circle-svgrepo-com.svg | 26 - .../assets/icons/info-square-svgrepo-com.svg | 26 - .../public/assets/icons/lock-svgrepo-com.svg | 24 - .../assets/icons/mail-read-svgrepo-com.svg | 26 - .../public/assets/icons/mail-svgrepo-com.svg | 24 - .../assets/icons/maximize-svgrepo-com.svg | 28 - .../public/assets/icons/menu-svgrepo-com.svg | 3 - .../assets/icons/minimize-svgrepo-com.svg | 28 - .../public/assets/icons/minus-svgrepo-com.svg | 18 - .../icons/more-horizontal-svgrepo-com.svg | 18 - .../icons/more-vertical-svgrepo-com.svg | 18 - .../icons/navigation-ne-svgrepo-com.svg | 18 - .../icons/navigation-nw-svgrepo-com.svg | 18 - .../assets/icons/navigation-svgrepo-com.svg | 18 - .../icons/objects-column-svgrepo-com.svg | 7 - .../assets/icons/push-down-svgrepo-com.svg | 28 - .../assets/icons/push-left-svgrepo-com.svg | 28 - .../assets/icons/push-right-svgrepo-com.svg | 28 - .../assets/icons/push-up-svgrepo-com.svg | 28 - .../assets/icons/search-alt-1-svgrepo-com.svg | 4 - .../assets/icons/search-svgrepo-com.svg | 3 - .../assets/icons/send-alt-2-svgrepo-com.svg | 4 - .../icons/sidebar-bottom-svgrepo-com.svg | 24 - .../assets/icons/sidebar-left-svgrepo-com.svg | 24 - .../icons/sidebar-right-svgrepo-com.svg | 24 - .../assets/icons/sidebar-top-svgrepo-com.svg | 24 - .../assets/icons/signal-svgrepo-com.svg | 24 - .../assets/icons/stopwatch-svgrepo-com.svg | 26 - .../assets/icons/support-svgrepo-com.svg | 32 - .../icons/table-cells-large-svgrepo-com.svg | 4 - .../public/assets/icons/tag-svgrepo-com.svg | 4 - .../public/assets/icons/tags-svgrepo-com.svg | 4 - .../assets/icons/thumbs-down-svgrepo-com.svg | 18 - .../assets/icons/thumbs-up-svgrepo-com.svg | 18 - .../public/assets/icons/tick-svgrepo-com.svg | 18 - .../public/assets/icons/trash-svgrepo-com.svg | 4 - .../assets/icons/unlock-svgrepo-com.svg | 24 - .../assets/icons/upload-svgrepo-com.svg | 30 - .../assets/icons/user-add-svgrepo-com.svg | 28 - .../icons/user-question-svgrepo-com.svg | 4 - .../assets/icons/user-remove-svgrepo-com.svg | 26 - .../public/assets/icons/user-svgrepo-com.svg | 24 - .../assets/icons/user-x-svgrepo-com.svg | 28 - .../assets/icons/volume-down-svgrepo-com.svg | 24 - .../assets/icons/volume-mute-svgrepo-com.svg | 18 - .../assets/icons/volume-off-svgrepo-com.svg | 30 - .../assets/icons/volume-up-svgrepo-com.svg | 22 - .../icons/wand-magic-sparkles-svgrepo-com.svg | 4 - .../assets/icons/x-circle-svgrepo-com.svg | 26 - .../assets/icons/x-square-svgrepo-com.svg | 26 - .../public/assets/icons/xmark-svgrepo-com.svg | 4 - .../assets/icons/zoom-out-svgrepo-com.svg | 26 - front/v2/public/assets/logo.png | Bin 5783 -> 0 bytes front/v2/public/config.json | 31 - front/v2/public/config.schema.json | 106 - front/v2/src/apiContracts/dataApi.ts | 9 - front/v2/src/app/app.config.ts | 12 - front/v2/src/app/app.html | 4 - front/v2/src/app/app.routes.ts | 30 - front/v2/src/app/app.scss | 8 - front/v2/src/app/app.spec.ts | 23 - front/v2/src/app/app.ts | 17 - .../admin-panel-link/admin-panel-link.html | 6 - .../admin-panel-link/admin-panel-link.scss | 79 - .../admin-panel-link/admin-panel-link.spec.ts | 23 - .../admin-panel-link/admin-panel-link.ts | 10 - .../content-manager-panel-link.html | 6 - .../content-manager-panel-link.spec.ts | 23 - .../content-manager-panel-link.ts | 10 - .../events-link/events-link.html | 6 - .../events-link/events-link.spec.ts | 23 - .../events-link/events-link.ts | 10 - .../app/global-components/header/header.html | 24 - .../app/global-components/header/header.scss | 38 - .../global-components/header/header.spec.ts | 23 - .../app/global-components/header/header.ts | 53 - .../login-link/login-link.html | 7 - .../login-link/login-link.scss | 68 - .../login-link/login-link.spec.ts | 23 - .../login-link/login-link.ts | 12 - .../src/app/global-components/logo/logo.html | 3 - .../src/app/global-components/logo/logo.scss | 14 - .../app/global-components/logo/logo.spec.ts | 23 - .../v2/src/app/global-components/logo/logo.ts | 12 - .../services-link/services-link.html | 6 - .../services-link/services-link.spec.ts | 23 - .../services-link/services-link.ts | 10 - .../tags-link/tags-link.html | 6 - .../tags-link/tags-link.spec.ts | 23 - .../global-components/tags-link/tags-link.ts | 10 - .../user-galleries-link.html | 6 - .../user-galleries-link.spec.ts | 23 - .../user-galleries-link.ts | 10 - .../user-profile-link/user-profile-link.html | 3 - .../user-profile-link/user-profile-link.scss | 79 - .../user-profile-link.spec.ts | 23 - .../user-profile-link/user-profile-link.ts | 11 - .../axios-setup-interceptor.spec.ts | 17 - .../axiosSetup/axios-setup-interceptor.ts | 18 - .../crypto-service/crypto-service.spec.ts | 16 - .../services/crypto-service/crypto-service.ts | 61 - .../galleryService/gallery-service.spec.ts | 16 - .../galleryService/gallery-service.ts | 21 - front/v2/src/app/services/theme/theme.spec.ts | 16 - front/v2/src/app/services/theme/theme.ts | 23 - .../thumbprint-service.spec.ts | 16 - .../thumprint-service/thumbprint-service.ts | 52 - .../services/userService/userService.spec.ts | 16 - .../app/services/userService/userService.ts | 90 - .../src/app/views/admin-view/admin-view.html | 1 - .../app/views/admin-view/admin-view.spec.ts | 23 - .../v2/src/app/views/admin-view/admin-view.ts | 11 - .../content-manager-view.html | 1 - .../content-manager-view.scss | 0 .../content-manager-view.spec.ts | 23 - .../content-manager-view.ts | 11 - .../app/views/events-view/events-view.html | 1 - .../app/views/events-view/events-view.scss | 0 .../app/views/events-view/events-view.spec.ts | 23 - .../src/app/views/events-view/events-view.ts | 11 - .../forgot-password-view.html | 29 - .../forgot-password-view.scss | 18 - .../forgot-password-view.spec.ts | 23 - .../forgot-password-view.ts | 37 - .../app/views/gallery-view/gallery-view.html | 14 - .../app/views/gallery-view/gallery-view.scss | 51 - .../views/gallery-view/gallery-view.spec.ts | 23 - .../app/views/gallery-view/gallery-view.ts | 44 - .../low-res-image/low-res-image.html | 9 - .../low-res-image/low-res-image.scss | 44 - .../low-res-image/low-res-image.spec.ts | 23 - .../low-res-image/low-res-image.ts | 25 - .../mid-res-image/mid-res-image.html | 97 - .../mid-res-image/mid-res-image.scss | 537 - .../mid-res-image/mid-res-image.spec.ts | 23 - .../mid-res-image/mid-res-image.ts | 161 - .../src/app/views/home-view/home-view.spec.ts | 23 - front/v2/src/app/views/home-view/home-view.ts | 24 - .../login-options-view.html | 1 - .../login-options-view.scss | 0 .../login-options-view.spec.ts | 23 - .../login-options-view/login-options-view.ts | 11 - .../src/app/views/login-view/login-view.html | 140 - .../src/app/views/login-view/login-view.scss | 105 - .../app/views/login-view/login-view.spec.ts | 23 - .../v2/src/app/views/login-view/login-view.ts | 196 - .../views/register-view/register-view.html | 83 - .../views/register-view/register-view.scss | 67 - .../views/register-view/register-view.spec.ts | 23 - .../app/views/register-view/register-view.ts | 139 - .../views/services-view/services-view.html | 1 - .../views/services-view/services-view.scss | 0 .../views/services-view/services-view.spec.ts | 23 - .../app/views/services-view/services-view.ts | 11 - .../v2/src/app/views/tags-view/tags-view.html | 1 - .../v2/src/app/views/tags-view/tags-view.scss | 0 .../src/app/views/tags-view/tags-view.spec.ts | 23 - front/v2/src/app/views/tags-view/tags-view.ts | 11 - .../upload-image-view/upload-image-view.html | 9 - .../upload-image-view/upload-image-view.scss | 0 .../upload-image-view.spec.ts | 23 - .../upload-image-view/upload-image-view.ts | 11 - .../user-galleries-view.html | 1 - .../user-galleries-view.scss | 0 .../user-galleries-view.spec.ts | 23 - .../user-galleries-view.ts | 11 - .../user-profile-view/user-profile-view.html | 1 - .../user-profile-view/user-profile-view.scss | 0 .../user-profile-view.spec.ts | 23 - .../user-profile-view/user-profile-view.ts | 11 - front/v2/src/index.html | 11 - front/v2/src/main.ts | 20 - front/v2/src/models/config.ts | 130 - front/v2/src/models/eventModel.ts | 16 - front/v2/src/models/gallery/galleryFactory.ts | 67 - front/v2/src/models/gallery/galleryModel.ts | 99 - front/v2/src/models/gallery/homeGallery.ts | 14 - front/v2/src/models/permissionModel.ts | 67 - front/v2/src/models/personModel.ts | 68 - front/v2/src/models/photoModel.ts | 46 - front/v2/src/models/rankingModel.ts | 25 - front/v2/src/models/roleModel.ts | 70 - front/v2/src/models/tagModel.ts | 3 - front/v2/src/models/userModel.ts | 71 - front/v2/src/styles.scss | 37 - front/v2/src/styles/_buttons.scss | 152 - front/v2/src/styles/_inputs.scss | 160 - front/v2/src/styles/_loaders.scss | 2 - front/v2/src/styles/_variables.scss | 33 - .../src/styles/loaders/_loader-spinner.scss | 40 - .../styles/loaders/_paper-plane-loader.scss | 110 - front/v2/src/styles/themes/_dark.scss | 18 - front/v2/src/styles/themes/_light.scss | 18 - front/v2/src/styles/themes/dark.scss | 0 front/v2/src/styles/themes/light.scss | 0 front/v2/src/utils/paginator.ts | 83 - front/v2/src/utils/svg-button/svg-button.html | 24 - front/v2/src/utils/svg-button/svg-button.scss | 81 - front/v2/src/utils/svg-button/svg-button.ts | 30 - front/v2/src/utils/svg/svg.ts | 41 - .../distinctEmailPasswordValidator.ts | 112 - .../v2/src/utils/validators/emailValidator.ts | 10 - .../src/utils/validators/passwordValidator.ts | 13 - front/v2/tsconfig.app.json | 15 - front/v2/tsconfig.json | 34 - front/v2/tsconfig.spec.json | 14 - pruebas/login-form-icons-readme.txt | 0 pruebas/login-form.css | 0 pruebas/login-form.html | 234 - 512 files changed, 56 insertions(+), 38079 deletions(-) delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/tasks.json delete mode 100644 README.md delete mode 100644 back/.config/dotnet-tools.json delete mode 100644 back/.program_data/imgs/systemkey.lock delete mode 100644 back/DTO/PhotoFormModel.cs delete mode 100644 back/DTO/UserDto.cs delete mode 100644 back/DataModels/EfmigrationsLock.cs delete mode 100644 back/DataModels/Event.cs delete mode 100644 back/DataModels/Gallery.cs delete mode 100644 back/DataModels/Permission.cs delete mode 100644 back/DataModels/Person.cs delete mode 100644 back/DataModels/Photo.cs delete mode 100644 back/DataModels/Ranking.cs delete mode 100644 back/DataModels/Role.cs delete mode 100644 back/DataModels/SocialMedia.cs delete mode 100644 back/DataModels/SystemKey.cs delete mode 100644 back/DataModels/Tag.cs delete mode 100644 back/DataModels/User.cs delete mode 100644 back/Options/DatabaseConfig.cs delete mode 100644 back/Options/Databases.cs delete mode 100644 back/Options/MailServerOptions.cs delete mode 100644 back/Program.cs delete mode 100644 back/Properties/launchSettings.json delete mode 100644 back/ServicesExtensions/DatabaseContexts.cs delete mode 100644 back/ServicesExtensions/DdContextOptionsBuilderExtensions.cs delete mode 100644 back/ServicesExtensions/Options.cs delete mode 100644 back/ServicesExtensions/ServicesExtensions.cs delete mode 100644 back/appsettings.Development.json delete mode 100644 back/appsettings.Production.json delete mode 100644 back/appsettings.json delete mode 100644 back/back.csproj delete mode 100644 back/back.sln delete mode 100644 back/controllers/AuthController.cs delete mode 100644 back/controllers/CryptoController.cs delete mode 100644 back/controllers/PhotosController.cs delete mode 100644 back/controllers/UsersController.cs delete mode 100644 back/healthchecks/options/HealthChecksConfigs.cs delete mode 100644 back/healthchecks/sqlite.cs delete mode 100644 back/persistance/blob/FileSystemImageStorageService.cs delete mode 100644 back/persistance/blob/IBlobStorageService.cs delete mode 100644 back/persistance/data/DataContext.cs delete mode 100644 back/persistance/data/migrations/20250824120656_InitialSetup.Designer.cs delete mode 100644 back/persistance/data/migrations/20250824120656_InitialSetup.cs delete mode 100644 back/persistance/data/migrations/DataContextModelSnapshot.cs delete mode 100644 back/persistance/data/migrations/sqlite/tables.sql delete mode 100644 back/persistance/data/relations/EventRelationEstablisher.cs delete mode 100644 back/persistance/data/relations/GalleryRelationEstablisher.cs delete mode 100644 back/persistance/data/relations/IRelationEstablisher.cs delete mode 100644 back/persistance/data/relations/PersonRelationEstablisher.cs delete mode 100644 back/persistance/data/relations/PhotoContext.cs delete mode 100644 back/persistance/data/relations/PhotoRelationEstablisher.cs delete mode 100644 back/persistance/data/relations/RoleContext.cs delete mode 100644 back/persistance/data/relations/RoleRelationEstablisher.cs delete mode 100644 back/persistance/data/relations/SeedingDbContext.cs delete mode 100644 back/persistance/data/relations/TagRelationEstablisher.cs delete mode 100644 back/persistance/data/relations/UserRelationEstablisher.cs delete mode 100644 back/persistance/data/repositories/Abstracts/IPermissionRepository.cs delete mode 100644 back/persistance/data/repositories/Abstracts/IPersonRepository.cs delete mode 100644 back/persistance/data/repositories/Abstracts/IPhotoRepository.cs delete mode 100644 back/persistance/data/repositories/Abstracts/IRoleRepository.cs delete mode 100644 back/persistance/data/repositories/Abstracts/IUserRepository.cs delete mode 100644 back/persistance/data/repositories/PermissionRepository.cs delete mode 100644 back/persistance/data/repositories/PersonRepository.cs delete mode 100644 back/persistance/data/repositories/PhotoRepository.cs delete mode 100644 back/persistance/data/repositories/RoleRepository.cs delete mode 100644 back/persistance/data/repositories/UserRepository.cs delete mode 100644 back/persistance/data/seeders/ISeeder.cs delete mode 100644 back/persistance/data/seeders/PermissionSeeder.cs delete mode 100644 back/persistance/data/seeders/RoleSeeder.cs delete mode 100644 back/persistance/data/seeders/SystemUserSeeder.cs delete mode 100644 back/services/bussines/Errors.cs delete mode 100644 back/services/bussines/HttpErrorMap.cs delete mode 100644 back/services/bussines/PhotoService/IPhotoService.cs delete mode 100644 back/services/bussines/PhotoService/PhotoService.cs delete mode 100644 back/services/bussines/UserService/IUserService.cs delete mode 100644 back/services/bussines/UserService/UserService.cs delete mode 100644 back/services/engine/Crypto/CryptoService.cs delete mode 100644 back/services/engine/Crypto/ICryptoService.cs delete mode 100644 back/services/engine/ImageResizer/IImageResizer.cs delete mode 100644 back/services/engine/ImageResizer/ImageResizer.cs delete mode 100644 back/services/engine/PasswordGenerator/IPasswordGenerator.cs delete mode 100644 back/services/engine/PasswordGenerator/PasswordGenerator.cs delete mode 100644 back/services/engine/SystemUser/ISystemUserGenerator.cs delete mode 100644 back/services/engine/SystemUser/SystemUserGenerator.cs delete mode 100644 back/services/engine/mailing/EmailService.cs delete mode 100644 back/services/engine/mailing/IEmailService.cs delete mode 100644 backend/Presentation/Controllers/AuthController.cs delete mode 100644 backend/Presentation/Infraestructura/Responses/ExecutionError.cs delete mode 100644 backend/Presentation/Infraestructura/Responses/Response.cs delete mode 100644 backend/Presentation/Infraestructura/Responses/ValidationError.cs delete mode 100644 backend/Presentation/Presentation.csproj delete mode 100644 backend/Presentation/Program.cs delete mode 100644 backend/Presentation/Properties/launchSettings.json delete mode 100644 backend/Presentation/appsettings.Development.json delete mode 100644 backend/Presentation/appsettings.json rename bd/.gitkeep => docs/analisis-funcional.md (100%) rename front/v2/public/assets/icons/clean_svgs.ps1 => docs/analisis-tecnico.md (100%) rename front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.scss => docs/cronograma.md (100%) delete mode 100644 docs/front/frontend-documentation.md rename front/v2/src/app/global-components/events-link/events-link.scss => docs/index.md (100%) create mode 100644 docs/introduccion.md rename front/v2/src/app/global-components/services-link/services-link.scss => docs/manual-usuario.md (100%) rename front/v2/src/app/global-components/tags-link/tags-link.scss => docs/plan-proyecto.md (100%) rename front/v2/src/app/global-components/user-galleries-link/user-galleries-link.scss => docs/pruebas.md (100%) rename front/v2/src/app/views/admin-view/admin-view.scss => docs/requisitos.md (100%) delete mode 100644 docs/resources/root/architecturalComponentLayout.svg delete mode 100644 front/v1/.editorconfig delete mode 100644 front/v1/.gitignore delete mode 100644 front/v1/.vscode/extensions.json delete mode 100644 front/v1/.vscode/launch.json delete mode 100644 front/v1/.vscode/tasks.json delete mode 100644 front/v1/README.md delete mode 100644 front/v1/angular.json delete mode 100644 front/v1/package-lock.json delete mode 100644 front/v1/package.json delete mode 100644 front/v1/public/assets/config.json delete mode 100644 front/v1/public/assets/icons/_fix-svg-stroke.js delete mode 100644 front/v1/public/assets/icons/add-square-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/add-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/alert-square-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/align-justify-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/align-left-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/align-right-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/arrow-down-left-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/arrow-down-right-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/arrow-down-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/arrow-left-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/arrow-right-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/arrow-up-left-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/arrow-up-right-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/arrow-up-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/bell-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/browsers-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/bubble-square-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/cart-minus-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/cart-plus-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/cart-shopping-fast-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/cart-xmark-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/chevron-down-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/chevron-left-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/chevron-right-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/circle-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/clock-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/code-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/disc-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/download-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/edit-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/expand-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/file-add-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/file-remove-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/file-text-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/fingerprint-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/folder-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/grid-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/id-badge-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/info-circle-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/info-square-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/lock-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/mail-read-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/mail-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/maximize-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/menu-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/minimize-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/minus-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/more-horizontal-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/more-vertical-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/navigation-ne-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/navigation-nw-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/navigation-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/optimized_svg/share_social.svg delete mode 100644 front/v1/public/assets/icons/push-down-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/push-left-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/push-right-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/push-up-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/search-alt-1-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/search-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/send-alt-2-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/sidebar-bottom-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/sidebar-left-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/sidebar-right-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/sidebar-top-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/signal-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/stopwatch-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/support-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/thumbs-down-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/thumbs-up-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/tick-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/unlock-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/upload-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/user-add-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/user-remove-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/user-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/user-x-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/volume-down-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/volume-mute-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/volume-off-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/volume-up-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/x-circle-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/x-square-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/xmark-svgrepo-com.svg delete mode 100644 front/v1/public/assets/icons/zoom-out-svgrepo-com.svg delete mode 100644 front/v1/public/favicon.ico delete mode 100644 front/v1/src/app/_index.scss delete mode 100644 front/v1/src/app/_variables.scss delete mode 100644 front/v1/src/app/app.config.ts delete mode 100644 front/v1/src/app/app.html delete mode 100644 front/v1/src/app/app.routes.ts delete mode 100644 front/v1/src/app/app.scss delete mode 100644 front/v1/src/app/app.spec.ts delete mode 100644 front/v1/src/app/app.ts delete mode 100644 front/v1/src/app/button/button.html delete mode 100644 front/v1/src/app/button/button.scss delete mode 100644 front/v1/src/app/button/button.spec.ts delete mode 100644 front/v1/src/app/button/button.ts delete mode 100644 front/v1/src/app/gallery/gallery.html delete mode 100644 front/v1/src/app/gallery/gallery.scss delete mode 100644 front/v1/src/app/gallery/gallery.spec.ts delete mode 100644 front/v1/src/app/gallery/gallery.ts delete mode 100644 front/v1/src/app/low-res-image/low-res-image.html delete mode 100644 front/v1/src/app/low-res-image/low-res-image.scss delete mode 100644 front/v1/src/app/low-res-image/low-res-image.spec.ts delete mode 100644 front/v1/src/app/low-res-image/low-res-image.ts delete mode 100644 front/v1/src/app/mid-res-image/mid-res-image.html delete mode 100644 front/v1/src/app/mid-res-image/mid-res-image.scss delete mode 100644 front/v1/src/app/mid-res-image/mid-res-image.spec.ts delete mode 100644 front/v1/src/app/mid-res-image/mid-res-image.ts delete mode 100644 front/v1/src/app/svg/svg.ts delete mode 100644 front/v1/src/app/upload-image-form/photo.ts delete mode 100644 front/v1/src/app/upload-image-form/upload-image-form.html delete mode 100644 front/v1/src/app/upload-image-form/upload-image-form.scss delete mode 100644 front/v1/src/app/upload-image-form/upload-image-form.spec.ts delete mode 100644 front/v1/src/app/upload-image-form/upload-image-form.ts delete mode 100644 front/v1/src/index.html delete mode 100644 front/v1/src/main.ts delete mode 100644 front/v1/src/styles.scss delete mode 100644 front/v1/tsconfig.app.json delete mode 100644 front/v1/tsconfig.json delete mode 100644 front/v1/tsconfig.spec.json delete mode 100644 front/v2/.editorconfig delete mode 100644 front/v2/.gitignore delete mode 100644 front/v2/.vscode/extensions.json delete mode 100644 front/v2/.vscode/launch.json delete mode 100644 front/v2/.vscode/tasks.json delete mode 100644 front/v2/README.md delete mode 100644 front/v2/angular.json delete mode 100644 front/v2/package-lock.json delete mode 100644 front/v2/package.json delete mode 100644 front/v2/public/assets/external/apple-original-logo.svg delete mode 100644 front/v2/public/assets/external/google-original-wordmark-logo.svg delete mode 100644 front/v2/public/assets/external/meta-logo.svg delete mode 100644 front/v2/public/assets/external/microsoft-logo.svg delete mode 100644 front/v2/public/assets/favicon.ico delete mode 100644 front/v2/public/assets/favicon.png delete mode 100644 front/v2/public/assets/icons/_fix-svg-stroke.js delete mode 100644 front/v2/public/assets/icons/add-square-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/add-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/alert-square-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/align-justify-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/align-left-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/align-right-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/arrow-down-left-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/arrow-down-right-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/arrow-down-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/arrow-left-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/arrow-right-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/arrow-up-left-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/arrow-up-right-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/arrow-up-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/bell-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/book-section-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/browsers-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/bubble-square-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/calendar-day-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/cart-minus-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/cart-plus-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/cart-shopping-fast-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/cart-xmark-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/chevron-down-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/chevron-left-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/chevron-right-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/circle-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/clean_svgs.bat delete mode 100644 front/v2/public/assets/icons/clock-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/code-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/compress-alt-2-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/disc-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/door-open-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/download-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/edit-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/engine-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/expand-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/file-add-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/file-remove-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/file-text-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/fingerprint-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/folder-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/gauge-high-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/gear-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/grid-plus-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/grid-search-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/grid-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/id-badge-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/info-circle-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/info-square-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/lock-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/mail-read-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/mail-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/maximize-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/menu-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/minimize-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/minus-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/more-horizontal-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/more-vertical-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/navigation-ne-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/navigation-nw-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/navigation-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/objects-column-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/push-down-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/push-left-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/push-right-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/push-up-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/search-alt-1-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/search-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/send-alt-2-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/sidebar-bottom-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/sidebar-left-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/sidebar-right-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/sidebar-top-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/signal-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/stopwatch-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/support-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/table-cells-large-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/tag-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/tags-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/thumbs-down-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/thumbs-up-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/tick-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/trash-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/unlock-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/upload-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/user-add-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/user-question-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/user-remove-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/user-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/user-x-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/volume-down-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/volume-mute-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/volume-off-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/volume-up-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/wand-magic-sparkles-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/x-circle-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/x-square-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/xmark-svgrepo-com.svg delete mode 100644 front/v2/public/assets/icons/zoom-out-svgrepo-com.svg delete mode 100644 front/v2/public/assets/logo.png delete mode 100644 front/v2/public/config.json delete mode 100644 front/v2/public/config.schema.json delete mode 100644 front/v2/src/apiContracts/dataApi.ts delete mode 100644 front/v2/src/app/app.config.ts delete mode 100644 front/v2/src/app/app.html delete mode 100644 front/v2/src/app/app.routes.ts delete mode 100644 front/v2/src/app/app.scss delete mode 100644 front/v2/src/app/app.spec.ts delete mode 100644 front/v2/src/app/app.ts delete mode 100644 front/v2/src/app/global-components/admin-panel-link/admin-panel-link.html delete mode 100644 front/v2/src/app/global-components/admin-panel-link/admin-panel-link.scss delete mode 100644 front/v2/src/app/global-components/admin-panel-link/admin-panel-link.spec.ts delete mode 100644 front/v2/src/app/global-components/admin-panel-link/admin-panel-link.ts delete mode 100644 front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.html delete mode 100644 front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.spec.ts delete mode 100644 front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.ts delete mode 100644 front/v2/src/app/global-components/events-link/events-link.html delete mode 100644 front/v2/src/app/global-components/events-link/events-link.spec.ts delete mode 100644 front/v2/src/app/global-components/events-link/events-link.ts delete mode 100644 front/v2/src/app/global-components/header/header.html delete mode 100644 front/v2/src/app/global-components/header/header.scss delete mode 100644 front/v2/src/app/global-components/header/header.spec.ts delete mode 100644 front/v2/src/app/global-components/header/header.ts delete mode 100644 front/v2/src/app/global-components/login-link/login-link.html delete mode 100644 front/v2/src/app/global-components/login-link/login-link.scss delete mode 100644 front/v2/src/app/global-components/login-link/login-link.spec.ts delete mode 100644 front/v2/src/app/global-components/login-link/login-link.ts delete mode 100644 front/v2/src/app/global-components/logo/logo.html delete mode 100644 front/v2/src/app/global-components/logo/logo.scss delete mode 100644 front/v2/src/app/global-components/logo/logo.spec.ts delete mode 100644 front/v2/src/app/global-components/logo/logo.ts delete mode 100644 front/v2/src/app/global-components/services-link/services-link.html delete mode 100644 front/v2/src/app/global-components/services-link/services-link.spec.ts delete mode 100644 front/v2/src/app/global-components/services-link/services-link.ts delete mode 100644 front/v2/src/app/global-components/tags-link/tags-link.html delete mode 100644 front/v2/src/app/global-components/tags-link/tags-link.spec.ts delete mode 100644 front/v2/src/app/global-components/tags-link/tags-link.ts delete mode 100644 front/v2/src/app/global-components/user-galleries-link/user-galleries-link.html delete mode 100644 front/v2/src/app/global-components/user-galleries-link/user-galleries-link.spec.ts delete mode 100644 front/v2/src/app/global-components/user-galleries-link/user-galleries-link.ts delete mode 100644 front/v2/src/app/global-components/user-profile-link/user-profile-link.html delete mode 100644 front/v2/src/app/global-components/user-profile-link/user-profile-link.scss delete mode 100644 front/v2/src/app/global-components/user-profile-link/user-profile-link.spec.ts delete mode 100644 front/v2/src/app/global-components/user-profile-link/user-profile-link.ts delete mode 100644 front/v2/src/app/interceptors/axiosSetup/axios-setup-interceptor.spec.ts delete mode 100644 front/v2/src/app/interceptors/axiosSetup/axios-setup-interceptor.ts delete mode 100644 front/v2/src/app/services/crypto-service/crypto-service.spec.ts delete mode 100644 front/v2/src/app/services/crypto-service/crypto-service.ts delete mode 100644 front/v2/src/app/services/galleryService/gallery-service.spec.ts delete mode 100644 front/v2/src/app/services/galleryService/gallery-service.ts delete mode 100644 front/v2/src/app/services/theme/theme.spec.ts delete mode 100644 front/v2/src/app/services/theme/theme.ts delete mode 100644 front/v2/src/app/services/thumprint-service/thumbprint-service.spec.ts delete mode 100644 front/v2/src/app/services/thumprint-service/thumbprint-service.ts delete mode 100644 front/v2/src/app/services/userService/userService.spec.ts delete mode 100644 front/v2/src/app/services/userService/userService.ts delete mode 100644 front/v2/src/app/views/admin-view/admin-view.html delete mode 100644 front/v2/src/app/views/admin-view/admin-view.spec.ts delete mode 100644 front/v2/src/app/views/admin-view/admin-view.ts delete mode 100644 front/v2/src/app/views/content-manager-view/content-manager-view.html delete mode 100644 front/v2/src/app/views/content-manager-view/content-manager-view.scss delete mode 100644 front/v2/src/app/views/content-manager-view/content-manager-view.spec.ts delete mode 100644 front/v2/src/app/views/content-manager-view/content-manager-view.ts delete mode 100644 front/v2/src/app/views/events-view/events-view.html delete mode 100644 front/v2/src/app/views/events-view/events-view.scss delete mode 100644 front/v2/src/app/views/events-view/events-view.spec.ts delete mode 100644 front/v2/src/app/views/events-view/events-view.ts delete mode 100644 front/v2/src/app/views/forgot-password-view/forgot-password-view.html delete mode 100644 front/v2/src/app/views/forgot-password-view/forgot-password-view.scss delete mode 100644 front/v2/src/app/views/forgot-password-view/forgot-password-view.spec.ts delete mode 100644 front/v2/src/app/views/forgot-password-view/forgot-password-view.ts delete mode 100644 front/v2/src/app/views/gallery-view/gallery-view.html delete mode 100644 front/v2/src/app/views/gallery-view/gallery-view.scss delete mode 100644 front/v2/src/app/views/gallery-view/gallery-view.spec.ts delete mode 100644 front/v2/src/app/views/gallery-view/gallery-view.ts delete mode 100644 front/v2/src/app/views/gallery-view/low-res-image/low-res-image.html delete mode 100644 front/v2/src/app/views/gallery-view/low-res-image/low-res-image.scss delete mode 100644 front/v2/src/app/views/gallery-view/low-res-image/low-res-image.spec.ts delete mode 100644 front/v2/src/app/views/gallery-view/low-res-image/low-res-image.ts delete mode 100644 front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.html delete mode 100644 front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.scss delete mode 100644 front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.spec.ts delete mode 100644 front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.ts delete mode 100644 front/v2/src/app/views/home-view/home-view.spec.ts delete mode 100644 front/v2/src/app/views/home-view/home-view.ts delete mode 100644 front/v2/src/app/views/login-options-view/login-options-view.html delete mode 100644 front/v2/src/app/views/login-options-view/login-options-view.scss delete mode 100644 front/v2/src/app/views/login-options-view/login-options-view.spec.ts delete mode 100644 front/v2/src/app/views/login-options-view/login-options-view.ts delete mode 100644 front/v2/src/app/views/login-view/login-view.html delete mode 100644 front/v2/src/app/views/login-view/login-view.scss delete mode 100644 front/v2/src/app/views/login-view/login-view.spec.ts delete mode 100644 front/v2/src/app/views/login-view/login-view.ts delete mode 100644 front/v2/src/app/views/register-view/register-view.html delete mode 100644 front/v2/src/app/views/register-view/register-view.scss delete mode 100644 front/v2/src/app/views/register-view/register-view.spec.ts delete mode 100644 front/v2/src/app/views/register-view/register-view.ts delete mode 100644 front/v2/src/app/views/services-view/services-view.html delete mode 100644 front/v2/src/app/views/services-view/services-view.scss delete mode 100644 front/v2/src/app/views/services-view/services-view.spec.ts delete mode 100644 front/v2/src/app/views/services-view/services-view.ts delete mode 100644 front/v2/src/app/views/tags-view/tags-view.html delete mode 100644 front/v2/src/app/views/tags-view/tags-view.scss delete mode 100644 front/v2/src/app/views/tags-view/tags-view.spec.ts delete mode 100644 front/v2/src/app/views/tags-view/tags-view.ts delete mode 100644 front/v2/src/app/views/upload-image-view/upload-image-view.html delete mode 100644 front/v2/src/app/views/upload-image-view/upload-image-view.scss delete mode 100644 front/v2/src/app/views/upload-image-view/upload-image-view.spec.ts delete mode 100644 front/v2/src/app/views/upload-image-view/upload-image-view.ts delete mode 100644 front/v2/src/app/views/user-galleries-view/user-galleries-view.html delete mode 100644 front/v2/src/app/views/user-galleries-view/user-galleries-view.scss delete mode 100644 front/v2/src/app/views/user-galleries-view/user-galleries-view.spec.ts delete mode 100644 front/v2/src/app/views/user-galleries-view/user-galleries-view.ts delete mode 100644 front/v2/src/app/views/user-profile-view/user-profile-view.html delete mode 100644 front/v2/src/app/views/user-profile-view/user-profile-view.scss delete mode 100644 front/v2/src/app/views/user-profile-view/user-profile-view.spec.ts delete mode 100644 front/v2/src/app/views/user-profile-view/user-profile-view.ts delete mode 100644 front/v2/src/index.html delete mode 100644 front/v2/src/main.ts delete mode 100644 front/v2/src/models/config.ts delete mode 100644 front/v2/src/models/eventModel.ts delete mode 100644 front/v2/src/models/gallery/galleryFactory.ts delete mode 100644 front/v2/src/models/gallery/galleryModel.ts delete mode 100644 front/v2/src/models/gallery/homeGallery.ts delete mode 100644 front/v2/src/models/permissionModel.ts delete mode 100644 front/v2/src/models/personModel.ts delete mode 100644 front/v2/src/models/photoModel.ts delete mode 100644 front/v2/src/models/rankingModel.ts delete mode 100644 front/v2/src/models/roleModel.ts delete mode 100644 front/v2/src/models/tagModel.ts delete mode 100644 front/v2/src/models/userModel.ts delete mode 100644 front/v2/src/styles.scss delete mode 100644 front/v2/src/styles/_buttons.scss delete mode 100644 front/v2/src/styles/_inputs.scss delete mode 100644 front/v2/src/styles/_loaders.scss delete mode 100644 front/v2/src/styles/_variables.scss delete mode 100644 front/v2/src/styles/loaders/_loader-spinner.scss delete mode 100644 front/v2/src/styles/loaders/_paper-plane-loader.scss delete mode 100644 front/v2/src/styles/themes/_dark.scss delete mode 100644 front/v2/src/styles/themes/_light.scss delete mode 100644 front/v2/src/styles/themes/dark.scss delete mode 100644 front/v2/src/styles/themes/light.scss delete mode 100644 front/v2/src/utils/paginator.ts delete mode 100644 front/v2/src/utils/svg-button/svg-button.html delete mode 100644 front/v2/src/utils/svg-button/svg-button.scss delete mode 100644 front/v2/src/utils/svg-button/svg-button.ts delete mode 100644 front/v2/src/utils/svg/svg.ts delete mode 100644 front/v2/src/utils/validators/distinctEmailPasswordValidator.ts delete mode 100644 front/v2/src/utils/validators/emailValidator.ts delete mode 100644 front/v2/src/utils/validators/passwordValidator.ts delete mode 100644 front/v2/tsconfig.app.json delete mode 100644 front/v2/tsconfig.json delete mode 100644 front/v2/tsconfig.spec.json delete mode 100644 pruebas/login-form-icons-readme.txt delete mode 100644 pruebas/login-form.css delete mode 100644 pruebas/login-form.html diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 49e0f5e..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "FRONT: DEBUG(Edge)", - "request": "launch", - "type": "msedge", - "url": "http://localhost:4200", - "webRoot": "${workspaceFolder}/front/v2", - "preLaunchTask": "Start Node server with nvs latest" - }, - { - "name": "(legacy) FRONT: DEBUG(Edge)", - "request": "launch", - "type": "msedge", - "url": "http://localhost:4200", - "webRoot": "${workspaceFolder}/front/v1", - "preLaunchTask": "(legacy) Start Node server with nvs latest" - }, - { - "name": "Attach Edge", - "type": "msedge", - "request": "attach", - "url": "http://localhost:4200/#", - "webRoot": "${workspaceFolder}" - }, - { - "name": "Launch Edge (Test)", - "type": "msedge", - "request": "launch", - "url": "http://localhost:9876/debug.html", - "webRoot": "${workspaceFolder}" - }, - { - "name": "Launch Edge (E2E)", - "type": "node", - "request": "launch", - "program": "${workspaceFolder}/node_modules/protractor/bin/protractor", - "protocol": "inspector", - "args": ["${workspaceFolder}/protractor.conf.js"] - } - ] -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index c3feb3c..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "(legacy) Start Node server with nvs latest", - "type": "shell", - "command": "nvs use latest && npm run start", - "options": { - "cwd": "${workspaceFolder}/front/v1" - }, - "isBackground": true, - "problemMatcher": [], - "presentation": { - "echo": true, - "reveal": "always", - "focus": false, - "panel": "shared" - } - }, - { - "label": "Start Node server with nvs latest", - "type": "shell", - "command": "nvs use latest && npm run start", - "options": { - "cwd": "${workspaceFolder}/front/v2" - }, - "isBackground": true, - "problemMatcher": [], - "presentation": { - "echo": true, - "reveal": "always", - "focus": false, - "panel": "shared" - } - } - ] -} diff --git a/README.md b/README.md deleted file mode 100644 index 954a514..0000000 --- a/README.md +++ /dev/null @@ -1,213 +0,0 @@ -# mmorales.photo - -## Index - -1. [Problem](#problem) -2. [Proposal](#proposal) - 1. [Objectives](#objectives) - 2. [Monetization](#monetization) - 3. [Scope](#scope) - 4. [Risks and Mitigations](#risks-and-mitigations) - 5. [Solution](#solution) - 6. [System Architecture](#system-architecture) -3. [Glossary](#glossary) -4. [Additional Context](#additional-context) - -## Additional Context - -- [Frontend Documentation](docs/front/frontend-documentation.md) -- [Backend Documentation](docs/back) -- [Resources](docs/resources) - -## Problem - -As digital photographers, there are few alternatives to showcase their work. -Many of them require web development skills. -Many lack support for selling or appointment booking. -Many do not offer enough storage. -Many do not offer custom layouts or domain naming. -Many rely on platforms that sell services as a service (SaaS). -Most rely on platforms that sell hosting as a service (IaaS). -Most do not have user interactivity, resulting in a simple gallery without feedback. - -Many amateur photographers use Instagram as a gallery and portfolio. Then, they use Dropbox, WeTransfer, Google Drive, or similar platforms. They rely on manual methods for paying for services, such as wire transfer or cash, sometimes leading to loss of money or loss of a client due to client dissatisfaction. - -## Proposal - -A platform with three kinds of view: - -1. A client view: A simple gallery with easy contact and appointment booking methods. With a history of purchases and services to access private galleries where images can be downloaded without restrictions. These galleries must be able to be shared across users so one pays, all get access. - -2. A content manager view: A simple administration page for uploading content, customizing the current content (such as website name, icon, and current images displayed), and creating buyers' galleries. It must also be able to moderate user-generated content, such as public gallery comments. - -3. An administrator view: A more complex display of web-related content. The admin can edit service-related items, such as adding content managers, editing payment methods, changing website name, icon, fonts, and component CSS. It must also be able to look up non-sensitive user details such as name or email to assist users in need. - -The solutions must be oriented towards user experience and satisfaction. -It must also provide user security and protect photographers' work. -For non-techies, it must provide an easy way to manage, use, and host; the out-of-the-box experience must be excellent. -For techies, it must provide a self-hosted environment, allowing customization of less critical parts such as mailing, frontend layout, and database provider. - -### Objectives - -We expect: - -- To fulfill the needs of new professionals and provide a solid alternative for established ones. -- A secure and professional way to deliver digital photography work to clients. -- A collaborative platform between photographers and clients to enable better work. -- The easiest-to-use and best out-of-the-box experience for new clients. - -### Monetization - -__What do we sell?__ We sell a fire-and-forget service. -__What do customers pay for?__ Non-techies pay for setup, management, support, and storage. Techies pay for support. -__How do customers receive the product?__ Non-techies receive a pre-made setup on their desired hosting. Techies receive a click-and-run service. -__How much do we receive per product?__ As a product, we do not receive anything. As a service, we license the service monthly, yearly, or by one-hour support service. - -### Scope - -#### What IS included - -- Provide a friendly, comfortable, and fast frontend; an agile and resilient backend. -- Offer broad customization options regarding infrastructure. -- Deliver the most simple and satisfying out-of-the-box experience possible. -- Enable integration with multiple cloud storage providers and local storage. -- Support for multi-language and accessibility features. -- Ensure data privacy and security for users and photographers. -- Provide basic analytics and usage statistics for administrators. -- Allow easy deployment on various hosting environments (cloud, on-premises, hybrid). - -#### What is NOT included - -- Payment gateways. -- Extensive customization of the visual design. -- Hosting management tasks. -- Advanced marketing automation tools. -- Third-party plugin marketplace. -- Deep integration with external CRM or ERP systems. - -### Risks and Mitigations - -| Risk | Description | Mitigation | -|------|-------------|------------| -| Vendor lock-in | Dependence on a single cloud provider may limit flexibility and increase costs. | Support multiple storage providers and allow easy migration between them. | -| Data loss or corruption | Images or user data could be lost due to hardware failure or software bugs. | Implement regular backups, redundancy, and data integrity checks. | -| Security breaches | Unauthorized access to private galleries or sensitive user data. | Use strong encryption (HTTPS, AES), MFA, and regular security audits. | -| Scalability issues | Performance degradation as the number of users or images grows. | Design for horizontal scalability and monitor system performance. | -| Legal and compliance | Failure to comply with data protection laws (GDPR, etc.). | Store data in compliant regions and provide clear privacy policies. | -| User adoption | Users may find the platform difficult to use or not see its value. | Focus on user experience, provide onboarding guides, and collect feedback. | -| Third-party service outages | External services (cloud, identity providers) may become unavailable. | Implement fallback mechanisms and monitor service health. | -| Cost overruns | Unexpected expenses in infrastructure or development. | Monitor costs, set budgets, and optimize resource usage. | - -### Solution - -Based on a three-layered architecture, each layer must present a plug-and-play architecture. - -__As frontend__, we are starting with Angular as a base, then creating Vue and React alternatives. -It will follow a clean architecture based on the scream architecture approach. -To make rendering easy for low-end/home servers, it will mainly use client-side rendering. -For identity verification, the frontend will rely on OpenID data provided by the backend, using a cookie ID and JWE for identification. -For UI layout, mobile and tablet will be preferred as end devices. Computers and large-sized devices will be last in layout responsibility. The UI will be built by composing different small components, following a Vue-like philosophy. - -__As backend__, we are deploying a C# .NET engine. As a self-host-aware project, we need to ensure platform compatibility. A cloud-native approach will be taken, providing a system-agnostic platform. Cross-compiling will be a must. Database-agnostic, it will use SQLite as the default database for fallback and non-customized database. PostgreSQL will be used for SQL-based database development, making it pluggable and interchangeable with Microsoft SQL Server and other SQL providers like CockroachDB. -For architecture, we will take a Domain-Driven approach. Using EntityFramework for database operations makes development faster and database-agnostic. -For security, all communications will be made via HTTPS and encrypted with military-grade AES. -Also, to make user registration easier, we will use as many identity providers as possible, such as Google, Facebook, Instagram... Once registered, users need to access as easily as possible, so passwordless access should be implemented. For security, an MFA system will be required. -To be able to respond to energy shortages, we will use DAPR and some edge computing technologies. -To be more resilient against some attacks, we will implement BFF (Backend for Frontend) technology. -For custom gallery creation, we will use a parallel processor based on messaging. - -__As database__, we are going to choose a database-agnostic approach. -Since during development we will ignore database layout, we are going to expose two configurations for two kinds of data levels. -User-related data will be presented as the SensibleData database. -Images and other blobs will be presented as the BlobData database. -As a cloud-native approach, we will take blob storage as a service-independent module, so users can use their own disk space or services such as: - -- __Amazon S3:__ Highly scalable, reliable, and widely used object storage service. -- __Microsoft Azure Blob Storage:__ Secure and scalable storage for unstructured data, integrated with the Azure ecosystem. -- __Google Cloud Storage:__ Global object storage with strong integration to Google Cloud services. -- __DigitalOcean Spaces:__ Simple and cost-effective object storage compatible with the S3 API. -- __Backblaze B2:__ Affordable cloud storage with S3 compatibility. -- __Wasabi:__ High-performance, low-cost cloud storage with S3 API support. -- __IBM Cloud Object Storage:__ Enterprise-grade, scalable object storage. -- __MinIO:__ Self-hosted, S3-compatible object storage solution for on-premises or private cloud. - -### System Architecture - -![Diagram of the connections between the described components. Frontend connected to BFF, BFF connected to BlobProvider, BFF connected to Backend, Backend connected to DataProvider and Backend connected to Identity provider.](docs/resources/root/architecturalComponentLayout.svg) - -At system level, since identity and data providers are not controlled parts, there are three main components: - -- Frontend -- BFF -- Backend - -Frontend will speak ONLY with BFF via REST commands. Only sensible data will be encrypted via AES. -Frontend will GET lazily all the images for galleries. - -BFF will redirect GET image requests to configured CDN or will serve them if no CDN is configured. -BFF will cache repeated and critical requests. -BFF will redirect to Backend in case of user creation, login or update; selling activity as booking or buying; image creation, edition or delete. - -Backend will contact Identity Providers such as Google or Instagram at login time. -Backend will generate and validate login tokens. -Backend will create, retrieve, edit and delete user and image data. - -Since frontend will be device dependent in the future, BFF will give flexibility for identifying client users. - ---- - -## Glossary - -__Frontend:__ The part of the application that users interact with directly, typically the website or app interface. - -__Backend:__ The server-side part of the application that handles business logic, data storage, and communication with other services. - -__SaaS (Software as a Service):__ A software distribution model in which applications are hosted by a service provider and made available to customers over the internet. - -__IaaS (Infrastructure as a Service):__ A form of cloud computing that provides virtualized computing resources over the internet. - -__Client-side rendering:__ Rendering of web pages in the user's browser using JavaScript frameworks. - -__Server-side rendering (SSR):__ Rendering of web pages on the server before sending them to the user's browser. - -__OpenID:__ An authentication protocol that allows users to log in to multiple services with a single identity. - -__JWE (JSON Web Encryption):__ A standard for encrypting data in JSON format, often used for secure transmission of authentication tokens. - -__MFA (Multi-Factor Authentication):__ A security system that requires more than one method of authentication from independent categories of credentials. - -__BFF (Backend for Frontend):__ An architectural pattern where a dedicated backend is built for each frontend application to optimize communication and security. - -__Domain-Driven Design (DDD):__ An approach to software development that focuses on modeling software to match a domain's business concepts and logic. - -__EntityFramework:__ An object-relational mapper (ORM) for .NET, used to interact with databases using .NET objects. - -__Blob Storage:__ A service for storing large amounts of unstructured data, such as images, videos, and documents. - -__Plug-and-play architecture:__ A design approach that allows components to be easily added, removed, or replaced without affecting the rest of the system. - -__CDN (Content Delivery Network):__ A network of servers distributed geographically to deliver content more efficiently to users based on their location. - -__AES (Advanced Encryption Standard):__ A symmetric encryption algorithm widely used for securing sensitive data. - -__REST (Representational State Transfer):__ An architectural style for designing networked applications, often used for APIs. - -__DAPR (Distributed Application Runtime):__ A runtime that simplifies building distributed systems by providing APIs for common tasks like state management and pub/sub messaging. - -__Edge Computing:__ A distributed computing paradigm that brings computation and data storage closer to the location where it is needed to improve response times and save bandwidth. - -__Parallel Processing:__ A method of processing data in which multiple processors execute tasks simultaneously to increase efficiency and performance. - -__API (Application Programming Interface):__ Un conjunto de definiciones y protocolos para construir e integrar software de aplicaciones. - -__OAuth:__ Un estándar abierto para la autorización que permite a los usuarios compartir recursos entre aplicaciones sin compartir credenciales. - -__CI/CD (Continuous Integration/Continuous Deployment):__ Un conjunto de prácticas que automatizan el desarrollo, las pruebas y la implementación de software. - -__Microservicios:__ Un estilo arquitectónico que estructura una aplicación como un conjunto de servicios pequeños y autónomos. - -__Load Balancer:__ Un dispositivo o software que distribuye tráfico de red o aplicación entre varios servidores para mejorar la eficiencia y la disponibilidad. - -__Cache:__ Un almacenamiento temporal de datos para acelerar el acceso a información frecuentemente utilizada. - -__JWT (JSON Web Token):__ Un estándar para transmitir información de forma segura entre partes como un objeto JSON. diff --git a/back/.config/dotnet-tools.json b/back/.config/dotnet-tools.json deleted file mode 100644 index 837b189..0000000 --- a/back/.config/dotnet-tools.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": 1, - "isRoot": true, - "tools": { - "dotnet-ef": { - "version": "9.0.8", - "commands": [ - "dotnet-ef" - ], - "rollForward": false - } - } -} \ No newline at end of file diff --git a/back/.program_data/imgs/systemkey.lock b/back/.program_data/imgs/systemkey.lock deleted file mode 100644 index 6012986..0000000 --- a/back/.program_data/imgs/systemkey.lock +++ /dev/null @@ -1,5 +0,0 @@ -{ - "email": "sys@t.em", - "key": "b60e166e-d4a5-416e-a7c9-142d05fb7f31", - "password": "8C3,uTÑ Roles { get; set; } = []; -} diff --git a/back/DataModels/EfmigrationsLock.cs b/back/DataModels/EfmigrationsLock.cs deleted file mode 100644 index e9d01bc..0000000 --- a/back/DataModels/EfmigrationsLock.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace back.DataModels; - -public partial class EfmigrationsLock -{ - public int Id { get; set; } - - public string Timestamp { get; set; } = null!; -} diff --git a/back/DataModels/Event.cs b/back/DataModels/Event.cs deleted file mode 100644 index 85d833c..0000000 --- a/back/DataModels/Event.cs +++ /dev/null @@ -1,44 +0,0 @@ -using MCVIngenieros.Transactional.Abstractions; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -[Table("Events")] -public partial class Event : ISoftDeletable, IEquatable -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - [Required, MaxLength(50)] - public string Title { get; set; } = null!; - [MaxLength(500)] - public string? Description { get; set; } - public string? Date { get; set; } - public string? Location { get; set; } - public string CreatedAt { get; set; } = null!; - public string UpdatedAt { get; set; } = null!; - public string? CreatedBy { get; set; } - public string? UpdatedBy { get; set; } - public int IsDeleted { get; set; } - public string? DeletedAt { get; set; } - public virtual ICollection Galleries { get; set; } = []; - public virtual ICollection Photos { get; set; } = []; - public virtual ICollection Tags { get; set; } = []; - - public override int GetHashCode() - => HashCode.Combine(Id, Title, Date, Location); - - public override bool Equals(object? obj) - => obj is Event otherEvent && Equals(otherEvent); - - public bool Equals(Event? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return - Id == other.Id - || (Title == other.Title && Date == other.Date && Location == other.Location) - || GetHashCode() == other.GetHashCode(); - } -} - diff --git a/back/DataModels/Gallery.cs b/back/DataModels/Gallery.cs deleted file mode 100644 index 246f750..0000000 --- a/back/DataModels/Gallery.cs +++ /dev/null @@ -1,44 +0,0 @@ -using MCVIngenieros.Transactional.Abstractions; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -[Table("Galleries")] -public partial class Gallery: IEquatable, ISoftDeletable -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - [MaxLength(100)] - public string? Title { get; set; } - [MaxLength(500)] - public string? Description { get; set; } - public string? CreatedAt { get; set; } - public string? UpdatedAt { get; set; } - public string CreatedBy { get; set; } = null!; - public int? IsPublic { get; set; } - public int? IsArchived { get; set; } - public int? IsFavorite { get; set; } - public int IsDeleted { get; set; } - public string? DeletedAt { get; set; } - public string? EventId { get; set; } - public virtual User CreatedByNavigation { get; set; } = null!; - public virtual Event? Event { get; set; } - public virtual ICollection Photos { get; set; } = []; - public virtual ICollection Tags { get; set; } = []; - public virtual ICollection Users { get; set; } = []; - - public Gallery() { } - - public override int GetHashCode() => HashCode.Combine(Id, Title); - - public override bool Equals(object? obj) => obj is Gallery otherEvent && Equals(otherEvent); - - public bool Equals(Gallery? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return - Id == other.Id || GetHashCode() == other.GetHashCode(); - } -} diff --git a/back/DataModels/Permission.cs b/back/DataModels/Permission.cs deleted file mode 100644 index 11de19f..0000000 --- a/back/DataModels/Permission.cs +++ /dev/null @@ -1,72 +0,0 @@ -using MCVIngenieros.Transactional.Abstractions.Interfaces; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -public record PermissionDto -{ - public string Id { get; set; } = null!; -} - -[Table("Permissions")] -public partial class Permission : IEntity -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - [Required, MaxLength(100)] - public string Name { get; set; } = null!; - [MaxLength(255)] - public string? Description { get; set; } - public virtual ICollection Roles { get; set; } = []; - - public override int GetHashCode() => HashCode.Combine(Id, Name); - - public override bool Equals(object? obj) - => obj is Permission other && Equals(other); - public bool Equals(Permission? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return - Id == other.Id || GetHashCode() == other.GetHashCode(); - } - - public bool IsNull => this is null; - - public object Clone() => (Permission)MemberwiseClone(); - - public int CompareTo(object? obj) - { - if (obj is null) return 1; - if (obj is not Permission other) throw new ArgumentException("Object is not a Person"); - return CompareTo(other); - } - - public int CompareTo(Permission? other) - { - if (other is null) return 1; - if (ReferenceEquals(this, other)) return 0; - return string.Compare(Id, other.Id, StringComparison.OrdinalIgnoreCase); - } - - public PermissionDto ToDto() - { - return new PermissionDto - { - Id = Id - }; - } - - // Static permissions - public static readonly Permission ViewContentPermission = new() { Id = "1", Name = "VIEW_CONTENT", Description = "Permission to view content" }; - public static readonly Permission LikeContentPermission = new() { Id = "2", Name = "LIKE_CONTENT", Description = "Permission to like content" }; - public static readonly Permission EditContentPermission = new() { Id = "3", Name = "EDIT_CONTENT", Description = "Permission to edit content" }; - public static readonly Permission DeleteContentPermission = new() { Id = "4", Name = "DELETE_CONTENT", Description = "Permission to delete content" }; - public static readonly Permission CreateContentPermission = new() { Id = "5", Name = "CREATE_CONTENT", Description = "Permission to create new content" }; - public static readonly Permission EditUserPermission = new() { Id = "6", Name = "EDIT_USER", Description = "Permission to edit user" }; - public static readonly Permission DeleteUserPermission = new() { Id = "7", Name = "DELETE_USER", Description = "Permission to delete user" }; - public static readonly Permission DisableUserPermission = new() { Id = "8", Name = "DISABLE_USER", Description = "Permission to disable user" }; - public static readonly Permission CreateUserPermission = new() { Id = "9", Name = "CREATE_USER", Description = "Permission to create new user" }; - public static readonly Permission EditWebConfigPermission = new() { Id = "10", Name = "EDIT_WEB_CONFIG", Description = "Permission to edit web configuration" }; -} diff --git a/back/DataModels/Person.cs b/back/DataModels/Person.cs deleted file mode 100644 index 61bdfaa..0000000 --- a/back/DataModels/Person.cs +++ /dev/null @@ -1,70 +0,0 @@ -using MCVIngenieros.Transactional.Abstractions; -using MCVIngenieros.Transactional.Abstractions.Interfaces; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -[Table("Persons")] -public partial class Person: IEntity, ISoftDeletable -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - [Required, MaxLength(100)] - public string Name { get; set; } = null!; - public string? ProfilePicture { get; set; } - public string? Avatar { get; set; } - public string? SocialMediaId { get; set; } - [MaxLength(250)] - public string? Bio { get; set; } // Optional field for a short biography or description - public string CreatedAt { get; set; } = null!; - public string? UpdatedAt { get; set; } - public int IsDeleted { get; set; } - public string? DeletedAt { get; set; } - - public virtual ICollection Photos { get; set; } = []; - public virtual SocialMedia? SocialMedia { get; set; } - public virtual User? User { get; set; } - public virtual ICollection PhotosNavigation { get; set; } = []; - - - public override int GetHashCode() => HashCode.Combine(Id, Name); - - public override bool Equals(object? obj) - => obj is Person other && Equals(other); - - public bool Equals(Person? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return - Id == other.Id || GetHashCode() == other.GetHashCode(); - } - public bool IsNull => this is null; - - public object Clone() => (Person)MemberwiseClone(); - - public int CompareTo(object? obj) - { - if(obj is null) return 1; - if (obj is not Person other) throw new ArgumentException("Object is not a Person"); - return CompareTo(other); - } - - public int CompareTo(Person? other) - { - if (other is null) return 1; - if (ReferenceEquals(this, other)) return 0; - return string.Compare(Id, other.Id, StringComparison.OrdinalIgnoreCase); - } - - public const string SystemPersonId = "00000000-0000-0000-0000-000000000001"; - - public static readonly Person SystemPerson = new() - { - Id = SystemPersonId, - Name = "System", - CreatedAt = DateTime.UtcNow.ToString("dd-MM-yyyy HH:mm:ss zz"), - User = User.SystemUser - }; -} \ No newline at end of file diff --git a/back/DataModels/Photo.cs b/back/DataModels/Photo.cs deleted file mode 100644 index fb7af91..0000000 --- a/back/DataModels/Photo.cs +++ /dev/null @@ -1,66 +0,0 @@ -using MCVIngenieros.Transactional.Abstractions.Interfaces; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -[Table("Photos")] -public partial class Photo : IEntity -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - [Required, MaxLength(100), MinLength(1)] - public string Title { get; set; } = null!; - [MaxLength(500)] - public string? Description { get; set; } - public string? Extension { get; set; } - public string? LowResUrl { get; set; } - public string? MidResUrl { get; set; } - public string? HighResUrl { get; set; } - public string? CreatedAt { get; set; } - public string? UpdatedAt { get; set; } - public string CreatedBy { get; set; } = null!; - public string? UpdatedBy { get; set; } - public string? EventId { get; set; } - public string? RankingId { get; set; } - public int? IsFavorite { get; set; } - public int? IsPublic { get; set; } - public int? IsArchived { get; set; } - public virtual Person CreatedByNavigation { get; set; } = null!; - public virtual Event? Event { get; set; } - public virtual ICollection Galleries { get; set; } = []; - public virtual ICollection People { get; set; } = []; - public virtual ICollection Tags { get; set; } = []; - public virtual ICollection Users { get; set; } = []; - - public override int GetHashCode() => HashCode.Combine(Id, Title); - - public override bool Equals(object? obj) - => obj is Photo otherEvent && Equals(otherEvent); - - public bool Equals(Photo? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return - Id == other.Id || GetHashCode() == other.GetHashCode(); - } - - public bool IsNull => this is null; - - public object Clone() => (Photo)MemberwiseClone(); - - public int CompareTo(object? obj) - { - if (obj is null) return 1; - if (obj is not Photo other) throw new ArgumentException("Object is not a Person"); - return CompareTo(other); - } - - public int CompareTo(Photo? other) - { - if (other is null) return 1; - if (ReferenceEquals(this, other)) return 0; - return string.Compare(Id, other.Id, StringComparison.OrdinalIgnoreCase); - } -} \ No newline at end of file diff --git a/back/DataModels/Ranking.cs b/back/DataModels/Ranking.cs deleted file mode 100644 index 408e945..0000000 --- a/back/DataModels/Ranking.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -public class RankingGroup -{ - public const float ExtremlyBad = 1/5f; - public const float Bad = 2 / 5f; - public const float Normal = 3 / 5f; - public const float Good = 4 / 5f; - public const float ExtremlyGood = 5 / 5f; - - public static string GetGroup(float score) => (float)Math.Ceiling(score) switch - { - <= ExtremlyBad => nameof(ExtremlyBad), - <= Bad => nameof(Bad), - <= Normal => nameof(Normal), - <= Good => nameof(Good), - _ => nameof(ExtremlyGood) - }; -} - -[Table("Rankings")] -public partial class Ranking : IEquatable -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - public int TotalVotes { get; set; } - public int UpVotes { get; set; } - public int DownVotes { get; set; } - - public Ranking(int totalVotes, int upVotes = 0, int downVotes = 0) - { - TotalVotes = totalVotes; - UpVotes = upVotes; - DownVotes = downVotes; - } - - public Ranking() - { - TotalVotes = 0; - UpVotes = 0; - DownVotes = 0; - } - - public void DownVote() - { - DownVotes++; - TotalVotes++; - } - - public void UpVote() - { - UpVotes++; - TotalVotes++; - } - - public float Score - { - get - { - if (TotalVotes == 0) return 0; - return (float)(UpVotes - DownVotes) / TotalVotes; - } - } - - public string Group => RankingGroup.GetGroup(Score); - - public override int GetHashCode() => HashCode.Combine(Id, TotalVotes, UpVotes, DownVotes); - - public override bool Equals(object? obj) => obj is Ranking otherEvent && Equals(otherEvent); - - public bool Equals(Ranking? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return - Id == other.Id - || GetHashCode() == other.GetHashCode() - || (TotalVotes == other.TotalVotes && UpVotes == other.UpVotes && DownVotes == other.DownVotes); - } - - public static bool operator ==(Ranking ranking1, Ranking ranking2) - { - if (ranking1 is null && ranking2 is null) return true; - if (ranking1 is null || ranking2 is null) return false; - return ranking1.Equals(ranking2); - } - - public static bool operator !=(Ranking ranking1, Ranking ranking2) - { - if (ranking1 is null && ranking2 is null) return false; - if (ranking1 is null || ranking2 is null) return true; - return !ranking1.Equals(ranking2); - } - - public static bool operator < (Ranking ranking1, Ranking ranking2) - { - ArgumentNullException.ThrowIfNull(ranking1, nameof(ranking1)); - ArgumentNullException.ThrowIfNull(ranking2, nameof(ranking2)); - return ranking1.Score < ranking2.Score; - } - - public static bool operator > (Ranking ranking1, Ranking ranking2) - { - ArgumentNullException.ThrowIfNull(ranking1, nameof(ranking1)); - ArgumentNullException.ThrowIfNull(ranking2, nameof(ranking2)); - if (ranking1 is null && ranking2 is null) return true; - if (ranking1 is null || ranking2 is null) return false; - return ranking1.Score > ranking2.Score; - } - - public static bool operator <= (Ranking ranking1, Ranking ranking2) - => ranking1 == ranking2 || ranking1 < ranking2; - - public static bool operator >= (Ranking ranking1, Ranking ranking2) - => ranking1 == ranking2 || ranking1 > ranking2; -} diff --git a/back/DataModels/Role.cs b/back/DataModels/Role.cs deleted file mode 100644 index b1dba06..0000000 --- a/back/DataModels/Role.cs +++ /dev/null @@ -1,127 +0,0 @@ -using MCVIngenieros.Transactional.Abstractions.Interfaces; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -public class RoleDto -{ - public string Id { get; set; } = null!; - public List Permissions { get; set; } = []; -} - -[Table("Roles")] -public partial class Role : IEntity -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - [Required, MaxLength(100)] - public string Name { get; set; } = null!; - [MaxLength(250)] - public string? Description { get; set; } - public string? BaseRoleModelId { get; set; } - public virtual Role? BaseRoleModel { get; set; } - public virtual ICollection InverseBaseRoleModel { get; set; } = []; - public virtual ICollection Permissions { get; set; } = new HashSet(); - public virtual ICollection Users { get; set; } = []; - - public bool IsAdmin() => BaseRoleModel != null ? BaseRoleModel.IsAdmin() : Id == AdminRole.Id; - public bool IsContentManager() => BaseRoleModel != null ? BaseRoleModel.IsContentManager() : Id == ContentManagerRole.Id; - public bool IsUser() => BaseRoleModel != null ? BaseRoleModel.IsUser() : Id == UserRole.Id; - - public bool HasPermission(Permission permission) - { - var baseRoleHasPermission = BaseRoleModel != null && BaseRoleModel.HasPermission(permission); - return baseRoleHasPermission || Permissions.Any(p => p.Id == permission.Id); - } - - public Role() { } - - public Role(string id, string name, string description, List? permissions = null, Role? baseRoleModel = null) - { - Id = id; - Name = name; - Description = description; - Permissions = permissions ?? []; - if (baseRoleModel != null) - { - BaseRoleModel = baseRoleModel; - BaseRoleModelId = baseRoleModel.Id; - foreach (var permission in baseRoleModel.Permissions) - { - if (!Permissions.Any(p => p.Id == permission.Id)) - { - Permissions.Add(permission); - } - } - } - } - - public override int GetHashCode() => HashCode.Combine(Id, Name); - - public override bool Equals(object? obj) => obj is Role otherEvent && Equals(otherEvent); - - public bool Equals(Role? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return Id == other.Id || GetHashCode() == other.GetHashCode(); - } - - public bool IsNull => this is null; - - public object Clone() => (Role)MemberwiseClone(); - - public int CompareTo(object? obj) - { - if (obj is null) return 1; - if (obj is not Role other) throw new ArgumentException("Object is not a Person"); - return CompareTo(other); - } - - public int CompareTo(Role? other) - { - if (other is null) return 1; - if (ReferenceEquals(this, other)) return 0; - return string.Compare(Id, other.Id, StringComparison.OrdinalIgnoreCase); - } - - public RoleDto ToDto() - { - return new RoleDto - { - Id = Id, - Permissions = [.. Permissions.Select(p => p.ToDto())] - }; - } - - public static readonly Role UserRole = new( - "1", "User", "Role for regular users", - [ - Permission.ViewContentPermission, - Permission.LikeContentPermission - ] - ); - - public static readonly Role ContentManagerRole = new( - "2", "Content Manager", "Role for managing content", - [ - Permission.CreateContentPermission, - Permission.EditContentPermission, - Permission.DeleteContentPermission - ], - UserRole - ); - - public static readonly Role AdminRole = new( - "3", "Admin", "Administrator role with full permissions", - [ - Permission.CreateUserPermission, - Permission.DisableUserPermission, - Permission.EditUserPermission, - Permission.DeleteUserPermission, - Permission.EditWebConfigPermission - ], - ContentManagerRole - ); -} diff --git a/back/DataModels/SocialMedia.cs b/back/DataModels/SocialMedia.cs deleted file mode 100644 index 009a05c..0000000 --- a/back/DataModels/SocialMedia.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -[Table("SocialMedia")] -public partial class SocialMedia: IEquatable -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - public string? Facebook { get; set; } - public string? Instagram { get; set; } - public string? Twitter { get; set; } - public string? BlueSky { get; set; } - public string? Tiktok { get; set; } - public string? Linkedin { get; set; } - public string? Pinterest { get; set; } - public string? Discord { get; set; } - public string? Reddit { get; set; } - public string? Other { get; set; } - public virtual ICollection People { get; set; } = []; - - public override int GetHashCode() => HashCode.Combine(Id); - - public override bool Equals(object? obj) => obj is SocialMedia otherEvent && Equals(otherEvent); - - public bool Equals(SocialMedia? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return GetHashCode() == other.GetHashCode(); - } -} diff --git a/back/DataModels/SystemKey.cs b/back/DataModels/SystemKey.cs deleted file mode 100644 index abc9100..0000000 --- a/back/DataModels/SystemKey.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace back.DataModels; - -public class SystemKey -{ - public string Email { get; set; } = User.SystemUser.Email; - public string Key { get; set; } = Guid.NewGuid().ToString(); - public required string Password { get; set; } - - public bool IsValid(string email, string password, string key) - { - return Email.Equals(email, StringComparison.InvariantCultureIgnoreCase) && - Password.Equals(password, StringComparison.InvariantCulture) && - Key.Equals(key, StringComparison.InvariantCulture); - } -} \ No newline at end of file diff --git a/back/DataModels/Tag.cs b/back/DataModels/Tag.cs deleted file mode 100644 index 94565ee..0000000 --- a/back/DataModels/Tag.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -[Table("Tags")] -public partial class Tag: IEquatable -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - [Required, MaxLength(25)] - public string Name { get; set; } = null!; - [Required] - public string CreatedAt { get; set; } = null!; - - public virtual ICollection Events { get; set; } = []; - - public virtual ICollection Galleries { get; set; } = []; - - public virtual ICollection Photos { get; set; } = []; - - public override int GetHashCode() => HashCode.Combine(Id, Name); - - public override bool Equals(object? obj) => obj is Tag tag && Equals(tag); - - public bool Equals(Tag? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return Id == other.Id || GetHashCode() == other.GetHashCode(); - } -} diff --git a/back/DataModels/User.cs b/back/DataModels/User.cs deleted file mode 100644 index 0bbcb94..0000000 --- a/back/DataModels/User.cs +++ /dev/null @@ -1,86 +0,0 @@ -using back.DTO; -using MCVIngenieros.Transactional.Abstractions.Interfaces; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace back.DataModels; - -[Table("Users")] -public class User : IEntity -{ - [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } = null!; - [Required, EmailAddress] - public string Email { get; set; } = null!; - [Required, MinLength(8)] - public string Password { get; set; } = null!; - [Required] - public string Salt { get; set; } = null!; - public string CreatedAt { get; set; } = null!; - - public virtual Person IdNavigation { get; set; } = null!; - public virtual ICollection Galleries { get; set; } = []; - public virtual ICollection GalleriesNavigation { get; set; } = []; - public virtual ICollection Photos { get; set; } = []; - public virtual ICollection Roles { get; set; } = []; - - public User() { } - public User(string id, string email, string password, DateTimeOffset createdAt) - { - Id = id; - Email = email; - Password = password; - CreatedAt = createdAt.ToString("dd-MM-yyyy HH:mm:ss zz"); - } - - public UserDto ToDto() => new() - { - Id = Id, - Roles = [.. Roles.Select(r => r.ToDto())] - }; - - public bool IsAdmin() => Roles.Any(r => r.IsAdmin()); - public bool IsContentManager() => Roles.Any(r => r.IsContentManager()); - public bool IsUser() => Roles.Any(r => r.IsUser()); - - public override int GetHashCode() => HashCode.Combine(Id, Email); - - public override bool Equals(object? obj) => obj is User otherEvent && Equals(otherEvent); - - public bool Equals(User? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return Id == other.Id && Email == other.Email; - } - - public bool IsNull => this is null; - - public object Clone() => (User)MemberwiseClone(); - - public int CompareTo(object? obj) - { - if (obj is null) return 1; - if (obj is not User other) throw new ArgumentException("Object is not a Person"); - return CompareTo(other); - } - - public int CompareTo(User? other) - { - if (other is null) return 1; - if (ReferenceEquals(this, other)) return 0; - return string.Compare(Id, other.Id, StringComparison.OrdinalIgnoreCase); - } - - public const string SystemUserId = "00000000-0000-0000-0000-000000000001"; - - public static readonly User SystemUser = new( - id: SystemUserId, - email: "sys@t.em", - password: "", - createdAt: DateTime.UtcNow - ) - { - Roles = [Role.AdminRole, Role.ContentManagerRole, Role.UserRole] - }; -} \ No newline at end of file diff --git a/back/Options/DatabaseConfig.cs b/back/Options/DatabaseConfig.cs deleted file mode 100644 index b39c84c..0000000 --- a/back/Options/DatabaseConfig.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace back.Options; - -public sealed class DatabaseConfig -{ - public const string BlobStorage = "Databases:Blob"; - public const string DataStorage = "Databases:Data"; - public required string Provider { get; set; } - public string? DatabaseName { get; set; } - public string? AccountKey { get; set; } - public string? TokenCredential { get; set; } - public string? BaseUrl { get; set; } - public string? ConnectionString { get; set; } - public string? SystemContainer { get; set; } -} diff --git a/back/Options/Databases.cs b/back/Options/Databases.cs deleted file mode 100644 index f3bddbd..0000000 --- a/back/Options/Databases.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace back.Options; - -public sealed class Databases -{ - public string? BaseDirectory { get; set; } -} diff --git a/back/Options/MailServerOptions.cs b/back/Options/MailServerOptions.cs deleted file mode 100644 index f8f74fc..0000000 --- a/back/Options/MailServerOptions.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace back.Options; - -public sealed class MailServerOptions -{ - public required string SmtpServer { get; set; } - public required int Puerto { get; set; } - public required string Usuario { get; set; } - public required string Password { get; set; } - public bool EnableSsl { get; set; } -} diff --git a/back/Program.cs b/back/Program.cs deleted file mode 100644 index 00c7195..0000000 --- a/back/Program.cs +++ /dev/null @@ -1,48 +0,0 @@ -using back.ServicesExtensions; -using MCVIngenieros.Healthchecks; - -namespace back; - -public class Program -{ - public static void Main(string[] args) - { - var builder = WebApplication.CreateBuilder(args); - - builder.Services.UseExtensions(); - - builder.Services.AddControllers(); - - builder.Services.AddHealthChecksSupport().DiscoverHealthChecks(); - - // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi - builder.Services.AddSwaggerGen(); - - builder.Services.AddCors(options => - { - options.AddPolicy("AllowAll", - builder => builder.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader()); - }); - - var app = builder.Build(); - - // Configure the HTTP request pipeline. - if (app.Environment.IsDevelopment()) - { - app.UseSwagger(); - app.UseSwaggerUI(); - } - - app.UseHttpsRedirection(); - - app.UseAuthorization(); - - app.UseCors("AllowAll"); - - app.MapControllers(); - - app.Run(); - } -} diff --git a/back/Properties/launchSettings.json b/back/Properties/launchSettings.json deleted file mode 100644 index 114d561..0000000 --- a/back/Properties/launchSettings.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "http://localhost:5250", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "swagger", - "applicationUrl": "https://localhost:7273;http://localhost:5250", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/back/ServicesExtensions/DatabaseContexts.cs b/back/ServicesExtensions/DatabaseContexts.cs deleted file mode 100644 index c982e3d..0000000 --- a/back/ServicesExtensions/DatabaseContexts.cs +++ /dev/null @@ -1,49 +0,0 @@ -using back.Options; -using back.persistance.data; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; - -namespace back.ServicesExtensions; - -public static partial class ServicesExtensions -{ - private static IServiceCollection AddDatabaseContext(this IServiceCollection services) - { - services.AddContext(); - - return services; - } - private static IServiceCollection AddContext(this IServiceCollection services) - where T : DbContext - { - var config = services - .BuildServiceProvider() - .GetRequiredService>() - .Get(DatabaseConfig.DataStorage); - - services.AddDbContext(options => - { - options.UseDatabaseConfig(config); - }); - - using var scope = services.BuildServiceProvider().CreateScope(); - var context = scope.ServiceProvider - .GetRequiredService(); - var isDevelopment = scope.ServiceProvider - .GetRequiredService() - .IsDevelopment(); - - if (isDevelopment && !context.Database.HasPendingModelChanges()) - { - context.Database.EnsureCreated(); - } - else - { - context.Database.EnsureCreated(); - context.Database.Migrate(); - } - context.SaveChanges(); - - return services; - } -} diff --git a/back/ServicesExtensions/DdContextOptionsBuilderExtensions.cs b/back/ServicesExtensions/DdContextOptionsBuilderExtensions.cs deleted file mode 100644 index 367ad22..0000000 --- a/back/ServicesExtensions/DdContextOptionsBuilderExtensions.cs +++ /dev/null @@ -1,92 +0,0 @@ -using back.Options; -using Microsoft.EntityFrameworkCore; -using System.Text.RegularExpressions; - -namespace back.ServicesExtensions; - -public enum DatabaseProvider -{ - /* -- Relational databases supported by EF Core -- */ - SUPPORTED, // Placeholder for supported databases. - InMemory, - Sqlite, - PostgreSQL, - CockroachDB, // CockroachDB is compatible with PostgreSQL. - SQLServer, - MariaDB, - MySQL, - Oracle, // Oracle is supported by EF Core but requires a separate package. - - /* -- NoSQL are not supported by EF -- */ - - NOT_SUPPORTED, // Placeholder for unsupported databases. - Firebird, // Firebird is supported by EF Core but requires a separate package. - Db2, // Db2 is supported by EF Core but requires a separate package. - SAPHana, // SAP HANA is supported by EF Core but requires a separate package. - Sybase, // Sybase is supported by EF Core but requires a separate package. - Cosmos, // Cosmos DB is database supported by EF Core. - MongoDB, - InfluxDB, - Redis, - Cassandra, - ElasticSearch, - CouchDB, - RavenDB, - Neo4j, - OrientDB, - ArangoDB, - ClickHouse, - Druid, - TimescaleDB, -} - -public static partial class DbContextOptionsBuilderExtensions -{ - private static string SupportedDbs() - => string.Join(", ", Enum.GetValues() - .Where(db => db > DatabaseProvider.SUPPORTED && db < DatabaseProvider.NOT_SUPPORTED) - .OrderBy(db => db) - .Select(db => db.ToString())); - - public static void UseDatabaseConfig(this DbContextOptionsBuilder options, DatabaseConfig config) - { - var providerName = Enum.GetNames() - .FirstOrDefault(name => name.Equals(config.Provider, StringComparison.InvariantCultureIgnoreCase)); - if (!Enum.TryParse(providerName, out DatabaseProvider provider)) - { - throw new InvalidOperationException($"Unsupported database provider: {config.Provider} -- Supported providers are: {SupportedDbs()}"); - } - - switch (provider) - { - case DatabaseProvider.Sqlite: - var match = SQLiteRegex().Match(config.ConnectionString ?? string.Empty); - if (match.Success) - { - string? folder = null; - string path = match.Groups[1].Value.Replace("\\", "/"); - folder = path.Contains('/') ? path[..path.IndexOf('/')] : path; - Directory.CreateDirectory(folder); - } - options.UseSqlite(config.ConnectionString); - break; - case DatabaseProvider.InMemory: - options.UseInMemoryDatabase(config.ConnectionString); - break; - case DatabaseProvider.PostgreSQL or DatabaseProvider.CockroachDB: - options.UseNpgsql(config.ConnectionString); - break; - case DatabaseProvider.SQLServer: - options.UseSqlServer(config.ConnectionString); - break; - case DatabaseProvider.MySQL or DatabaseProvider.MariaDB: - options.UseMySql(config.ConnectionString, ServerVersion.AutoDetect(config.ConnectionString)); - break; - default: - throw new InvalidOperationException($"Unsupported database provider: {config.Provider}"); - } - } - - [GeneratedRegex(@"Data Source=([^;]+)")] - private static partial Regex SQLiteRegex(); -} diff --git a/back/ServicesExtensions/Options.cs b/back/ServicesExtensions/Options.cs deleted file mode 100644 index 686ebd1..0000000 --- a/back/ServicesExtensions/Options.cs +++ /dev/null @@ -1,76 +0,0 @@ -using back.healthchecks.Options; -using back.Options; - -namespace back.ServicesExtensions; - -public static partial class ServicesExtensions -{ - private static IConfiguration ConfigureOptions(this IServiceCollection services) - { - IConfiguration config = services.BuildServiceProvider().GetRequiredService(); - string? baseDirectory = null; - - services.Configure(config.GetSection(nameof(Databases))); - services.Configure(DatabaseConfig.DataStorage, config.GetSection(DatabaseConfig.DataStorage)); - services.Configure(DatabaseConfig.BlobStorage, config.GetSection(DatabaseConfig.BlobStorage)); - services.Configure(config.GetSection(nameof(MailServerOptions))); - - services.Configure(HealthChecksConfigs.Sqlite, config.GetSection(HealthChecksConfigs.Sqlite)); - - services.PostConfigure(databases => - { - if (!string.IsNullOrEmpty(databases.BaseDirectory) && !Directory.Exists(databases.BaseDirectory)) - { - try - { - Directory.CreateDirectory(databases.BaseDirectory); - Console.WriteLine($"Base directory created at: {databases.BaseDirectory}"); - baseDirectory = databases.BaseDirectory; - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Failed to create base directory at {databases.BaseDirectory}. " + - "Please ensure the path is valid and accessible.", ex - ); - } - } - }); - - services.PostConfigure(DatabaseConfig.DataStorage, config => - { - PostConfigureDatabaseConfig(config, baseDirectory); - }); - - services.PostConfigure(DatabaseConfig.BlobStorage, config => - { - PostConfigureDatabaseConfig(config, baseDirectory); - }); - - return config; - } - - private static void PostConfigureDatabaseConfig(DatabaseConfig config, string? baseDirectory) - { - if (!string.IsNullOrEmpty(config.SystemContainer)) - { - var path = config.SystemContainer; - if (!string.IsNullOrEmpty(baseDirectory)) - { - path = Path.Combine(baseDirectory, path); - } - try - { - Directory.CreateDirectory(path); - Console.WriteLine($"System container for {config.Provider} created at: {path}"); - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Failed to create system container at {path}. " + - "Please ensure the path is valid and accessible.", ex - ); - } - } - } -} diff --git a/back/ServicesExtensions/ServicesExtensions.cs b/back/ServicesExtensions/ServicesExtensions.cs deleted file mode 100644 index a797685..0000000 --- a/back/ServicesExtensions/ServicesExtensions.cs +++ /dev/null @@ -1,49 +0,0 @@ -using back.persistance.data; -using System.Text.Json.Serialization; -using back.services.engine.SystemUser; -using DependencyInjector; -using System.Text.Json; -using MCVIngenieros.Transactional.Abstractions.Interfaces; -using MCVIngenieros.Transactional.Implementations.EntityFramework; - -namespace back.ServicesExtensions; - -public static partial class ServicesExtensions -{ - public static IServiceCollection UseExtensions(this IServiceCollection services) - { - //var config = - services.ConfigureOptions(); - - services.AddMemoryCache(); - - services.AddDatabaseContext(); - services.AddServices(); - - services.AddScoped, EntityFrameworkTransactionalService>(); - - services.AddSingleton(new JsonSerializerOptions { - Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - AllowTrailingCommas = true, - PropertyNameCaseInsensitive = true, - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - WriteIndented = true, - Converters = { - new JsonStringEnumConverter(JsonNamingPolicy.CamelCase), - }, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - DictionaryKeyPolicy = JsonNamingPolicy.CamelCase, - NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString, - ReadCommentHandling = JsonCommentHandling.Skip, - UnmappedMemberHandling = JsonUnmappedMemberHandling.Skip, - UnknownTypeHandling = JsonUnknownTypeHandling.JsonElement, - }); - - using var scope = services.BuildServiceProvider().CreateScope(); - scope.ServiceProvider - .GetRequiredService().GenerateAsync().Wait(); - - - return services; - } -} diff --git a/back/appsettings.Development.json b/back/appsettings.Development.json deleted file mode 100644 index 8f113a3..0000000 --- a/back/appsettings.Development.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "Databases": { - "BaseDirectory": ".program_data", - "Data": { - "Provider": "sqlite", - "ConnectionString": "Data Source=.program_data/app.db" - }, - "Blob": { - "Provider": "system", - "baseUrl": "https://localhost:7273/api/photo/{id}/{res}", - "SystemContainer": "imgs" - } - }, - "MailServerOptions": { - "SmtpServer": "smtp.gmail.com", - "Puerto": 587, - "Usuario": "", - "Password": "", - "EnableSsl": true - }, - "HealthChecksConfigs": { - "CacheDuration": "00:30:00", - "Timeout": "00:00:05", - "AssembliesToScan": [ - "back" - ], - "Sqlite": { - "RetryAttempts": 2, - "Timeout": "00:05:00", - "RetryDelay": "00:00:10", - "Severity": "Info" - } - } -} diff --git a/back/appsettings.Production.json b/back/appsettings.Production.json deleted file mode 100644 index 0bc2373..0000000 --- a/back/appsettings.Production.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "Databases": { - "Data": { - "Provider": "sqlite", - "ConnectionString": "Data Source=data/app.db;Cache=Shared" - }, - "Blob": { - "Provider": "system", - "baseUrl": "https://back.mmorales.photo/api/photo/{id}/{res}" - } - } -} diff --git a/back/appsettings.json b/back/appsettings.json deleted file mode 100644 index 10f68b8..0000000 --- a/back/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} diff --git a/back/back.csproj b/back/back.csproj deleted file mode 100644 index 5c70458..0000000 --- a/back/back.csproj +++ /dev/null @@ -1,54 +0,0 @@ - - - - net9.0 - enable - enable - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - - diff --git a/back/back.sln b/back/back.sln deleted file mode 100644 index 8823921..0000000 --- a/back/back.sln +++ /dev/null @@ -1,43 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.14.36401.2 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "back", "back.csproj", "{392278F3-4B36-47F4-AD31-5FBFCC181AD4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MCVIngenieros.Transactional", "..\..\nuget\Transactional\MCVIngenieros.Transactional.csproj", "{ED76105A-5E6F-4997-86FE-6A7902A2AEBA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DependencyInjector", "..\..\nuget\DependencyInjector\DependencyInjector.csproj", "{DBDF84A4-235C-4F29-8626-5BD1DC255970}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Presentation", "..\backend\Presentation\Presentation.csproj", "{F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {392278F3-4B36-47F4-AD31-5FBFCC181AD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {392278F3-4B36-47F4-AD31-5FBFCC181AD4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {392278F3-4B36-47F4-AD31-5FBFCC181AD4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {392278F3-4B36-47F4-AD31-5FBFCC181AD4}.Release|Any CPU.Build.0 = Release|Any CPU - {ED76105A-5E6F-4997-86FE-6A7902A2AEBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ED76105A-5E6F-4997-86FE-6A7902A2AEBA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ED76105A-5E6F-4997-86FE-6A7902A2AEBA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ED76105A-5E6F-4997-86FE-6A7902A2AEBA}.Release|Any CPU.Build.0 = Release|Any CPU - {DBDF84A4-235C-4F29-8626-5BD1DC255970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DBDF84A4-235C-4F29-8626-5BD1DC255970}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DBDF84A4-235C-4F29-8626-5BD1DC255970}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DBDF84A4-235C-4F29-8626-5BD1DC255970}.Release|Any CPU.Build.0 = Release|Any CPU - {F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F1DD9D2A-0467-41EE-B3BB-303F1A0C18D6}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {F531A9C8-70D1-45AA-B4AA-AC49FCADAE3D} - EndGlobalSection -EndGlobal diff --git a/back/controllers/AuthController.cs b/back/controllers/AuthController.cs deleted file mode 100644 index 6f761d5..0000000 --- a/back/controllers/AuthController.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace back.controllers; - -public class ValidationErrors -{ - public string? Field { get; set; } - public string? Message { get; set; } -} - -public class ExecutionErrors -{ - public Exception? Exception { get; set; } - public string? Message { get; set; } -} - -public abstract class ResponseBase -{ - public object? Data { get; set; } - public string? Message { get; set; } - public bool Success { get; set; } - public int StatusCode { get; set; } - public ValidationErrors[] ValidationErrors { get; set; } - public ExecutionErrors[] ExecutionErrors { get; set; } -} - -public record LoginRequest(string Username, string Password); - -[ApiController, Route("api/[controller]")] -public class AuthController(IAuthService authService) : ControllerBase -{ - - private readonly IAuthService _authService = authService; - - [HttpPost, Route("login")] - public async Task Login([FromBody] LoginRequest loginRequest) - { - // validar que el usuario y la contraseña sean correctos - // obtener el token JWT encriptado - // obtener el refresh token - // devolver el token JWT y el refresh token en los headers de las respuestas - // devolver datos del usuario en el body de la respuesta - } -} diff --git a/back/controllers/CryptoController.cs b/back/controllers/CryptoController.cs deleted file mode 100644 index 90da9c6..0000000 --- a/back/controllers/CryptoController.cs +++ /dev/null @@ -1,21 +0,0 @@ -using back.services.engine.Crypto; -using Microsoft.AspNetCore.Mvc; -using System.Net; - -namespace back.controllers; - -[ApiController, Route("api/[controller]")] -public class CryptoController(ICryptoService cryptoService) : ControllerBase -{ - [HttpGet("[action]")] public async Task RSA([FromHeader(Name = "X-client-thumbprint")] string clientId) - { - if (string.IsNullOrWhiteSpace(clientId)) - { - return BadRequest("Client ID is required."); - } - var key = cryptoService.GetPublicCertificate(clientId); - if (key == null) - return StatusCode((int)HttpStatusCode.InternalServerError, "Failed to generate RSA keys."); - return Ok(new { PublicKey = key }); - } -} diff --git a/back/controllers/PhotosController.cs b/back/controllers/PhotosController.cs deleted file mode 100644 index 3be5755..0000000 --- a/back/controllers/PhotosController.cs +++ /dev/null @@ -1,67 +0,0 @@ -using back.DataModels; -using back.DTO; -using back.services.bussines.PhotoService; -using Microsoft.AspNetCore.Mvc; - -namespace back.controllers; - -[Route("api/[controller]")] -[ApiController] -public class PhotosController(IPhotoService photoService) : ControllerBase -{ - private readonly IPhotoService _photoService = photoService; - - // GET: api/ - [HttpGet] - public async Task>> Get([FromQuery] int page = 1, [FromQuery] int pageSize = 20) - { - (int totalItems, IEnumerable? pageData) = await _photoService.GetPage(page, pageSize); - Response.Headers.Append("X-Total-Count", totalItems.ToString()); - return Ok(pageData); - } - - // GET api//5 - [HttpGet("{id}/{res}")] - public async Task Get(string id, string res) - { - (string? mediaType, byte[]? fileBytes) = await _photoService.GetBytes(id, res.ToLower()); - if(fileBytes == null) - return NotFound(); - return File(fileBytes, mediaType ?? "image/jpeg"); - } - - // POST api/ - [HttpPost] - public async Task Post([FromForm] PhotoFormModel form) - { - try - { - if (form.Image == null || form.Image.Length == 0) - return BadRequest("No image uploaded."); - - await _photoService.Create(form); - - return Created(); - } - catch - { - return BadRequest(); - } - } - - //// PUT api/ - [HttpPut] - public async Task Put([FromBody] Photo photo) - { - await _photoService.Update(photo); - return NoContent(); - } - - // DELETE api//5 - [HttpDelete("{id}")] - public async Task Delete(string id) - { - await _photoService.Delete(id); - return NoContent(); - } -} diff --git a/back/controllers/UsersController.cs b/back/controllers/UsersController.cs deleted file mode 100644 index b35d60a..0000000 --- a/back/controllers/UsersController.cs +++ /dev/null @@ -1,90 +0,0 @@ -using back.DataModels; -using back.services.bussines; -using back.services.bussines.UserService; -using Microsoft.AspNetCore.Mvc; - -namespace back.controllers; - -public record UserLoginFromModel(string Email, string Password, string? SystemKey); -public record ForgotPasswordFromModel(string Email); -public record RegisterFromModel(string Name, string Email, string Password); - -[ApiController, Route("api/[controller]")] -public class UsersController(IUserService user) : ControllerBase -{ - private readonly IUserService _user = user; - // GET: api/ - //[HttpGet] - //public async Task>> Get([FromQuery] int page = 1, [FromQuery] int pageSize = 20) - //{ - // var users = await _userContext.GetPage(page, pageSize); - // var totalItems = await _userContext.GetTotalItems(); - // Response.Headers.Append("X-Total-Count", totalItems.ToString()); - // return Ok(users); - //} - //// GET api//5 - //[HttpGet("{id}")] - //public async Task Get(Guid id) - //{ - // var user = await _userContext.GetById(id); - // if (user == null) - // return NotFound(); - // return Ok(user); - //} - - [HttpPost("[action]")] - public async Task Login( - [FromHeader(Name = "X-client-thumbprint")] string clientId, - [FromBody] UserLoginFromModel user - ) - { - if (string.IsNullOrEmpty(clientId)) - return BadRequest("Client ID cannot be null or empty"); - - if (user == null || string.IsNullOrEmpty(user.Email) || string.IsNullOrEmpty(user.Password)) - return BadRequest(Errors.BadRequest.Description); - - if (user.Email.Equals(DataModels.User.SystemUser.Email, StringComparison.InvariantCultureIgnoreCase)) - { - if (string.IsNullOrEmpty(user.SystemKey)) - return Unauthorized(Errors.Unauthorized.Description); - var systemUser = await _user.ValidateSystemUser(user.Email, user.Password, user.SystemKey, clientId); - if (systemUser == null) - return Unauthorized(Errors.Unauthorized.Description); - return Ok(systemUser.ToDto()); - } - - var existingUser = await _user.Login(user.Email, user.Password, clientId); - if (existingUser == null) - return Unauthorized(Errors.Unauthorized.Description); - return Ok(existingUser); - } - - [HttpPost("forgot-password")] - public async Task ForgotPassword([FromBody] ForgotPasswordFromModel user) - { - if (string.IsNullOrEmpty(user.Email)) - return BadRequest("Email cannot be null or empty"); - await _user.SendResetPassword(user.Email); - return Ok("If the email exists, a reset password link has been sent."); - } - - // POST api/ - [HttpPost("[action]")] - public async Task Register( - [FromHeader(Name = "X-client-thumbprint")] string clientId, - [FromBody] RegisterFromModel user) - { - if (user == null) - return BadRequest("User cannot be null"); - try - { - var createdUser = await _user.Create(clientId, new User() { Email = user.Email, Password = user.Password }); - return Created(); - } - catch (Exception ex) - { - return BadRequest(ex); - } - } -} diff --git a/back/healthchecks/options/HealthChecksConfigs.cs b/back/healthchecks/options/HealthChecksConfigs.cs deleted file mode 100644 index 88fa79b..0000000 --- a/back/healthchecks/options/HealthChecksConfigs.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace back.healthchecks.Options; - -public partial class HealthChecksConfigs : MCVIngenieros.Healthchecks.Options.HealthChecksConfigs -{ - public const string Sqlite = "Sqlite"; -} diff --git a/back/healthchecks/sqlite.cs b/back/healthchecks/sqlite.cs deleted file mode 100644 index f825a40..0000000 --- a/back/healthchecks/sqlite.cs +++ /dev/null @@ -1,52 +0,0 @@ -using back.healthchecks.Options; -using back.Options; -using MCVIngenieros.Healthchecks; -using MCVIngenieros.Healthchecks.Abstracts; -using Microsoft.Extensions.Options; - -namespace back.healthchecks; - -public class SqliteHealthCheck(IOptionsMonitor databaseConfig, IOptionsMonitor healthchecksConfig) : HealthCheck -{ - private readonly DatabaseConfig databaseConfig = databaseConfig.Get(DatabaseConfig.DataStorage); - private readonly HealthChecksConfigs hcConfig = healthchecksConfig.Get(HealthChecksConfigs.Sqlite); - - public string Description => "Conecta con la base de datos SQLite y trata de hacer una consulta sobre la tabla Users."; - public int? RetryAttempts => hcConfig.RetryAttempts ?? 2; - public TimeSpan? Timeout => hcConfig.Timeout ?? TimeSpan.FromSeconds(5); - public TimeSpan? RetryDelay => hcConfig.RetryDelay ?? TimeSpan.FromSeconds(1); - public HealthCheckSeverity? Severity => hcConfig.Severity ?? HealthCheckSeverity.Critical; - - public override Task CheckAsync(CancellationToken cancellationToken = default) - { - var isHealthy = false; - var details = string.Empty; - try - { - using var connection = new Microsoft.Data.Sqlite.SqliteConnection(databaseConfig.ConnectionString); - connection.Open(); - using var command = connection.CreateCommand(); - command.CommandText = $"SELECT COUNT(1) FROM Users WHERE Id = '{DataModels.User.SystemUserId}';"; - var result = command.ExecuteScalar(); - if (result != null && Convert.ToInt32(result) == 1) - { - isHealthy = true; - details = "Connection to SQLite database successful and SystemUser exists."; - } - else - { - details = "Connection to SQLite database successful but SystemUser does not exist."; - } - } - catch (Exception ex) - { - details = $"Failed to connect to SQLite database: {ex.Message}"; - } - - return Task.FromResult(new HealthCheckResult(isHealthy) - { - Details = details, - Severity = isHealthy ? HealthCheckSeverity.Info : HealthCheckSeverity.Critical - }); - } -} diff --git a/back/persistance/blob/FileSystemImageStorageService.cs b/back/persistance/blob/FileSystemImageStorageService.cs deleted file mode 100644 index ea482a6..0000000 --- a/back/persistance/blob/FileSystemImageStorageService.cs +++ /dev/null @@ -1,111 +0,0 @@ -using back.Options; -using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.Options; - -namespace back.persistance.blob; - -public class FileSystemImageStorageService( - IOptions systemOptions, - IOptionsMonitor options, - IMemoryCache memoryCache - ) : IBlobStorageService -{ - private readonly string RootPath = systemOptions.Value.BaseDirectory ?? "data"; - private readonly DatabaseConfig config = options.Get(DatabaseConfig.BlobStorage); - private readonly IMemoryCache cache = memoryCache; - - private string GetFullPath(string fileName) - { - // Ensure the directory exists - var path = Path.Join(RootPath, config.SystemContainer, fileName); - var directory = Path.GetDirectoryName(path); - if (directory != null && !Directory.Exists(directory)) - { - Directory.CreateDirectory(directory); - } - return path; - } - - public async Task Delete(string fileName) - { - try - { - var path = GetFullPath(fileName); - if (cache.TryGetValue(path, out Stream? cachedStream)) - { - cachedStream?.Dispose(); // Dispose the cached stream if it exists - cache.Remove(path); // Remove from cache - } - if (File.Exists(path)) - { - File.Delete(path); - } - } - catch (Exception ex) - { - throw new InvalidOperationException($"Error deleting file {fileName}: {ex.Message}", ex); - } - } - - public async Task GetStream(string fileName) - { - var path = GetFullPath(fileName); - if (File.Exists(path)) - { - if (cache.TryGetValue(path, out Stream? cachedStream)) - { - return cachedStream; - } - // open the file stream for multiple reads and cache it for performance - var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); - - cache.CreateEntry(path) - .SetValue(fileStream) - .SetSlidingExpiration(TimeSpan.FromMinutes(30)); // Cache for 30 minutes - - return fileStream; - } - return null; - } - - public async Task GetBytes(string fileName) - { - var stream = await GetStream(fileName); - if (stream != null) - { - using var memoryStream = new MemoryStream(); - await stream.CopyToAsync(memoryStream); - return memoryStream.ToArray(); - } - return null; - } - - public async Task Save(Stream blobStream, string fileName) - { - var path = GetFullPath(fileName); - if (cache.TryGetValue(path, out Stream? _) || File.Exists(path)) - { - throw new InvalidOperationException($"File {fileName} already exists. Use Update for updating file info."); - } - using var fileStream = new FileStream(path, options: new FileStreamOptions { - Access = FileAccess.Write, - BufferSize = 4096, - Mode = FileMode.OpenOrCreate, - Share = FileShare.Read, - }); - blobStream.Seek(0, SeekOrigin.Begin); - await blobStream.CopyToAsync(fileStream); - blobStream.Seek(0, SeekOrigin.Begin); - } - - public async Task Update(Stream blobStream, string fileName) - { - var path = GetFullPath(fileName); - if (File.Exists(path)) - { - await Delete(fileName); - } - await Save(blobStream, fileName); - } -} - diff --git a/back/persistance/blob/IBlobStorageService.cs b/back/persistance/blob/IBlobStorageService.cs deleted file mode 100644 index d9138af..0000000 --- a/back/persistance/blob/IBlobStorageService.cs +++ /dev/null @@ -1,13 +0,0 @@ -using DependencyInjector.Abstractions.Lifetimes; - -namespace back.persistance.blob; - -public interface IBlobStorageService : ISingleton -{ - Task Save(Stream blobStream, string fileName); - Task GetStream(string fileName); - Task GetBytes(string fileName); - Task Delete(string fileName); - Task Update(Stream blobStream, string fileName); -} - diff --git a/back/persistance/data/DataContext.cs b/back/persistance/data/DataContext.cs deleted file mode 100644 index 7dc197e..0000000 --- a/back/persistance/data/DataContext.cs +++ /dev/null @@ -1,56 +0,0 @@ -using back.DataModels; -using back.persistance.data.relations; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data; - -public partial class DataContext : DbContext -{ - public DataContext() { } - public DataContext(DbContextOptions options) : base(options) { } - - public virtual DbSet EfmigrationsLocks { get; set; } - - public virtual DbSet Events { get; set; } - - public virtual DbSet Galleries { get; set; } - - public virtual DbSet Permissions { get; set; } - - public virtual DbSet Persons { get; set; } - - public virtual DbSet Photos { get; set; } - - public virtual DbSet Rankings { get; set; } - - public virtual DbSet Roles { get; set; } - - public virtual DbSet SocialMedia { get; set; } - - public virtual DbSet Tags { get; set; } - - public virtual DbSet Users { get; set; } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.ToTable("__EFMigrationsLock"); - - entity.Property(e => e.Id).ValueGeneratedNever(); - }); - - typeof(IRelationEstablisher).Assembly.GetExportedTypes() - .Where(t => typeof(IRelationEstablisher).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract) - .ToList() - .ForEach(seederType => - { - var relationEstablisher = (IRelationEstablisher?)Activator.CreateInstance(seederType); - relationEstablisher?.EstablishRelation(modelBuilder); - }); - - OnModelCreatingPartial(modelBuilder); - } - - partial void OnModelCreatingPartial(ModelBuilder modelBuilder); -} diff --git a/back/persistance/data/migrations/20250824120656_InitialSetup.Designer.cs b/back/persistance/data/migrations/20250824120656_InitialSetup.Designer.cs deleted file mode 100644 index 6b5d8ce..0000000 --- a/back/persistance/data/migrations/20250824120656_InitialSetup.Designer.cs +++ /dev/null @@ -1,752 +0,0 @@ -// -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using back.persistance.data; - -#nullable disable - -namespace back.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20250824120656_InitialSetup")] - partial class InitialSetup - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "9.0.8"); - - modelBuilder.Entity("EventTag", b => - { - b.Property("EventId") - .HasColumnType("TEXT"); - - b.Property("TagId") - .HasColumnType("TEXT"); - - b.HasKey("EventId", "TagId"); - - b.HasIndex("TagId"); - - b.ToTable("EventTags", (string)null); - }); - - modelBuilder.Entity("GalleryPhoto", b => - { - b.Property("GalleryId") - .HasColumnType("TEXT"); - - b.Property("PhotoId") - .HasColumnType("TEXT"); - - b.HasKey("GalleryId", "PhotoId"); - - b.HasIndex("PhotoId"); - - b.ToTable("GalleryPhotos", (string)null); - }); - - modelBuilder.Entity("GalleryTag", b => - { - b.Property("GalleryId") - .HasColumnType("TEXT"); - - b.Property("TagId") - .HasColumnType("TEXT"); - - b.HasKey("GalleryId", "TagId"); - - b.HasIndex("TagId"); - - b.ToTable("GalleryTags", (string)null); - }); - - modelBuilder.Entity("GalleryUserViewer", b => - { - b.Property("GalleryId") - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("GalleryId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("GalleryUserViewers", (string)null); - }); - - modelBuilder.Entity("PhotoPerson", b => - { - b.Property("PhotoId") - .HasColumnType("TEXT"); - - b.Property("PersonId") - .HasColumnType("TEXT"); - - b.HasKey("PhotoId", "PersonId"); - - b.HasIndex("PersonId"); - - b.ToTable("PhotoPersons", (string)null); - }); - - modelBuilder.Entity("PhotoTag", b => - { - b.Property("PhotoId") - .HasColumnType("TEXT"); - - b.Property("TagId") - .HasColumnType("TEXT"); - - b.HasKey("PhotoId", "TagId"); - - b.HasIndex("TagId"); - - b.ToTable("PhotoTags", (string)null); - }); - - modelBuilder.Entity("PhotoUserBuyer", b => - { - b.Property("PhotoId") - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("PhotoId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("PhotoUserBuyers", (string)null); - }); - - modelBuilder.Entity("RolePermission", b => - { - b.Property("RoleId") - .HasColumnType("TEXT"); - - b.Property("PermissionId") - .HasColumnType("TEXT"); - - b.HasKey("RoleId", "PermissionId"); - - b.HasIndex("PermissionId"); - - b.ToTable("RolePermissions", (string)null); - }); - - modelBuilder.Entity("UserRole", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("UserRoles", (string)null); - }); - - modelBuilder.Entity("back.DataModels.EfmigrationsLock", b => - { - b.Property("Id") - .HasColumnType("INTEGER"); - - b.Property("Timestamp") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("__EFMigrationsLock", (string)null); - }); - - modelBuilder.Entity("back.DataModels.Event", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .HasColumnType("TEXT"); - - b.Property("Date") - .HasColumnType("TEXT"); - - b.Property("DeletedAt") - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("IsDeleted") - .HasColumnType("INTEGER"); - - b.Property("Location") - .HasColumnType("TEXT"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("UpdatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UpdatedBy") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("Events"); - }); - - modelBuilder.Entity("back.DataModels.Gallery", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DeletedAt") - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("EventId") - .HasColumnType("TEXT"); - - b.Property("IsArchived") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0); - - b.Property("IsDeleted") - .HasColumnType("INTEGER"); - - b.Property("IsFavorite") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0); - - b.Property("IsPublic") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1); - - b.Property("Title") - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("UpdatedAt") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CreatedBy"); - - b.HasIndex("EventId"); - - b.ToTable("Galleries"); - }); - - modelBuilder.Entity("back.DataModels.Permission", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(255) - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("Permissions"); - }); - - modelBuilder.Entity("back.DataModels.Person", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Avatar") - .HasColumnType("TEXT"); - - b.Property("Bio") - .HasMaxLength(250) - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DeletedAt") - .HasColumnType("TEXT"); - - b.Property("IsDeleted") - .HasColumnType("INTEGER"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("ProfilePicture") - .HasColumnType("TEXT"); - - b.Property("SocialMediaId") - .HasColumnType("TEXT"); - - b.Property("UpdatedAt") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("SocialMediaId"); - - b.ToTable("Persons"); - }); - - modelBuilder.Entity("back.DataModels.Photo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("EventId") - .HasColumnType("TEXT"); - - b.Property("Extension") - .HasColumnType("TEXT"); - - b.Property("HighResUrl") - .HasColumnType("TEXT"); - - b.Property("IsArchived") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0); - - b.Property("IsFavorite") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0); - - b.Property("IsPublic") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1); - - b.Property("LowResUrl") - .HasColumnType("TEXT"); - - b.Property("MidResUrl") - .HasColumnType("TEXT"); - - b.Property("RankingId") - .HasColumnType("TEXT"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("UpdatedAt") - .HasColumnType("TEXT"); - - b.Property("UpdatedBy") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CreatedBy"); - - b.HasIndex("EventId"); - - b.ToTable("Photos"); - }); - - modelBuilder.Entity("back.DataModels.Ranking", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("DownVotes") - .HasColumnType("INTEGER"); - - b.Property("TotalVotes") - .HasColumnType("INTEGER"); - - b.Property("UpVotes") - .HasColumnType("INTEGER"); - - b.HasKey("Id"); - - b.ToTable("Rankings"); - }); - - modelBuilder.Entity("back.DataModels.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("BaseRoleModelId") - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(250) - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("BaseRoleModelId"); - - b.ToTable("Roles"); - }); - - modelBuilder.Entity("back.DataModels.SocialMedia", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("BlueSky") - .HasColumnType("TEXT"); - - b.Property("Discord") - .HasColumnType("TEXT"); - - b.Property("Facebook") - .HasColumnType("TEXT"); - - b.Property("Instagram") - .HasColumnType("TEXT"); - - b.Property("Linkedin") - .HasColumnType("TEXT"); - - b.Property("Other") - .HasColumnType("TEXT"); - - b.Property("Pinterest") - .HasColumnType("TEXT"); - - b.Property("Reddit") - .HasColumnType("TEXT"); - - b.Property("Tiktok") - .HasColumnType("TEXT"); - - b.Property("Twitter") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("SocialMedia"); - }); - - modelBuilder.Entity("back.DataModels.Tag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(25) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex(new[] { "Name" }, "IX_Tags_Name") - .IsUnique(); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("back.DataModels.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Password") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Salt") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("EventTag", b => - { - b.HasOne("back.DataModels.Event", null) - .WithMany() - .HasForeignKey("EventId") - .IsRequired(); - - b.HasOne("back.DataModels.Tag", null) - .WithMany() - .HasForeignKey("TagId") - .IsRequired(); - }); - - modelBuilder.Entity("GalleryPhoto", b => - { - b.HasOne("back.DataModels.Gallery", null) - .WithMany() - .HasForeignKey("GalleryId") - .IsRequired(); - - b.HasOne("back.DataModels.Photo", null) - .WithMany() - .HasForeignKey("PhotoId") - .IsRequired(); - }); - - modelBuilder.Entity("GalleryTag", b => - { - b.HasOne("back.DataModels.Gallery", null) - .WithMany() - .HasForeignKey("GalleryId") - .IsRequired(); - - b.HasOne("back.DataModels.Tag", null) - .WithMany() - .HasForeignKey("TagId") - .IsRequired(); - }); - - modelBuilder.Entity("GalleryUserViewer", b => - { - b.HasOne("back.DataModels.Gallery", null) - .WithMany() - .HasForeignKey("GalleryId") - .IsRequired(); - - b.HasOne("back.DataModels.User", null) - .WithMany() - .HasForeignKey("UserId") - .IsRequired(); - }); - - modelBuilder.Entity("PhotoPerson", b => - { - b.HasOne("back.DataModels.Person", null) - .WithMany() - .HasForeignKey("PersonId") - .IsRequired(); - - b.HasOne("back.DataModels.Photo", null) - .WithMany() - .HasForeignKey("PhotoId") - .IsRequired(); - }); - - modelBuilder.Entity("PhotoTag", b => - { - b.HasOne("back.DataModels.Photo", null) - .WithMany() - .HasForeignKey("PhotoId") - .IsRequired(); - - b.HasOne("back.DataModels.Tag", null) - .WithMany() - .HasForeignKey("TagId") - .IsRequired(); - }); - - modelBuilder.Entity("PhotoUserBuyer", b => - { - b.HasOne("back.DataModels.Photo", null) - .WithMany() - .HasForeignKey("PhotoId") - .IsRequired(); - - b.HasOne("back.DataModels.User", null) - .WithMany() - .HasForeignKey("UserId") - .IsRequired(); - }); - - modelBuilder.Entity("RolePermission", b => - { - b.HasOne("back.DataModels.Permission", null) - .WithMany() - .HasForeignKey("PermissionId") - .IsRequired(); - - b.HasOne("back.DataModels.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .IsRequired(); - }); - - modelBuilder.Entity("UserRole", b => - { - b.HasOne("back.DataModels.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .IsRequired(); - - b.HasOne("back.DataModels.User", null) - .WithMany() - .HasForeignKey("UserId") - .IsRequired(); - }); - - modelBuilder.Entity("back.DataModels.Gallery", b => - { - b.HasOne("back.DataModels.User", "CreatedByNavigation") - .WithMany("Galleries") - .HasForeignKey("CreatedBy") - .IsRequired(); - - b.HasOne("back.DataModels.Event", "Event") - .WithMany("Galleries") - .HasForeignKey("EventId"); - - b.Navigation("CreatedByNavigation"); - - b.Navigation("Event"); - }); - - modelBuilder.Entity("back.DataModels.Person", b => - { - b.HasOne("back.DataModels.SocialMedia", "SocialMedia") - .WithMany("People") - .HasForeignKey("SocialMediaId"); - - b.Navigation("SocialMedia"); - }); - - modelBuilder.Entity("back.DataModels.Photo", b => - { - b.HasOne("back.DataModels.Person", "CreatedByNavigation") - .WithMany("Photos") - .HasForeignKey("CreatedBy") - .IsRequired(); - - b.HasOne("back.DataModels.Event", "Event") - .WithMany("Photos") - .HasForeignKey("EventId"); - - b.Navigation("CreatedByNavigation"); - - b.Navigation("Event"); - }); - - modelBuilder.Entity("back.DataModels.Role", b => - { - b.HasOne("back.DataModels.Role", "BaseRoleModel") - .WithMany("InverseBaseRoleModel") - .HasForeignKey("BaseRoleModelId"); - - b.Navigation("BaseRoleModel"); - }); - - modelBuilder.Entity("back.DataModels.User", b => - { - b.HasOne("back.DataModels.Person", "IdNavigation") - .WithOne("User") - .HasForeignKey("back.DataModels.User", "Id") - .IsRequired(); - - b.Navigation("IdNavigation"); - }); - - modelBuilder.Entity("back.DataModels.Event", b => - { - b.Navigation("Galleries"); - - b.Navigation("Photos"); - }); - - modelBuilder.Entity("back.DataModels.Person", b => - { - b.Navigation("Photos"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("back.DataModels.Role", b => - { - b.Navigation("InverseBaseRoleModel"); - }); - - modelBuilder.Entity("back.DataModels.SocialMedia", b => - { - b.Navigation("People"); - }); - - modelBuilder.Entity("back.DataModels.User", b => - { - b.Navigation("Galleries"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/back/persistance/data/migrations/20250824120656_InitialSetup.cs b/back/persistance/data/migrations/20250824120656_InitialSetup.cs deleted file mode 100644 index 2c9b59c..0000000 --- a/back/persistance/data/migrations/20250824120656_InitialSetup.cs +++ /dev/null @@ -1,583 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace back.Migrations -{ - /// - public partial class InitialSetup : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "__EFMigrationsLock", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false), - Timestamp = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK___EFMigrationsLock", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Events", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Title = table.Column(type: "TEXT", maxLength: 50, nullable: false), - Description = table.Column(type: "TEXT", maxLength: 500, nullable: true), - Date = table.Column(type: "TEXT", nullable: true), - Location = table.Column(type: "TEXT", nullable: true), - CreatedAt = table.Column(type: "TEXT", nullable: false), - UpdatedAt = table.Column(type: "TEXT", nullable: false), - CreatedBy = table.Column(type: "TEXT", nullable: true), - UpdatedBy = table.Column(type: "TEXT", nullable: true), - IsDeleted = table.Column(type: "INTEGER", nullable: false), - DeletedAt = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Events", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Permissions", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", maxLength: 100, nullable: false), - Description = table.Column(type: "TEXT", maxLength: 255, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Permissions", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Rankings", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - TotalVotes = table.Column(type: "INTEGER", nullable: false), - UpVotes = table.Column(type: "INTEGER", nullable: false), - DownVotes = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Rankings", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Roles", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", maxLength: 100, nullable: false), - Description = table.Column(type: "TEXT", maxLength: 250, nullable: true), - BaseRoleModelId = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Roles", x => x.Id); - table.ForeignKey( - name: "FK_Roles_Roles_BaseRoleModelId", - column: x => x.BaseRoleModelId, - principalTable: "Roles", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "SocialMedia", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Facebook = table.Column(type: "TEXT", nullable: true), - Instagram = table.Column(type: "TEXT", nullable: true), - Twitter = table.Column(type: "TEXT", nullable: true), - BlueSky = table.Column(type: "TEXT", nullable: true), - Tiktok = table.Column(type: "TEXT", nullable: true), - Linkedin = table.Column(type: "TEXT", nullable: true), - Pinterest = table.Column(type: "TEXT", nullable: true), - Discord = table.Column(type: "TEXT", nullable: true), - Reddit = table.Column(type: "TEXT", nullable: true), - Other = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_SocialMedia", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Tags", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", maxLength: 25, nullable: false), - CreatedAt = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Tags", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "RolePermissions", - columns: table => new - { - RoleId = table.Column(type: "TEXT", nullable: false), - PermissionId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_RolePermissions", x => new { x.RoleId, x.PermissionId }); - table.ForeignKey( - name: "FK_RolePermissions_Permissions_PermissionId", - column: x => x.PermissionId, - principalTable: "Permissions", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_RolePermissions_Roles_RoleId", - column: x => x.RoleId, - principalTable: "Roles", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "Persons", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", maxLength: 100, nullable: false), - ProfilePicture = table.Column(type: "TEXT", nullable: true), - Avatar = table.Column(type: "TEXT", nullable: true), - SocialMediaId = table.Column(type: "TEXT", nullable: true), - Bio = table.Column(type: "TEXT", maxLength: 250, nullable: true), - CreatedAt = table.Column(type: "TEXT", nullable: false), - UpdatedAt = table.Column(type: "TEXT", nullable: true), - IsDeleted = table.Column(type: "INTEGER", nullable: false), - DeletedAt = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Persons", x => x.Id); - table.ForeignKey( - name: "FK_Persons_SocialMedia_SocialMediaId", - column: x => x.SocialMediaId, - principalTable: "SocialMedia", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "EventTags", - columns: table => new - { - EventId = table.Column(type: "TEXT", nullable: false), - TagId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_EventTags", x => new { x.EventId, x.TagId }); - table.ForeignKey( - name: "FK_EventTags_Events_EventId", - column: x => x.EventId, - principalTable: "Events", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_EventTags_Tags_TagId", - column: x => x.TagId, - principalTable: "Tags", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "Photos", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Title = table.Column(type: "TEXT", maxLength: 100, nullable: false), - Description = table.Column(type: "TEXT", maxLength: 500, nullable: true), - Extension = table.Column(type: "TEXT", nullable: true), - LowResUrl = table.Column(type: "TEXT", nullable: true), - MidResUrl = table.Column(type: "TEXT", nullable: true), - HighResUrl = table.Column(type: "TEXT", nullable: true), - CreatedAt = table.Column(type: "TEXT", nullable: true), - UpdatedAt = table.Column(type: "TEXT", nullable: true), - CreatedBy = table.Column(type: "TEXT", nullable: false), - UpdatedBy = table.Column(type: "TEXT", nullable: true), - EventId = table.Column(type: "TEXT", nullable: true), - RankingId = table.Column(type: "TEXT", nullable: true), - IsFavorite = table.Column(type: "INTEGER", nullable: true, defaultValue: 0), - IsPublic = table.Column(type: "INTEGER", nullable: true, defaultValue: 1), - IsArchived = table.Column(type: "INTEGER", nullable: true, defaultValue: 0) - }, - constraints: table => - { - table.PrimaryKey("PK_Photos", x => x.Id); - table.ForeignKey( - name: "FK_Photos_Events_EventId", - column: x => x.EventId, - principalTable: "Events", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_Photos_Persons_CreatedBy", - column: x => x.CreatedBy, - principalTable: "Persons", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "Users", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Email = table.Column(type: "TEXT", nullable: false), - Password = table.Column(type: "TEXT", nullable: false), - Salt = table.Column(type: "TEXT", nullable: false), - CreatedAt = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Users", x => x.Id); - table.ForeignKey( - name: "FK_Users_Persons_Id", - column: x => x.Id, - principalTable: "Persons", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "PhotoPersons", - columns: table => new - { - PhotoId = table.Column(type: "TEXT", nullable: false), - PersonId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_PhotoPersons", x => new { x.PhotoId, x.PersonId }); - table.ForeignKey( - name: "FK_PhotoPersons_Persons_PersonId", - column: x => x.PersonId, - principalTable: "Persons", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_PhotoPersons_Photos_PhotoId", - column: x => x.PhotoId, - principalTable: "Photos", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "PhotoTags", - columns: table => new - { - PhotoId = table.Column(type: "TEXT", nullable: false), - TagId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_PhotoTags", x => new { x.PhotoId, x.TagId }); - table.ForeignKey( - name: "FK_PhotoTags_Photos_PhotoId", - column: x => x.PhotoId, - principalTable: "Photos", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_PhotoTags_Tags_TagId", - column: x => x.TagId, - principalTable: "Tags", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "Galleries", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Title = table.Column(type: "TEXT", maxLength: 100, nullable: true), - Description = table.Column(type: "TEXT", maxLength: 500, nullable: true), - CreatedAt = table.Column(type: "TEXT", nullable: true), - UpdatedAt = table.Column(type: "TEXT", nullable: true), - CreatedBy = table.Column(type: "TEXT", nullable: false), - IsPublic = table.Column(type: "INTEGER", nullable: true, defaultValue: 1), - IsArchived = table.Column(type: "INTEGER", nullable: true, defaultValue: 0), - IsFavorite = table.Column(type: "INTEGER", nullable: true, defaultValue: 0), - IsDeleted = table.Column(type: "INTEGER", nullable: false), - DeletedAt = table.Column(type: "TEXT", nullable: true), - EventId = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Galleries", x => x.Id); - table.ForeignKey( - name: "FK_Galleries_Events_EventId", - column: x => x.EventId, - principalTable: "Events", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_Galleries_Users_CreatedBy", - column: x => x.CreatedBy, - principalTable: "Users", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "PhotoUserBuyers", - columns: table => new - { - PhotoId = table.Column(type: "TEXT", nullable: false), - UserId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_PhotoUserBuyers", x => new { x.PhotoId, x.UserId }); - table.ForeignKey( - name: "FK_PhotoUserBuyers_Photos_PhotoId", - column: x => x.PhotoId, - principalTable: "Photos", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_PhotoUserBuyers_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "UserRoles", - columns: table => new - { - UserId = table.Column(type: "TEXT", nullable: false), - RoleId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_UserRoles_Roles_RoleId", - column: x => x.RoleId, - principalTable: "Roles", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_UserRoles_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "GalleryPhotos", - columns: table => new - { - GalleryId = table.Column(type: "TEXT", nullable: false), - PhotoId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_GalleryPhotos", x => new { x.GalleryId, x.PhotoId }); - table.ForeignKey( - name: "FK_GalleryPhotos_Galleries_GalleryId", - column: x => x.GalleryId, - principalTable: "Galleries", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_GalleryPhotos_Photos_PhotoId", - column: x => x.PhotoId, - principalTable: "Photos", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "GalleryTags", - columns: table => new - { - GalleryId = table.Column(type: "TEXT", nullable: false), - TagId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_GalleryTags", x => new { x.GalleryId, x.TagId }); - table.ForeignKey( - name: "FK_GalleryTags_Galleries_GalleryId", - column: x => x.GalleryId, - principalTable: "Galleries", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_GalleryTags_Tags_TagId", - column: x => x.TagId, - principalTable: "Tags", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "GalleryUserViewers", - columns: table => new - { - GalleryId = table.Column(type: "TEXT", nullable: false), - UserId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_GalleryUserViewers", x => new { x.GalleryId, x.UserId }); - table.ForeignKey( - name: "FK_GalleryUserViewers_Galleries_GalleryId", - column: x => x.GalleryId, - principalTable: "Galleries", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_GalleryUserViewers_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_EventTags_TagId", - table: "EventTags", - column: "TagId"); - - migrationBuilder.CreateIndex( - name: "IX_Galleries_CreatedBy", - table: "Galleries", - column: "CreatedBy"); - - migrationBuilder.CreateIndex( - name: "IX_Galleries_EventId", - table: "Galleries", - column: "EventId"); - - migrationBuilder.CreateIndex( - name: "IX_GalleryPhotos_PhotoId", - table: "GalleryPhotos", - column: "PhotoId"); - - migrationBuilder.CreateIndex( - name: "IX_GalleryTags_TagId", - table: "GalleryTags", - column: "TagId"); - - migrationBuilder.CreateIndex( - name: "IX_GalleryUserViewers_UserId", - table: "GalleryUserViewers", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Persons_SocialMediaId", - table: "Persons", - column: "SocialMediaId"); - - migrationBuilder.CreateIndex( - name: "IX_PhotoPersons_PersonId", - table: "PhotoPersons", - column: "PersonId"); - - migrationBuilder.CreateIndex( - name: "IX_Photos_CreatedBy", - table: "Photos", - column: "CreatedBy"); - - migrationBuilder.CreateIndex( - name: "IX_Photos_EventId", - table: "Photos", - column: "EventId"); - - migrationBuilder.CreateIndex( - name: "IX_PhotoTags_TagId", - table: "PhotoTags", - column: "TagId"); - - migrationBuilder.CreateIndex( - name: "IX_PhotoUserBuyers_UserId", - table: "PhotoUserBuyers", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_RolePermissions_PermissionId", - table: "RolePermissions", - column: "PermissionId"); - - migrationBuilder.CreateIndex( - name: "IX_Roles_BaseRoleModelId", - table: "Roles", - column: "BaseRoleModelId"); - - migrationBuilder.CreateIndex( - name: "IX_Tags_Name", - table: "Tags", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_UserRoles_RoleId", - table: "UserRoles", - column: "RoleId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "__EFMigrationsLock"); - - migrationBuilder.DropTable( - name: "EventTags"); - - migrationBuilder.DropTable( - name: "GalleryPhotos"); - - migrationBuilder.DropTable( - name: "GalleryTags"); - - migrationBuilder.DropTable( - name: "GalleryUserViewers"); - - migrationBuilder.DropTable( - name: "PhotoPersons"); - - migrationBuilder.DropTable( - name: "PhotoTags"); - - migrationBuilder.DropTable( - name: "PhotoUserBuyers"); - - migrationBuilder.DropTable( - name: "Rankings"); - - migrationBuilder.DropTable( - name: "RolePermissions"); - - migrationBuilder.DropTable( - name: "UserRoles"); - - migrationBuilder.DropTable( - name: "Galleries"); - - migrationBuilder.DropTable( - name: "Tags"); - - migrationBuilder.DropTable( - name: "Photos"); - - migrationBuilder.DropTable( - name: "Permissions"); - - migrationBuilder.DropTable( - name: "Roles"); - - migrationBuilder.DropTable( - name: "Users"); - - migrationBuilder.DropTable( - name: "Events"); - - migrationBuilder.DropTable( - name: "Persons"); - - migrationBuilder.DropTable( - name: "SocialMedia"); - } - } -} diff --git a/back/persistance/data/migrations/DataContextModelSnapshot.cs b/back/persistance/data/migrations/DataContextModelSnapshot.cs deleted file mode 100644 index 69154c8..0000000 --- a/back/persistance/data/migrations/DataContextModelSnapshot.cs +++ /dev/null @@ -1,749 +0,0 @@ -// -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using back.persistance.data; - -#nullable disable - -namespace back.Migrations -{ - [DbContext(typeof(DataContext))] - partial class DataContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "9.0.8"); - - modelBuilder.Entity("EventTag", b => - { - b.Property("EventId") - .HasColumnType("TEXT"); - - b.Property("TagId") - .HasColumnType("TEXT"); - - b.HasKey("EventId", "TagId"); - - b.HasIndex("TagId"); - - b.ToTable("EventTags", (string)null); - }); - - modelBuilder.Entity("GalleryPhoto", b => - { - b.Property("GalleryId") - .HasColumnType("TEXT"); - - b.Property("PhotoId") - .HasColumnType("TEXT"); - - b.HasKey("GalleryId", "PhotoId"); - - b.HasIndex("PhotoId"); - - b.ToTable("GalleryPhotos", (string)null); - }); - - modelBuilder.Entity("GalleryTag", b => - { - b.Property("GalleryId") - .HasColumnType("TEXT"); - - b.Property("TagId") - .HasColumnType("TEXT"); - - b.HasKey("GalleryId", "TagId"); - - b.HasIndex("TagId"); - - b.ToTable("GalleryTags", (string)null); - }); - - modelBuilder.Entity("GalleryUserViewer", b => - { - b.Property("GalleryId") - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("GalleryId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("GalleryUserViewers", (string)null); - }); - - modelBuilder.Entity("PhotoPerson", b => - { - b.Property("PhotoId") - .HasColumnType("TEXT"); - - b.Property("PersonId") - .HasColumnType("TEXT"); - - b.HasKey("PhotoId", "PersonId"); - - b.HasIndex("PersonId"); - - b.ToTable("PhotoPersons", (string)null); - }); - - modelBuilder.Entity("PhotoTag", b => - { - b.Property("PhotoId") - .HasColumnType("TEXT"); - - b.Property("TagId") - .HasColumnType("TEXT"); - - b.HasKey("PhotoId", "TagId"); - - b.HasIndex("TagId"); - - b.ToTable("PhotoTags", (string)null); - }); - - modelBuilder.Entity("PhotoUserBuyer", b => - { - b.Property("PhotoId") - .HasColumnType("TEXT"); - - b.Property("UserId") - .HasColumnType("TEXT"); - - b.HasKey("PhotoId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("PhotoUserBuyers", (string)null); - }); - - modelBuilder.Entity("RolePermission", b => - { - b.Property("RoleId") - .HasColumnType("TEXT"); - - b.Property("PermissionId") - .HasColumnType("TEXT"); - - b.HasKey("RoleId", "PermissionId"); - - b.HasIndex("PermissionId"); - - b.ToTable("RolePermissions", (string)null); - }); - - modelBuilder.Entity("UserRole", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("UserRoles", (string)null); - }); - - modelBuilder.Entity("back.DataModels.EfmigrationsLock", b => - { - b.Property("Id") - .HasColumnType("INTEGER"); - - b.Property("Timestamp") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("__EFMigrationsLock", (string)null); - }); - - modelBuilder.Entity("back.DataModels.Event", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .HasColumnType("TEXT"); - - b.Property("Date") - .HasColumnType("TEXT"); - - b.Property("DeletedAt") - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("IsDeleted") - .HasColumnType("INTEGER"); - - b.Property("Location") - .HasColumnType("TEXT"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("TEXT"); - - b.Property("UpdatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("UpdatedBy") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("Events"); - }); - - modelBuilder.Entity("back.DataModels.Gallery", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DeletedAt") - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("EventId") - .HasColumnType("TEXT"); - - b.Property("IsArchived") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0); - - b.Property("IsDeleted") - .HasColumnType("INTEGER"); - - b.Property("IsFavorite") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0); - - b.Property("IsPublic") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1); - - b.Property("Title") - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("UpdatedAt") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CreatedBy"); - - b.HasIndex("EventId"); - - b.ToTable("Galleries"); - }); - - modelBuilder.Entity("back.DataModels.Permission", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(255) - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("Permissions"); - }); - - modelBuilder.Entity("back.DataModels.Person", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Avatar") - .HasColumnType("TEXT"); - - b.Property("Bio") - .HasMaxLength(250) - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("DeletedAt") - .HasColumnType("TEXT"); - - b.Property("IsDeleted") - .HasColumnType("INTEGER"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("ProfilePicture") - .HasColumnType("TEXT"); - - b.Property("SocialMediaId") - .HasColumnType("TEXT"); - - b.Property("UpdatedAt") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("SocialMediaId"); - - b.ToTable("Persons"); - }); - - modelBuilder.Entity("back.DataModels.Photo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .HasColumnType("TEXT"); - - b.Property("CreatedBy") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("TEXT"); - - b.Property("EventId") - .HasColumnType("TEXT"); - - b.Property("Extension") - .HasColumnType("TEXT"); - - b.Property("HighResUrl") - .HasColumnType("TEXT"); - - b.Property("IsArchived") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0); - - b.Property("IsFavorite") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0); - - b.Property("IsPublic") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(1); - - b.Property("LowResUrl") - .HasColumnType("TEXT"); - - b.Property("MidResUrl") - .HasColumnType("TEXT"); - - b.Property("RankingId") - .HasColumnType("TEXT"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.Property("UpdatedAt") - .HasColumnType("TEXT"); - - b.Property("UpdatedBy") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("CreatedBy"); - - b.HasIndex("EventId"); - - b.ToTable("Photos"); - }); - - modelBuilder.Entity("back.DataModels.Ranking", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("DownVotes") - .HasColumnType("INTEGER"); - - b.Property("TotalVotes") - .HasColumnType("INTEGER"); - - b.Property("UpVotes") - .HasColumnType("INTEGER"); - - b.HasKey("Id"); - - b.ToTable("Rankings"); - }); - - modelBuilder.Entity("back.DataModels.Role", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("BaseRoleModelId") - .HasColumnType("TEXT"); - - b.Property("Description") - .HasMaxLength(250) - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("BaseRoleModelId"); - - b.ToTable("Roles"); - }); - - modelBuilder.Entity("back.DataModels.SocialMedia", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("BlueSky") - .HasColumnType("TEXT"); - - b.Property("Discord") - .HasColumnType("TEXT"); - - b.Property("Facebook") - .HasColumnType("TEXT"); - - b.Property("Instagram") - .HasColumnType("TEXT"); - - b.Property("Linkedin") - .HasColumnType("TEXT"); - - b.Property("Other") - .HasColumnType("TEXT"); - - b.Property("Pinterest") - .HasColumnType("TEXT"); - - b.Property("Reddit") - .HasColumnType("TEXT"); - - b.Property("Tiktok") - .HasColumnType("TEXT"); - - b.Property("Twitter") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("SocialMedia"); - }); - - modelBuilder.Entity("back.DataModels.Tag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(25) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex(new[] { "Name" }, "IX_Tags_Name") - .IsUnique(); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("back.DataModels.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CreatedAt") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Password") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Salt") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("EventTag", b => - { - b.HasOne("back.DataModels.Event", null) - .WithMany() - .HasForeignKey("EventId") - .IsRequired(); - - b.HasOne("back.DataModels.Tag", null) - .WithMany() - .HasForeignKey("TagId") - .IsRequired(); - }); - - modelBuilder.Entity("GalleryPhoto", b => - { - b.HasOne("back.DataModels.Gallery", null) - .WithMany() - .HasForeignKey("GalleryId") - .IsRequired(); - - b.HasOne("back.DataModels.Photo", null) - .WithMany() - .HasForeignKey("PhotoId") - .IsRequired(); - }); - - modelBuilder.Entity("GalleryTag", b => - { - b.HasOne("back.DataModels.Gallery", null) - .WithMany() - .HasForeignKey("GalleryId") - .IsRequired(); - - b.HasOne("back.DataModels.Tag", null) - .WithMany() - .HasForeignKey("TagId") - .IsRequired(); - }); - - modelBuilder.Entity("GalleryUserViewer", b => - { - b.HasOne("back.DataModels.Gallery", null) - .WithMany() - .HasForeignKey("GalleryId") - .IsRequired(); - - b.HasOne("back.DataModels.User", null) - .WithMany() - .HasForeignKey("UserId") - .IsRequired(); - }); - - modelBuilder.Entity("PhotoPerson", b => - { - b.HasOne("back.DataModels.Person", null) - .WithMany() - .HasForeignKey("PersonId") - .IsRequired(); - - b.HasOne("back.DataModels.Photo", null) - .WithMany() - .HasForeignKey("PhotoId") - .IsRequired(); - }); - - modelBuilder.Entity("PhotoTag", b => - { - b.HasOne("back.DataModels.Photo", null) - .WithMany() - .HasForeignKey("PhotoId") - .IsRequired(); - - b.HasOne("back.DataModels.Tag", null) - .WithMany() - .HasForeignKey("TagId") - .IsRequired(); - }); - - modelBuilder.Entity("PhotoUserBuyer", b => - { - b.HasOne("back.DataModels.Photo", null) - .WithMany() - .HasForeignKey("PhotoId") - .IsRequired(); - - b.HasOne("back.DataModels.User", null) - .WithMany() - .HasForeignKey("UserId") - .IsRequired(); - }); - - modelBuilder.Entity("RolePermission", b => - { - b.HasOne("back.DataModels.Permission", null) - .WithMany() - .HasForeignKey("PermissionId") - .IsRequired(); - - b.HasOne("back.DataModels.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .IsRequired(); - }); - - modelBuilder.Entity("UserRole", b => - { - b.HasOne("back.DataModels.Role", null) - .WithMany() - .HasForeignKey("RoleId") - .IsRequired(); - - b.HasOne("back.DataModels.User", null) - .WithMany() - .HasForeignKey("UserId") - .IsRequired(); - }); - - modelBuilder.Entity("back.DataModels.Gallery", b => - { - b.HasOne("back.DataModels.User", "CreatedByNavigation") - .WithMany("Galleries") - .HasForeignKey("CreatedBy") - .IsRequired(); - - b.HasOne("back.DataModels.Event", "Event") - .WithMany("Galleries") - .HasForeignKey("EventId"); - - b.Navigation("CreatedByNavigation"); - - b.Navigation("Event"); - }); - - modelBuilder.Entity("back.DataModels.Person", b => - { - b.HasOne("back.DataModels.SocialMedia", "SocialMedia") - .WithMany("People") - .HasForeignKey("SocialMediaId"); - - b.Navigation("SocialMedia"); - }); - - modelBuilder.Entity("back.DataModels.Photo", b => - { - b.HasOne("back.DataModels.Person", "CreatedByNavigation") - .WithMany("Photos") - .HasForeignKey("CreatedBy") - .IsRequired(); - - b.HasOne("back.DataModels.Event", "Event") - .WithMany("Photos") - .HasForeignKey("EventId"); - - b.Navigation("CreatedByNavigation"); - - b.Navigation("Event"); - }); - - modelBuilder.Entity("back.DataModels.Role", b => - { - b.HasOne("back.DataModels.Role", "BaseRoleModel") - .WithMany("InverseBaseRoleModel") - .HasForeignKey("BaseRoleModelId"); - - b.Navigation("BaseRoleModel"); - }); - - modelBuilder.Entity("back.DataModels.User", b => - { - b.HasOne("back.DataModels.Person", "IdNavigation") - .WithOne("User") - .HasForeignKey("back.DataModels.User", "Id") - .IsRequired(); - - b.Navigation("IdNavigation"); - }); - - modelBuilder.Entity("back.DataModels.Event", b => - { - b.Navigation("Galleries"); - - b.Navigation("Photos"); - }); - - modelBuilder.Entity("back.DataModels.Person", b => - { - b.Navigation("Photos"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("back.DataModels.Role", b => - { - b.Navigation("InverseBaseRoleModel"); - }); - - modelBuilder.Entity("back.DataModels.SocialMedia", b => - { - b.Navigation("People"); - }); - - modelBuilder.Entity("back.DataModels.User", b => - { - b.Navigation("Galleries"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/back/persistance/data/migrations/sqlite/tables.sql b/back/persistance/data/migrations/sqlite/tables.sql deleted file mode 100644 index 80af444..0000000 --- a/back/persistance/data/migrations/sqlite/tables.sql +++ /dev/null @@ -1,200 +0,0 @@ --- Tabla de redes sociales (SocialMedia) y relación uno a uno con Person -CREATE TABLE IF NOT EXISTS SocialMedia ( - Id TEXT PRIMARY KEY, - Facebook TEXT, - Instagram TEXT, - Twitter TEXT, - BlueSky TEXT, - Tiktok TEXT, - Linkedin TEXT, - Pinterest TEXT, - Discord TEXT, - Reddit TEXT, - Other TEXT -); - --- Person: cada persona tiene un grupo de redes sociales (uno a uno, fk opcional) -CREATE TABLE IF NOT EXISTS Persons ( - Id TEXT PRIMARY KEY, - Name TEXT NOT NULL, - ProfilePicture TEXT, - Avatar TEXT, - SocialMediaId TEXT, - Bio TEXT, - CreatedAt TEXT NOT NULL, - UpdatedAt TEXT, - FOREIGN KEY (SocialMediaId) REFERENCES SocialMedia(Id) -); - --- User: es una persona (herencia por clave primaria compartida) -CREATE TABLE IF NOT EXISTS Users ( - Id TEXT PRIMARY KEY, -- MISMA clave y valor que Persons.Id - Email TEXT NOT NULL, - Password TEXT NOT NULL, - Salt TEXT NOT NULL, - FOREIGN KEY (Id) REFERENCES Persons(Id) -); - --- Un usuario puede ver muchas galerías (muchos-a-muchos: Galleries <-> Users) -CREATE TABLE IF NOT EXISTS GalleryUserViewers ( - GalleryId TEXT NOT NULL, - UserId TEXT NOT NULL, - PRIMARY KEY (GalleryId, UserId), - FOREIGN KEY (GalleryId) REFERENCES Galleries(Id), - FOREIGN KEY (UserId) REFERENCES Users(Id) -); - --- Un usuario ha creado muchas galerías (uno a muchos) --- Una galería solo puede ser creada por un usuario -CREATE TABLE IF NOT EXISTS Galleries ( - Id TEXT PRIMARY KEY, - Title TEXT, - Description TEXT, - CreatedAt TEXT, - UpdatedAt TEXT, - CreatedBy TEXT NOT NULL, -- FK a Users - IsPublic INTEGER DEFAULT 1, - IsArchived INTEGER DEFAULT 0, - IsFavorite INTEGER DEFAULT 0, - EventId TEXT, -- FK opcional a Events (una galería puede asociarse a un evento) - FOREIGN KEY (CreatedBy) REFERENCES Users(Id), - FOREIGN KEY (EventId) REFERENCES Events(Id) -); - --- Galería-Photo: una galería contiene muchas imagenes, una imagen puede estar en muchas galerías (muchos-a-muchos) -CREATE TABLE IF NOT EXISTS GalleryPhotos ( - GalleryId TEXT NOT NULL, - PhotoId TEXT NOT NULL, - PRIMARY KEY (GalleryId, PhotoId), - FOREIGN KEY (GalleryId) REFERENCES Galleries(Id), - FOREIGN KEY (PhotoId) REFERENCES Photos(Id) -); - --- Tabla de eventos -CREATE TABLE IF NOT EXISTS Events ( - Id TEXT PRIMARY KEY, - Title TEXT NOT NULL, - Description TEXT, - Date TEXT, - Location TEXT, - CreatedAt TEXT NOT NULL, - UpdatedAt TEXT NOT NULL, - CreatedBy TEXT, - UpdatedBy TEXT, - IsDeleted INTEGER NOT NULL DEFAULT 0, - DeletedAt TEXT -); - --- Tabla de fotos -CREATE TABLE IF NOT EXISTS Photos ( - Id TEXT PRIMARY KEY, - Title TEXT NOT NULL, - Description TEXT, - Extension TEXT, - LowResUrl TEXT, - MidResUrl TEXT, - HighResUrl TEXT, - CreatedAt TEXT, - UpdatedAt TEXT, - CreatedBy TEXT NOT NULL, -- Persona que subió la foto: FK a Persons - UpdatedBy TEXT, - EventId TEXT, -- Una photo solo puede tener un evento asociado (FK) - RankingId TEXT, - IsFavorite INTEGER DEFAULT 0, - IsPublic INTEGER DEFAULT 1, - IsArchived INTEGER DEFAULT 0, - FOREIGN KEY (CreatedBy) REFERENCES Persons(Id), - FOREIGN KEY (EventId) REFERENCES Events(Id) -); - --- Una persona puede salir en muchas fotos, y una foto puede tener muchas personas (muchos-a-muchos) -CREATE TABLE IF NOT EXISTS PhotoPersons ( - PhotoId TEXT NOT NULL, - PersonId TEXT NOT NULL, - PRIMARY KEY (PhotoId, PersonId), - FOREIGN KEY (PhotoId) REFERENCES Photos(Id), - FOREIGN KEY (PersonId) REFERENCES Persons(Id) -); - --- Un usuario puede comprar muchas fotos para verlas, y una foto puede haber sido comprada por muchos usuarios --- (solo necesario si IsPublic = 0) -CREATE TABLE IF NOT EXISTS PhotoUserBuyers ( - PhotoId TEXT NOT NULL, - UserId TEXT NOT NULL, - PRIMARY KEY (PhotoId, UserId), - FOREIGN KEY (PhotoId) REFERENCES Photos(Id), - FOREIGN KEY (UserId) REFERENCES Users(Id) -); - --- Tabla de tags (únicos) -CREATE TABLE IF NOT EXISTS Tags ( - Id TEXT PRIMARY KEY, - Name TEXT NOT NULL UNIQUE, - CreatedAt TEXT NOT NULL -); - --- Una foto puede tener muchos tags (muchos-a-muchos) -CREATE TABLE IF NOT EXISTS PhotoTags ( - PhotoId TEXT NOT NULL, - TagId TEXT NOT NULL, - PRIMARY KEY (PhotoId, TagId), - FOREIGN KEY (PhotoId) REFERENCES Photos(Id), - FOREIGN KEY (TagId) REFERENCES Tags(Id) -); - --- Un evento puede tener muchos tags (muchos-a-muchos) -CREATE TABLE IF NOT EXISTS EventTags ( - EventId TEXT NOT NULL, - TagId TEXT NOT NULL, - PRIMARY KEY (EventId, TagId), - FOREIGN KEY (EventId) REFERENCES Events(Id), - FOREIGN KEY (TagId) REFERENCES Tags(Id) -); - --- Una galería puede tener muchos tags (muchos-a-muchos) -CREATE TABLE IF NOT EXISTS GalleryTags ( - GalleryId TEXT NOT NULL, - TagId TEXT NOT NULL, - PRIMARY KEY (GalleryId, TagId), - FOREIGN KEY (GalleryId) REFERENCES Galleries(Id), - FOREIGN KEY (TagId) REFERENCES Tags(Id) -); - --- Rankings (por si corresponde) -CREATE TABLE IF NOT EXISTS Rankings ( - Id TEXT PRIMARY KEY, - TotalVotes INTEGER NOT NULL, - UpVotes INTEGER NOT NULL, - DownVotes INTEGER NOT NULL -); - --- Permissions y Roles, tal y como en el mensaje anterior... -CREATE TABLE IF NOT EXISTS Permissions ( - Id TEXT PRIMARY KEY, - Name TEXT NOT NULL, - Description TEXT -); - -CREATE TABLE IF NOT EXISTS Roles ( - Id TEXT PRIMARY KEY, - Name TEXT NOT NULL, - Description TEXT, - BaseRoleModelId TEXT, - FOREIGN KEY (BaseRoleModelId) REFERENCES Roles(Id) -); - -CREATE TABLE IF NOT EXISTS UserRoles ( - UserId TEXT NOT NULL, - RoleId TEXT NOT NULL, - PRIMARY KEY (UserId, RoleId), - FOREIGN KEY (UserId) REFERENCES Users(Id), - FOREIGN KEY (RoleId) REFERENCES Roles(Id) -); - -CREATE TABLE IF NOT EXISTS RolePermissions ( - RoleId TEXT NOT NULL, - PermissionId TEXT NOT NULL, - PRIMARY KEY (RoleId, PermissionId), - FOREIGN KEY (RoleId) REFERENCES Roles(Id), - FOREIGN KEY (PermissionId) REFERENCES Permissions(Id) -); diff --git a/back/persistance/data/relations/EventRelationEstablisher.cs b/back/persistance/data/relations/EventRelationEstablisher.cs deleted file mode 100644 index 25241da..0000000 --- a/back/persistance/data/relations/EventRelationEstablisher.cs +++ /dev/null @@ -1,28 +0,0 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.relations; - -public class EventRelationEstablisher: IRelationEstablisher -{ - public void EstablishRelation(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.HasMany(d => d.Tags).WithMany(p => p.Events) - .UsingEntity>( - "EventTag", - r => r.HasOne().WithMany() - .HasForeignKey("TagId") - .OnDelete(DeleteBehavior.ClientSetNull), - l => l.HasOne().WithMany() - .HasForeignKey("EventId") - .OnDelete(DeleteBehavior.ClientSetNull), - j => - { - j.HasKey("EventId", "TagId"); - j.ToTable("EventTags"); - }); - }); - } -} diff --git a/back/persistance/data/relations/GalleryRelationEstablisher.cs b/back/persistance/data/relations/GalleryRelationEstablisher.cs deleted file mode 100644 index b1a0e7f..0000000 --- a/back/persistance/data/relations/GalleryRelationEstablisher.cs +++ /dev/null @@ -1,68 +0,0 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.relations; - -public class GalleryRelationEstablisher : IRelationEstablisher -{ - public void EstablishRelation(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.Property(e => e.IsArchived).HasDefaultValue(0); - entity.Property(e => e.IsFavorite).HasDefaultValue(0); - entity.Property(e => e.IsPublic).HasDefaultValue(1); - - entity.HasOne(d => d.CreatedByNavigation).WithMany(p => p.Galleries) - .HasForeignKey(d => d.CreatedBy) - .OnDelete(DeleteBehavior.ClientSetNull); - - entity.HasOne(d => d.Event).WithMany(p => p.Galleries).HasForeignKey(d => d.EventId); - - entity.HasMany(d => d.Photos).WithMany(p => p.Galleries) - .UsingEntity>( - "GalleryPhoto", - r => r.HasOne().WithMany() - .HasForeignKey("PhotoId") - .OnDelete(DeleteBehavior.ClientSetNull), - l => l.HasOne().WithMany() - .HasForeignKey("GalleryId") - .OnDelete(DeleteBehavior.ClientSetNull), - j => - { - j.HasKey("GalleryId", "PhotoId"); - j.ToTable("GalleryPhotos"); - }); - - entity.HasMany(d => d.Tags).WithMany(p => p.Galleries) - .UsingEntity>( - "GalleryTag", - r => r.HasOne().WithMany() - .HasForeignKey("TagId") - .OnDelete(DeleteBehavior.ClientSetNull), - l => l.HasOne().WithMany() - .HasForeignKey("GalleryId") - .OnDelete(DeleteBehavior.ClientSetNull), - j => - { - j.HasKey("GalleryId", "TagId"); - j.ToTable("GalleryTags"); - }); - - entity.HasMany(d => d.Users).WithMany(p => p.GalleriesNavigation) - .UsingEntity>( - "GalleryUserViewer", - r => r.HasOne().WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.ClientSetNull), - l => l.HasOne().WithMany() - .HasForeignKey("GalleryId") - .OnDelete(DeleteBehavior.ClientSetNull), - j => - { - j.HasKey("GalleryId", "UserId"); - j.ToTable("GalleryUserViewers"); - }); - }); - } -} \ No newline at end of file diff --git a/back/persistance/data/relations/IRelationEstablisher.cs b/back/persistance/data/relations/IRelationEstablisher.cs deleted file mode 100644 index 5d2e4ae..0000000 --- a/back/persistance/data/relations/IRelationEstablisher.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.relations; - -public interface IRelationEstablisher -{ - void EstablishRelation(ModelBuilder modelBuilder); -} diff --git a/back/persistance/data/relations/PersonRelationEstablisher.cs b/back/persistance/data/relations/PersonRelationEstablisher.cs deleted file mode 100644 index 245ed4a..0000000 --- a/back/persistance/data/relations/PersonRelationEstablisher.cs +++ /dev/null @@ -1,68 +0,0 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.relations; - -public class PersonRelationEstablisher : IRelationEstablisher -{ - public void EstablishRelation(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.Property(e => e.IsArchived).HasDefaultValue(0); - entity.Property(e => e.IsFavorite).HasDefaultValue(0); - entity.Property(e => e.IsPublic).HasDefaultValue(1); - - entity.HasOne(d => d.CreatedByNavigation).WithMany(p => p.Photos) - .HasForeignKey(d => d.CreatedBy) - .OnDelete(DeleteBehavior.ClientSetNull); - - entity.HasOne(d => d.Event).WithMany(p => p.Photos).HasForeignKey(d => d.EventId); - - entity.HasMany(d => d.People).WithMany(p => p.PhotosNavigation) - .UsingEntity>( - "PhotoPerson", - r => r.HasOne().WithMany() - .HasForeignKey("PersonId") - .OnDelete(DeleteBehavior.ClientSetNull), - l => l.HasOne().WithMany() - .HasForeignKey("PhotoId") - .OnDelete(DeleteBehavior.ClientSetNull), - j => - { - j.HasKey("PhotoId", "PersonId"); - j.ToTable("PhotoPersons"); - }); - - entity.HasMany(d => d.Tags).WithMany(p => p.Photos) - .UsingEntity>( - "PhotoTag", - r => r.HasOne().WithMany() - .HasForeignKey("TagId") - .OnDelete(DeleteBehavior.ClientSetNull), - l => l.HasOne().WithMany() - .HasForeignKey("PhotoId") - .OnDelete(DeleteBehavior.ClientSetNull), - j => - { - j.HasKey("PhotoId", "TagId"); - j.ToTable("PhotoTags"); - }); - - entity.HasMany(d => d.Users).WithMany(p => p.Photos) - .UsingEntity>( - "PhotoUserBuyer", - r => r.HasOne().WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.ClientSetNull), - l => l.HasOne().WithMany() - .HasForeignKey("PhotoId") - .OnDelete(DeleteBehavior.ClientSetNull), - j => - { - j.HasKey("PhotoId", "UserId"); - j.ToTable("PhotoUserBuyers"); - }); - }); - } -} diff --git a/back/persistance/data/relations/PhotoContext.cs b/back/persistance/data/relations/PhotoContext.cs deleted file mode 100644 index e931ea7..0000000 --- a/back/persistance/data/relations/PhotoContext.cs +++ /dev/null @@ -1,307 +0,0 @@ -//using back.DataModels; -//using back.DTO; -//using back.persistance.blob; -//using back.services.ImageResizer; -//using Microsoft.EntityFrameworkCore; -//using Microsoft.Extensions.Hosting.Internal; - -//namespace back.persistance.data.relations; - -//public class PhotoContext : DbContext -//{ - -// private readonly IImageResizer _Resizer; -// private readonly IBlobStorageService _BlobStorage; - -// private readonly TagContext _tagContext; -// private readonly EventContext _eventContext; -// private readonly PersonRelationEstablisher _personContext; - -// public PhotoContext(DbContextOptions options, IHostEnvironment hostingEnvironment, -// IImageResizer resizer, -// IBlobStorageService blobStorage, -// TagContext tags, -// EventContext events, -// PersonRelationEstablisher persons -// ) : base(options) -// { -// _Resizer = resizer; -// _BlobStorage = blobStorage; -// _tagContext = tags; -// _eventContext = events; -// _personContext = persons; - -// if (hostingEnvironment.IsDevelopment()) -// { -// Database.EnsureCreated(); -// } -// else -// { -// Database.Migrate(); -// } -// } - -// protected override void OnModelCreating(ModelBuilder modelBuilder) -// { -// // Photo -> Tags (muchos-a-muchos) -// modelBuilder.Entity() -// .HasMany(p => p.Tags) -// .WithMany(t => t.Photos) -// .UsingEntity(j => j.ToTable("PhotoTags")); - -// // Photo -> Persons (muchos-a-muchos) -// modelBuilder.Entity() -// .HasMany(p => p.PersonsIn) -// .WithMany(per => per.Photos) -// .UsingEntity(j => j.ToTable("PhotoPersons")); - -// // Photo -> Event (muchos-a-uno) -// modelBuilder.Entity() -// .HasOne(p => p.Event) -// .WithMany() // Un evento puede tener múltiples fotos -// .HasForeignKey(p => p.EventId); - -// // Photo -> Ranking (uno-a-uno) -// modelBuilder.Entity() -// .HasOne(p => p.Ranking) -// .WithOne(r => r.Photo) // Un ranking está asociado a una sola foto -// .HasForeignKey(p => p.RankingId); - -// base.OnModelCreating(modelBuilder); -// } - -// public async Task CreateNew(PhotoFormModel? form) -// { -// if (form == null) { return; } - -// var photo = new Photo( -// Guid.NewGuid().ToString(), -// form.Title, -// form.Description ?? string.Empty, -// string.Empty, // LowResUrl will be set later -// string.Empty, // MidResUrl will be set later -// string.Empty, // HighResUrl will be set later -// DateTime.UtcNow, -// DateTime.UtcNow, -// form.UserId, -// form.UserId -// ) -// { -// IsPublic = form.IsPublic -// }; - -// List tasks = [ -// SaveBlob(photo, form), -// LinkTags(photo, form.Tags ?? [], form.UserId), -// LinkEvent(photo, form.Evento ?? "", form.UserId), -// LinkPersons(photo, form.People ?? [], form.UserId), -// ]; - -// await Task.WhenAll(tasks); -// await Photos.AddAsync(photo); -// await SaveChangesAsync(); -// } - -// private async Task LinkPersons(Photo photo, string[] personas, string updatedBy = "SYSTEM") -// { -// if (photo == null || personas == null || personas.Length == 0) return; -// foreach (var personId in personas) -// { -// var person = await _personContext.GetById(personId); -// if (person != null) -// { -// await LinkPersons(photo, person, updatedBy); -// } -// } -// } - -// private async Task LinkPersons(Photo photo, Person tag, string updatedBy = "SYSTEM") -// { -// if (tag == null) return; -// // Ensure the tag exists -// if (await _personContext.Exists(tag.Id)) -// { -// photo.PersonsIn ??= []; -// photo.PersonsIn.Add(tag); -// photo.UpdatedAt = DateTime.UtcNow; -// photo.UpdatedBy = updatedBy; // or use a more appropriate value -// } -// } - -// private async Task LinkTags(Photo photo, string[] tags, string updatedBy = "SYSTEM") -// { -// if (photo == null || tags == null || tags.Length == 0) return; -// foreach (var tagId in tags) -// { -// var tag = await _tagContext.GetById(tagId); -// if (tag != null) -// { -// await LinkTag(photo, tag, updatedBy); -// } -// } -// } - -// private async Task LinkTag(Photo photo, Tag tag, string updatedBy = "SYSTEM") -// { -// if (tag == null) return; -// // Ensure the tag exists -// if (await _tagContext.Exists(tag.Id)) -// { -// photo.Tags.Add(tag); -// photo.UpdatedAt = DateTime.UtcNow; -// photo.UpdatedBy = updatedBy; // or use a more appropriate value -// } -// } - -// private async Task LinkEvent(Photo photo, string eventId, string updatedBy = "SYSTEM") -// { -// if (string.IsNullOrEmpty(eventId)) return; -// var evento = await _eventContext.GetById(eventId); -// if (evento != null) -// { -// await LinkEvent(photo, evento, updatedBy); -// } -// } - -// private async Task LinkEvent(Photo photo, Event? evento, string updatedBy = "SYSTEM") -// { -// if (evento == null) return; -// // Ensure the event exists -// if (await _eventContext.Exists(evento.Id)) -// { -// photo.Event = evento; -// photo.UpdatedAt = DateTime.UtcNow; -// photo.UpdatedBy = updatedBy; -// } -// } - -// private async Task SaveBlob(Photo photo, PhotoFormModel form) -// { -// if (form.Image != null && form.Image.Length > 0) -// { -// var lowRes = await _Resizer.ResizeImage(form.Image, 480); -// var midRes = await _Resizer.ResizeImage(form.Image, 720); -// // Upload images to blob storage -// photo.Extension = form.Image.FileName.Split('.').Last(); -// photo.LowResUrl = $"low/{photo.Id}.webp"; -// photo.MidResUrl = $"mid/{photo.Id}.webp"; -// photo.HighResUrl = $"high/{photo.Id}.{photo.Extension}"; -// await _BlobStorage.SaveAsync(lowRes, photo.LowResUrl); -// await _BlobStorage.SaveAsync(midRes, photo.MidResUrl); -// await _BlobStorage.SaveAsync(form.Image.OpenReadStream(), photo.HighResUrl); -// } -// } - -// public async Task GetById(string id) -// { -// return await GetById(Guid.Parse(id)); -// } - -// public async Task GetById(Guid id) -// { -// try -// { -// return await Photos.FindAsync(id); -// } -// catch -// { -// return null; -// } -// } - -// public async Task GetTotalItems() -// { -// try -// { -// return await Photos.CountAsync(); -// } -// catch -// { -// return 0; -// } -// } - -// public async Task?> GetPage(int page = 1, int pageSize = 20) -// { -// if (page < 1) page = 1; -// if (pageSize < 1) pageSize = 20; -// try -// { -// return await Photos -// .OrderByDescending(p => p.CreatedAt) -// .Skip((page - 1) * pageSize) -// .Take(pageSize) -// .ToListAsync(); -// } -// catch -// { -// return null; -// } -// } - -// public async Task Exists(Photo? photo) -// { -// try -// { -// if (photo == null) return false; -// if (string.IsNullOrEmpty(photo.Id)) return false; -// return await Photos.AnyAsync(p => p.Id == photo.Id); -// } -// catch -// { -// return false; // Handle exceptions gracefully -// } -// } - -// public async Task Exists(string id) -// { -// try -// { -// if (string.IsNullOrEmpty(id)) return false; -// return await Photos.AnyAsync(p => p.Id == id); -// } -// catch -// { -// return false; // Handle exceptions gracefully -// } -// } - -// public async Task Delete(Photo photo) -// { -// if (photo == null) return; -// if (await Exists(photo)) -// { -// // Delete the photo from blob storage -// if (!string.IsNullOrEmpty(photo.LowResUrl)) -// await _BlobStorage.DeleteAsync(photo.LowResUrl); -// if (!string.IsNullOrEmpty(photo.MidResUrl)) -// await _BlobStorage.DeleteAsync(photo.MidResUrl); -// if (!string.IsNullOrEmpty(photo.HighResUrl)) -// await _BlobStorage.DeleteAsync(photo.HighResUrl); -// Photos.Remove(photo); -// await SaveChangesAsync(); -// } -// } - -// public async Task Update(Photo photo) -// { -// if (photo == null) return; -// if (await Exists(photo)) -// { -// var evento = photo.Event; -// photo.Event = null; -// await LinkEvent(photo, evento, photo.UpdatedBy); - -// var tags = photo.Tags.Select(t => t.Id); -// photo.Tags.Clear(); -// await LinkTags(photo, [.. tags], photo.UpdatedBy); - -// var persons = photo.PersonsIn?.Select(t => t.Id) ?? []; -// photo.PersonsIn = null; -// await LinkPersons(photo, [.. persons], photo.UpdatedBy); - -// Photos.Update(photo); -// await SaveChangesAsync(); -// } -// } -//} diff --git a/back/persistance/data/relations/PhotoRelationEstablisher.cs b/back/persistance/data/relations/PhotoRelationEstablisher.cs deleted file mode 100644 index ec6fbf7..0000000 --- a/back/persistance/data/relations/PhotoRelationEstablisher.cs +++ /dev/null @@ -1,15 +0,0 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.relations; - -public class PhotoRelationEstablisher : IRelationEstablisher -{ - public void EstablishRelation(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.SocialMedia).WithMany(p => p.People).HasForeignKey(d => d.SocialMediaId); - }); - } -} diff --git a/back/persistance/data/relations/RoleContext.cs b/back/persistance/data/relations/RoleContext.cs deleted file mode 100644 index ffafd1f..0000000 --- a/back/persistance/data/relations/RoleContext.cs +++ /dev/null @@ -1,25 +0,0 @@ -//using back.DataModels; -//using Microsoft.EntityFrameworkCore; - -//namespace back.persistance.data.relations; - - -//public class RoleContext : DbContext -//{ -// protected override void OnModelCreating(ModelBuilder modelBuilder) -// { -// // Role -> Permissions (muchos-a-muchos) -// modelBuilder.Entity() -// .HasMany(r => r.Permissions) -// .WithMany(p => p.Roles) -// .UsingEntity(j => j.ToTable("RolePermissions")); - -// // Role -> BaseRole (auto-referencial) -// modelBuilder.Entity() -// .HasOne(r => r.BaseRoleModel) -// .WithMany() // Un rol base puede ser heredado por múltiples roles -// .HasForeignKey(r => r.BaseRoleModelId); - -// base.OnModelCreating(modelBuilder); -// } -//} diff --git a/back/persistance/data/relations/RoleRelationEstablisher.cs b/back/persistance/data/relations/RoleRelationEstablisher.cs deleted file mode 100644 index 30536a4..0000000 --- a/back/persistance/data/relations/RoleRelationEstablisher.cs +++ /dev/null @@ -1,30 +0,0 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.relations; - -public class RoleRelationEstablisher : IRelationEstablisher -{ - public void EstablishRelation(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.BaseRoleModel).WithMany(p => p.InverseBaseRoleModel).HasForeignKey(d => d.BaseRoleModelId); - - entity.HasMany(d => d.Permissions).WithMany(p => p.Roles) - .UsingEntity>( - "RolePermission", - r => r.HasOne().WithMany() - .HasForeignKey("PermissionId") - .OnDelete(DeleteBehavior.ClientSetNull), - l => l.HasOne().WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.ClientSetNull), - j => - { - j.HasKey("RoleId", "PermissionId"); - j.ToTable("RolePermissions"); - }); - }); - } -} diff --git a/back/persistance/data/relations/SeedingDbContext.cs b/back/persistance/data/relations/SeedingDbContext.cs deleted file mode 100644 index cd7bff0..0000000 --- a/back/persistance/data/relations/SeedingDbContext.cs +++ /dev/null @@ -1,40 +0,0 @@ -//using back.DataModels; -//using Microsoft.EntityFrameworkCore; - -//namespace back.persistance.data.relations; - -//public class SeedingDbContext : DbContext -//{ -// protected override void OnModelCreating(ModelBuilder modelBuilder) -// { -// // 3. CONFIGURAR RELACIONES -// modelBuilder.Entity() -// .HasMany(r => r.Permissions) -// .WithMany(p => p.Roles) -// .UsingEntity>( -// "RolePermissions", -// j => j.HasOne().WithMany().HasForeignKey("PermissionsId"), -// j => j.HasOne().WithMany().HasForeignKey("RolesId"), -// j => j.HasData( -// // Usuario: VIEW_CONTENT y LIKE_CONTENT -// new { RolesId = "1", PermissionsId = "1" }, -// new { RolesId = "1", PermissionsId = "2" }, - -// // Content Manager: permisos adicionales -// new { RolesId = "2", PermissionsId = "5" }, -// new { RolesId = "2", PermissionsId = "3" }, -// new { RolesId = "2", PermissionsId = "4" }, -// new { RolesId = "2", PermissionsId = "9" }, -// new { RolesId = "2", PermissionsId = "8" }, - -// // Admin: permisos adicionales -// new { RolesId = "3", PermissionsId = "6" }, -// new { RolesId = "3", PermissionsId = "7" }, -// new { RolesId = "3", PermissionsId = "10" } -// ) -// ); - -// // Resto de configuraciones... -// base.OnModelCreating(modelBuilder); -// } -//} diff --git a/back/persistance/data/relations/TagRelationEstablisher.cs b/back/persistance/data/relations/TagRelationEstablisher.cs deleted file mode 100644 index 8930983..0000000 --- a/back/persistance/data/relations/TagRelationEstablisher.cs +++ /dev/null @@ -1,15 +0,0 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.relations; - -public class TagRelationEstablisher : IRelationEstablisher -{ - public void EstablishRelation(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.HasIndex(e => e.Name, "IX_Tags_Name").IsUnique(); - }); - } -} diff --git a/back/persistance/data/relations/UserRelationEstablisher.cs b/back/persistance/data/relations/UserRelationEstablisher.cs deleted file mode 100644 index 4c68898..0000000 --- a/back/persistance/data/relations/UserRelationEstablisher.cs +++ /dev/null @@ -1,32 +0,0 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.relations; - -public class UserRelationEstablisher : IRelationEstablisher -{ - public void EstablishRelation(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.IdNavigation).WithOne(p => p.User) - .HasForeignKey(d => d.Id) - .OnDelete(DeleteBehavior.ClientSetNull); - - entity.HasMany(d => d.Roles).WithMany(p => p.Users) - .UsingEntity>( - "UserRole", - r => r.HasOne().WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.ClientSetNull), - l => l.HasOne().WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.ClientSetNull), - j => - { - j.HasKey("UserId", "RoleId"); - j.ToTable("UserRoles"); - }); - }); - } -} diff --git a/back/persistance/data/repositories/Abstracts/IPermissionRepository.cs b/back/persistance/data/repositories/Abstracts/IPermissionRepository.cs deleted file mode 100644 index e85d8e1..0000000 --- a/back/persistance/data/repositories/Abstracts/IPermissionRepository.cs +++ /dev/null @@ -1,10 +0,0 @@ -using back.DataModels; -using DependencyInjector.Abstractions.Lifetimes; -using MCVIngenieros.Transactional.Abstractions.Interfaces; - -namespace back.persistance.data.repositories.Abstracts; - -public interface IPermissionRepository : IRepository, IScoped -{ - Task SeedDefaultPermissions(); -} diff --git a/back/persistance/data/repositories/Abstracts/IPersonRepository.cs b/back/persistance/data/repositories/Abstracts/IPersonRepository.cs deleted file mode 100644 index f28dcf3..0000000 --- a/back/persistance/data/repositories/Abstracts/IPersonRepository.cs +++ /dev/null @@ -1,10 +0,0 @@ -using back.DataModels; -using DependencyInjector.Abstractions.Lifetimes; -using MCVIngenieros.Transactional.Abstractions.Interfaces; - -namespace back.persistance.data.repositories.Abstracts; - -public interface IPersonRepository : IRepository, IScoped -{ - -} \ No newline at end of file diff --git a/back/persistance/data/repositories/Abstracts/IPhotoRepository.cs b/back/persistance/data/repositories/Abstracts/IPhotoRepository.cs deleted file mode 100644 index ed03f6b..0000000 --- a/back/persistance/data/repositories/Abstracts/IPhotoRepository.cs +++ /dev/null @@ -1,8 +0,0 @@ -using back.DataModels; -using DependencyInjector.Abstractions.Lifetimes; -using MCVIngenieros.Transactional.Abstractions.Interfaces; - -namespace back.persistance.data.repositories.Abstracts; - -public interface IPhotoRepository : IRepository, IScoped -{ } diff --git a/back/persistance/data/repositories/Abstracts/IRoleRepository.cs b/back/persistance/data/repositories/Abstracts/IRoleRepository.cs deleted file mode 100644 index 35b8b34..0000000 --- a/back/persistance/data/repositories/Abstracts/IRoleRepository.cs +++ /dev/null @@ -1,10 +0,0 @@ -using back.DataModels; -using DependencyInjector.Abstractions.Lifetimes; -using MCVIngenieros.Transactional.Abstractions.Interfaces; - -namespace back.persistance.data.repositories.Abstracts; - -public interface IRoleRepository : IRepository, IScoped -{ - Task SeedDefaultRoles(); -} diff --git a/back/persistance/data/repositories/Abstracts/IUserRepository.cs b/back/persistance/data/repositories/Abstracts/IUserRepository.cs deleted file mode 100644 index 6d39852..0000000 --- a/back/persistance/data/repositories/Abstracts/IUserRepository.cs +++ /dev/null @@ -1,14 +0,0 @@ -using back.DataModels; -using DependencyInjector.Abstractions.Lifetimes; -using MCVIngenieros.Transactional.Abstractions.Interfaces; - -namespace back.persistance.data.repositories.Abstracts; - -public interface IUserRepository : IRepository, IScoped -{ - Task GetByEmail(string email); - Task GetUserSaltByEmail(string email); - Task Login(string email, string password); - Task ExistsByEmail(string email); - //Task IsContentManager(string userId); -} diff --git a/back/persistance/data/repositories/PermissionRepository.cs b/back/persistance/data/repositories/PermissionRepository.cs deleted file mode 100644 index 3425e17..0000000 --- a/back/persistance/data/repositories/PermissionRepository.cs +++ /dev/null @@ -1,34 +0,0 @@ -using back.DataModels; -using back.persistance.data.repositories.Abstracts; -using MCVIngenieros.Transactional.Implementations.EntityFramework; - -namespace back.persistance.data.repositories; - -public class PermissionRepository(DataContext context) : ReadWriteRepository(context), IPermissionRepository -{ - // Implement methods specific to Photo repository if needed - public async Task SeedDefaultPermissions() - { - var defaultPermissions = new List - { - Permission.ViewContentPermission, - Permission.LikeContentPermission, - Permission.EditContentPermission, - Permission.DeleteContentPermission, - Permission.CreateContentPermission, - Permission.EditUserPermission, - Permission.DeleteUserPermission, - Permission.DisableUserPermission, - Permission.CreateUserPermission, - Permission.EditWebConfigPermission - }; - foreach (var permission in defaultPermissions) - { - if (!Entities.Any(p => p.Id == permission.Id)) - { - Entities.Add(permission); - } - } - await SaveChanges(); - } -} diff --git a/back/persistance/data/repositories/PersonRepository.cs b/back/persistance/data/repositories/PersonRepository.cs deleted file mode 100644 index b5e4def..0000000 --- a/back/persistance/data/repositories/PersonRepository.cs +++ /dev/null @@ -1,10 +0,0 @@ -using back.DataModels; -using back.persistance.data.repositories.Abstracts; -using MCVIngenieros.Transactional.Implementations.EntityFramework; - -namespace back.persistance.data.repositories; - -public class PersonRepository(DataContext context) : ReadWriteRepository(context), IPersonRepository -{ - // Implement methods specific to Photo repository if needed -} \ No newline at end of file diff --git a/back/persistance/data/repositories/PhotoRepository.cs b/back/persistance/data/repositories/PhotoRepository.cs deleted file mode 100644 index 36aee8a..0000000 --- a/back/persistance/data/repositories/PhotoRepository.cs +++ /dev/null @@ -1,10 +0,0 @@ -using back.DataModels; -using back.persistance.data.repositories.Abstracts; -using MCVIngenieros.Transactional.Implementations.EntityFramework; - -namespace back.persistance.data.repositories; - -public class PhotoRepository(DataContext context) : ReadWriteRepository(context), IPhotoRepository -{ - // Implement methods specific to Photo repository if needed -} diff --git a/back/persistance/data/repositories/RoleRepository.cs b/back/persistance/data/repositories/RoleRepository.cs deleted file mode 100644 index 206e31f..0000000 --- a/back/persistance/data/repositories/RoleRepository.cs +++ /dev/null @@ -1,27 +0,0 @@ -using back.DataModels; -using back.persistance.data.repositories.Abstracts; -using MCVIngenieros.Transactional.Implementations.EntityFramework; - -namespace back.persistance.data.repositories; - -public class RoleRepository(DataContext context) : ReadWriteRepository(context), IRoleRepository -{ - // Implement methods specific to Photo repository if needed - public async Task SeedDefaultRoles() - { - var defaultRoles = new List - { - Role.AdminRole, - Role.UserRole, - Role.ContentManagerRole - }; - foreach (var role in defaultRoles) - { - if (!Entities.Any(p => p.Id == role.Id)) - { - Entities.Add(role); - } - } - await SaveChanges(); - } -} diff --git a/back/persistance/data/repositories/UserRepository.cs b/back/persistance/data/repositories/UserRepository.cs deleted file mode 100644 index 0892aa0..0000000 --- a/back/persistance/data/repositories/UserRepository.cs +++ /dev/null @@ -1,75 +0,0 @@ -using back.DataModels; -using back.persistance.data.repositories.Abstracts; -using MCVIngenieros.Transactional.Implementations.EntityFramework; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.repositories; - -public class UserRepository( - DataContext context - ) : ReadWriteRepository(context), IUserRepository -{ - public async Task GetByEmail(string email) - { - try - { - if (string.IsNullOrEmpty(email)) return null; - return await Entities.FirstOrDefaultAsync(u => u.Email == email); - } - catch - { - return null; - } - } - - public async Task GetUserSaltByEmail(string email) - { - try - { - if (string.IsNullOrEmpty(email)) return string.Empty; - var user = await Entities.FirstOrDefaultAsync(u => u.Email == email); - return user?.Salt ?? string.Empty; - } - catch - { - return string.Empty; - } - } - - public async Task Login(string email, string password) - { - if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password)) return null; - try - { - return await Entities - .Include(u => u.Roles) - .ThenInclude(r => r.Permissions) - .FirstOrDefaultAsync(u => u.Email == email && u.Password == password); - } - catch - { - return null; - } - } - - public async Task ExistsByEmail(string email) - { - try - { - if (string.IsNullOrEmpty(email)) return false; - return await Entities.AnyAsync(u => u.Email == email); - } - catch - { - return false; - } - } - - //public async Task IsContentManager(string userId) - //{ - // var user = await GetById(userId); - // if (user == null) - // return false; - // return user.Roles.Any(role => role.IsContentManager() || role.IsAdmin()); - //} -} diff --git a/back/persistance/data/seeders/ISeeder.cs b/back/persistance/data/seeders/ISeeder.cs deleted file mode 100644 index ceda337..0000000 --- a/back/persistance/data/seeders/ISeeder.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.seeders; - -public interface ISeeder -{ - void Seed(ModelBuilder modelBuilder); -} diff --git a/back/persistance/data/seeders/PermissionSeeder.cs b/back/persistance/data/seeders/PermissionSeeder.cs deleted file mode 100644 index ab777ae..0000000 --- a/back/persistance/data/seeders/PermissionSeeder.cs +++ /dev/null @@ -1,23 +0,0 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.seeders; - -public class PermissionSeeder : ISeeder -{ - public void Seed(ModelBuilder modelBuilder) - { - modelBuilder.Entity().HasData( - Permission.ViewContentPermission, - Permission.LikeContentPermission, - Permission.EditContentPermission, - Permission.DeleteContentPermission, - Permission.CreateContentPermission, - Permission.EditUserPermission, - Permission.DeleteUserPermission, - Permission.DisableUserPermission, - Permission.CreateUserPermission, - Permission.EditWebConfigPermission - ); - } -} \ No newline at end of file diff --git a/back/persistance/data/seeders/RoleSeeder.cs b/back/persistance/data/seeders/RoleSeeder.cs deleted file mode 100644 index 06fcc86..0000000 --- a/back/persistance/data/seeders/RoleSeeder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using back.DataModels; -using Microsoft.EntityFrameworkCore; - -namespace back.persistance.data.seeders; - -public class RoleSeeder : ISeeder -{ - public void Seed(ModelBuilder modelBuilder) - { - modelBuilder.Entity().HasData( - new Role { Id = "1", Name = "User", Description = "Role for regular users", BaseRoleModelId = null }, - new Role { Id = "2", Name = "Content Manager", Description = "Role for managing content", BaseRoleModelId = "1" }, - new Role { Id = "3", Name = "Admin", Description = "Administrator role with full permissions", BaseRoleModelId = "2" } - ); - } -} \ No newline at end of file diff --git a/back/persistance/data/seeders/SystemUserSeeder.cs b/back/persistance/data/seeders/SystemUserSeeder.cs deleted file mode 100644 index 0f7ae32..0000000 --- a/back/persistance/data/seeders/SystemUserSeeder.cs +++ /dev/null @@ -1,14 +0,0 @@ -//using back.DataModels; -//using Microsoft.EntityFrameworkCore; - -//namespace back.persistance.data.seeders; - -//public class SystemUserSeeder : ISeeder -//{ -// public void Seed(ModelBuilder modelBuilder) -// { -// modelBuilder.Entity().HasData( -// User.SystemUser -// ); -// } -//} \ No newline at end of file diff --git a/back/services/bussines/Errors.cs b/back/services/bussines/Errors.cs deleted file mode 100644 index 866a7cd..0000000 --- a/back/services/bussines/Errors.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Net; - -namespace back.services.bussines; - -public static class Errors -{ - public static readonly HttpErrorMap Unauthorized = - new(HttpStatusCode.Unauthorized, "Invalid user data. Email or password are wrong."); - public static readonly HttpErrorMap BadRequest = - new(HttpStatusCode.BadRequest, "Missing user data."); -} \ No newline at end of file diff --git a/back/services/bussines/HttpErrorMap.cs b/back/services/bussines/HttpErrorMap.cs deleted file mode 100644 index 223d084..0000000 --- a/back/services/bussines/HttpErrorMap.cs +++ /dev/null @@ -1,5 +0,0 @@ -using System.Net; - -namespace back.services.bussines; - -public record HttpErrorMap(HttpStatusCode Code, string Description); diff --git a/back/services/bussines/PhotoService/IPhotoService.cs b/back/services/bussines/PhotoService/IPhotoService.cs deleted file mode 100644 index c7f725f..0000000 --- a/back/services/bussines/PhotoService/IPhotoService.cs +++ /dev/null @@ -1,15 +0,0 @@ -using back.DataModels; -using back.DTO; -using DependencyInjector.Abstractions.Lifetimes; - -namespace back.services.bussines.PhotoService; - -public interface IPhotoService: IScoped -{ - Task Create(PhotoFormModel form); - Task Delete(string id, string userId = "00000000-0000-0000-0000-000000000001"); - Task Get(string id, string userId = "00000000-0000-0000-0000-000000000001"); - Task<(string? mediaType, byte[]? fileBytes)> GetBytes(string id, string res = ""); - Task<(int totalItems, IEnumerable? pageData)> GetPage(int page, int pageSize); - Task Update(Photo photo, string userId = "00000000-0000-0000-0000-000000000001"); -} \ No newline at end of file diff --git a/back/services/bussines/PhotoService/PhotoService.cs b/back/services/bussines/PhotoService/PhotoService.cs deleted file mode 100644 index 215c3c2..0000000 --- a/back/services/bussines/PhotoService/PhotoService.cs +++ /dev/null @@ -1,82 +0,0 @@ -using back.DataModels; -using back.DTO; -using back.persistance.blob; -using back.persistance.data.repositories.Abstracts; - -namespace back.services.bussines.PhotoService; - -public class PhotoService( - IPhotoRepository photoRepository, - IUserRepository userRepository, - IBlobStorageService blobStorageService - ) : IPhotoService -{ - public async Task Create(PhotoFormModel form) - { - ArgumentNullException.ThrowIfNull(form); - if (form.Image == null || form.Image.Length == 0) - throw new ArgumentException("No image uploaded.", nameof(form)); - //if (string.IsNullOrEmpty(form.UserId) || await userRepository.IsContentManager(form.UserId)) - // throw new ArgumentException("Invalid user ID or user is not a content manager.", nameof(form.UserId)); - - - - throw new NotImplementedException(); - } - - public async Task Delete(string id, string userId = User.SystemUserId) - { - //if (string.IsNullOrEmpty(userId) || await userRepository.IsContentManager(userId)) - // throw new ArgumentException("Invalid user ID or user is not a content manager.", nameof(userId)); - photoRepository.Delete(id); - } - - public async Task Get(string id, string userId = User.SystemUserId) - { - Photo? photo = await photoRepository.GetById(id); - return photo; - //return photo?.CanBeSeenBy(userId) ?? false - // ? photo - // : null; - } - - public async Task<(string? mediaType, byte[]? fileBytes)> GetBytes(string id, string res = "") - { - var photo = await photoRepository.GetById(id); - if (photo == null) - return (null, null); - - string filePath = res.ToLower() switch - { - "high" => photo.HighResUrl, - "mid" => photo.MidResUrl, - "low" or _ => photo.LowResUrl - }; - - string? mediaType = res.ToLower() switch - { - "high" => $"image/{photo.Extension}", - "mid" or "low" or _ => "image/webp", - }; - - return ( - mediaType, - await blobStorageService.GetBytes(filePath) ?? throw new FileNotFoundException("File not found.", filePath) - ); - } - - public async Task<(int totalItems, IEnumerable? pageData)> GetPage(int page, int pageSize) - { - return ( - totalItems: await photoRepository.GetTotalItems(), - pageData: photoRepository.GetPage(page, pageSize) - ); - } - - public async Task Update(Photo photo, string userId = "00000000-0000-0000-0000-000000000001") - { - //if (string.IsNullOrEmpty(userId) || await userRepository.IsContentManager(userId)) - // throw new ArgumentException("Invalid user ID or user is not a content manager.", nameof(userId)); - return await photoRepository.Update(photo); - } -} diff --git a/back/services/bussines/UserService/IUserService.cs b/back/services/bussines/UserService/IUserService.cs deleted file mode 100644 index 0d576af..0000000 --- a/back/services/bussines/UserService/IUserService.cs +++ /dev/null @@ -1,13 +0,0 @@ -using back.DataModels; -using DependencyInjector.Abstractions.Lifetimes; - -namespace back.services.bussines.UserService; - -public interface IUserService: IScoped -{ - Task Create(string clientId, User user); - Task Login(string email, string password, string clientId); - Task SendResetPassword(string email); - Task Update(User user); - Task ValidateSystemUser(string email, string password, string systemKey, string clientId); -} \ No newline at end of file diff --git a/back/services/bussines/UserService/UserService.cs b/back/services/bussines/UserService/UserService.cs deleted file mode 100644 index 6f2e4f0..0000000 --- a/back/services/bussines/UserService/UserService.cs +++ /dev/null @@ -1,142 +0,0 @@ -using back.DataModels; -using back.persistance.blob; -using back.persistance.data.repositories.Abstracts; -using back.services.engine.Crypto; -using back.services.engine.mailing; -using System.Text; -using System.Text.Json; - -namespace back.services.bussines.UserService; - -public class UserService( - IUserRepository userRepository, ICryptoService cryptoService, - IEmailService emailService, - IBlobStorageService blobStorageService, - JsonSerializerOptions jsonSerializerOptions - ) : IUserService -{ - private readonly IUserRepository _repository = userRepository ?? throw new ArgumentNullException(nameof(userRepository)); - private readonly ICryptoService _cryptoService = cryptoService; - private readonly IEmailService _emailService = emailService; - private readonly IBlobStorageService _blobStorageService = blobStorageService; - - public async Task Create(string clientId, User user) - { - ArgumentNullException.ThrowIfNull(user); - - if (user.Id != null && await _repository.Exists(user.Id)) - { - return await _repository.GetById(user.Id); - } - if (string.IsNullOrEmpty(user.Email) || string.IsNullOrEmpty(user.Password)) - { - return null; - } - if (await _repository.Exists(user.Email)) - { - return await _repository.GetByEmail(user.Email); - } - - if (string.IsNullOrEmpty(user.Salt)) - { - user.Salt = _cryptoService.Salt(); - } - user.Password = _cryptoService.Decrypt(clientId, user.Password) ?? string.Empty; - user.Password = _cryptoService.HashPassword(user.Password, user.Salt) ?? string.Empty; - - user.CreatedAt = DateTimeOffset.UtcNow.ToString("dd-MM-yyyy HH:mm:ss zz"); - - //user.Roles.Add(Role.UserRole); - - await _repository.Insert(user); - await _repository.SaveChanges(); - return user; - } - - public async Task Update(User user) - { - ArgumentNullException.ThrowIfNull(user); - if (user.Id == null || !await _repository.Exists(user.Id)) - { - return null; - } - var existingUser = await _repository.GetById(user.Id); - if (existingUser == null) return null; - existingUser.Email = user.Email; - await _repository.Update(existingUser); - await _repository.SaveChanges(); - return existingUser; - } - - public async Task Login(string email, string decryptedPass) - { - var salt = await _repository.GetUserSaltByEmail(email); - var hashedPassword = _cryptoService.HashPassword(decryptedPass, salt); - var user = await _repository.Login(email, hashedPassword ?? string.Empty); - return user; - } - - public async Task Login(string email, string password, string clientId) - { - if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password)) return null; - - try - { - var decryptedPass = _cryptoService.Decrypt(clientId, password); - var user = await Login(email, decryptedPass ?? string.Empty); - return user; - } - catch - { - return null; - } - } - - public async Task SendResetPassword(string email) - { - var exists = await _repository.ExistsByEmail(email); - if (!exists) - { - return; - } - await _emailService.SendEmailAsync( - tos: email, - from: "admin@mmorales.photo", - subject: "Reset Password", - body: "If you received this email, it means that you have requested a password reset. Please follow the instructions in the email to reset your password." - ); - } - - public async Task ValidateSystemUser(string email, string password, string systemKey, string clientId) - { - var decryptedPassword = _cryptoService.Decrypt(clientId, password) ?? string.Empty; - var decryptedsystemKey = _cryptoService.Decrypt(clientId, systemKey) ?? string.Empty; - if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(decryptedPassword) || string.IsNullOrEmpty(decryptedsystemKey)) - { - return null; - } - if (!email.Equals(User.SystemUser.Email, StringComparison.InvariantCultureIgnoreCase)) - { - return null; - } - - var systemKeyBytes = await _blobStorageService.GetBytes("systemkey.lock"); - var systemKeyString = Encoding.UTF8.GetString(systemKeyBytes ?? []); - var systemKeyObject = JsonSerializer.Deserialize(systemKeyString, jsonSerializerOptions); - if (systemKeyObject == null || !systemKeyObject.IsValid(email, decryptedPassword, decryptedsystemKey)) - { - return null; - } - if (!await _repository.ExistsByEmail(email)) - { - return null; - } - var user = await _repository.GetByEmail(email); - if (user == null) - { - return null; - } - var loggedUser = await Login(user.Email!, decryptedPassword); - return loggedUser; - } -} diff --git a/back/services/engine/Crypto/CryptoService.cs b/back/services/engine/Crypto/CryptoService.cs deleted file mode 100644 index 39298a7..0000000 --- a/back/services/engine/Crypto/CryptoService.cs +++ /dev/null @@ -1,175 +0,0 @@ -using Microsoft.Extensions.Caching.Memory; -using System.Security.Cryptography; - -namespace back.services.engine.Crypto; - -public class CryptoService(IMemoryCache cache) : ICryptoService -{ - private readonly IMemoryCache _cache = cache; - private readonly MemoryCacheEntryOptions _CacheOptions = new() - { - AbsoluteExpiration = DateTimeOffset.Now.AddHours(1), - AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1), - SlidingExpiration = TimeSpan.FromMinutes(30), - Priority = CacheItemPriority.High, - PostEvictionCallbacks = - { - new PostEvictionCallbackRegistration - { - EvictionCallback = (key, value, reason, state) => - { - var clientId = key.ToString()?.Replace("_public","").Replace("_private",""); - if(string.IsNullOrEmpty(clientId)) { return; } - // Handle the eviction of the certificate - removing public/private keys from the cache - try{ cache.Remove($"{clientId}_public"); } catch{ } - try{ cache.Remove($"{clientId}_private"); } catch{ } - } - } - } - }; - - public string? Encrypt(string clientId,string plainText) - { - // get keys from cache - if (!_cache.TryGetValue($"{clientId}_private", out string? privateCert) || string.IsNullOrEmpty(privateCert)) - { - throw new InvalidOperationException("Private certificate not found for the client."); - } - if (!_cache.TryGetValue($"{clientId}_public", out string? publicCert) || string.IsNullOrEmpty(publicCert)) - { - throw new InvalidOperationException("Public certificate not found for the client."); - } - // import rsa keys and configure RSA for encryption - using var rsa = RSA.Create(2048); - rsa.ImportSubjectPublicKeyInfo(Convert.FromBase64String(publicCert), out _); - rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateCert), out _); - // Encrypt the plain text using RSA - string? encryptedText = null; - try - { - var plainBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - var encryptedBytes = rsa.Encrypt(plainBytes, RSAEncryptionPadding.OaepSHA256); - encryptedText = Convert.ToBase64String(encryptedBytes); - } - catch (CryptographicException ex) - { - // Handle encryption errors - throw new InvalidOperationException("Encryption failed.", ex); - } - return encryptedText; - } - - public string? Decrypt(string clientId, string encryptedText) - { - // get keys from cache - if (!_cache.TryGetValue($"{clientId}_private", out string? privateCert) || string.IsNullOrEmpty(privateCert)) - { - throw new InvalidOperationException("Private certificate not found for the client."); - } - if (!_cache.TryGetValue($"{clientId}_public", out string? publicCert) || string.IsNullOrEmpty(publicCert)) - { - throw new InvalidOperationException("Private certificate not found for the client."); - } - // import rsa keys and configure RSA for decryption - using var rsa = RSA.Create(2048); - rsa.ImportSubjectPublicKeyInfo(Convert.FromBase64String(publicCert), out _); - rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateCert), out _); - // Decrypt the encrypted text using RSA - string? plainText = null; - try - { - var encryptedBytes = Convert.FromBase64String(encryptedText); - var decryptedBytes = rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.OaepSHA256); - plainText = System.Text.Encoding.UTF8.GetString(decryptedBytes); - } - catch (CryptographicException ex) - { - // Handle decryption errors - throw new InvalidOperationException("Decryption failed.", ex); - } - return plainText; - } - - public string GetPublicCertificate(string clientId) - { - if (_cache.TryGetValue($"{clientId}_public", out string? publicCert) && !string.IsNullOrEmpty(publicCert)) - { - return publicCert; - } - (publicCert, string privateCert) = GenerateCertificate(); - _cache.Set($"{clientId}_public", publicCert, _CacheOptions); - _cache.Set($"{clientId}_private", privateCert, _CacheOptions); - return publicCert; - } - - public string GetPrivateCertificate(string clientId) - { - if (_cache.TryGetValue($"{clientId}_private", out string? privateCert) && !string.IsNullOrEmpty(privateCert)) - { - return privateCert; - } - (string publicCert, privateCert) = GenerateCertificate(); - _cache.Set($"{clientId}_public", publicCert, _CacheOptions); - _cache.Set($"{clientId}_private", privateCert, _CacheOptions); - return privateCert; - } - - private static (string publicCert, string privateCert) GenerateCertificate() - { - // Generate a new RSA key pair for the client - using var rsa = RSA.Create(2048); - var publicKey = rsa.ExportSubjectPublicKeyInfo(); - var privateKey = rsa.ExportRSAPrivateKey(); - // Convert to Base64 strings for storage - var publicCert = Convert.ToBase64String(publicKey); - var privateCert = Convert.ToBase64String(privateKey); - return (publicCert, privateCert); - } - - public string? Hash(string plainText) - { - string? hash = null; - if (string.IsNullOrEmpty(plainText)) - { - return hash; - } - var plainBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - var hashBytes = SHA256.HashData(plainBytes); - hash = Convert.ToBase64String(hashBytes); - return hash; - } - - public bool VerifyHash(string plainText, string hash) - { - var plainTextHash = Hash(plainText); - if (string.IsNullOrEmpty(plainTextHash) || string.IsNullOrEmpty(hash)) - { - return false; - } - return plainTextHash.Equals(hash, StringComparison.OrdinalIgnoreCase); - } - - public string Pepper() - { - // get pepper from environtment variable - var pepper = Environment.GetEnvironmentVariable("PEPPER"); - if (string.IsNullOrEmpty(pepper)) - { - return "BactilForteFlash20mg"; - } - return pepper; - } - - public string Salt() - { - var saltBytes = new byte[32]; // 256 bits - using var rng = RandomNumberGenerator.Create(); - rng.GetBytes(saltBytes); - return Convert.ToBase64String(saltBytes); - } - - public string? HashPassword(string plainPassword, string plainSalt) - { - return Hash($"{plainPassword}{plainSalt}{Pepper()}"); - } -} \ No newline at end of file diff --git a/back/services/engine/Crypto/ICryptoService.cs b/back/services/engine/Crypto/ICryptoService.cs deleted file mode 100644 index 224a286..0000000 --- a/back/services/engine/Crypto/ICryptoService.cs +++ /dev/null @@ -1,16 +0,0 @@ -using DependencyInjector.Abstractions.Lifetimes; - -namespace back.services.engine.Crypto; - -public interface ICryptoService : ISingleton -{ - string? Encrypt(string clientId, string plainText); - string? Decrypt(string clientId, string encryptedText); - string? Hash(string plainText); - string? HashPassword(string? plainPassword, string? plainSalt); - bool VerifyHash(string plainText, string hash); - string Salt(); - string Pepper(); - string GetPublicCertificate(string clientId); - string GetPrivateCertificate(string clientId); -} \ No newline at end of file diff --git a/back/services/engine/ImageResizer/IImageResizer.cs b/back/services/engine/ImageResizer/IImageResizer.cs deleted file mode 100644 index 02f6de5..0000000 --- a/back/services/engine/ImageResizer/IImageResizer.cs +++ /dev/null @@ -1,8 +0,0 @@ -using DependencyInjector.Abstractions.Lifetimes; - -namespace back.services.engine.ImageResizer; - -public interface IImageResizer : ISingleton -{ - Task ResizeImage(IFormFile image, int v); -} diff --git a/back/services/engine/ImageResizer/ImageResizer.cs b/back/services/engine/ImageResizer/ImageResizer.cs deleted file mode 100644 index b45edce..0000000 --- a/back/services/engine/ImageResizer/ImageResizer.cs +++ /dev/null @@ -1,23 +0,0 @@ -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Processing; - -namespace back.services.engine.ImageResizer; - -public sealed class ImageResizer : IImageResizer -{ - public async Task ResizeImage(IFormFile image, int maxRes) - { - if (image == null || image.Length == 0) - { - throw new ArgumentException("Invalid image file."); - } - using var inputStream = image.OpenReadStream(); - using var outputStream = new MemoryStream(); - using var img = Image.Load(inputStream); - - img.Mutate(x => x.Resize(new ResizeOptions { Size = new Size(maxRes, 0), Mode = ResizeMode.Max })); - await img.SaveAsWebpAsync(outputStream); - outputStream.Position = 0; - return outputStream; - } -} \ No newline at end of file diff --git a/back/services/engine/PasswordGenerator/IPasswordGenerator.cs b/back/services/engine/PasswordGenerator/IPasswordGenerator.cs deleted file mode 100644 index bcc7d97..0000000 --- a/back/services/engine/PasswordGenerator/IPasswordGenerator.cs +++ /dev/null @@ -1,8 +0,0 @@ -using DependencyInjector.Abstractions.Lifetimes; - -namespace back.services.engine.PasswordGenerator; - -public interface IPasswordGenerator : ISingleton -{ - string Generate(int length, bool includeNumbers = true, bool includeMayus = true, bool includeMinus = true, bool includeSpecials = true); -} \ No newline at end of file diff --git a/back/services/engine/PasswordGenerator/PasswordGenerator.cs b/back/services/engine/PasswordGenerator/PasswordGenerator.cs deleted file mode 100644 index 1426aa6..0000000 --- a/back/services/engine/PasswordGenerator/PasswordGenerator.cs +++ /dev/null @@ -1,40 +0,0 @@ -namespace back.services.engine.PasswordGenerator; - -public class PasswordGenerator : IPasswordGenerator -{ - public string Generate(int length, bool includeNumbers = true, bool includeMayus = true, bool includeMinus = true, bool includeSpecials = true) - { - const string numbers = "0123456789"; - const string mayus = "ABCÇDEFGHIJKLMNÑOPQRSTUVWXYZ"; - const string minus = "abcçdefghijklmnñopqrstuvwxyz"; - const string specials = "!@#$%^&*()_+[]{}|;:,.<>?"; - var characters = minus; - if (includeNumbers) characters += numbers; - if (includeMayus) characters += mayus; - if (includeSpecials) characters += specials; - var random = new Random((int)DateTimeOffset.UtcNow.Ticks); - var password = new char[length]; - - for (int i = 0; i < length; i++) - { - password[i] = characters[random.Next(characters.Length)]; - } - - var positionPool = new List(); - for (int i = 0; i < length; i++) positionPool.Add(i); - var forcedRandomNumber = random.Next(0, positionPool.Count); - positionPool.RemoveAt(forcedRandomNumber); - var forcedRandomMayus = random.Next(0, positionPool.Count); - positionPool.RemoveAt(forcedRandomMayus); - var forcedRandomMinus = random.Next(0, positionPool.Count); - positionPool.RemoveAt(forcedRandomMinus); - var forcedRandomSpecial = random.Next(0, positionPool.Count); - positionPool.RemoveAt(forcedRandomSpecial); - - password[forcedRandomNumber] = numbers[random.Next(numbers.Length)]; - password[forcedRandomMayus] = mayus[random.Next(mayus.Length)]; - password[forcedRandomMinus] = minus[random.Next(minus.Length)]; - password[forcedRandomSpecial] = specials[random.Next(specials.Length)]; - return new string(password); - } -} diff --git a/back/services/engine/SystemUser/ISystemUserGenerator.cs b/back/services/engine/SystemUser/ISystemUserGenerator.cs deleted file mode 100644 index 01cb831..0000000 --- a/back/services/engine/SystemUser/ISystemUserGenerator.cs +++ /dev/null @@ -1,8 +0,0 @@ -using DependencyInjector.Abstractions.Lifetimes; - -namespace back.services.engine.SystemUser; - -public interface ISystemUserGenerator: IScoped -{ - Task GenerateAsync(); -} \ No newline at end of file diff --git a/back/services/engine/SystemUser/SystemUserGenerator.cs b/back/services/engine/SystemUser/SystemUserGenerator.cs deleted file mode 100644 index dd704b9..0000000 --- a/back/services/engine/SystemUser/SystemUserGenerator.cs +++ /dev/null @@ -1,60 +0,0 @@ -using back.DataModels; -using back.persistance.blob; -using back.persistance.data; -using back.persistance.data.repositories.Abstracts; -using back.services.engine.Crypto; -using back.services.engine.PasswordGenerator; -using MCVIngenieros.Transactional.Abstractions.Interfaces; -using System.Text.Json; - -namespace back.services.engine.SystemUser; - -public class SystemUserGenerator( - ITransactionalService transactional, - JsonSerializerOptions jsonSerializerOptions, - IUserRepository userRepository, - IPersonRepository personRepository, - IRoleRepository roleRepository, - IPermissionRepository permissionRepository, - ICryptoService cryptoService, - IBlobStorageService blobStorageService, - IPasswordGenerator passwordGenerator) : ISystemUserGenerator -{ - public async Task GenerateAsync() - { - var systemKey = new SystemKey() - { - Password = passwordGenerator.Generate(16), - }; - var systemKeyJson = JsonSerializer.Serialize(systemKey, options: jsonSerializerOptions); - - using Stream stream = new MemoryStream(new System.Text.UTF8Encoding(true).GetBytes(systemKeyJson)); - - await blobStorageService.Delete("systemkey.lock"); - - await blobStorageService.Save( - stream, - "systemkey.lock" - ); - - User.SystemUser.Password = systemKey.Password; - User.SystemUser.Salt = cryptoService.Salt(); - User.SystemUser.Password = cryptoService.HashPassword(User.SystemUser.Password, User.SystemUser.Salt) ?? string.Empty; - - if (!await userRepository.Exists(User.SystemUser.Id!)) - { - await transactional.DoTransaction(async () => - { - await permissionRepository.SeedDefaultPermissions(); - await roleRepository.SeedDefaultRoles(); - await personRepository.Insert(Person.SystemPerson); - await userRepository.Insert(User.SystemUser); - }); - } - else - { - await userRepository.Update(User.SystemUser); - await userRepository.SaveChanges(); - } - } -} \ No newline at end of file diff --git a/back/services/engine/mailing/EmailService.cs b/back/services/engine/mailing/EmailService.cs deleted file mode 100644 index bdc1089..0000000 --- a/back/services/engine/mailing/EmailService.cs +++ /dev/null @@ -1,66 +0,0 @@ -using back.Options; -using Microsoft.Extensions.Options; -using System.Net; -using System.Net.Mail; - -namespace back.services.engine.mailing; - -public class EmailService(IOptions options) : IEmailService -{ - public async Task SendEmailAsync(List tos, string from, string subject, string body, Dictionary? attachments = null, CancellationToken cancellationToken = default) - { - try - { - await Parallel.ForEachAsync(tos, async (to, cancellationToken) => { - await SendEmailAsync(to, from, subject, body, attachments, cancellationToken); - }); - } - catch (Exception ex) - { - // Log the exception or handle it as needed - Console.WriteLine($"Error sending email to multiple recipients: {ex.Message}"); - } - } - public async Task SendEmailAsync(string to, string from, string subject, string body, Dictionary? attachments = null, CancellationToken cancellationToken = default) - { - try - { - using var message = new MailMessage(); - message.From = new MailAddress(from); - message.To.Add(to); - message.Subject = subject; - message.Body = body; - message.IsBodyHtml = true; - message.Priority = MailPriority.Normal; - message.DeliveryNotificationOptions = DeliveryNotificationOptions.Never; - - if (attachments != null) - { - foreach (var attachment in attachments) - { - if (attachment.Value is FileStream fileStream) - { - message.Attachments.Add(new Attachment(fileStream, attachment.Key)); - } - if (attachment.Value is string filePath && File.Exists(filePath)) - { - message.Attachments.Add(new Attachment(filePath)); - } - } - } - - using var cliente = new SmtpClient(options.Value.SmtpServer, options.Value.Puerto); - cliente.UseDefaultCredentials = false; - cliente.Credentials = new NetworkCredential(options.Value.Usuario, options.Value.Password); - cliente.EnableSsl = options.Value.EnableSsl; - cliente.DeliveryMethod = SmtpDeliveryMethod.Network; - - await cliente.SendMailAsync(message, cancellationToken); - } - catch (Exception ex) - { - // Log the exception or handle it as needed - Console.WriteLine($"Error sending email: {ex.Message}"); - } - } -} diff --git a/back/services/engine/mailing/IEmailService.cs b/back/services/engine/mailing/IEmailService.cs deleted file mode 100644 index ecfec68..0000000 --- a/back/services/engine/mailing/IEmailService.cs +++ /dev/null @@ -1,9 +0,0 @@ -using DependencyInjector.Abstractions.Lifetimes; - -namespace back.services.engine.mailing; - -public interface IEmailService : IScoped -{ - Task SendEmailAsync(List tos, string from, string subject, string body, Dictionary? attachments = null, CancellationToken cancellationToken = default); - Task SendEmailAsync(string tos, string from, string subject, string body, Dictionary? attachments = null, CancellationToken cancellationToken = default); -} diff --git a/backend/Presentation/Controllers/AuthController.cs b/backend/Presentation/Controllers/AuthController.cs deleted file mode 100644 index aa5a22e..0000000 --- a/backend/Presentation/Controllers/AuthController.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace Presentation.Controllers; - -public class AuthController : Controller -{ - -} diff --git a/backend/Presentation/Infraestructura/Responses/ExecutionError.cs b/backend/Presentation/Infraestructura/Responses/ExecutionError.cs deleted file mode 100644 index 61c9d3a..0000000 --- a/backend/Presentation/Infraestructura/Responses/ExecutionError.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Presentation.Infraestructura.Responses; - -public sealed class ExecutionError(string message) -{ - public string Message { get; set; } = message; -} diff --git a/backend/Presentation/Infraestructura/Responses/Response.cs b/backend/Presentation/Infraestructura/Responses/Response.cs deleted file mode 100644 index 7c896cd..0000000 --- a/backend/Presentation/Infraestructura/Responses/Response.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Net; - -namespace Presentation.Infraestructura.Responses; - -public sealed class Response -{ - public bool IsSuccess { get; set; } - public HttpStatusCode StatusCode { get; set; } - public T? Data { get; set; } - public ValidationError[]? ValidationErrors { get; set; } - public ExecutionError[]? ExecutionErrors { get; set; } - - public static Response Success(T result, HttpStatusCode statusCode = HttpStatusCode.OK) => - new() - { - IsSuccess = true, - StatusCode = statusCode, - Data = result - }; - - public static Response Failure(HttpStatusCode statusCode = HttpStatusCode.InternalServerError, ValidationError[]? validationErrors = null, ExecutionError[]? executionErrors = null) => - new() - { - IsSuccess = false, - StatusCode = statusCode, - ValidationErrors = validationErrors, - ExecutionErrors = executionErrors - }; -} \ No newline at end of file diff --git a/backend/Presentation/Infraestructura/Responses/ValidationError.cs b/backend/Presentation/Infraestructura/Responses/ValidationError.cs deleted file mode 100644 index fea7ef2..0000000 --- a/backend/Presentation/Infraestructura/Responses/ValidationError.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Presentation.Infraestructura.Responses; - -public sealed class ValidationError(string fieldName, string message) -{ - public string Field { get; set; } = fieldName; - public string Message { get; set; } = message; -} diff --git a/backend/Presentation/Presentation.csproj b/backend/Presentation/Presentation.csproj deleted file mode 100644 index f1ec019..0000000 --- a/backend/Presentation/Presentation.csproj +++ /dev/null @@ -1,34 +0,0 @@ - - - - net9.0 - enable - enable - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/backend/Presentation/Program.cs b/backend/Presentation/Program.cs deleted file mode 100644 index e95a90f..0000000 --- a/backend/Presentation/Program.cs +++ /dev/null @@ -1,96 +0,0 @@ -using OpenTelemetry.Resources; -using OpenTelemetry.Trace; -using Serilog; -using Serilog.Events; -using Serilog.Sinks.OpenTelemetry; - -namespace Presentation -{ - public class Program - { - public static void Main(string[] args) - { - // Configura Serilog como logger global antes de crear el builder - Log.Logger = new LoggerConfiguration() - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .Enrich.FromLogContext() - .WriteTo.Console() - .WriteTo.OpenTelemetry(options => - { - options.Endpoint = "http://localhost:4317"; // OTLP endpoint - options.Protocol = OtlpProtocol.Grpc; - options.ResourceAttributes = new Dictionary - { - ["service.name"] = "mmorales.photo-backend" - }; - }) - .CreateLogger(); - - try - { - Log.Information("Starting up"); - var builder = WebApplication.CreateBuilder(args); - builder.Host.UseSerilog(); // Usa Serilog como proveedor de logs por defecto - - builder.Services.AddProblemDetails(options => - options.CustomizeProblemDetails = - ctx => ctx.ProblemDetails.Extensions.Add("traceId", ctx.HttpContext.TraceIdentifier) - ); - builder.Services.AddOpenTelemetry() - .WithTracing(tracerProviderBuilder => - { - tracerProviderBuilder - .SetResourceBuilder(ResourceBuilder.CreateDefault() - .AddService(builder.Environment.ApplicationName)) - .AddAspNetCoreInstrumentation() // Traza todas las peticiones HTTP entrantes - .AddHttpClientInstrumentation() // Traza las llamadas HttpClient salientes - .AddOtlpExporter(opt => - { - opt.Endpoint = new Uri("http://localhost:4317"); // Direccin del colector OTel - }) - .AddConsoleExporter(); // Exporta trazas tambin a consola para desarrollo - }); - // Add services to the container. - - builder.Services.AddControllers(); - // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi - builder.Services.AddOpenApi(); - - var app = builder.Build(); - if (!app.Environment.IsDevelopment()) - { - app.UseExceptionHandler(); - app.UseHsts(); - } - app.UseStatusCodePages(); - - app.UseAuthentication(); // Habilita autenticacin - app.UseAuthorization(); // Habilita autorizacin - - // Configure the HTTP request pipeline. - if (app.Environment.IsDevelopment()) - { - app.MapOpenApi(); - } - - app.UseHttpsRedirection(); - - app.UseAuthorization(); - - - app.MapControllers(); - - app.Run(); - } - catch (Exception ex) - { - Log.Fatal(ex, "Application start-up failed"); - throw; - } - finally - { - Log.CloseAndFlush(); - } - } - } -} diff --git a/backend/Presentation/Properties/launchSettings.json b/backend/Presentation/Properties/launchSettings.json deleted file mode 100644 index 64271a2..0000000 --- a/backend/Presentation/Properties/launchSettings.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "http://localhost:5101", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "https://localhost:7265;http://localhost:5101", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/backend/Presentation/appsettings.Development.json b/backend/Presentation/appsettings.Development.json deleted file mode 100644 index 0c208ae..0000000 --- a/backend/Presentation/appsettings.Development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/backend/Presentation/appsettings.json b/backend/Presentation/appsettings.json deleted file mode 100644 index 10f68b8..0000000 --- a/backend/Presentation/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} diff --git a/bd/.gitkeep b/docs/analisis-funcional.md similarity index 100% rename from bd/.gitkeep rename to docs/analisis-funcional.md diff --git a/front/v2/public/assets/icons/clean_svgs.ps1 b/docs/analisis-tecnico.md similarity index 100% rename from front/v2/public/assets/icons/clean_svgs.ps1 rename to docs/analisis-tecnico.md diff --git a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.scss b/docs/cronograma.md similarity index 100% rename from front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.scss rename to docs/cronograma.md diff --git a/docs/front/frontend-documentation.md b/docs/front/frontend-documentation.md deleted file mode 100644 index 468bf95..0000000 --- a/docs/front/frontend-documentation.md +++ /dev/null @@ -1,69 +0,0 @@ -# Documentación del Frontend - -## **Tecnología Base** - -- **Framework:** Angular 20 -- **Lenguaje:** TypeScript -- **Estilos:** SCSS -- **Gestión de Estado:** RxJS (si aplica) -- **Rutas:** Angular Router - -## **Estructura del Proyecto** - -El proyecto estará organizado en módulos y componentes para maximizar la reutilización y la escalabilidad. La estructura inicial será: - -```FileSystem -src/ - app/ - core/ # Servicios y lógica compartida - shared/ # Componentes y directivas reutilizables - features/ # Módulos específicos de características - home/ # Página principal - gallery/ # Página de galería - profile/ # Página de perfil - app-routing.module.ts - app.module.ts - assets/ # Recursos estáticos como imágenes - environments/ # Configuraciones de entorno -``` - -## **Componentes Principales** - -### **Menú de Navegación (`MenuComponent`)** - -- **Descripción:** Componente para la navegación entre las diferentes secciones de la aplicación. -- **Propiedades:** - - `links: Array<{ label: string, route: string }>`: Lista de enlaces. -- **Eventos:** - - `onLinkClick`: Evento emitido al hacer clic en un enlace. - -### **Galería (`GalleryComponent`)** - -- **Descripción:** Componente para mostrar una colección de imágenes. -- **Propiedades:** - - `images: Array<{ src: string, alt: string }>`: Lista de imágenes. -- **Eventos:** - - `onImageClick`: Evento emitido al seleccionar una imagen. - -### **Imagen (`ImageComponent`)** - -- **Descripción:** Componente para mostrar una imagen individual. -- **Propiedades:** - - `src: string`: URL de la imagen. - - `alt: string`: Texto alternativo. -- **Eventos:** - - `onClick`: Evento emitido al hacer clic en la imagen. - -### **Pie de Página (`FooterComponent`)** - -- **Descripción:** Componente para mostrar información adicional en la parte inferior de la página. -- **Propiedades:** - - `links: Array<{ label: string, url: string }>`: Enlaces a recursos externos. - -### **Página Principal (`HomePageComponent`)** - -- **Descripción:** Página que combina el menú, la galería y el pie de página. -- **Componentes Hijos:** - - `MenuComponent` - - `GalleryComponent` - - `FooterComponent` diff --git a/front/v2/src/app/global-components/events-link/events-link.scss b/docs/index.md similarity index 100% rename from front/v2/src/app/global-components/events-link/events-link.scss rename to docs/index.md diff --git a/docs/introduccion.md b/docs/introduccion.md new file mode 100644 index 0000000..e584c2c --- /dev/null +++ b/docs/introduccion.md @@ -0,0 +1,56 @@ +# Galerías Fotográficas + +--- + +## Que problema identificamos + +Existen multiples alternativas para la distribución de imágenes digitales, como redes sociales o proveedores de almacenamiento en la nube. +Las redes sociales exponen publicamente y con poco control el contenido de las imágenes. +Los proveedores de almacenamiento ofrecen un control mayor sobre la exposición de las imágenes a cambio de una suscripción o pago por uso. + +Como profesional que espera cobrar por el trabajo, publicar fotos privadas en redes sociales abre camino a múltiples problemas: perdida de privacidad para el cliente, mala exposición y pobre posicionamiento web, perdida de calidad en la imágen, se impide reutilizar la imagen con otros fines sin herramientas de terceros que pueden ser perjudiciales para clientes y profesionales. +Usar proveedores como WeTransfer, Google Drive o Dropbox, requiere de pagos y un conocimiento mínimo sobre el uso de estos servicios por parte del cliente; además, para ahorrar costes los profesionales deben eliminar los grupos de imágenes con cierta frequencia o fracturar por tiempo de almacenamiento al cliente. +Ambas opciones limitan la cooperatividad y la recuperación de las imágenes por parte del cliente. +Además, expone fácilmente al profesional a varios riesgos y problemáticas emergentes con la evolución constante del software: la perdida de credenciales, el robo de identidad, el plagio, la pérdida de control sobre la calidad de transmisión de la imagen. + +Como cliente, recibir una sesión por WeTransfer limita las opciones de feedback y mejora o personalización. Recibirla por correo electrónico limita la cantidad de imágenes recibidas. Recibirlas por Google Drive o similares nos quita espacio de nuestro almacenamiento en la nube. Si el profesional publica las imágenes, referenciándos puede afectar a nuestra huella digital e imagen en redes. +Además, según la configuración del servicio que use el profesional, es común tener a disposición las imágenes solamente durante un tiempo determinado, haciendo imposible recuperarlas o acceder a ellas pasado ese tiempo. + +Ambos participantes de la actividad recaen en un moderno problema: necesitar diversos servicios para controlar un único recurso. +Como profesional, necesitas una web-portfolio, un perfil en redes, un servicio de almacenamiento y una forma de contacto con el cliente. +Como cliente, necesitas poder ver el trabajo anterior del profesional, contactar con él y poder revisar el trabajo de forma conjunta para lograr el resultado que uno espera. + +## Que queremos resolver + +Desde el punto de vista del profesional, podemos agrupar todos los servicios en un único servico. +Una especie de Amazon para imágenes. + +Desde el punto de vista del cliente, agrupandolo todo, evitamos la necesidad de acceder a tantos servicios diferentes y familiarizamos al usuario con una interfaz sencilla y directa, minimizando el roce con el aplicativo. + +## Alternativas a nuestra solución + +Existen multitud de alternativas a una web hecha a mano, como Wix o Joomla. +Existen alternativas cloud-native para alojar un portfolio. +Existen muchos proveedores de almacenamiento web. +Existen muchas redes sociales donde compartir las imágenes. +Existen metodos de comunicación y trabajo colaborativo. +En su gran mayoría, en servicios diferenciados. +Sin embargo no existe servicios unificados. + +--- + +## Despiece del problema + +### Almacenamiento + +El profesional no quiere tener que gastar en almacenamiento ni preocuparse del estado de un proveedor. +Por tanto, el sistema tiene que poder almacenar las imágenes durante mucho tiempo y mantenerlas en linea el mismo tiempo. + +### Distribución + +El profesional no quiere tener que usar más de un servicio para enviar las imágenes al cliente o subirlas a redes sociales. +El cliente no quiere recibir las imágenes en un zip o tener que descargarlas desde un servicio de terceros. + +### Trabajo colaborativo + +El profesional quiere que el cliente escoja la imagen que más el guste y le ayude a diff --git a/front/v2/src/app/global-components/services-link/services-link.scss b/docs/manual-usuario.md similarity index 100% rename from front/v2/src/app/global-components/services-link/services-link.scss rename to docs/manual-usuario.md diff --git a/front/v2/src/app/global-components/tags-link/tags-link.scss b/docs/plan-proyecto.md similarity index 100% rename from front/v2/src/app/global-components/tags-link/tags-link.scss rename to docs/plan-proyecto.md diff --git a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.scss b/docs/pruebas.md similarity index 100% rename from front/v2/src/app/global-components/user-galleries-link/user-galleries-link.scss rename to docs/pruebas.md diff --git a/front/v2/src/app/views/admin-view/admin-view.scss b/docs/requisitos.md similarity index 100% rename from front/v2/src/app/views/admin-view/admin-view.scss rename to docs/requisitos.md diff --git a/docs/resources/root/architecturalComponentLayout.svg b/docs/resources/root/architecturalComponentLayout.svg deleted file mode 100644 index 930b57f..0000000 --- a/docs/resources/root/architecturalComponentLayout.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/front/v1/.editorconfig b/front/v1/.editorconfig deleted file mode 100644 index d92628d..0000000 --- a/front/v1/.editorconfig +++ /dev/null @@ -1,17 +0,0 @@ -# Editor configuration, see https://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = tab -indent_size = 4 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.ts] -quote_type = single -ij_typescript_use_double_quotes = false - -[*.md] -max_line_length = off -trim_trailing_whitespace = false diff --git a/front/v1/.gitignore b/front/v1/.gitignore deleted file mode 100644 index cc7b141..0000000 --- a/front/v1/.gitignore +++ /dev/null @@ -1,42 +0,0 @@ -# See https://docs.github.com/get-started/getting-started-with-git/ignoring-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 diff --git a/front/v1/.vscode/extensions.json b/front/v1/.vscode/extensions.json deleted file mode 100644 index 77b3745..0000000 --- a/front/v1/.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/front/v1/.vscode/launch.json b/front/v1/.vscode/launch.json deleted file mode 100644 index 925af83..0000000 --- a/front/v1/.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/front/v1/.vscode/tasks.json b/front/v1/.vscode/tasks.json deleted file mode 100644 index a298b5b..0000000 --- a/front/v1/.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/front/v1/README.md b/front/v1/README.md deleted file mode 100644 index c23c618..0000000 --- a/front/v1/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# Front - -This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.0.2. - -## Development server - -To start a local development server, run: - -```bash -ng serve -``` - -Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files. - -## Code scaffolding - -Angular CLI includes powerful code scaffolding tools. To generate a new component, run: - -```bash -ng generate component component-name -``` - -For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: - -```bash -ng generate --help -``` - -## Building - -To build the project run: - -```bash -ng build -``` - -This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed. - -## Running unit tests - -To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command: - -```bash -ng test -``` - -## Running end-to-end tests - -For end-to-end (e2e) testing, run: - -```bash -ng e2e -``` - -Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. - -## Additional Resources - -For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/front/v1/angular.json b/front/v1/angular.json deleted file mode 100644 index 3b5c3a4..0000000 --- a/front/v1/angular.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "front": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "style": "scss" - } - }, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular/build:application", - "options": { - "browser": "src/main.ts", - "polyfills": [ - "zone.js" - ], - "tsConfig": "tsconfig.app.json", - "inlineStyleLanguage": "scss", - "assets": [ - { - "glob": "**/*", - "input": "public" - } - ], - "styles": [ - "src/styles.scss" - ] - }, - "configurations": { - "production": { - "budgets": [ - { - "type": "initial", - "maximumWarning": "500kB", - "maximumError": "1MB" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "4kB", - "maximumError": "10kB" - } - ], - "outputHashing": "all" - }, - "development": { - "optimization": false, - "extractLicenses": false, - "sourceMap": true - } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular/build:dev-server", - "configurations": { - "production": { - "buildTarget": "front:build:production" - }, - "development": { - "buildTarget": "front:build:development" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular/build:extract-i18n" - }, - "test": { - "builder": "@angular/build:karma", - "options": { - "polyfills": [ - "zone.js", - "zone.js/testing" - ], - "tsConfig": "tsconfig.spec.json", - "inlineStyleLanguage": "scss", - "assets": [ - { - "glob": "**/*", - "input": "public" - } - ], - "styles": [ - "src/styles.scss" - ] - } - } - } - } - } -} diff --git a/front/v1/package-lock.json b/front/v1/package-lock.json deleted file mode 100644 index ad70841..0000000 --- a/front/v1/package-lock.json +++ /dev/null @@ -1,9738 +0,0 @@ -{ - "name": "front", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "front", - "version": "0.0.0", - "dependencies": { - "@angular/common": "^20.0.0", - "@angular/compiler": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/forms": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "@angular/router": "^20.0.0", - "axios": "^1.11.0", - "rxjs": "~7.8.0", - "tslib": "^2.3.0", - "zone.js": "~0.15.0" - }, - "devDependencies": { - "@angular/build": "^20.0.2", - "@angular/cli": "^20.0.2", - "@angular/compiler-cli": "^20.0.0", - "@types/jasmine": "~5.1.0", - "jasmine-core": "~5.7.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.1.0", - "typescript": "~5.8.2" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.32.0.tgz", - "integrity": "sha512-HG/6Eib6DnJYm/B2ijWFXr4txca/YOuA4K7AsEU0JBrOZSB+RU7oeDyNBPi3c0v0UDDqlkBqM3vBU/auwZlglA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.32.0.tgz", - "integrity": "sha512-8Y9MLU72WFQOW3HArYv16+Wvm6eGmsqbxxM1qxtm0hvSASJbxCm+zQAZe5stqysTlcWo4BJ82KEH1PfgHbJAmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.32.0.tgz", - "integrity": "sha512-w8L+rgyXMCPBKmEdOT+RfgMrF0mT6HK60vPYWLz8DBs/P7yFdGo7urn99XCJvVLMSKXrIbZ2FMZ/i50nZTXnuQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.32.0.tgz", - "integrity": "sha512-AdWfynhUeX7jz/LTiFU3wwzJembTbdLkQIOLs4n7PyBuxZ3jz4azV1CWbIP8AjUOFmul6uXbmYza+KqyS5CzOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.32.0.tgz", - "integrity": "sha512-bTupJY4xzGZYI4cEQcPlSjjIEzMvv80h7zXGrXY1Y0KC/n/SLiMv84v7Uy+B6AG1Kiy9FQm2ADChBLo1uEhGtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.32.0.tgz", - "integrity": "sha512-if+YTJw1G3nDKL2omSBjQltCHUQzbaHADkcPQrGFnIGhVyHU3Dzq4g46uEv8mrL5sxL8FjiS9LvekeUlL2NRqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.32.0.tgz", - "integrity": "sha512-kmK5nVkKb4DSUgwbveMKe4X3xHdMsPsOVJeEzBvFJ+oS7CkBPmpfHAEq+CcmiPJs20YMv6yVtUT9yPWL5WgAhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/ingestion": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.32.0.tgz", - "integrity": "sha512-PZTqjJbx+fmPuT2ud1n4vYDSF1yrT//vOGI9HNYKNA0PM0xGUBWigf5gRivHsXa3oBnUlTyHV9j7Kqx5BHbVHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/monitoring": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.32.0.tgz", - "integrity": "sha512-kYYoOGjvNQAmHDS1v5sBj+0uEL9RzYqH/TAdq8wmcV+/22weKt/fjh+6LfiqkS1SCZFYYrwGnirrUhUM36lBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.32.0.tgz", - "integrity": "sha512-jyIBLdskjPAL7T1g57UMfUNx+PzvYbxKslwRUKBrBA6sNEsYCFdxJAtZSLUMmw6MC98RDt4ksmEl5zVMT5bsuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.32.0.tgz", - "integrity": "sha512-eDp14z92Gt6JlFgiexImcWWH+Lk07s/FtxcoDaGrE4UVBgpwqOO6AfQM6dXh1pvHxlDFbMJihHc/vj3gBhPjqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.32.0.tgz", - "integrity": "sha512-rnWVglh/K75hnaLbwSc2t7gCkbq1ldbPgeIKDUiEJxZ4mlguFgcltWjzpDQ/t1LQgxk9HdIFcQfM17Hid3aQ6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.32.0.tgz", - "integrity": "sha512-LbzQ04+VLkzXY4LuOzgyjqEv/46Gwrk55PldaglMJ4i4eDXSRXGKkwJpXFwsoU+c1HMQlHIyjJBhrfsfdyRmyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-devkit/architect": { - "version": "0.2001.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.4.tgz", - "integrity": "sha512-lZ9wYv1YDcw2Ggi2/TXXhYs7JAukAJHdZGZn6Co5s1QE774bVled1qK8pf46rSsG1BGn1a9VFsRFOlB/sx6WjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.1.4", - "rxjs": "7.8.2" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/core": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.4.tgz", - "integrity": "sha512-I5CllQoDrVL20/+0JZk/gmR14n/+mwYIoD1RfBDwnaiHlO9o2whRsJj+LeUd9IA5Hf9MPPx+EkOVQt3vsYU0sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.2", - "source-map": "0.7.4" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.5.tgz", - "integrity": "sha512-fAxBFNIlete9FiqaqpQuXgjpoXwQRwKjv9MEW7DuciPYd/FFWr0858U2bzuJEk0mFNY3f9Q4vlY/RgDk9HWF2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.1.5", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "8.2.0", - "rxjs": "7.8.2" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.5.tgz", - "integrity": "sha512-458Q/pNoXIyUWVbnXktMyc7Ly3MxsYwgQcEIFzzxJu+zDLAt1PwyDe4o+rd8XHwbceW9r0XIlQa78dEjew6MPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.2", - "source-map": "0.7.4" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular/build": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.1.4.tgz", - "integrity": "sha512-DClI15kl0t1YijptthQfw0cRSj8Opf8ACsZa1xT3o77BALpeusxS2QzSy6xGH+QnwesTyJFux1oRYjtAKmE2YA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2001.4", - "@babel/core": "7.27.7", - "@babel/helper-annotate-as-pure": "7.27.3", - "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.13", - "@vitejs/plugin-basic-ssl": "2.1.0", - "beasties": "0.3.4", - "browserslist": "^4.23.0", - "esbuild": "0.25.5", - "https-proxy-agent": "7.0.6", - "istanbul-lib-instrument": "6.0.3", - "jsonc-parser": "3.3.1", - "listr2": "8.3.3", - "magic-string": "0.30.17", - "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "7.1.0", - "picomatch": "4.0.2", - "piscina": "5.1.2", - "rollup": "4.44.1", - "sass": "1.89.2", - "semver": "7.7.2", - "source-map-support": "0.5.21", - "tinyglobby": "0.2.14", - "vite": "7.0.6", - "watchpack": "2.4.4" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "lmdb": "3.4.1" - }, - "peerDependencies": { - "@angular/compiler": "^20.0.0", - "@angular/compiler-cli": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/localize": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "@angular/platform-server": "^20.0.0", - "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.1.4", - "karma": "^6.4.0", - "less": "^4.2.0", - "ng-packagr": "^20.0.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "tslib": "^2.3.0", - "typescript": ">=5.8 <5.9", - "vitest": "^3.1.1" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - }, - "@angular/localize": { - "optional": true - }, - "@angular/platform-browser": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@angular/ssr": { - "optional": true - }, - "karma": { - "optional": true - }, - "less": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@angular/cli": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.1.5.tgz", - "integrity": "sha512-1pkShcbPEkQn8wCoHsr9v+udy5EmelHVwZ5kNZjZZ2EDTcB/RC7cuuUfyWRxrYJxwT5K/jx00ORQvbVJj0L+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.2001.5", - "@angular-devkit/core": "20.1.5", - "@angular-devkit/schematics": "20.1.5", - "@inquirer/prompts": "7.6.0", - "@listr2/prompt-adapter-inquirer": "2.0.22", - "@modelcontextprotocol/sdk": "1.13.3", - "@schematics/angular": "20.1.5", - "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.32.0", - "ini": "5.0.0", - "jsonc-parser": "3.3.1", - "listr2": "8.3.3", - "npm-package-arg": "12.0.2", - "npm-pick-manifest": "10.0.0", - "pacote": "21.0.0", - "resolve": "1.22.10", - "semver": "7.7.2", - "yargs": "18.0.0", - "zod": "3.25.75" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.2001.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.5.tgz", - "integrity": "sha512-LdjmE75wjmpHNfFsDecZB95H/DekX1hJLmRzGWid+Fd6lbyFBQyUjq+ucwD9WlHqqrD+CgKapQKnUhlBSIJxPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.1.5", - "rxjs": "7.8.2" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.5.tgz", - "integrity": "sha512-458Q/pNoXIyUWVbnXktMyc7Ly3MxsYwgQcEIFzzxJu+zDLAt1PwyDe4o+rd8XHwbceW9r0XIlQa78dEjew6MPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.2", - "source-map": "0.7.4" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular/common": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.1.4.tgz", - "integrity": "sha512-AL+HdsY5xL2iM1zZ55ce33U+w2LgPJZQwKvHXJJ/Hpk3rpFNamWtRPmJBeq8Z0dQV1lLTMM+2pUatH6p+5pvEg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/core": "20.1.4", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/compiler": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.1.4.tgz", - "integrity": "sha512-gQbchh2ziK9QxZuHgEf7BUMCm/ayu6Zr9hst6itSecinUJgUeeSp3Z4vXjIBNBUKMPB135tWw9RGiVbW8saBmg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@angular/compiler-cli": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.1.4.tgz", - "integrity": "sha512-I603/3EmclgX4VUryBo3bxlF+8+fVucrW/V0leqNlt72ppFTphDiKiopogoJFWJxuULTo2V+7Koq8Em7kUO67Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "7.28.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^18.0.0" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/compiler": "20.1.4", - "typescript": ">=5.8 <5.9" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular/core": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.1.4.tgz", - "integrity": "sha512-aWDux64a9usuVU2SnF0epqjXAj8JO8jViUzZAJAuFKSCtkeNzqP+Z6DjkqsCKrNvGP7xkX1XhhepUygxgh7/6A==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/compiler": "20.1.4", - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" - }, - "peerDependenciesMeta": { - "@angular/compiler": { - "optional": true - }, - "zone.js": { - "optional": true - } - } - }, - "node_modules/@angular/forms": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.1.4.tgz", - "integrity": "sha512-5gUwcV+JpzJ2rSPo1nR6iNz2Dm3iRcVCvRTsVnKhFbZCIbGLihLpoCuittsgUY/C9wh/rnmXlatmLJ7giSuUZA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/common": "20.1.4", - "@angular/core": "20.1.4", - "@angular/platform-browser": "20.1.4", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/platform-browser": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.1.4.tgz", - "integrity": "sha512-z86NsGSwm5pXCACdWBbp7SC1Xn+UGvuoRqTsi0dNUXT/3WrP6MvZT3TfNKwM63GLUqFAICSt7uFXS84D72ukvA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/animations": "20.1.4", - "@angular/common": "20.1.4", - "@angular/core": "20.1.4" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@angular/router": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.1.4.tgz", - "integrity": "sha512-Etd2V2Qw+clQhJORBm7tMphCCweLNKbZvUc+lh1r7yrbBPnZvK3yd69W9ZQoRzrSSI25VGQDyzQXgpLUlHoE+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/common": "20.1.4", - "@angular/core": "20.1.4", - "@angular/platform-browser": "20.1.4", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.0.tgz", - "integrity": "sha512-fdSw07FLJEU5vbpOPzXo5c6xmMGDzbZE2+niuDHX5N6mc6V0Ebso/q3xiHra4D73+PMsC8MJmcaZKuAAoaQsSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.13.tgz", - "integrity": "sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz", - "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.15", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.15.tgz", - "integrity": "sha512-wst31XT8DnGOSS4nNJDIklGKnf+8shuauVrWzgKegWUe28zfCftcWZ2vktGdzJgcylWSS2SrDnYUb6alZcwnCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "external-editor": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/expand": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.17.tgz", - "integrity": "sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.1.tgz", - "integrity": "sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.17.tgz", - "integrity": "sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.17.tgz", - "integrity": "sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.6.0.tgz", - "integrity": "sha512-jAhL7tyMxB3Gfwn4HIJ0yuJ5pvcB5maYUcouGcgd/ub79f9MqZ+aVnBtuFf+VC2GTkCBF+R+eo7Vi63w5VZlzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.1.9", - "@inquirer/confirm": "^5.1.13", - "@inquirer/editor": "^4.2.14", - "@inquirer/expand": "^4.0.16", - "@inquirer/input": "^4.2.0", - "@inquirer/number": "^3.0.16", - "@inquirer/password": "^4.0.16", - "@inquirer/rawlist": "^4.1.4", - "@inquirer/search": "^3.0.16", - "@inquirer/select": "^4.2.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.5.tgz", - "integrity": "sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/search": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.0.tgz", - "integrity": "sha512-PMk1+O/WBcYJDq2H7foV0aAZSmDdkzZB9Mw2v/DmONRJopwA/128cS9M/TXWLKKdEQKZnKwBzqu2G4x/2Nqx8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.1.tgz", - "integrity": "sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.22.tgz", - "integrity": "sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/type": "^1.5.5" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.1.tgz", - "integrity": "sha512-kKeP5PaY3bFrrF6GY5aDd96iuh1eoS+5CHJ+7hIP629KIEwzGNwbIzBmEX9TAhRJOivSRDTHCIsbu//+NsYKkg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.1.tgz", - "integrity": "sha512-9CMB3seTyHs3EOVWdKiB8IIEDBJ3Gq00Tqyi0V7DS3HL90BjM/AkbZGuhzXwPrfeFazR24SKaRrUQF74f+CmWw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.1.tgz", - "integrity": "sha512-1Mi69vU0akHgCI7tF6YbimPaNEKJiBm/p5A+aM8egr0joj27cQmCCOm2mZQ+Ht2BqmCfZaIgQnMg4gFYNMlpCA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.1.tgz", - "integrity": "sha512-d0vuXOdoKjHHJYZ/CRWopnkOiUpev+bgBBW+1tXtWsYWUj8uxl9ZmTBEmsL5mjUlpQDrlYiJSrhOU1hg5QWBSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.1.tgz", - "integrity": "sha512-00RbEpvfnyPodlICiGFuiOmyvWaL9nzCRSqZz82BVFsGTiSQnnF0gpD1C8tO6OvtptELbtRuM7BS9f97LcowZw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-win32-arm64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.1.tgz", - "integrity": "sha512-4h8tm3i1ODf+28UyqQZLP7c2jmRM26AyEEyYp994B4GiBdGvGAsYUu3oiHANYK9xFpvLuFzyGeqFm1kdNC0D1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.1.tgz", - "integrity": "sha512-HqqKIhTbq6piJhkJpTTf3w1m/CgrmwXRAL9R9j7Ru5xdZSeO7Mg4AWiBC9B00uXR+LvVZKtUyRMVZfhmIZztmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.13.3.tgz", - "integrity": "sha512-bGwA78F/U5G2jrnsdRkPY3IwIwZeWUEfb5o764b79lb0rJmMT76TLwKhdNZOWakOQtedYefwIR4emisEMvInKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.6", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@napi-rs/nice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.4.tgz", - "integrity": "sha512-Sqih1YARrmMoHlXGgI9JrrgkzxcaaEso0AH+Y7j8NHonUs+xe4iDsgC3IBIDNdzEewbNpccNN6hip+b5vmyRLw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@napi-rs/nice-android-arm-eabi": "1.0.4", - "@napi-rs/nice-android-arm64": "1.0.4", - "@napi-rs/nice-darwin-arm64": "1.0.4", - "@napi-rs/nice-darwin-x64": "1.0.4", - "@napi-rs/nice-freebsd-x64": "1.0.4", - "@napi-rs/nice-linux-arm-gnueabihf": "1.0.4", - "@napi-rs/nice-linux-arm64-gnu": "1.0.4", - "@napi-rs/nice-linux-arm64-musl": "1.0.4", - "@napi-rs/nice-linux-ppc64-gnu": "1.0.4", - "@napi-rs/nice-linux-riscv64-gnu": "1.0.4", - "@napi-rs/nice-linux-s390x-gnu": "1.0.4", - "@napi-rs/nice-linux-x64-gnu": "1.0.4", - "@napi-rs/nice-linux-x64-musl": "1.0.4", - "@napi-rs/nice-win32-arm64-msvc": "1.0.4", - "@napi-rs/nice-win32-ia32-msvc": "1.0.4", - "@napi-rs/nice-win32-x64-msvc": "1.0.4" - } - }, - "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.4.tgz", - "integrity": "sha512-OZFMYUkih4g6HCKTjqJHhMUlgvPiDuSLZPbPBWHLjKmFTv74COzRlq/gwHtmEVaR39mJQ6ZyttDl2HNMUbLVoA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.4.tgz", - "integrity": "sha512-k8u7cjeA64vQWXZcRrPbmwjH8K09CBnNaPnI9L1D5N6iMPL3XYQzLcN6WwQonfcqCDv5OCY3IqX89goPTV4KMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-GsLdQvUcuVzoyzmtjsThnpaVEizAqH5yPHgnsBmq3JdVoVZHELFo7PuJEdfOH1DOHi2mPwB9sCJEstAYf3XCJA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.4.tgz", - "integrity": "sha512-1y3gyT3e5zUY5SxRl3QDtJiWVsbkmhtUHIYwdWWIQ3Ia+byd/IHIEpqAxOGW1nhhnIKfTCuxBadHQb+yZASVoA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.4.tgz", - "integrity": "sha512-06oXzESPRdXUuzS8n2hGwhM2HACnDfl3bfUaSqLGImM8TA33pzDXgGL0e3If8CcFWT98aHows5Lk7xnqYNGFeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.4.tgz", - "integrity": "sha512-CgklZ6g8WL4+EgVVkxkEvvsi2DSLf9QIloxWO0fvQyQBp6VguUSX3eHLeRpqwW8cRm2Hv/Q1+PduNk7VK37VZw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.4.tgz", - "integrity": "sha512-wdAJ7lgjhAlsANUCv0zi6msRwq+D4KDgU+GCCHssSxWmAERZa2KZXO0H2xdmoJ/0i03i6YfK/sWaZgUAyuW2oQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.4.tgz", - "integrity": "sha512-4b1KYG+sriufhFrpUS9uNOEYYJqSfcbnwGx6uGX7JjrH8tELG90cOpCawz5THNIwlS3DhLgnCOcn0+4p6z26QA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.4.tgz", - "integrity": "sha512-iaf3vMRgr23oe1PUaKpxaH3DS0IMN0+N9iEiWVwYPm/U15vZFYdqVegGfN2PzrZLUl5lc8ZxbmEKDfuqslhAMA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.4.tgz", - "integrity": "sha512-UXoREY6Yw6rHrGuTwQgBxpfjK34t6mTjibE9/cXbefL9AuUCJ9gEgwNKZiONuR5QGswChqo9cnthjdKkYyAdDg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.4.tgz", - "integrity": "sha512-eFbgYCRPmsqbYPAlLYU5hYTNbogmIDUvknilehHsFhCH1+0/kN87lP+XaLT0Yeq4V/rpwChSd9vlz4muzFArtw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.4.tgz", - "integrity": "sha512-4T3E6uTCwWT6IPnwuPcWVz3oHxvEp/qbrCxZhsgzwTUBEwu78EGNXGdHfKJQt3soth89MLqZJw+Zzvnhrsg1mQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.4.tgz", - "integrity": "sha512-NtbBkAeyBPLvCBkWtwkKXkNSn677eaT0cX3tygq+2qVv71TmHgX4gkX6o9BXjlPzdgPGwrUudavCYPT9tzkEqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.4.tgz", - "integrity": "sha512-vubOe3i+YtSJGEk/++73y+TIxbuVHi+W8ZzrRm2eETCjCRwNlgbfToQZ85dSA+4iBB/NJRGNp+O4hfdbbttZWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.4.tgz", - "integrity": "sha512-BMOVrUDZeg1RNRKVlh4eyLv5djAAVLiSddfpuuQ47EFjBcklg0NUeKMFKNrKQR4UnSn4HAiACLD7YK7koskwmg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.4.tgz", - "integrity": "sha512-kCNk6HcRZquhw/whwh4rHsdPyOSCQCgnVDVik+Y9cuSVTDy3frpiCJTScJqPPS872h4JgZKkr/+CwcwttNEo9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/git": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", - "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", - "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", - "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/redact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", - "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", - "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/@parcel/watcher/node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", - "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", - "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", - "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", - "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", - "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", - "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", - "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", - "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", - "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", - "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", - "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", - "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", - "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", - "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", - "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", - "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", - "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", - "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", - "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", - "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@schematics/angular": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.1.5.tgz", - "integrity": "sha512-+bgbujb9F6cgP/hz0L8IEJy16aXIsgypTcHdckozbjDRUMtqjjmCNjutep0t6hfe9La/4hF8pKiOx9KLBFG+rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.1.5", - "@angular-devkit/schematics": "20.1.5", - "jsonc-parser": "3.3.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.5.tgz", - "integrity": "sha512-458Q/pNoXIyUWVbnXktMyc7Ly3MxsYwgQcEIFzzxJu+zDLAt1PwyDe4o+rd8XHwbceW9r0XIlQa78dEjew6MPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.2", - "source-map": "0.7.4" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@sigstore/bundle": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", - "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", - "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", - "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", - "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "make-fetch-happen": "^14.0.2", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", - "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.4.1", - "tuf-js": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/verify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", - "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", - "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jasmine": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.8.tgz", - "integrity": "sha512-u7/CnvRdh6AaaIzYjCgUuVbREFgulhX05Qtf6ZtW+aOcjCKKVvKgpkPYJBFTZSHtFBYimzU4zP0V2vrEsq9Wcg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz", - "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.10.0" - } - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", - "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "peerDependencies": { - "vite": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/algoliasearch": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.32.0.tgz", - "integrity": "sha512-84xBncKNPBK8Ae89F65+SyVcOihrIbm/3N7to+GpRBHEUXGjA3ydWTMpcRW6jmFzkBQ/eqYy/y+J+NBpJWYjBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-abtesting": "5.32.0", - "@algolia/client-analytics": "5.32.0", - "@algolia/client-common": "5.32.0", - "@algolia/client-insights": "5.32.0", - "@algolia/client-personalization": "5.32.0", - "@algolia/client-query-suggestions": "5.32.0", - "@algolia/client-search": "5.32.0", - "@algolia/ingestion": "1.32.0", - "@algolia/monitoring": "1.32.0", - "@algolia/recommend": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/beasties": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.4.tgz", - "integrity": "sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "htmlparser2": "^10.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.49", - "postcss-media-query-parser": "^0.2.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.5.0.tgz", - "integrity": "sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.194", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz", - "integrity": "sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", - "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "punycode": "^1.4.1", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", - "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-walk": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", - "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minimatch": "^10.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/immutable": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", - "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", - "dev": true, - "license": "MIT" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jasmine-core": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.7.1.tgz", - "integrity": "sha512-QnurrtpKsPoixxG2R3d1xP0St/2kcX5oTZyDyQJMY+Vzi/HUlu1kGm+2V8Tz+9lV991leB1l0xcsyz40s9xOOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/karma": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", - "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.7.2", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/karma-chrome-launcher": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", - "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "which": "^1.2.1" - } - }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/karma-coverage": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", - "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.0.5", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma-coverage/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jasmine-core": "^4.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "karma": "^6.0.0" - } - }, - "node_modules/karma-jasmine-html-reporter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", - "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "jasmine-core": "^4.0.0 || ^5.0.0", - "karma": "^6.0.0", - "karma-jasmine": "^5.0.0" - } - }, - "node_modules/karma-jasmine/node_modules/jasmine-core": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", - "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/karma/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "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.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/karma/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/karma/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/karma/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/karma/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/karma/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/karma/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/karma/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/karma/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/karma/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/karma/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz", - "integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/karma/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/lmdb": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.1.tgz", - "integrity": "sha512-hoG9RIv42kdGJiieyElgWcKCTaw5S6Jqwyd1gLSVdsJ3+8MVm8e4yLronThiRJI9DazFAAs9xfB9nWeMQ2DWKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "msgpackr": "^1.11.2", - "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.2.2", - "ordered-binary": "^1.5.3", - "weak-lru-cache": "^1.2.2" - }, - "bin": { - "download-lmdb-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.4.1", - "@lmdb/lmdb-darwin-x64": "3.4.1", - "@lmdb/lmdb-linux-arm": "3.4.1", - "@lmdb/lmdb-linux-arm64": "3.4.1", - "@lmdb/lmdb-linux-x64": "3.4.1", - "@lmdb/lmdb-win32-arm64": "3.4.1", - "@lmdb/lmdb-win32-x64": "3.4.1" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-fetch-happen": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "ssri": "^12.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", - "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/msgpackr": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", - "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", - "dev": true, - "license": "MIT", - "optional": true, - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "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" - } - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-gyp": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.3.0.tgz", - "integrity": "sha512-9J0+C+2nt3WFuui/mC46z2XCZ21/cKlFDuywULmseD/LlmnOrSeEAE4c/1jw6aybXLmpZnQY3/LmOJfgyHIcng==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "tar": "^7.4.3", - "tinyglobby": "^0.2.12", - "which": "^5.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-bundled": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", - "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-install-checks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", - "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-package-arg": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", - "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-packlist": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.1.tgz", - "integrity": "sha512-vaC03b2PqJA6QqmwHi1jNU8fAPXEnnyv4j/W4PVfgm24C4/zZGSVut3z0YUeN0WIFCo1oGOL02+6LbvFK7JL4Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^8.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", - "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", - "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^3.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ordered-binary": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", - "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pacote": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", - "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^10.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.1.0.tgz", - "integrity": "sha512-2ifK6Jb+ONoqOy5f+cYHsqvx1obHQdvIk13Jmt/5ezxP0U9p+fqd+R6O73KblGswyuzBYfetmsfK9ThMgnuPPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-html-rewriting-stream/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/piscina": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.2.tgz", - "integrity": "sha512-9cE/BTA/xhDiyNUEj6EKWLEQC17fh/24ydYzQwcA7QdYh75K6kzL2GHvxDF5i9rFGtUaaKk7/u4xp07qiKXccQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.x" - }, - "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" - } - }, - "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true, - "license": "MIT" - }, - "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.9" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", - "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.44.1", - "@rollup/rollup-android-arm64": "4.44.1", - "@rollup/rollup-darwin-arm64": "4.44.1", - "@rollup/rollup-darwin-x64": "4.44.1", - "@rollup/rollup-freebsd-arm64": "4.44.1", - "@rollup/rollup-freebsd-x64": "4.44.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", - "@rollup/rollup-linux-arm-musleabihf": "4.44.1", - "@rollup/rollup-linux-arm64-gnu": "4.44.1", - "@rollup/rollup-linux-arm64-musl": "4.44.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-musl": "4.44.1", - "@rollup/rollup-linux-s390x-gnu": "4.44.1", - "@rollup/rollup-linux-x64-gnu": "4.44.1", - "@rollup/rollup-linux-x64-musl": "4.44.1", - "@rollup/rollup-win32-arm64-msvc": "4.44.1", - "@rollup/rollup-win32-ia32-msvc": "4.44.1", - "@rollup/rollup-win32-x64-msvc": "4.44.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sigstore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", - "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "@sigstore/sign": "^3.1.0", - "@sigstore/tuf": "^3.1.0", - "@sigstore/verify": "^2.1.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socks": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", - "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tuf-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", - "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "3.0.1", - "debug": "^4.4.1", - "make-fetch-happen": "^14.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.40", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", - "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", - "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.40.0", - "tinyglobby": "^0.2.14" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "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 - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.75", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.75.tgz", - "integrity": "sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "zod": "^3.24.1" - } - }, - "node_modules/zone.js": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", - "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", - "license": "MIT" - } - } -} diff --git a/front/v1/package.json b/front/v1/package.json deleted file mode 100644 index 75c3139..0000000 --- a/front/v1/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "front", - "version": "0.0.0", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "watch": "ng build --watch --configuration development", - "test": "ng test" - }, - "private": true, - "dependencies": { - "@angular/common": "^20.0.0", - "@angular/compiler": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/forms": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "@angular/router": "^20.0.0", - "axios": "^1.11.0", - "rxjs": "~7.8.0", - "tslib": "^2.3.0", - "zone.js": "~0.15.0" - }, - "devDependencies": { - "@angular/build": "^20.0.2", - "@angular/cli": "^20.0.2", - "@angular/compiler-cli": "^20.0.0", - "@types/jasmine": "~5.1.0", - "jasmine-core": "~5.7.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.1.0", - "typescript": "~5.8.2" - } -} diff --git a/front/v1/public/assets/config.json b/front/v1/public/assets/config.json deleted file mode 100644 index ab5584b..0000000 --- a/front/v1/public/assets/config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "bff": "https://back.mmorales.photo" -} \ No newline at end of file diff --git a/front/v1/public/assets/icons/_fix-svg-stroke.js b/front/v1/public/assets/icons/_fix-svg-stroke.js deleted file mode 100644 index 97ce02d..0000000 --- a/front/v1/public/assets/icons/_fix-svg-stroke.js +++ /dev/null @@ -1,12 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -const iconsDir = __dirname; -fs.readdirSync(iconsDir).forEach(file => { - if (file.endsWith('.svg')) { - const filePath = path.join(iconsDir, file); - let content = fs.readFileSync(filePath, 'utf8'); - content = content.replace(/stroke="#[0-9a-fA-F]{3,6}"/g, 'stroke="currentColor"'); - fs.writeFileSync(filePath, content, 'utf8'); - } -}); \ No newline at end of file diff --git a/front/v1/public/assets/icons/add-square-svgrepo-com.svg b/front/v1/public/assets/icons/add-square-svgrepo-com.svg deleted file mode 100644 index 60f9b55..0000000 --- a/front/v1/public/assets/icons/add-square-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/add-svgrepo-com.svg b/front/v1/public/assets/icons/add-svgrepo-com.svg deleted file mode 100644 index 4662c0d..0000000 --- a/front/v1/public/assets/icons/add-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/alert-square-svgrepo-com.svg b/front/v1/public/assets/icons/alert-square-svgrepo-com.svg deleted file mode 100644 index fb71faa..0000000 --- a/front/v1/public/assets/icons/alert-square-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/align-justify-svgrepo-com.svg b/front/v1/public/assets/icons/align-justify-svgrepo-com.svg deleted file mode 100644 index 8633686..0000000 --- a/front/v1/public/assets/icons/align-justify-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/align-left-svgrepo-com.svg b/front/v1/public/assets/icons/align-left-svgrepo-com.svg deleted file mode 100644 index 2a6be29..0000000 --- a/front/v1/public/assets/icons/align-left-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/align-right-svgrepo-com.svg b/front/v1/public/assets/icons/align-right-svgrepo-com.svg deleted file mode 100644 index b45a18f..0000000 --- a/front/v1/public/assets/icons/align-right-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/arrow-down-left-svgrepo-com.svg b/front/v1/public/assets/icons/arrow-down-left-svgrepo-com.svg deleted file mode 100644 index a74722b..0000000 --- a/front/v1/public/assets/icons/arrow-down-left-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/arrow-down-right-svgrepo-com.svg b/front/v1/public/assets/icons/arrow-down-right-svgrepo-com.svg deleted file mode 100644 index 3e64fbb..0000000 --- a/front/v1/public/assets/icons/arrow-down-right-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/arrow-down-svgrepo-com.svg b/front/v1/public/assets/icons/arrow-down-svgrepo-com.svg deleted file mode 100644 index aff78bb..0000000 --- a/front/v1/public/assets/icons/arrow-down-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/arrow-left-svgrepo-com.svg b/front/v1/public/assets/icons/arrow-left-svgrepo-com.svg deleted file mode 100644 index 289a108..0000000 --- a/front/v1/public/assets/icons/arrow-left-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/arrow-right-svgrepo-com.svg b/front/v1/public/assets/icons/arrow-right-svgrepo-com.svg deleted file mode 100644 index 5206b98..0000000 --- a/front/v1/public/assets/icons/arrow-right-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/arrow-up-left-svgrepo-com.svg b/front/v1/public/assets/icons/arrow-up-left-svgrepo-com.svg deleted file mode 100644 index afaeba2..0000000 --- a/front/v1/public/assets/icons/arrow-up-left-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/arrow-up-right-svgrepo-com.svg b/front/v1/public/assets/icons/arrow-up-right-svgrepo-com.svg deleted file mode 100644 index cae4485..0000000 --- a/front/v1/public/assets/icons/arrow-up-right-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/arrow-up-svgrepo-com.svg b/front/v1/public/assets/icons/arrow-up-svgrepo-com.svg deleted file mode 100644 index 902c038..0000000 --- a/front/v1/public/assets/icons/arrow-up-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/bell-svgrepo-com.svg b/front/v1/public/assets/icons/bell-svgrepo-com.svg deleted file mode 100644 index 2e47e4a..0000000 --- a/front/v1/public/assets/icons/bell-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/browsers-svgrepo-com.svg b/front/v1/public/assets/icons/browsers-svgrepo-com.svg deleted file mode 100644 index 9bfecbc..0000000 --- a/front/v1/public/assets/icons/browsers-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/bubble-square-svgrepo-com.svg b/front/v1/public/assets/icons/bubble-square-svgrepo-com.svg deleted file mode 100644 index 02ca5a8..0000000 --- a/front/v1/public/assets/icons/bubble-square-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/cart-minus-svgrepo-com.svg b/front/v1/public/assets/icons/cart-minus-svgrepo-com.svg deleted file mode 100644 index 3ef9090..0000000 --- a/front/v1/public/assets/icons/cart-minus-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/cart-plus-svgrepo-com.svg b/front/v1/public/assets/icons/cart-plus-svgrepo-com.svg deleted file mode 100644 index 88a8fac..0000000 --- a/front/v1/public/assets/icons/cart-plus-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/cart-shopping-fast-svgrepo-com.svg b/front/v1/public/assets/icons/cart-shopping-fast-svgrepo-com.svg deleted file mode 100644 index 355ca00..0000000 --- a/front/v1/public/assets/icons/cart-shopping-fast-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/cart-xmark-svgrepo-com.svg b/front/v1/public/assets/icons/cart-xmark-svgrepo-com.svg deleted file mode 100644 index 152c31e..0000000 --- a/front/v1/public/assets/icons/cart-xmark-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/chevron-down-svgrepo-com.svg b/front/v1/public/assets/icons/chevron-down-svgrepo-com.svg deleted file mode 100644 index 8bd725b..0000000 --- a/front/v1/public/assets/icons/chevron-down-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/chevron-left-svgrepo-com.svg b/front/v1/public/assets/icons/chevron-left-svgrepo-com.svg deleted file mode 100644 index 0dcb492..0000000 --- a/front/v1/public/assets/icons/chevron-left-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/chevron-right-svgrepo-com.svg b/front/v1/public/assets/icons/chevron-right-svgrepo-com.svg deleted file mode 100644 index eb5736f..0000000 --- a/front/v1/public/assets/icons/chevron-right-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/circle-svgrepo-com.svg b/front/v1/public/assets/icons/circle-svgrepo-com.svg deleted file mode 100644 index df9f2e2..0000000 --- a/front/v1/public/assets/icons/circle-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/clock-svgrepo-com.svg b/front/v1/public/assets/icons/clock-svgrepo-com.svg deleted file mode 100644 index 95a7942..0000000 --- a/front/v1/public/assets/icons/clock-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/code-svgrepo-com.svg b/front/v1/public/assets/icons/code-svgrepo-com.svg deleted file mode 100644 index defea8d..0000000 --- a/front/v1/public/assets/icons/code-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/disc-svgrepo-com.svg b/front/v1/public/assets/icons/disc-svgrepo-com.svg deleted file mode 100644 index 4391cb8..0000000 --- a/front/v1/public/assets/icons/disc-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/download-svgrepo-com.svg b/front/v1/public/assets/icons/download-svgrepo-com.svg deleted file mode 100644 index 1610c42..0000000 --- a/front/v1/public/assets/icons/download-svgrepo-com.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/edit-svgrepo-com.svg b/front/v1/public/assets/icons/edit-svgrepo-com.svg deleted file mode 100644 index 7b02a97..0000000 --- a/front/v1/public/assets/icons/edit-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/expand-svgrepo-com.svg b/front/v1/public/assets/icons/expand-svgrepo-com.svg deleted file mode 100644 index 9527034..0000000 --- a/front/v1/public/assets/icons/expand-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/file-add-svgrepo-com.svg b/front/v1/public/assets/icons/file-add-svgrepo-com.svg deleted file mode 100644 index 46bd4ce..0000000 --- a/front/v1/public/assets/icons/file-add-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/file-remove-svgrepo-com.svg b/front/v1/public/assets/icons/file-remove-svgrepo-com.svg deleted file mode 100644 index 0ec15fd..0000000 --- a/front/v1/public/assets/icons/file-remove-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/file-text-svgrepo-com.svg b/front/v1/public/assets/icons/file-text-svgrepo-com.svg deleted file mode 100644 index c9ceb2c..0000000 --- a/front/v1/public/assets/icons/file-text-svgrepo-com.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/fingerprint-svgrepo-com.svg b/front/v1/public/assets/icons/fingerprint-svgrepo-com.svg deleted file mode 100644 index 4f97240..0000000 --- a/front/v1/public/assets/icons/fingerprint-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/folder-svgrepo-com.svg b/front/v1/public/assets/icons/folder-svgrepo-com.svg deleted file mode 100644 index 6f81e19..0000000 --- a/front/v1/public/assets/icons/folder-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/grid-svgrepo-com.svg b/front/v1/public/assets/icons/grid-svgrepo-com.svg deleted file mode 100644 index 51e046f..0000000 --- a/front/v1/public/assets/icons/grid-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/id-badge-svgrepo-com.svg b/front/v1/public/assets/icons/id-badge-svgrepo-com.svg deleted file mode 100644 index c522e1a..0000000 --- a/front/v1/public/assets/icons/id-badge-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/info-circle-svgrepo-com.svg b/front/v1/public/assets/icons/info-circle-svgrepo-com.svg deleted file mode 100644 index f3d9536..0000000 --- a/front/v1/public/assets/icons/info-circle-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/info-square-svgrepo-com.svg b/front/v1/public/assets/icons/info-square-svgrepo-com.svg deleted file mode 100644 index 4650bb7..0000000 --- a/front/v1/public/assets/icons/info-square-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/lock-svgrepo-com.svg b/front/v1/public/assets/icons/lock-svgrepo-com.svg deleted file mode 100644 index 4aed4fb..0000000 --- a/front/v1/public/assets/icons/lock-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/mail-read-svgrepo-com.svg b/front/v1/public/assets/icons/mail-read-svgrepo-com.svg deleted file mode 100644 index ffd8a4a..0000000 --- a/front/v1/public/assets/icons/mail-read-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/mail-svgrepo-com.svg b/front/v1/public/assets/icons/mail-svgrepo-com.svg deleted file mode 100644 index 59f98b7..0000000 --- a/front/v1/public/assets/icons/mail-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/maximize-svgrepo-com.svg b/front/v1/public/assets/icons/maximize-svgrepo-com.svg deleted file mode 100644 index 9aa6af9..0000000 --- a/front/v1/public/assets/icons/maximize-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/menu-svgrepo-com.svg b/front/v1/public/assets/icons/menu-svgrepo-com.svg deleted file mode 100644 index b9360ff..0000000 --- a/front/v1/public/assets/icons/menu-svgrepo-com.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/front/v1/public/assets/icons/minimize-svgrepo-com.svg b/front/v1/public/assets/icons/minimize-svgrepo-com.svg deleted file mode 100644 index 6a51581..0000000 --- a/front/v1/public/assets/icons/minimize-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/minus-svgrepo-com.svg b/front/v1/public/assets/icons/minus-svgrepo-com.svg deleted file mode 100644 index 7d29ef7..0000000 --- a/front/v1/public/assets/icons/minus-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/more-horizontal-svgrepo-com.svg b/front/v1/public/assets/icons/more-horizontal-svgrepo-com.svg deleted file mode 100644 index 3b963ca..0000000 --- a/front/v1/public/assets/icons/more-horizontal-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/more-vertical-svgrepo-com.svg b/front/v1/public/assets/icons/more-vertical-svgrepo-com.svg deleted file mode 100644 index d2c8d68..0000000 --- a/front/v1/public/assets/icons/more-vertical-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/navigation-ne-svgrepo-com.svg b/front/v1/public/assets/icons/navigation-ne-svgrepo-com.svg deleted file mode 100644 index a30a1fc..0000000 --- a/front/v1/public/assets/icons/navigation-ne-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/navigation-nw-svgrepo-com.svg b/front/v1/public/assets/icons/navigation-nw-svgrepo-com.svg deleted file mode 100644 index 3e8081c..0000000 --- a/front/v1/public/assets/icons/navigation-nw-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/navigation-svgrepo-com.svg b/front/v1/public/assets/icons/navigation-svgrepo-com.svg deleted file mode 100644 index 32ee540..0000000 --- a/front/v1/public/assets/icons/navigation-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/optimized_svg/share_social.svg b/front/v1/public/assets/icons/optimized_svg/share_social.svg deleted file mode 100644 index 0749518..0000000 --- a/front/v1/public/assets/icons/optimized_svg/share_social.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/front/v1/public/assets/icons/push-down-svgrepo-com.svg b/front/v1/public/assets/icons/push-down-svgrepo-com.svg deleted file mode 100644 index 973912f..0000000 --- a/front/v1/public/assets/icons/push-down-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/push-left-svgrepo-com.svg b/front/v1/public/assets/icons/push-left-svgrepo-com.svg deleted file mode 100644 index d2c4f15..0000000 --- a/front/v1/public/assets/icons/push-left-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/push-right-svgrepo-com.svg b/front/v1/public/assets/icons/push-right-svgrepo-com.svg deleted file mode 100644 index 8e5bafc..0000000 --- a/front/v1/public/assets/icons/push-right-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/push-up-svgrepo-com.svg b/front/v1/public/assets/icons/push-up-svgrepo-com.svg deleted file mode 100644 index d51be51..0000000 --- a/front/v1/public/assets/icons/push-up-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/search-alt-1-svgrepo-com.svg b/front/v1/public/assets/icons/search-alt-1-svgrepo-com.svg deleted file mode 100644 index 4dfed1a..0000000 --- a/front/v1/public/assets/icons/search-alt-1-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/search-svgrepo-com.svg b/front/v1/public/assets/icons/search-svgrepo-com.svg deleted file mode 100644 index 616241e..0000000 --- a/front/v1/public/assets/icons/search-svgrepo-com.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/front/v1/public/assets/icons/send-alt-2-svgrepo-com.svg b/front/v1/public/assets/icons/send-alt-2-svgrepo-com.svg deleted file mode 100644 index bae8f5a..0000000 --- a/front/v1/public/assets/icons/send-alt-2-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/sidebar-bottom-svgrepo-com.svg b/front/v1/public/assets/icons/sidebar-bottom-svgrepo-com.svg deleted file mode 100644 index 1cd9053..0000000 --- a/front/v1/public/assets/icons/sidebar-bottom-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/sidebar-left-svgrepo-com.svg b/front/v1/public/assets/icons/sidebar-left-svgrepo-com.svg deleted file mode 100644 index 05aa48e..0000000 --- a/front/v1/public/assets/icons/sidebar-left-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/sidebar-right-svgrepo-com.svg b/front/v1/public/assets/icons/sidebar-right-svgrepo-com.svg deleted file mode 100644 index f460bf4..0000000 --- a/front/v1/public/assets/icons/sidebar-right-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/sidebar-top-svgrepo-com.svg b/front/v1/public/assets/icons/sidebar-top-svgrepo-com.svg deleted file mode 100644 index d29deb1..0000000 --- a/front/v1/public/assets/icons/sidebar-top-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/signal-svgrepo-com.svg b/front/v1/public/assets/icons/signal-svgrepo-com.svg deleted file mode 100644 index 1aa56a8..0000000 --- a/front/v1/public/assets/icons/signal-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/stopwatch-svgrepo-com.svg b/front/v1/public/assets/icons/stopwatch-svgrepo-com.svg deleted file mode 100644 index 8e16824..0000000 --- a/front/v1/public/assets/icons/stopwatch-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/support-svgrepo-com.svg b/front/v1/public/assets/icons/support-svgrepo-com.svg deleted file mode 100644 index 3c9d459..0000000 --- a/front/v1/public/assets/icons/support-svgrepo-com.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/thumbs-down-svgrepo-com.svg b/front/v1/public/assets/icons/thumbs-down-svgrepo-com.svg deleted file mode 100644 index e2012ad..0000000 --- a/front/v1/public/assets/icons/thumbs-down-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/thumbs-up-svgrepo-com.svg b/front/v1/public/assets/icons/thumbs-up-svgrepo-com.svg deleted file mode 100644 index 7b8c1a5..0000000 --- a/front/v1/public/assets/icons/thumbs-up-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/tick-svgrepo-com.svg b/front/v1/public/assets/icons/tick-svgrepo-com.svg deleted file mode 100644 index bd30433..0000000 --- a/front/v1/public/assets/icons/tick-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/unlock-svgrepo-com.svg b/front/v1/public/assets/icons/unlock-svgrepo-com.svg deleted file mode 100644 index 45d9636..0000000 --- a/front/v1/public/assets/icons/unlock-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/upload-svgrepo-com.svg b/front/v1/public/assets/icons/upload-svgrepo-com.svg deleted file mode 100644 index 7c4201d..0000000 --- a/front/v1/public/assets/icons/upload-svgrepo-com.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/user-add-svgrepo-com.svg b/front/v1/public/assets/icons/user-add-svgrepo-com.svg deleted file mode 100644 index 1c8b986..0000000 --- a/front/v1/public/assets/icons/user-add-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/user-remove-svgrepo-com.svg b/front/v1/public/assets/icons/user-remove-svgrepo-com.svg deleted file mode 100644 index a9867aa..0000000 --- a/front/v1/public/assets/icons/user-remove-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/user-svgrepo-com.svg b/front/v1/public/assets/icons/user-svgrepo-com.svg deleted file mode 100644 index 3d131af..0000000 --- a/front/v1/public/assets/icons/user-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/user-x-svgrepo-com.svg b/front/v1/public/assets/icons/user-x-svgrepo-com.svg deleted file mode 100644 index 683277c..0000000 --- a/front/v1/public/assets/icons/user-x-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/volume-down-svgrepo-com.svg b/front/v1/public/assets/icons/volume-down-svgrepo-com.svg deleted file mode 100644 index 1ecc293..0000000 --- a/front/v1/public/assets/icons/volume-down-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/volume-mute-svgrepo-com.svg b/front/v1/public/assets/icons/volume-mute-svgrepo-com.svg deleted file mode 100644 index 693b2bd..0000000 --- a/front/v1/public/assets/icons/volume-mute-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/volume-off-svgrepo-com.svg b/front/v1/public/assets/icons/volume-off-svgrepo-com.svg deleted file mode 100644 index 1cb4105..0000000 --- a/front/v1/public/assets/icons/volume-off-svgrepo-com.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/volume-up-svgrepo-com.svg b/front/v1/public/assets/icons/volume-up-svgrepo-com.svg deleted file mode 100644 index a3f0adf..0000000 --- a/front/v1/public/assets/icons/volume-up-svgrepo-com.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/x-circle-svgrepo-com.svg b/front/v1/public/assets/icons/x-circle-svgrepo-com.svg deleted file mode 100644 index 7d4be12..0000000 --- a/front/v1/public/assets/icons/x-circle-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/x-square-svgrepo-com.svg b/front/v1/public/assets/icons/x-square-svgrepo-com.svg deleted file mode 100644 index ba92413..0000000 --- a/front/v1/public/assets/icons/x-square-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/xmark-svgrepo-com.svg b/front/v1/public/assets/icons/xmark-svgrepo-com.svg deleted file mode 100644 index 84e4f19..0000000 --- a/front/v1/public/assets/icons/xmark-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v1/public/assets/icons/zoom-out-svgrepo-com.svg b/front/v1/public/assets/icons/zoom-out-svgrepo-com.svg deleted file mode 100644 index 0b4ef8c..0000000 --- a/front/v1/public/assets/icons/zoom-out-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v1/public/favicon.ico b/front/v1/public/favicon.ico deleted file mode 100644 index 57614f9c967596fad0a3989bec2b1deff33034f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmd^G33O9Omi+`8$@{|M-I6TH3wzF-p5CV8o}7f~KxR60LK+ApEFB<$bcciv%@SmA zV{n>g85YMFFeU*Uvl=i4v)C*qgnb;$GQ=3XTe9{Y%c`mO%su)noNCCQ*@t1WXn|B(hQ7i~ zrUK8|pUkD6#lNo!bt$6)jR!&C?`P5G(`e((P($RaLeq+o0Vd~f11;qB05kdbAOm?r zXv~GYr_sibQO9NGTCdT;+G(!{4Xs@4fPak8#L8PjgJwcs-Mm#nR_Z0s&u?nDX5^~@ z+A6?}g0|=4e_LoE69pPFO`yCD@BCjgKpzMH0O4Xs{Ahc?K3HC5;l=f zg>}alhBXX&);z$E-wai+9TTRtBX-bWYY@cl$@YN#gMd~tM_5lj6W%8ah4;uZ;jP@Q zVbuel1rPA?2@x9Y+u?e`l{Z4ngfG5q5BLH5QsEu4GVpt{KIp1?U)=3+KQ;%7ec8l* zdV=zZgN5>O3G(3L2fqj3;oBbZZw$Ij@`Juz@?+yy#OPw)>#wsTewVgTK9BGt5AbZ&?K&B3GVF&yu?@(Xj3fR3n+ZP0%+wo)D9_xp>Z$`A4 zfV>}NWjO#3lqumR0`gvnffd9Ka}JJMuHS&|55-*mCD#8e^anA<+sFZVaJe7{=p*oX zE_Uv?1>e~ga=seYzh{9P+n5<+7&9}&(kwqSaz;1aD|YM3HBiy<))4~QJSIryyqp| z8nGc(8>3(_nEI4n)n7j(&d4idW1tVLjZ7QbNLXg;LB ziHsS5pXHEjGJZb59KcvS~wv;uZR-+4qEqow`;JCfB*+b^UL^3!?;-^F%yt=VjU|v z39SSqKcRu_NVvz!zJzL0CceJaS6%!(eMshPv_0U5G`~!a#I$qI5Ic(>IONej@aH=f z)($TAT#1I{iCS4f{D2+ApS=$3E7}5=+y(rA9mM#;Cky%b*Gi0KfFA`ofKTzu`AV-9 znW|y@19rrZ*!N2AvDi<_ZeR3O2R{#dh1#3-d%$k${Rx42h+i&GZo5!C^dSL34*AKp z27mTd>k>?V&X;Nl%GZ(>0s`1UN~Hfyj>KPjtnc|)xM@{H_B9rNr~LuH`Gr5_am&Ep zTjZA8hljNj5H1Ipm-uD9rC}U{-vR!eay5&6x6FkfupdpT*84MVwGpdd(}ib)zZ3Ky z7C$pnjc82(W_y_F{PhYj?o!@3__UUvpX)v69aBSzYj3 zdi}YQkKs^SyXyFG2LTRz9{(w}y~!`{EuAaUr6G1M{*%c+kP1olW9z23dSH!G4_HSK zzae-DF$OGR{ofP*!$a(r^5Go>I3SObVI6FLY)N@o<*gl0&kLo-OT{Tl*7nCz>Iq=? zcigIDHtj|H;6sR?or8Wd_a4996GI*CXGU}o;D9`^FM!AT1pBY~?|4h^61BY#_yIfO zKO?E0 zJ{Pc`9rVEI&$xxXu`<5E)&+m(7zX^v0rqofLs&bnQT(1baQkAr^kEsk)15vlzAZ-l z@OO9RF<+IiJ*O@HE256gCt!bF=NM*vh|WVWmjVawcNoksRTMvR03H{p@cjwKh(CL4 z7_PB(dM=kO)!s4fW!1p0f93YN@?ZSG` z$B!JaAJCtW$B97}HNO9(x-t30&E}Mo1UPi@Av%uHj~?T|!4JLwV;KCx8xO#b9IlUW zI6+{a@Wj|<2Y=U;a@vXbxqZNngH8^}LleE_4*0&O7#3iGxfJ%Id>+sb;7{L=aIic8 z|EW|{{S)J-wr@;3PmlxRXU8!e2gm_%s|ReH!reFcY8%$Hl4M5>;6^UDUUae?kOy#h zk~6Ee_@ZAn48Bab__^bNmQ~+k=02jz)e0d9Z3>G?RGG!65?d1>9}7iG17?P*=GUV-#SbLRw)Hu{zx*azHxWkGNTWl@HeWjA?39Ia|sCi{e;!^`1Oec zb>Z|b65OM*;eC=ZLSy?_fg$&^2xI>qSLA2G*$nA3GEnp3$N-)46`|36m*sc#4%C|h zBN<2U;7k>&G_wL4=Ve5z`ubVD&*Hxi)r@{4RCDw7U_D`lbC(9&pG5C*z#W>8>HU)h z!h3g?2UL&sS!oY5$3?VlA0Me9W5e~V;2jds*fz^updz#AJ%G8w2V}AEE?E^=MK%Xt z__Bx1cr7+DQmuHmzn*|hh%~eEc9@m05@clWfpEFcr+06%0&dZJH&@8^&@*$qR@}o3 z@Tuuh2FsLz^zH+dN&T&?0G3I?MpmYJ;GP$J!EzjeM#YLJ!W$}MVNb0^HfOA>5Fe~UNn%Zk(PT@~9}1dt)1UQ zU*B5K?Dl#G74qmg|2>^>0WtLX#Jz{lO4NT`NYB*(L#D|5IpXr9v&7a@YsGp3vLR7L zHYGHZg7{ie6n~2p$6Yz>=^cEg7tEgk-1YRl%-s7^cbqFb(U7&Dp78+&ut5!Tn(hER z|Gp4Ed@CnOPeAe|N>U(dB;SZ?NU^AzoD^UAH_vamp6Ws}{|mSq`^+VP1g~2B{%N-!mWz<`)G)>V-<`9`L4?3dM%Qh6<@kba+m`JS{Ya@9Fq*m6$$ zA1%Ogc~VRH33|S9l%CNb4zM%k^EIpqY}@h{w(aBcJ9c05oiZx#SK9t->5lSI`=&l~ z+-Ic)a{FbBhXV$Xt!WRd`R#Jk-$+_Z52rS>?Vpt2IK<84|E-SBEoIw>cs=a{BlQ7O z-?{Fy_M&84&9|KM5wt~)*!~i~E=(6m8(uCO)I=)M?)&sRbzH$9Rovzd?ZEY}GqX+~ zFbEbLz`BZ49=2Yh-|<`waK-_4!7`ro@zlC|r&I4fc4oyb+m=|c8)8%tZ-z5FwhzDt zL5kB@u53`d@%nHl0Sp)Dw`(QU&>vujEn?GPEXUW!Wi<+4e%BORl&BIH+SwRcbS}X@ z01Pk|vA%OdJKAs17zSXtO55k!;%m9>1eW9LnyAX4uj7@${O6cfii`49qTNItzny5J zH&Gj`e}o}?xjQ}r?LrI%FjUd@xflT3|7LA|ka%Q3i}a8gVm<`HIWoJGH=$EGClX^C0lysQJ>UO(q&;`T#8txuoQ_{l^kEV9CAdXuU1Ghg8 zN_6hHFuy&1x24q5-(Z7;!poYdt*`UTdrQOIQ!2O7_+AHV2hgXaEz7)>$LEdG z<8vE^Tw$|YwZHZDPM!SNOAWG$?J)MdmEk{U!!$M#fp7*Wo}jJ$Q(=8>R`Ats?e|VU?Zt7Cdh%AdnfyN3MBWw{ z$OnREvPf7%z6`#2##_7id|H%Y{vV^vWXb?5d5?a_y&t3@p9t$ncHj-NBdo&X{wrfJ zamN)VMYROYh_SvjJ=Xd!Ga?PY_$;*L=SxFte!4O6%0HEh%iZ4=gvns7IWIyJHa|hT z2;1+e)`TvbNb3-0z&DD_)Jomsg-7p_Uh`wjGnU1urmv1_oVqRg#=C?e?!7DgtqojU zWoAB($&53;TsXu^@2;8M`#z{=rPy?JqgYM0CDf4v@z=ZD|ItJ&8%_7A#K?S{wjxgd z?xA6JdJojrWpB7fr2p_MSsU4(R7=XGS0+Eg#xR=j>`H@R9{XjwBmqAiOxOL` zt?XK-iTEOWV}f>Pz3H-s*>W z4~8C&Xq25UQ^xH6H9kY_RM1$ch+%YLF72AA7^b{~VNTG}Tj#qZltz5Q=qxR`&oIlW Nr__JTFzvMr^FKp4S3v*( diff --git a/front/v1/src/app/_index.scss b/front/v1/src/app/_index.scss deleted file mode 100644 index 78d6f7b..0000000 --- a/front/v1/src/app/_index.scss +++ /dev/null @@ -1,4 +0,0 @@ -@import 'variables'; -@import 'app'; -@import '../styles.scss'; - diff --git a/front/v1/src/app/_variables.scss b/front/v1/src/app/_variables.scss deleted file mode 100644 index a75739b..0000000 --- a/front/v1/src/app/_variables.scss +++ /dev/null @@ -1,15 +0,0 @@ -// Variables para el lenguaje visual (SCSS) -$primary-white: #fefcf8; // Blanco ahuevado gentil -$border-grey: #e0ddd8; // Gris suave para bordes -$text-dark: #2a2926; // Texto principal -$standard-button-icon: #8d8d8d; // Texto principal -$standard-button-border: #b8b8b891; // Texto principal -$standard-button-hovered: #494949; // Texto principal -$text-muted: #706b63; // Texto secundario - -// Colores de énfasis para cada acción -$edit-color: #4a90e2; // Azul suave -$delete-color: #e74c3c; // Rojo coral -$download-color: #27ae60; // Verde esmeralda -$share-color: #9b59b6; // Púrpura -$buy-color: #f39c12; // Naranja dorado \ No newline at end of file diff --git a/front/v1/src/app/app.config.ts b/front/v1/src/app/app.config.ts deleted file mode 100644 index d953f4c..0000000 --- a/front/v1/src/app/app.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; -import { provideRouter } from '@angular/router'; - -import { routes } from './app.routes'; - -export const appConfig: ApplicationConfig = { - providers: [ - provideBrowserGlobalErrorListeners(), - provideZoneChangeDetection({ eventCoalescing: true }), - provideRouter(routes) - ] -}; diff --git a/front/v1/src/app/app.html b/front/v1/src/app/app.html deleted file mode 100644 index 54911af..0000000 --- a/front/v1/src/app/app.html +++ /dev/null @@ -1,98 +0,0 @@ -
-
- - - - -
- -
- - - -
- - - @if(isMenuOpen) { - - } -
- -
- @if (showUploadForm) { - - } @else { - - } -
diff --git a/front/v1/src/app/app.routes.ts b/front/v1/src/app/app.routes.ts deleted file mode 100644 index dc39edb..0000000 --- a/front/v1/src/app/app.routes.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Routes } from '@angular/router'; - -export const routes: Routes = []; diff --git a/front/v1/src/app/app.scss b/front/v1/src/app/app.scss deleted file mode 100644 index bff59d9..0000000 --- a/front/v1/src/app/app.scss +++ /dev/null @@ -1,215 +0,0 @@ -@use "../styles.scss" as *; -@use "variables"; -@use "gallery/gallery"; - -.main-header { - position: sticky; - top: 0; - left: 0; - right: 0; - z-index: 1000; - background: variables.$primary-white; - -webkit-backdrop-filter: blur(20px); - backdrop-filter: blur(20px); - border-bottom: 2px solid variables.$border-grey; - box-shadow: 0 6px 10px rgba(42, 41, 38, 0.15); - width: 100%; - - .header-container { - display: flex; - align-items: center; - justify-content: space-between; - padding: 1rem 2rem; - max-width: 1400px; - margin: 0 auto; - gap: 2rem; - - .logo { - flex-shrink: 0; - - h1 { - margin: 0; - font-size: 1.5rem; - font-weight: 700; - color: variables.$text-dark; - letter-spacing: 0.5px; - text-transform: uppercase; - } - } - - .search-container { - flex: 1; - max-width: 600px; - margin: 0 2rem; - - .search-box { - position: relative; - display: flex; - align-items: center; - background: variables.$primary-white; - border: 2px solid variables.$border-grey; - border-radius: 12px; - overflow: hidden; - transition: border-color 0.3s ease, box-shadow 0.3s ease; - - &:focus-within { - border-color: variables.$edit-color; - box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1); - } - - .search-input { - flex: 1; - padding: 0.75rem 1rem; - border: none; - background: transparent; - font-size: 1rem; - color: variables.$text-dark; - outline: none; - - &::placeholder { - color: variables.$text-muted; - } - } - } - } - - .nav-icons { - display: flex; - align-items: center; - gap: 1.75rem; - flex-shrink: 0; - } - } - - .dropdown-menu { - position: absolute; - top: 100%; - right: 2rem; - background: variables.$primary-white; - border: 1px solid variables.$border-grey; - border-radius: 12px; - box-shadow: 0 8px 30px rgba(42, 41, 38, 0.15); - min-width: 200px; - overflow: hidden; - animation: slideDown 0.3s ease; - - .menu-nav { - padding: 0.5rem 0; - - .menu-item { - display: flex; - align-items: center; - gap: 0.75rem; - padding: 0.75rem 1.5rem; - color: variables.$text-dark; - text-decoration: none; - transition: background-color 0.2s ease; - font-weight: 500; - - &:hover { - background: rgba(variables.$edit-color, 0.1); - color: variables.$edit-color; - } - - svg-loader { - width: 20px; - height: 20px; - color: currentColor; - } - } - } - } -} - -@keyframes slideDown { - from { - opacity: 0; - transform: translateY(-10px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -.main-content { - min-height: calc(100vh - 80px); - padding: 0; - margin: 0; - width: 100%; - overflow-x: hidden; /* Sin scroll horizontal */ - overflow-y: scroll; /* Permite scroll vertical */ -} - -// Responsive design -@media (max-width: 768px) { - .main-header { - .header-container { - padding: 1rem; - gap: 1rem; - - .logo h1 { - font-size: 1.2rem; - } - - .search-container { - margin: 0; - max-width: none; - flex: 1; - - .search-box .search-input { - padding: 0.15rem; - font-size: 0.9rem; - } - } - - .nav-icons { - gap: 0.25rem; - } - } - - .dropdown-menu { - right: 1rem; - left: 1rem; - min-width: auto; - } - } - - .main-content { - margin-top: 0; - padding: 0; - min-height: calc(100vh - 70px); - width: 100%; - overflow-x: hidden; - } -} - -@media (max-width: 480px) { - .main-header { - .header-container { - flex-wrap: wrap; - gap: 0.5rem; - - .logo { - order: 1; - } - - .nav-icons { - order: 2; - } - - .search-container { - order: 3; - width: 100%; - margin: 0; - } - } - } - - .main-content { - margin-top: calc(120px + 2rem); - min-height: calc(100vh - 120px); - width: 100%; - overflow-x: hidden; - } -} diff --git a/front/v1/src/app/app.spec.ts b/front/v1/src/app/app.spec.ts deleted file mode 100644 index c7bd8f5..0000000 --- a/front/v1/src/app/app.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { App } from './app'; - -describe('App', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [App], - }).compileComponents(); - }); - - it('should create the app', () => { - const fixture = TestBed.createComponent(App); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(App); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain('Hello, front'); - }); -}); diff --git a/front/v1/src/app/app.ts b/front/v1/src/app/app.ts deleted file mode 100644 index 7de6b80..0000000 --- a/front/v1/src/app/app.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { Component, OnInit, HostListener } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { Title, Meta } from '@angular/platform-browser'; -import { Gallery } from './gallery/gallery'; -import { Button } from './button/button'; -import { SvgLoader } from './svg/svg'; -import { UploadImageForm } from './upload-image-form/upload-image-form'; -import { Router } from '@angular/router'; - -@Component({ - selector: 'app-root', - imports: [Gallery, Button, SvgLoader, FormsModule, UploadImageForm], - templateUrl: './app.html', - styleUrl: './app.scss', -}) -export class App implements OnInit { - protected title = 'mmorales.photo'; - protected description = - 'Portfolio of Manuel Morales, a photographer based in La Vila Joiosa, Alicante, Spain.'; - protected keywords = - 'photography, portfolio, Manuel Morales, La Vila Joiosa, Alicante, Spain'; - protected author = 'Manuel Morales'; - protected copyright = - '© ' + - new Date().getFullYear() + - ' Manuel Morales. All rights reserved.'; - - // Header properties - protected brandName = 'MMORALES PHOTO'; - protected searchQuery = ''; - protected isMenuOpen = false; - - constructor( - private titleService: Title, - private metaService: Meta, - private router: Router - ) {} - - ngOnInit(): void { - // Set page meta information - this.titleService.setTitle(this.title); - this.metaService.updateTag({ - name: 'description', - content: this.description, - }); - this.metaService.updateTag({ - name: 'keywords', - content: this.keywords, - }); - this.metaService.updateTag({ name: 'author', content: this.author }); - this.metaService.updateTag({ - name: 'copyright', - content: this.copyright, - }); - } - - protected showUploadForm = false; - - openUploadForm(): void { - this.showUploadForm = true; - } - closeUploadForm(): void { - this.showUploadForm = false; - } - - // Search functionality - onSearch(event: Event): void { - const target = event.target as HTMLInputElement; - this.searchQuery = target.value; - // TODO: Implement real-time search filtering - console.log('Searching for:', this.searchQuery); - } - - performSearch(): void { - if (this.searchQuery.trim()) { - // TODO: Implement search logic - console.log('Performing search for:', this.searchQuery); - } - } - - // Navigation functionality - openProfile(): void { - // TODO: Implement profile functionality - console.log('Opening profile...'); - } - - toggleMenu(): void { - this.isMenuOpen = !this.isMenuOpen; - } - - navigateTo(section: string): void { - this.isMenuOpen = false; // Close menu after navigation - this.showUploadForm = false; - if (section === 'home') { - this.router.navigate(['/']); - } - } - - // Close menu when clicking outside - @HostListener('document:click', ['$event']) - onDocumentClick(event: Event): void { - const target = event.target as HTMLElement; - if (!target.closest('.main-header')) { - this.isMenuOpen = false; - } - } - - // Close menu on escape key - @HostListener('document:keydown', ['$event']) - onKeyDown(event: KeyboardEvent): void { - if (event.key === 'Escape' && this.isMenuOpen) { - this.isMenuOpen = false; - } - } -} diff --git a/front/v1/src/app/button/button.html b/front/v1/src/app/button/button.html deleted file mode 100644 index f5a7e49..0000000 --- a/front/v1/src/app/button/button.html +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/front/v1/src/app/button/button.scss b/front/v1/src/app/button/button.scss deleted file mode 100644 index 9eaf152..0000000 --- a/front/v1/src/app/button/button.scss +++ /dev/null @@ -1,130 +0,0 @@ -@use "../variables"; - -button { - background: variables.$primary-white; - border: 2px solid variables.$standard-button-border; - color: variables.$standard-button-icon; - border-radius: 12px; - overflow: hidden; - cursor: pointer; - transition: all 0.3s ease; - width: 3.2rem; - height: 3.2rem; - margin: 0; - padding: 0; - flex-shrink: 1; - - &:hover { - color: variables.$standard-button-hovered; - transform: translateY(-5px) scale(1.07); - box-shadow: 0 6px 16px rgba(42, 41, 38, 0.1); - } - - &:active { - transform: translateY(0); - } - - &:disabled { - background: variables.$primary-white; - color: variables.$text-muted; - } - - svg-loader { - box-sizing: border-box; - pointer-events: none; - display: block; - height: 100%; - width: 100%; - margin: 0; - padding: 13%; - } - - &:hover { - svg-loader { - fill: variables.$primary-white; - } - } - - &.show-button { - } - &.hide-button { - } - &.open-button { - } - &.close-button { - } - - // Edit button - Pencil icon - &.edit-button { - color: variables.$edit-color; - border-color: variables.$edit-color; - &:hover { - background: variables.$edit-color; - color: variables.$primary-white; - } - svg-loader { - fill: variables.$edit-color; - } - } - - // Delete button - Trash icon - &.delete-button { - color: variables.$delete-color; - border-color: variables.$delete-color; - &:hover { - background: variables.$delete-color; - color: variables.$primary-white; - } - svg-loader { - fill: variables.$delete-color; - } - } - - // Download button - Download arrow - &.download-button { - color: variables.$download-color; - border-color: variables.$download-color; - &:hover { - background: variables.$download-color; - color: variables.$primary-white; - } - svg-loader { - fill: variables.$download-color; - } - } - - // Share button - Share icon - &.share-button { - color: variables.$share-color; - border-color: variables.$share-color; - &:hover { - background: variables.$share-color; - color: variables.$primary-white; - } - svg-loader { - fill: variables.$share-color; - } - } - - // Buy button - Shopping cart - &.buy-button { - color: variables.$buy-color; - border-color: variables.$buy-color; - &:hover { - background: variables.$buy-color; - color: variables.$primary-white; - } - svg-loader { - fill: variables.$buy-color; - } - } - - &.search-button { - border: none; - &:hover { - color: variables.$edit-color; - transform: none; - box-shadow: none; - } - } -} diff --git a/front/v1/src/app/button/button.spec.ts b/front/v1/src/app/button/button.spec.ts deleted file mode 100644 index 411f8f2..0000000 --- a/front/v1/src/app/button/button.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { Button } from './button'; - -describe('Button', () => { - let component: Button; - let fixture: ComponentFixture - - diff --git a/front/v1/src/app/upload-image-form/upload-image-form.scss b/front/v1/src/app/upload-image-form/upload-image-form.scss deleted file mode 100644 index 7064475..0000000 --- a/front/v1/src/app/upload-image-form/upload-image-form.scss +++ /dev/null @@ -1,200 +0,0 @@ -@import "../_variables"; - -.upload-image-form { - max-width: 600px; - margin: 0 auto; - padding: 2.5rem; - background: $primary-white; - border: 1px solid $border-grey; - border-radius: 16px; - box-shadow: 0 4px 20px rgba(42, 41, 38, 0.08); - - h2 { - margin: 0 0 2rem 0; - font-size: 2rem; - font-weight: 600; - color: $text-dark; - text-align: center; - letter-spacing: -0.5px; - } - - // Estructura lineal de los campos - label { - display: block; - margin: 1.5rem 0 0.5rem 0; - font-size: 1rem; - font-weight: 500; - color: $text-dark; - letter-spacing: 0.25px; - - &:first-of-type { - margin-top: 0; - } - } - - // Estilos unificados para inputs y textarea - input[type="text"], - textarea { - width: 100%; - padding: 0.875rem 1rem; - background: $primary-white; - border: 2px solid $border-grey; - border-radius: 8px; - font-family: inherit; - font-size: 1rem; - color: $text-dark; - transition: all 0.3s ease; - box-sizing: border-box; - - &:focus { - outline: none; - border-color: $edit-color; - box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1); - } - - &::placeholder { - color: $text-muted; - } - } - - // Textarea específico - textarea { - min-height: 100px; - resize: vertical; - line-height: 1.5; - } - - // Input file con estilo personalizado - input[type="file"] { - width: 100%; - padding: 1rem; - background: $primary-white; - border: 2px dashed $border-grey; - border-radius: 8px; - font-family: inherit; - font-size: 0.95rem; - color: $text-muted; - cursor: pointer; - transition: all 0.3s ease; - text-align: center; - - &:hover { - border-color: $edit-color; - background: rgba(74, 144, 226, 0.02); - } - - &:focus { - outline: none; - border-color: $edit-color; - box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1); - } - - // Estilo para cuando se selecciona un archivo - &::-webkit-file-upload-button { - background: $edit-color; - color: $primary-white; - border: none; - padding: 0.5rem 1rem; - border-radius: 6px; - font-size: 0.875rem; - font-weight: 500; - cursor: pointer; - margin-right: 0.75rem; - transition: background 0.2s ease; - - &:hover { - background: darken($edit-color, 5%); - } - } - } - - // Botón principal de envío - button { - width: 100%; - margin-top: 2.5rem; - padding: 1rem 2rem; - background: $edit-color; - color: $primary-white; - border: none; - border-radius: 12px; - font-family: inherit; - font-size: 1.1rem; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - text-transform: none; - letter-spacing: 0.5px; - - &:hover { - background: darken($edit-color, 5%); - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(74, 144, 226, 0.3); - } - - &:active { - transform: translateY(0); - } - - &:disabled { - background: $text-muted; - cursor: not-allowed; - transform: none; - box-shadow: none; - } - } - - // Estados de carga y feedback - &.uploading { - opacity: 0.8; - pointer-events: none; - - button { - background: $text-muted; - cursor: wait; - - &::after { - content: " ⏳"; - } - } - } -} - -// Responsive design -@media (max-width: 768px) { - .upload-image-form { - margin: 1rem; - padding: 1.5rem; - - h2 { - font-size: 1.75rem; - } - - input[type="text"], - textarea { - padding: 0.75rem; - } - - button { - padding: 0.875rem 1.5rem; - font-size: 1rem; - } - } -} - -@media (max-width: 480px) { - .upload-image-form { - margin: 0.5rem; - padding: 1rem; - border-radius: 12px; - - h2 { - font-size: 1.5rem; - margin-bottom: 1.5rem; - } - - label { - margin: 1rem 0 0.25rem 0; - font-size: 0.95rem; - } - } -} diff --git a/front/v1/src/app/upload-image-form/upload-image-form.spec.ts b/front/v1/src/app/upload-image-form/upload-image-form.spec.ts deleted file mode 100644 index 87de425..0000000 --- a/front/v1/src/app/upload-image-form/upload-image-form.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UploadImageForm } from './upload-image-form'; - -describe('UploadImageForm', () => { - let component: UploadImageForm; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [UploadImageForm] - }) - .compileComponents(); - - fixture = TestBed.createComponent(UploadImageForm); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v1/src/app/upload-image-form/upload-image-form.ts b/front/v1/src/app/upload-image-form/upload-image-form.ts deleted file mode 100644 index 42dce13..0000000 --- a/front/v1/src/app/upload-image-form/upload-image-form.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Component, EventEmitter, Output } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import axios from 'axios'; -import { PhotoFormModel } from './photo'; - -@Component({ - selector: 'upload-image-form', - imports: [FormsModule], - templateUrl: './upload-image-form.html', - styleUrl: './upload-image-form.scss', -}) -export class UploadImageForm { - @Output() close = new EventEmitter(); - - photo = new PhotoFormModel(); - - selectedFile: File | null = null; - - cancelUpload() { - this.close.emit(); - } - - uploadImage() { - if (this.selectedFile) { - const formData = new FormData(); - formData.append('image', this.selectedFile); - formData.append('title', this.photo.imageTitle); - formData.append('description', this.photo.imageDescription); - formData.append('tags', this.photo.imageTags); - formData.append('people', this.photo.imagePeople); - // Here you would typically send the formData to your backend API - - axios - .post('/photos', formData, { - headers: {}, - }) - .then(() => { - this.close.emit(); - }); - } - } - - thumbnailUrl: string | null = null; - onImageSelected(event: Event): void { - const input = event.target as HTMLInputElement; - if (input.files && input.files.length > 0) { - this.selectedFile = input.files[0]; - console.log('Selected image:', this.selectedFile); - this.thumbnailUrl = URL.createObjectURL(this.selectedFile); - } - } -} diff --git a/front/v1/src/index.html b/front/v1/src/index.html deleted file mode 100644 index a42be23..0000000 --- a/front/v1/src/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - Front - - - - - - - - diff --git a/front/v1/src/main.ts b/front/v1/src/main.ts deleted file mode 100644 index 6526cf6..0000000 --- a/front/v1/src/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { bootstrapApplication } from '@angular/platform-browser'; -import { appConfig } from './app/app.config'; -import { App } from './app/app'; -import axios from 'axios'; - -fetch('/assets/config.json') - .then((response) => response.json()) - .then((config) => { - axios.defaults.headers.post['Access-Control-Allow-Origin'] = '*'; - axios.defaults.baseURL = config.bff + '/api'; // Configurar base URL del BFF desde el archivo de configuración - bootstrapApplication(App, appConfig).catch((err) => console.error(err)); - }); diff --git a/front/v1/src/styles.scss b/front/v1/src/styles.scss deleted file mode 100644 index 0a0392a..0000000 --- a/front/v1/src/styles.scss +++ /dev/null @@ -1,39 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ -::-webkit-scrollbar { - width: 0px; - background: transparent; -} - -html, -body { - width: 100%; - height: 100%; - margin: 0; - padding: 0; - overflow-x: hidden; /* Elimina scroll horizontal */ - overflow-y: scroll; /* Permite scroll vertical */ - scroll-behavior: smooth; - box-sizing: border-box; - - // /* Estilos personalizados para la barra de scroll */ - // ::-webkit-scrollbar-track { - // background: #f1f1f1; - // border-radius: 4px; - // } - - // ::-webkit-scrollbar-thumb { - // background: #c1c1c1; - // border-radius: 4px; - // transition: background 0.3s ease; - // } - - // ::-webkit-scrollbar-thumb:hover { - // background: #a8a8a8; - // } - - // /* Para Firefox */ - // body { - // scrollbar-width: thin; - // scrollbar-color: #c1c1c1 #f1f1f1; - // } -} diff --git a/front/v1/tsconfig.app.json b/front/v1/tsconfig.app.json deleted file mode 100644 index 264f459..0000000 --- a/front/v1/tsconfig.app.json +++ /dev/null @@ -1,15 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "src/**/*.spec.ts" - ] -} diff --git a/front/v1/tsconfig.json b/front/v1/tsconfig.json deleted file mode 100644 index e4955f2..0000000 --- a/front/v1/tsconfig.json +++ /dev/null @@ -1,34 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "compileOnSave": false, - "compilerOptions": { - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "skipLibCheck": true, - "isolatedModules": true, - "experimentalDecorators": true, - "importHelpers": true, - "target": "ES2022", - "module": "preserve" - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "typeCheckHostBindings": true, - "strictTemplates": true - }, - "files": [], - "references": [ - { - "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.spec.json" - } - ] -} diff --git a/front/v1/tsconfig.spec.json b/front/v1/tsconfig.spec.json deleted file mode 100644 index 04df34c..0000000 --- a/front/v1/tsconfig.spec.json +++ /dev/null @@ -1,14 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/spec", - "types": [ - "jasmine" - ] - }, - "include": [ - "src/**/*.ts" - ] -} diff --git a/front/v2/.editorconfig b/front/v2/.editorconfig deleted file mode 100644 index f166060..0000000 --- a/front/v2/.editorconfig +++ /dev/null @@ -1,17 +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 -ij_typescript_use_double_quotes = false - -[*.md] -max_line_length = off -trim_trailing_whitespace = false diff --git a/front/v2/.gitignore b/front/v2/.gitignore deleted file mode 100644 index cc7b141..0000000 --- a/front/v2/.gitignore +++ /dev/null @@ -1,42 +0,0 @@ -# See https://docs.github.com/get-started/getting-started-with-git/ignoring-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 diff --git a/front/v2/.vscode/extensions.json b/front/v2/.vscode/extensions.json deleted file mode 100644 index 77b3745..0000000 --- a/front/v2/.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/front/v2/.vscode/launch.json b/front/v2/.vscode/launch.json deleted file mode 100644 index 35f90ce..0000000 --- a/front/v2/.vscode/launch.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "FRONT: DEBUG(Edge)", - "request": "launch", - "type": "msedge", - "url": "http://localhost:4200", - "webRoot": "${workspaceFolder}", - "preLaunchTask": "Start Node server with nvs latest" - }, - { - "name": "Attach Edge", - "type": "msedge", - "request": "attach", - "url": "http://localhost:4200/#", - "webRoot": "${workspaceFolder}" - }, - { - "name": "Launch Edge (Test)", - "type": "msedge", - "request": "launch", - "url": "http://localhost:9876/debug.html", - "webRoot": "${workspaceFolder}" - }, - { - "name": "Launch Edge (E2E)", - "type": "node", - "request": "launch", - "program": "${workspaceFolder}/node_modules/protractor/bin/protractor", - "protocol": "inspector", - "args": ["${workspaceFolder}/protractor.conf.js"] - } - ] -} diff --git a/front/v2/.vscode/tasks.json b/front/v2/.vscode/tasks.json deleted file mode 100644 index 95e77ed..0000000 --- a/front/v2/.vscode/tasks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Start Node server with nvs latest", - "type": "shell", - "command": "nvs use latest && npm run start", - "options": { - "cwd": "${workspaceFolder}" - }, - "isBackground": true, - "problemMatcher": [], - "presentation": { - "echo": true, - "reveal": "always", - "focus": false, - "panel": "shared" - } - } - ] -} diff --git a/front/v2/README.md b/front/v2/README.md deleted file mode 100644 index 9457a28..0000000 --- a/front/v2/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# V2 - -This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.0.2. - -## Development server - -To start a local development server, run: - -```bash -ng serve -``` - -Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files. - -## Code scaffolding - -Angular CLI includes powerful code scaffolding tools. To generate a new component, run: - -```bash -ng generate component component-name -``` - -For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: - -```bash -ng generate --help -``` - -## Building - -To build the project run: - -```bash -ng build -``` - -This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed. - -## Running unit tests - -To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command: - -```bash -ng test -``` - -## Running end-to-end tests - -For end-to-end (e2e) testing, run: - -```bash -ng e2e -``` - -Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. - -## Additional Resources - -For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/front/v2/angular.json b/front/v2/angular.json deleted file mode 100644 index cc1dfe4..0000000 --- a/front/v2/angular.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "v2": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "style": "scss" - } - }, - "root": "", - "sourceRoot": "src", - "prefix": "", - "architect": { - "build": { - "builder": "@angular/build:application", - "options": { - "browser": "src/main.ts", - "polyfills": ["zone.js"], - "tsConfig": "tsconfig.app.json", - "inlineStyleLanguage": "scss", - "assets": [ - { - "glob": "**/*", - "input": "public" - } - ], - "styles": ["src/styles.scss"], - "stylePreprocessorOptions": { - "includePaths": ["src/app"] - } - }, - "configurations": { - "production": { - "budgets": [ - { - "type": "initial", - "maximumWarning": "500kB", - "maximumError": "1MB" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "4kB", - "maximumError": "8kB" - } - ], - "outputHashing": "all" - }, - "development": { - "optimization": false, - "extractLicenses": false, - "sourceMap": true - } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular/build:dev-server", - "configurations": { - "production": { - "buildTarget": "v2:build:production" - }, - "development": { - "buildTarget": "v2:build:development" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular/build:extract-i18n" - }, - "test": { - "builder": "@angular/build:karma", - "options": { - "polyfills": ["zone.js", "zone.js/testing"], - "tsConfig": "tsconfig.spec.json", - "inlineStyleLanguage": "scss", - "assets": [ - { - "glob": "**/*", - "input": "public" - } - ], - "styles": ["src/styles.scss"] - } - } - } - } - } -} diff --git a/front/v2/package-lock.json b/front/v2/package-lock.json deleted file mode 100644 index cbfc185..0000000 --- a/front/v2/package-lock.json +++ /dev/null @@ -1,9733 +0,0 @@ -{ - "name": "v2", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "v2", - "version": "0.0.0", - "dependencies": { - "@angular/cdk": "^20.1.5", - "@angular/common": "^20.0.0", - "@angular/compiler": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/forms": "^20.0.0", - "@angular/material": "^20.1.5", - "@angular/platform-browser": "^20.0.0", - "@angular/router": "^20.0.0", - "rxjs": "~7.8.0", - "tslib": "^2.3.0", - "uuid": "^11.1.0", - "zone.js": "~0.15.0" - }, - "devDependencies": { - "@angular/build": "^20.0.2", - "@angular/cli": "^20.0.2", - "@angular/compiler-cli": "^20.0.0", - "@types/jasmine": "~5.1.0", - "axios": "^1.11.0", - "jasmine-core": "~5.7.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.1.0", - "typescript": "~5.8.2" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.32.0.tgz", - "integrity": "sha512-HG/6Eib6DnJYm/B2ijWFXr4txca/YOuA4K7AsEU0JBrOZSB+RU7oeDyNBPi3c0v0UDDqlkBqM3vBU/auwZlglA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.32.0.tgz", - "integrity": "sha512-8Y9MLU72WFQOW3HArYv16+Wvm6eGmsqbxxM1qxtm0hvSASJbxCm+zQAZe5stqysTlcWo4BJ82KEH1PfgHbJAmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.32.0.tgz", - "integrity": "sha512-w8L+rgyXMCPBKmEdOT+RfgMrF0mT6HK60vPYWLz8DBs/P7yFdGo7urn99XCJvVLMSKXrIbZ2FMZ/i50nZTXnuQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.32.0.tgz", - "integrity": "sha512-AdWfynhUeX7jz/LTiFU3wwzJembTbdLkQIOLs4n7PyBuxZ3jz4azV1CWbIP8AjUOFmul6uXbmYza+KqyS5CzOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.32.0.tgz", - "integrity": "sha512-bTupJY4xzGZYI4cEQcPlSjjIEzMvv80h7zXGrXY1Y0KC/n/SLiMv84v7Uy+B6AG1Kiy9FQm2ADChBLo1uEhGtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.32.0.tgz", - "integrity": "sha512-if+YTJw1G3nDKL2omSBjQltCHUQzbaHADkcPQrGFnIGhVyHU3Dzq4g46uEv8mrL5sxL8FjiS9LvekeUlL2NRqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.32.0.tgz", - "integrity": "sha512-kmK5nVkKb4DSUgwbveMKe4X3xHdMsPsOVJeEzBvFJ+oS7CkBPmpfHAEq+CcmiPJs20YMv6yVtUT9yPWL5WgAhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/ingestion": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.32.0.tgz", - "integrity": "sha512-PZTqjJbx+fmPuT2ud1n4vYDSF1yrT//vOGI9HNYKNA0PM0xGUBWigf5gRivHsXa3oBnUlTyHV9j7Kqx5BHbVHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/monitoring": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.32.0.tgz", - "integrity": "sha512-kYYoOGjvNQAmHDS1v5sBj+0uEL9RzYqH/TAdq8wmcV+/22weKt/fjh+6LfiqkS1SCZFYYrwGnirrUhUM36lBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.32.0.tgz", - "integrity": "sha512-jyIBLdskjPAL7T1g57UMfUNx+PzvYbxKslwRUKBrBA6sNEsYCFdxJAtZSLUMmw6MC98RDt4ksmEl5zVMT5bsuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.32.0.tgz", - "integrity": "sha512-eDp14z92Gt6JlFgiexImcWWH+Lk07s/FtxcoDaGrE4UVBgpwqOO6AfQM6dXh1pvHxlDFbMJihHc/vj3gBhPjqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.32.0.tgz", - "integrity": "sha512-rnWVglh/K75hnaLbwSc2t7gCkbq1ldbPgeIKDUiEJxZ4mlguFgcltWjzpDQ/t1LQgxk9HdIFcQfM17Hid3aQ6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.32.0.tgz", - "integrity": "sha512-LbzQ04+VLkzXY4LuOzgyjqEv/46Gwrk55PldaglMJ4i4eDXSRXGKkwJpXFwsoU+c1HMQlHIyjJBhrfsfdyRmyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-devkit/architect": { - "version": "0.2001.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.5.tgz", - "integrity": "sha512-LdjmE75wjmpHNfFsDecZB95H/DekX1hJLmRzGWid+Fd6lbyFBQyUjq+ucwD9WlHqqrD+CgKapQKnUhlBSIJxPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.1.5", - "rxjs": "7.8.2" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/core": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.5.tgz", - "integrity": "sha512-458Q/pNoXIyUWVbnXktMyc7Ly3MxsYwgQcEIFzzxJu+zDLAt1PwyDe4o+rd8XHwbceW9r0XIlQa78dEjew6MPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.2", - "source-map": "0.7.4" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.5.tgz", - "integrity": "sha512-fAxBFNIlete9FiqaqpQuXgjpoXwQRwKjv9MEW7DuciPYd/FFWr0858U2bzuJEk0mFNY3f9Q4vlY/RgDk9HWF2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.1.5", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "8.2.0", - "rxjs": "7.8.2" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/build": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.1.5.tgz", - "integrity": "sha512-Uh0VX9HQMLt4054P03f7UL6tu5kvuJhf5UXiRUzkaK/tMk7SDokp9YtN7lErPiWvDQFtuX9o27PMFpxwEfdRcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2001.5", - "@babel/core": "7.27.7", - "@babel/helper-annotate-as-pure": "7.27.3", - "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.13", - "@vitejs/plugin-basic-ssl": "2.1.0", - "beasties": "0.3.4", - "browserslist": "^4.23.0", - "esbuild": "0.25.5", - "https-proxy-agent": "7.0.6", - "istanbul-lib-instrument": "6.0.3", - "jsonc-parser": "3.3.1", - "listr2": "8.3.3", - "magic-string": "0.30.17", - "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "7.1.0", - "picomatch": "4.0.2", - "piscina": "5.1.2", - "rollup": "4.44.1", - "sass": "1.89.2", - "semver": "7.7.2", - "source-map-support": "0.5.21", - "tinyglobby": "0.2.14", - "vite": "7.0.6", - "watchpack": "2.4.4" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "lmdb": "3.4.1" - }, - "peerDependencies": { - "@angular/compiler": "^20.0.0", - "@angular/compiler-cli": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/localize": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "@angular/platform-server": "^20.0.0", - "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.1.5", - "karma": "^6.4.0", - "less": "^4.2.0", - "ng-packagr": "^20.0.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "tslib": "^2.3.0", - "typescript": ">=5.8 <5.9", - "vitest": "^3.1.1" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - }, - "@angular/localize": { - "optional": true - }, - "@angular/platform-browser": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@angular/ssr": { - "optional": true - }, - "karma": { - "optional": true - }, - "less": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@angular/cdk": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.1.5.tgz", - "integrity": "sha512-uJezXaVPAbumxTCv5JA7oIuWCgPlz9/Fj6dJl6bxcRD7DfMyHGq3dtoLhthuU/uk+OfK0FlTklR92Yss5frFUw==", - "license": "MIT", - "dependencies": { - "parse5": "^8.0.0", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": "^20.0.0 || ^21.0.0", - "@angular/core": "^20.0.0 || ^21.0.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/cdk/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@angular/cdk/node_modules/parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/@angular/cli": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.1.5.tgz", - "integrity": "sha512-1pkShcbPEkQn8wCoHsr9v+udy5EmelHVwZ5kNZjZZ2EDTcB/RC7cuuUfyWRxrYJxwT5K/jx00ORQvbVJj0L+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.2001.5", - "@angular-devkit/core": "20.1.5", - "@angular-devkit/schematics": "20.1.5", - "@inquirer/prompts": "7.6.0", - "@listr2/prompt-adapter-inquirer": "2.0.22", - "@modelcontextprotocol/sdk": "1.13.3", - "@schematics/angular": "20.1.5", - "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.32.0", - "ini": "5.0.0", - "jsonc-parser": "3.3.1", - "listr2": "8.3.3", - "npm-package-arg": "12.0.2", - "npm-pick-manifest": "10.0.0", - "pacote": "21.0.0", - "resolve": "1.22.10", - "semver": "7.7.2", - "yargs": "18.0.0", - "zod": "3.25.75" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/common": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.1.6.tgz", - "integrity": "sha512-VwV6u5y5NQg5u+Z5A50MCJNpxseny9Rv+csZe9zckH0ylqy9tLowbG6L7jrts36Ze2lwqRag0b+wB0TgrvaT0w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/core": "20.1.6", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/compiler": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.1.6.tgz", - "integrity": "sha512-PASAnrY3dHl3mOlYP7n49a1djbw+CGeBwkzhSVhDTrkg9hyx6GMDCNdNr1xZFWFjgS7vB3K8nIk8o9k+bXpH0g==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@angular/compiler-cli": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.1.6.tgz", - "integrity": "sha512-wskAeqRH46XfYRjaNSE3waeaBrogKghUM82WDDEw0U+CMP/j3BBS0RqILRYJCmuTjQ7RwXaPQBV2m2jAYaHlNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "7.28.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^18.0.0" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/compiler": "20.1.6", - "typescript": ">=5.8 <5.9" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular/core": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.1.6.tgz", - "integrity": "sha512-Nz62f9FNcvjOxUivi50YtmEfSdrS7xqpPDoN/jwLkT5VmFfIUFF77sabTF5KTWHCDbp420e2UON6uEblfiRfaw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/compiler": "20.1.6", - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" - }, - "peerDependenciesMeta": { - "@angular/compiler": { - "optional": true - }, - "zone.js": { - "optional": true - } - } - }, - "node_modules/@angular/forms": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.1.6.tgz", - "integrity": "sha512-9gLaiX8c2qOCu4jVukATCnSAANJuLKWGLZpZyLdJGHpZWM7ECf6hpsDKOq+AytqqYKWqZvjcI8AujUroU6aUtg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/common": "20.1.6", - "@angular/core": "20.1.6", - "@angular/platform-browser": "20.1.6", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/material": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.1.5.tgz", - "integrity": "sha512-Kce3rjQEblkX6gb6RH8Fefm0cFxXsM7d/bTCu3syCQiy4F0BUv4OGyThIkiWztVwVtg/E9IeYotoftCyydFJLQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/cdk": "20.1.5", - "@angular/common": "^20.0.0 || ^21.0.0", - "@angular/core": "^20.0.0 || ^21.0.0", - "@angular/forms": "^20.0.0 || ^21.0.0", - "@angular/platform-browser": "^20.0.0 || ^21.0.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/platform-browser": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.1.6.tgz", - "integrity": "sha512-0FmqP1+JdzrT74JZLbf5IpC8nn0AeJ3Mk1IlXRVcK5olyh3SiEZIGBw89mYwmgP3gQqnjoakooTMA3wwy4Evxw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/animations": "20.1.6", - "@angular/common": "20.1.6", - "@angular/core": "20.1.6" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@angular/router": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.1.6.tgz", - "integrity": "sha512-42eB6UB/uZt5LqBK7sIGV+fnWPWgwlhZDCl7aujv0Tlwx1HgdLW7EbqMYs+2SIrezn4uj0hg+74oy1PL46V7MA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/common": "20.1.6", - "@angular/core": "20.1.6", - "@angular/platform-browser": "20.1.6", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.0.tgz", - "integrity": "sha512-fdSw07FLJEU5vbpOPzXo5c6xmMGDzbZE2+niuDHX5N6mc6V0Ebso/q3xiHra4D73+PMsC8MJmcaZKuAAoaQsSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.13.tgz", - "integrity": "sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz", - "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.15", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.15.tgz", - "integrity": "sha512-wst31XT8DnGOSS4nNJDIklGKnf+8shuauVrWzgKegWUe28zfCftcWZ2vktGdzJgcylWSS2SrDnYUb6alZcwnCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "external-editor": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/expand": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.17.tgz", - "integrity": "sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.1.tgz", - "integrity": "sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.17.tgz", - "integrity": "sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.17.tgz", - "integrity": "sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.6.0.tgz", - "integrity": "sha512-jAhL7tyMxB3Gfwn4HIJ0yuJ5pvcB5maYUcouGcgd/ub79f9MqZ+aVnBtuFf+VC2GTkCBF+R+eo7Vi63w5VZlzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.1.9", - "@inquirer/confirm": "^5.1.13", - "@inquirer/editor": "^4.2.14", - "@inquirer/expand": "^4.0.16", - "@inquirer/input": "^4.2.0", - "@inquirer/number": "^3.0.16", - "@inquirer/password": "^4.0.16", - "@inquirer/rawlist": "^4.1.4", - "@inquirer/search": "^3.0.16", - "@inquirer/select": "^4.2.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.5.tgz", - "integrity": "sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/search": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.0.tgz", - "integrity": "sha512-PMk1+O/WBcYJDq2H7foV0aAZSmDdkzZB9Mw2v/DmONRJopwA/128cS9M/TXWLKKdEQKZnKwBzqu2G4x/2Nqx8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.1.tgz", - "integrity": "sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.22.tgz", - "integrity": "sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/type": "^1.5.5" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.1.tgz", - "integrity": "sha512-kKeP5PaY3bFrrF6GY5aDd96iuh1eoS+5CHJ+7hIP629KIEwzGNwbIzBmEX9TAhRJOivSRDTHCIsbu//+NsYKkg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.1.tgz", - "integrity": "sha512-9CMB3seTyHs3EOVWdKiB8IIEDBJ3Gq00Tqyi0V7DS3HL90BjM/AkbZGuhzXwPrfeFazR24SKaRrUQF74f+CmWw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.1.tgz", - "integrity": "sha512-1Mi69vU0akHgCI7tF6YbimPaNEKJiBm/p5A+aM8egr0joj27cQmCCOm2mZQ+Ht2BqmCfZaIgQnMg4gFYNMlpCA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.1.tgz", - "integrity": "sha512-d0vuXOdoKjHHJYZ/CRWopnkOiUpev+bgBBW+1tXtWsYWUj8uxl9ZmTBEmsL5mjUlpQDrlYiJSrhOU1hg5QWBSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.1.tgz", - "integrity": "sha512-00RbEpvfnyPodlICiGFuiOmyvWaL9nzCRSqZz82BVFsGTiSQnnF0gpD1C8tO6OvtptELbtRuM7BS9f97LcowZw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-win32-arm64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.1.tgz", - "integrity": "sha512-4h8tm3i1ODf+28UyqQZLP7c2jmRM26AyEEyYp994B4GiBdGvGAsYUu3oiHANYK9xFpvLuFzyGeqFm1kdNC0D1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.1.tgz", - "integrity": "sha512-HqqKIhTbq6piJhkJpTTf3w1m/CgrmwXRAL9R9j7Ru5xdZSeO7Mg4AWiBC9B00uXR+LvVZKtUyRMVZfhmIZztmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.13.3.tgz", - "integrity": "sha512-bGwA78F/U5G2jrnsdRkPY3IwIwZeWUEfb5o764b79lb0rJmMT76TLwKhdNZOWakOQtedYefwIR4emisEMvInKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.6", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@napi-rs/nice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.4.tgz", - "integrity": "sha512-Sqih1YARrmMoHlXGgI9JrrgkzxcaaEso0AH+Y7j8NHonUs+xe4iDsgC3IBIDNdzEewbNpccNN6hip+b5vmyRLw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@napi-rs/nice-android-arm-eabi": "1.0.4", - "@napi-rs/nice-android-arm64": "1.0.4", - "@napi-rs/nice-darwin-arm64": "1.0.4", - "@napi-rs/nice-darwin-x64": "1.0.4", - "@napi-rs/nice-freebsd-x64": "1.0.4", - "@napi-rs/nice-linux-arm-gnueabihf": "1.0.4", - "@napi-rs/nice-linux-arm64-gnu": "1.0.4", - "@napi-rs/nice-linux-arm64-musl": "1.0.4", - "@napi-rs/nice-linux-ppc64-gnu": "1.0.4", - "@napi-rs/nice-linux-riscv64-gnu": "1.0.4", - "@napi-rs/nice-linux-s390x-gnu": "1.0.4", - "@napi-rs/nice-linux-x64-gnu": "1.0.4", - "@napi-rs/nice-linux-x64-musl": "1.0.4", - "@napi-rs/nice-win32-arm64-msvc": "1.0.4", - "@napi-rs/nice-win32-ia32-msvc": "1.0.4", - "@napi-rs/nice-win32-x64-msvc": "1.0.4" - } - }, - "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.4.tgz", - "integrity": "sha512-OZFMYUkih4g6HCKTjqJHhMUlgvPiDuSLZPbPBWHLjKmFTv74COzRlq/gwHtmEVaR39mJQ6ZyttDl2HNMUbLVoA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.4.tgz", - "integrity": "sha512-k8u7cjeA64vQWXZcRrPbmwjH8K09CBnNaPnI9L1D5N6iMPL3XYQzLcN6WwQonfcqCDv5OCY3IqX89goPTV4KMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-GsLdQvUcuVzoyzmtjsThnpaVEizAqH5yPHgnsBmq3JdVoVZHELFo7PuJEdfOH1DOHi2mPwB9sCJEstAYf3XCJA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.4.tgz", - "integrity": "sha512-1y3gyT3e5zUY5SxRl3QDtJiWVsbkmhtUHIYwdWWIQ3Ia+byd/IHIEpqAxOGW1nhhnIKfTCuxBadHQb+yZASVoA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.4.tgz", - "integrity": "sha512-06oXzESPRdXUuzS8n2hGwhM2HACnDfl3bfUaSqLGImM8TA33pzDXgGL0e3If8CcFWT98aHows5Lk7xnqYNGFeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.4.tgz", - "integrity": "sha512-CgklZ6g8WL4+EgVVkxkEvvsi2DSLf9QIloxWO0fvQyQBp6VguUSX3eHLeRpqwW8cRm2Hv/Q1+PduNk7VK37VZw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.4.tgz", - "integrity": "sha512-wdAJ7lgjhAlsANUCv0zi6msRwq+D4KDgU+GCCHssSxWmAERZa2KZXO0H2xdmoJ/0i03i6YfK/sWaZgUAyuW2oQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.4.tgz", - "integrity": "sha512-4b1KYG+sriufhFrpUS9uNOEYYJqSfcbnwGx6uGX7JjrH8tELG90cOpCawz5THNIwlS3DhLgnCOcn0+4p6z26QA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.4.tgz", - "integrity": "sha512-iaf3vMRgr23oe1PUaKpxaH3DS0IMN0+N9iEiWVwYPm/U15vZFYdqVegGfN2PzrZLUl5lc8ZxbmEKDfuqslhAMA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.4.tgz", - "integrity": "sha512-UXoREY6Yw6rHrGuTwQgBxpfjK34t6mTjibE9/cXbefL9AuUCJ9gEgwNKZiONuR5QGswChqo9cnthjdKkYyAdDg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.4.tgz", - "integrity": "sha512-eFbgYCRPmsqbYPAlLYU5hYTNbogmIDUvknilehHsFhCH1+0/kN87lP+XaLT0Yeq4V/rpwChSd9vlz4muzFArtw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.4.tgz", - "integrity": "sha512-4T3E6uTCwWT6IPnwuPcWVz3oHxvEp/qbrCxZhsgzwTUBEwu78EGNXGdHfKJQt3soth89MLqZJw+Zzvnhrsg1mQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.4.tgz", - "integrity": "sha512-NtbBkAeyBPLvCBkWtwkKXkNSn677eaT0cX3tygq+2qVv71TmHgX4gkX6o9BXjlPzdgPGwrUudavCYPT9tzkEqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.4.tgz", - "integrity": "sha512-vubOe3i+YtSJGEk/++73y+TIxbuVHi+W8ZzrRm2eETCjCRwNlgbfToQZ85dSA+4iBB/NJRGNp+O4hfdbbttZWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.4.tgz", - "integrity": "sha512-BMOVrUDZeg1RNRKVlh4eyLv5djAAVLiSddfpuuQ47EFjBcklg0NUeKMFKNrKQR4UnSn4HAiACLD7YK7koskwmg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.4.tgz", - "integrity": "sha512-kCNk6HcRZquhw/whwh4rHsdPyOSCQCgnVDVik+Y9cuSVTDy3frpiCJTScJqPPS872h4JgZKkr/+CwcwttNEo9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/git": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", - "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", - "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", - "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/redact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", - "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", - "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/@parcel/watcher/node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", - "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", - "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", - "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", - "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", - "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", - "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", - "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", - "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", - "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", - "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", - "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", - "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", - "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", - "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", - "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", - "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", - "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", - "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", - "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", - "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@schematics/angular": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.1.5.tgz", - "integrity": "sha512-+bgbujb9F6cgP/hz0L8IEJy16aXIsgypTcHdckozbjDRUMtqjjmCNjutep0t6hfe9La/4hF8pKiOx9KLBFG+rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.1.5", - "@angular-devkit/schematics": "20.1.5", - "jsonc-parser": "3.3.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@sigstore/bundle": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", - "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", - "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", - "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", - "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "make-fetch-happen": "^14.0.2", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", - "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.4.1", - "tuf-js": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/verify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", - "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", - "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jasmine": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.8.tgz", - "integrity": "sha512-u7/CnvRdh6AaaIzYjCgUuVbREFgulhX05Qtf6ZtW+aOcjCKKVvKgpkPYJBFTZSHtFBYimzU4zP0V2vrEsq9Wcg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz", - "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.10.0" - } - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", - "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "peerDependencies": { - "vite": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/algoliasearch": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.32.0.tgz", - "integrity": "sha512-84xBncKNPBK8Ae89F65+SyVcOihrIbm/3N7to+GpRBHEUXGjA3ydWTMpcRW6jmFzkBQ/eqYy/y+J+NBpJWYjBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-abtesting": "5.32.0", - "@algolia/client-analytics": "5.32.0", - "@algolia/client-common": "5.32.0", - "@algolia/client-insights": "5.32.0", - "@algolia/client-personalization": "5.32.0", - "@algolia/client-query-suggestions": "5.32.0", - "@algolia/client-search": "5.32.0", - "@algolia/ingestion": "1.32.0", - "@algolia/monitoring": "1.32.0", - "@algolia/recommend": "5.32.0", - "@algolia/requester-browser-xhr": "5.32.0", - "@algolia/requester-fetch": "5.32.0", - "@algolia/requester-node-http": "5.32.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/beasties": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.4.tgz", - "integrity": "sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "htmlparser2": "^10.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.49", - "postcss-media-query-parser": "^0.2.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.5.0.tgz", - "integrity": "sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.198", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.198.tgz", - "integrity": "sha512-G5COfnp3w+ydVu80yprgWSfmfQaYRh9DOxfhAxstLyetKaLyl55QrNjx8C38Pc/C+RaDmb1M0Lk8wPEMQ+bGgQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", - "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "punycode": "^1.4.1", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", - "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-walk": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", - "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minimatch": "^10.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/immutable": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", - "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", - "dev": true, - "license": "MIT" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jasmine-core": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.7.1.tgz", - "integrity": "sha512-QnurrtpKsPoixxG2R3d1xP0St/2kcX5oTZyDyQJMY+Vzi/HUlu1kGm+2V8Tz+9lV991leB1l0xcsyz40s9xOOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/karma": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", - "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.7.2", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/karma-chrome-launcher": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", - "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "which": "^1.2.1" - } - }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/karma-coverage": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", - "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.0.5", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma-coverage/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jasmine-core": "^4.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "karma": "^6.0.0" - } - }, - "node_modules/karma-jasmine-html-reporter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", - "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "jasmine-core": "^4.0.0 || ^5.0.0", - "karma": "^6.0.0", - "karma-jasmine": "^5.0.0" - } - }, - "node_modules/karma-jasmine/node_modules/jasmine-core": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", - "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/karma/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "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.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/karma/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/karma/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/karma/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/karma/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/karma/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/karma/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/karma/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/karma/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/karma/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/karma/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz", - "integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/karma/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/lmdb": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.1.tgz", - "integrity": "sha512-hoG9RIv42kdGJiieyElgWcKCTaw5S6Jqwyd1gLSVdsJ3+8MVm8e4yLronThiRJI9DazFAAs9xfB9nWeMQ2DWKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "msgpackr": "^1.11.2", - "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.2.2", - "ordered-binary": "^1.5.3", - "weak-lru-cache": "^1.2.2" - }, - "bin": { - "download-lmdb-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.4.1", - "@lmdb/lmdb-darwin-x64": "3.4.1", - "@lmdb/lmdb-linux-arm": "3.4.1", - "@lmdb/lmdb-linux-arm64": "3.4.1", - "@lmdb/lmdb-linux-x64": "3.4.1", - "@lmdb/lmdb-win32-arm64": "3.4.1", - "@lmdb/lmdb-win32-x64": "3.4.1" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-fetch-happen": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "ssri": "^12.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", - "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/msgpackr": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", - "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", - "dev": true, - "license": "MIT", - "optional": true, - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "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" - } - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-gyp": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.3.0.tgz", - "integrity": "sha512-9J0+C+2nt3WFuui/mC46z2XCZ21/cKlFDuywULmseD/LlmnOrSeEAE4c/1jw6aybXLmpZnQY3/LmOJfgyHIcng==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "tar": "^7.4.3", - "tinyglobby": "^0.2.12", - "which": "^5.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-bundled": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", - "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-install-checks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", - "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-package-arg": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", - "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-packlist": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.1.tgz", - "integrity": "sha512-vaC03b2PqJA6QqmwHi1jNU8fAPXEnnyv4j/W4PVfgm24C4/zZGSVut3z0YUeN0WIFCo1oGOL02+6LbvFK7JL4Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^8.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", - "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", - "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^3.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ordered-binary": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", - "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pacote": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", - "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^12.0.0", - "npm-packlist": "^10.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", - "ssri": "^12.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.1.0.tgz", - "integrity": "sha512-2ifK6Jb+ONoqOy5f+cYHsqvx1obHQdvIk13Jmt/5ezxP0U9p+fqd+R6O73KblGswyuzBYfetmsfK9ThMgnuPPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-html-rewriting-stream/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/piscina": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.2.tgz", - "integrity": "sha512-9cE/BTA/xhDiyNUEj6EKWLEQC17fh/24ydYzQwcA7QdYh75K6kzL2GHvxDF5i9rFGtUaaKk7/u4xp07qiKXccQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.x" - }, - "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" - } - }, - "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true, - "license": "MIT" - }, - "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.9" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", - "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.44.1", - "@rollup/rollup-android-arm64": "4.44.1", - "@rollup/rollup-darwin-arm64": "4.44.1", - "@rollup/rollup-darwin-x64": "4.44.1", - "@rollup/rollup-freebsd-arm64": "4.44.1", - "@rollup/rollup-freebsd-x64": "4.44.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", - "@rollup/rollup-linux-arm-musleabihf": "4.44.1", - "@rollup/rollup-linux-arm64-gnu": "4.44.1", - "@rollup/rollup-linux-arm64-musl": "4.44.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-musl": "4.44.1", - "@rollup/rollup-linux-s390x-gnu": "4.44.1", - "@rollup/rollup-linux-x64-gnu": "4.44.1", - "@rollup/rollup-linux-x64-musl": "4.44.1", - "@rollup/rollup-win32-arm64-msvc": "4.44.1", - "@rollup/rollup-win32-ia32-msvc": "4.44.1", - "@rollup/rollup-win32-x64-msvc": "4.44.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sigstore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", - "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "@sigstore/sign": "^3.1.0", - "@sigstore/tuf": "^3.1.0", - "@sigstore/verify": "^2.1.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socks": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", - "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tuf-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", - "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "3.0.1", - "debug": "^4.4.1", - "make-fetch-happen": "^14.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.40", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", - "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", - "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.40.0", - "tinyglobby": "^0.2.14" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "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 - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.75", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.75.tgz", - "integrity": "sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "zod": "^3.24.1" - } - }, - "node_modules/zone.js": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", - "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", - "license": "MIT" - } - } -} diff --git a/front/v2/package.json b/front/v2/package.json deleted file mode 100644 index 315d0e0..0000000 --- a/front/v2/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "v2", - "version": "0.0.0", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "watch": "ng build --watch --configuration development", - "test": "ng test" - }, - "private": true, - "dependencies": { - "@angular/cdk": "^20.1.5", - "@angular/common": "^20.0.0", - "@angular/compiler": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/forms": "^20.0.0", - "@angular/material": "^20.1.5", - "@angular/platform-browser": "^20.0.0", - "@angular/router": "^20.0.0", - "rxjs": "~7.8.0", - "tslib": "^2.3.0", - "uuid": "^11.1.0", - "zone.js": "~0.15.0" - }, - "devDependencies": { - "@angular/build": "^20.0.2", - "@angular/cli": "^20.0.2", - "@angular/compiler-cli": "^20.0.0", - "@types/jasmine": "~5.1.0", - "axios": "^1.11.0", - "jasmine-core": "~5.7.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.1.0", - "typescript": "~5.8.2" - } -} diff --git a/front/v2/public/assets/external/apple-original-logo.svg b/front/v2/public/assets/external/apple-original-logo.svg deleted file mode 100644 index ef10aad..0000000 --- a/front/v2/public/assets/external/apple-original-logo.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - Black Logo Square - Created with Sketch. - - - - - - - - Black Logo Square - - - - diff --git a/front/v2/public/assets/external/google-original-wordmark-logo.svg b/front/v2/public/assets/external/google-original-wordmark-logo.svg deleted file mode 100644 index 05e3518..0000000 --- a/front/v2/public/assets/external/google-original-wordmark-logo.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - diff --git a/front/v2/public/assets/external/meta-logo.svg b/front/v2/public/assets/external/meta-logo.svg deleted file mode 100644 index 70f1f29..0000000 --- a/front/v2/public/assets/external/meta-logo.svg +++ /dev/null @@ -1,21 +0,0 @@ - - Meta - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/external/microsoft-logo.svg b/front/v2/public/assets/external/microsoft-logo.svg deleted file mode 100644 index 75b4aac..0000000 --- a/front/v2/public/assets/external/microsoft-logo.svg +++ /dev/null @@ -1,12 +0,0 @@ - - Microsoft - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/favicon.ico b/front/v2/public/assets/favicon.ico deleted file mode 100644 index e189f18919792ab764f54fa13d0fb67c9990a67d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12158 zcmeI&2dq`a76#z^Y^Yce6+~39f&~FZ)L5|h0;m{cY|$tx_JTc@#0DrD8;WAAAQ~fy z#wcK~vG;~oWA9yxW#0MLd+X$Q!#S77H6bQ%ZsyM3vuD<R*E3dp#o__l2 z^1=%*#Qk&6Jy+D%UVE*4_~D1;yYId$vu4f8Y31jie~xQ?GiJ;vZ@lqFdE$vD%F8dm z95h~i_0^#B%rnnKAKJ#CXT7#mJfeqZbYQ40&CSiFM~@z5vBefE%PqHDS$_HD%Mwd0 zQ95?)SUPv^T)KAcTDo-U5_PS$)+z%B4lKtXe|(uVX;S&=r=My`1^r!i*`+MH=%Qum zrI(J1MyF1l%2G=$6*SQ9(4j-nx5nI7bnuF2yu$#C^84?IYvrJie<&}%M zE3UX=$VjWtdTptA#G8r^46wkYxTXg@tg*%#!2>>w?bfYZ>E6A2wEE~S`NB6nkX6r~ zJ{*B`s<+i#~*)`ciwrYY_iEFp&Rp7TWz(VMURP5|J+vmsCdRZ46tPR6S2o{#^YZ-j&j)F`v(7f#Y*V#yGBO`6ZCfgN z;1$p03j-_)xsoxg?9|v?6R*~VCGq7mt$w(YPj=D1efzj)he`j-FTX5(`}PeU%u6}U zt)6mTuInD}Fu(#6nSSxb7iFDw)`@je+MQs{#RUyDS0`(lF*BE2P2R8rhx8KIz#y&RNY_qEV z=M^q|^M&*w{IW&+&EktMURGay^>WlvN0rf|N0+f<$Ck6tKD+F&!w&HbF4$o^=9puu zIvY1`TgUdC3PCW6%^1}~5gpXo+=FFK@-tW8bzOwe(YghRvA2E{6 zn`6&|cV6PkSbzuD@`Ot-y)-cV_S;Y)aD_qtU zyV#Ly{JsAA>tRp$<2O?0O*h>%^aRg&=biVL7pf5`Wuz>#eK(2OV@!*k1ss{JZtmTf-L3zyA8`BX|4$`|ry}8*LPF z;IG-%E&_bctv(7pz^lDwPLx1iM_6qxis!zPl`+BXl&EvmvIJ`Pb zwT6rRrOwPh;e-PRYfm&DJ+0CRSGS7qvRO6tg>P~iHf&hgVv8*z zMjUwHfmK~xeDTHM%g*O;cpu>G(yw2?>b^%N=I~3;RQc6_0Ry7CM?0U@Yq#8T%NV!a zcH70g9e3QZeD&2=t>Q}mf{!mBee}^G2NO5gV1w{`@kE>_CsiII_Ge80{PWM_{H1Ty zs8OLGa+Q1A!<-dV`($2=ovyWws$7)c8;g%M*IcvM_t`)rePwPd{yO`^m9|et_9VF? zxheExPg{85h0B#!URm{@4?g%H{PeE7?uv15zx{UPjv15qFk83xYxRrUt?h5-k+}-j zw%cwSYvQ93F7xmXmw9qrg&op4S&|uC=%_~?d1UmH!)2FU7UTW9_S$QUcT>ugDN|w$ z99dh#FuUiln=h`}7k1x$_n=Sqjc~yPo4MxE7avvzRD2=dFTs_u>A2&L3;QAqm>+-q z@mPaxus>_U$gbOh2~P8~wTF3sq_l<$Ciz63O~i^UaIrx?DBs991UowLQPRZBobTKD=IiKC)W#Yt%!5$em(ic6`nR)EcKCH+$w%>mH&+FdLkxqv9=~(i&z{JhpW{bKyJ>{WzC|ARlxryb#6HM2=><)3DCyCuy$;{z z?X}llG0z-jtF5*Q+f5s)hoQCS=D|ef3of`|$P0aTt~A1hHkpVSx7>0|jHj19_uMo5 z=HP=54n5LW;$nwvQ=UyP^0r({{zew;(4Nx>)12TUb2Q}f_T!9Qt?geKN9jatRvvut z!7_O8;JEe=O}3VHC^setF@vshE%~qWvluDXkn`+t!IO1%&ujbm6gfF3D0GyCEWi2Y zo7n%w2Q^9U6IvbC|tf{-&@`=L&ex zpA&r~FZ=;7c+O$%>p@!}Y)e4@6u`d!xI&4#Jgx8DHJQ#P%}o zqv1OaIis8QP!ErOyo*10GCuEJ+js1PY3Fn{uJR5q^IkkSJCh|lVRLd&u}n4JSrjfs zeE9U!PeVSw@u5>o3l{HqM~oN|d8qkhgMRWy_Koo5GvmyGjV#iR=#1^>x0{R;!C=il zyqtF0X>rc?zDbVY%+FU;XA0j0*_m^_SRr@z?%I1Mdq?h3#`9&dgIwXkCq3a)A6w8S z|MlARE6?FGFW);l|6~ky_Lp0ecltAXX>M+gZ>WSXedN^A4lSS%?4Z3H`X*+luGiFSzW$*CLgbk%%dxvSi^sNeBdP&^) zH7>_`Z%c0Yvj)BFyz|ZhpRbDZVmy7w5%Fa_oO~>K#b-+#E$`8=|LYfP$f))^#@Ncc z^ZDnWKi17a1?`jCcB>M^ztxpeu0(Mt;e5 z`GdSBeOfCXdlzdSpG)1NLAUzF4f~iPKJYL3h&9L)KXB%`#5nx3S-<}vCwjJjh^<+y z@80*8efHTW_84+vPi$P3BdGKtFSed<&wKB^clZk*N_mr``0eatEc-^owd$HrkcVg1 zvVQu6>-=sGJ6stPylYLlCI7i^c&Em8`5JxVCwVfKyu?p7%&#xGr7hxh;VWUfMYd?@SO1<&+LJ{k-dG|{*4bZH$HidMJoSl`#h_am;3Cim5sT1pKa1h`MS@wa*Sti zu|s--3BKAGMdyz``e=~Ld3;I?*=@JoVh&qyzSGJ>_=5K+SS`7Ii95c?&Yr%QdgUy+-*!QRp4_w=6eL~D#^Y{orb*BY1e+~bd(>BD#b z{{16YO}l_A{mVL;BhZ^F?ve=|d0*pqNY2mc2Z>P*Lx+CPFlf-AcqfcU`!uZRuxmQi z!rYdMPR=JoxHFEiOL0DN!A(wDGI32`_S-z~@+on}y;$H(mcEe~-HVs(L(KLLOg_NJ z#Sp&lx-B(n$fv|1^w|?%5j!%@^Dk8n$qq9o%e|5A;>Yo{9DD?eBQi?>_f_*ZTRf zXRcMgm@z_s`g-nr>GyNnqD_X*^mM`Y=uDw6=MlM`@7}&0crW2wmONIK%joxB$$8o{ zea5M-^WIs-*zBwA_bmH!Zd+Qktc7L3t7=`(aE9MWD;b8u(%6QCSXHQuE9ls~sOP?2dxInR_9+}t@XL*%(cBkV7j*)h zR&iu> z+zQ)L7$NwV!y7tyXuUXTAgZ*ySZmyOUxI>WSeO!$ojC~~Q$UON7D(5DSY$*xTAB#4 z>J9R9C6Nw}^CJ1ujSC-Q7SDm`)RUV68u%hws)WD8_;Vgqdy_Q8vwEM~ArOe(H)1a* zCv7|y1Y*4qmx&Z@e&(6Y;J@oK#qbz4KILNgH-AL;tT<#nh_e;;55>((U1`Bk#60ZE z${WE|;$k;0g=Dv>>piha`vx8>)JXW-nS4E-UF>h`wT6@9gN3y<{HDCef=+S41fkYL zD4nj%B=)IdlB4BAszJ$hlzludD$(v|1J`y(2mj-RbqXOFQ49S1t*tFX0Tw@o z?2_Q|?kiFGxvbPwX!82hOU4u}{_`wLi;H&0hkGD)cp1yl(a{%dxqXSX$mTCAPcfGP z{){_T8i9e*SEbw^?QP6*&_b{_jooF&r80i=&|44Q+l+QJdak-Au`f+it&W^%Zl;+atD*=X$e1=E8aMnwo43 z{zWStz91g&)Gd$KC50U=+3q$OfFjLsWQuG5CvSi+akRXrQ7FJMqftX|MzqQ(R?u3h z+E=7KlhRdmF@0{%X=imp7ll%YT07v&?5XscR;h1jh-tTrK)w%iw`4QNS|d-6k9xBt zG_A@kgngEOi`BZ1e(y@XwXm@8je@csDaPTlW`-w!5yMfLMJ4FUng^wQNl6UWdSQY2%-RkNw5~t{O=HAwB5{SvT}oyglR1qOPEf!o>=UNK#F_V6eMliJ%POFTOa(#zTsMbx(e zNZ}2__Km;8IH_G-F(qp4$=5YE`sCIa*tKbSeQ=!BPCr1Rr-Qkap`YyW7ZoWuLNbAj z^O`DP4i?clp2bnzUwXeuy-s}+a_wn53!Psp>OJInpmL|*5o)PZ(PC)_m10KK_vhMjW-hVe*i!mzu_%Ue>wHDg@R+{m- z($RtesP^dQqZLn(=jRSLPPYJMbz*t6IvT{eS#EnoHz?_i$aE0b7RhX_5+16)uKiwt zFvtT{X98uf%1nka)X)T>HSO)MgXkZDN^t-4g^5V%auCc=$;;&bahJ|F2&iaiUF~e{jCu zh|8@oi@GN{SZ;j$mDcZ(^k9+k6*_zet=z}21~WhR~EP3wk$ z3q4g|LbipF?29=Y@&>m?fDS^bfwnToP$!b6Wcu{eRaWzal1+S`9j@bLy`~_LB*lG! z@mdf2na*T@k>npvKt@fAT^O?+I!~f-|eKiK>+r zZJY7{mpy5M#$KG!^p{0=B3k?rQ5UZ6@NNSAasnFS7ZBi@27k^Mkq5-!E%7ialKwK# zMg;{0e&!fuZ}F$QUXYN`P+9*)7R@BC*~dx;S1ya%6k)L!Rn2g&WK-)4H|X?+tlRC3 z%-2sved^mwP=(NLPAfNoY7?+D=d<*p`U^EL#kFe{!;1!87MGUF%F73*@~V#B8x?BZ zOa*|6V&ulAZ=iDP>+j9=<@BT)D0Yo|Hvd>0E?-z#8Lr8Jh6l+f?$Y*7dcRZF)0$Ps zd&>l_avCV^741|2SqfPFqitZo2q_^4gQdGBU1<^TgR78eUOV9V@555P_1Bf=6~`|hAiDl$grw=;y6+7&q8+&cn@%6WvnL2L_yO? ztP{1s2jq4qHX*8Gfkmlw=wjvyo?(h@=S$a#+}Q~*`)H&8`0=eMq%%uH z7JCYVT;fYdOE8PZJ{SX7C;QF0A0S03I>o!kl;)4AHDylE`Kq>TF7Yf@t_$H#!gBe49eUhZual0vVJ9 zqWMlK4DB&qi?n3JU@-C5)Vuu&PVE>-NiQ`ujQI zF7kVqio`1tQH`OLjs2yM#_0}}vQl(`wMc50g8&QN$PXzV?i)L4@2&TiY)`V$XfCjv zop%|^-i+}A^$1vI??g;g+S45Dtk?rcjhUuVE9Xu8@<;3}kAj(RZEvr)oMrSPqA2|U zf~kiIGlfE>U+2L@?SZV<(%?C(D7P;nm_&{h0Z@bFoaR*5C#D7GT!_8o<4x9bPV;bfo*K+OmW))PBHipI z6}~!?d3^kA5=B86Vj`A2D_Cp1h?M^vaM%rw0lN}CCOUax?UYs+f0kaA&#VqAm+$Nc z!8W`fEdSHg?mCI5(Lt--^_wa#`!*xrkcdzuOYjbgd%PAGu);yy>kIq>9JLt3%geS; zlR*{Q={#8oMx)7Q>BibtKT!KyE=Lpktj6@_Ke^SDHMm)ohB%?Ws~AToC;P@~+^A&2 zj^$TYRt}HW!f5i!%3=V#CyWJ4j)f9~B#h3RPZs$ULG7H|=_11?1!u!uH$Ybq5)$&h z`)tg8E}i$?QFUPSq8DYds#NBem)j^PP|k{a zqZiF{2Nym^p;)79PKfaVmQ}fb!ID!ztu6S4E0 z)w)xG0qr^;h{3(Ln+xP?-EAq`+knJ1Z+~x8=&yWw?_yIk)6to*DY@j$`PkXq z&!MK=LWQ5u8PR(UO$OTqD}3Ze)seBR5X)CJT4D309y<{6uoDxnRr^gMivggZ>#W8j zXY-2AO{bYNcP!~m%T3X!9ZM1GFOd7bz7oX4IccUU-v&>jqLlmZ7DV8LI`GOrq=`i) zLSn%i4o-dVfIpo5nXd{q|6=5y?nE3`7k~)O9M^79<Hyd1ZYjBjwnP;+HdB~`=)@UKW2L}??S1STiRkS z?R{f>mY3_j`wvMMc?P>A?%2&D+*1HLnYhcMt}`aq;%WMWTH;x66ST~JtL)f(hYhXD z71^ms!3P&4qn0rzyLhFJ*X@(1MtfE?tm|v=Cd_efW60P*EOf`cK;X20J@r_A_w*5n zYm~`QQOH^&g$sp3jTlfWyI;o&PLg~2JjAnRW;1P_mVRNfpJ1$UDL{c-mag}20pI?V zbd}iR&AG8Bf7={8L=y!3XR{#e50;^f9WL8ECoII3RPETq*0hcBG!kaJ`|v}k`?wRa z2_^jS^Q-3L?TiYIiRmMvHB{K+6(XNr^V}G#jv<{-AfcDok zR}&Hv0A62rbadpimjBxNU0(IZgw|zTDpKVIP*^vyR+!{coyS|d%1+R1$Ufcuv>Nf_ zt#lHF7{+Z?+oyC9mu#n6Zzs$)s6CbzS?C%tw;2o+YScYre?KJq?OOnC5R&^SO+23T z@*>sv_;@g7B2fEg>WQy8CtQq3iNTYAAgk=rrF?kjR_=UXTHH;^bF?ZFU?bnWWT+Udv+H@|PxzF}A+unnt`qg#}_ckhiN>fXo3 z9S+<5flR2%&*9;A^QH|}uw}xWnJds3bYS`Ql%ke&npLwO2Wd_#-}x*xWU5H6-O?^B zp`|5hKxXUfyl1;vfq%Fv{bXj?+;%oK_mJO+#e1&zO4Dw;=xLJ*ZkCzQx$2;`xJD-z zVKbq&u?x4KpM`ygu}n-%fF%1FO5aV_x$q$#G-IztKkaVZzxrrnrt7p8Ov}y0{1;7D z_!J2@bN z1b|mTxrC*M+BnAhps@x{K<}MQa`5Kd`Y7R<*&20A%%xkqtAWiuZ#|pJ{wupf{~-Oc zX^*lc#q35Jc{(|sBxc|7DeUAKc*&uZ$KC>3Z6;1|b$({jll_38nv;A-ZVqk2KYJ=WQRelmFKyB!&Jv?3X5fOBTkVEbXRm4=a TyM8)&KL^oPf1rj{c@+LXIy@*u diff --git a/front/v2/public/assets/icons/_fix-svg-stroke.js b/front/v2/public/assets/icons/_fix-svg-stroke.js deleted file mode 100644 index 97ce02d..0000000 --- a/front/v2/public/assets/icons/_fix-svg-stroke.js +++ /dev/null @@ -1,12 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -const iconsDir = __dirname; -fs.readdirSync(iconsDir).forEach(file => { - if (file.endsWith('.svg')) { - const filePath = path.join(iconsDir, file); - let content = fs.readFileSync(filePath, 'utf8'); - content = content.replace(/stroke="#[0-9a-fA-F]{3,6}"/g, 'stroke="currentColor"'); - fs.writeFileSync(filePath, content, 'utf8'); - } -}); \ No newline at end of file diff --git a/front/v2/public/assets/icons/add-square-svgrepo-com.svg b/front/v2/public/assets/icons/add-square-svgrepo-com.svg deleted file mode 100644 index 60f9b55..0000000 --- a/front/v2/public/assets/icons/add-square-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/add-svgrepo-com.svg b/front/v2/public/assets/icons/add-svgrepo-com.svg deleted file mode 100644 index 4662c0d..0000000 --- a/front/v2/public/assets/icons/add-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/alert-square-svgrepo-com.svg b/front/v2/public/assets/icons/alert-square-svgrepo-com.svg deleted file mode 100644 index fb71faa..0000000 --- a/front/v2/public/assets/icons/alert-square-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/align-justify-svgrepo-com.svg b/front/v2/public/assets/icons/align-justify-svgrepo-com.svg deleted file mode 100644 index 8633686..0000000 --- a/front/v2/public/assets/icons/align-justify-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/align-left-svgrepo-com.svg b/front/v2/public/assets/icons/align-left-svgrepo-com.svg deleted file mode 100644 index 2a6be29..0000000 --- a/front/v2/public/assets/icons/align-left-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/align-right-svgrepo-com.svg b/front/v2/public/assets/icons/align-right-svgrepo-com.svg deleted file mode 100644 index b45a18f..0000000 --- a/front/v2/public/assets/icons/align-right-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/arrow-down-left-svgrepo-com.svg b/front/v2/public/assets/icons/arrow-down-left-svgrepo-com.svg deleted file mode 100644 index a74722b..0000000 --- a/front/v2/public/assets/icons/arrow-down-left-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/arrow-down-right-svgrepo-com.svg b/front/v2/public/assets/icons/arrow-down-right-svgrepo-com.svg deleted file mode 100644 index 3e64fbb..0000000 --- a/front/v2/public/assets/icons/arrow-down-right-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/arrow-down-svgrepo-com.svg b/front/v2/public/assets/icons/arrow-down-svgrepo-com.svg deleted file mode 100644 index aff78bb..0000000 --- a/front/v2/public/assets/icons/arrow-down-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/arrow-left-svgrepo-com.svg b/front/v2/public/assets/icons/arrow-left-svgrepo-com.svg deleted file mode 100644 index 289a108..0000000 --- a/front/v2/public/assets/icons/arrow-left-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/arrow-right-svgrepo-com.svg b/front/v2/public/assets/icons/arrow-right-svgrepo-com.svg deleted file mode 100644 index 5206b98..0000000 --- a/front/v2/public/assets/icons/arrow-right-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/arrow-up-left-svgrepo-com.svg b/front/v2/public/assets/icons/arrow-up-left-svgrepo-com.svg deleted file mode 100644 index afaeba2..0000000 --- a/front/v2/public/assets/icons/arrow-up-left-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/arrow-up-right-svgrepo-com.svg b/front/v2/public/assets/icons/arrow-up-right-svgrepo-com.svg deleted file mode 100644 index cae4485..0000000 --- a/front/v2/public/assets/icons/arrow-up-right-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/arrow-up-svgrepo-com.svg b/front/v2/public/assets/icons/arrow-up-svgrepo-com.svg deleted file mode 100644 index 902c038..0000000 --- a/front/v2/public/assets/icons/arrow-up-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/bell-svgrepo-com.svg b/front/v2/public/assets/icons/bell-svgrepo-com.svg deleted file mode 100644 index 2e47e4a..0000000 --- a/front/v2/public/assets/icons/bell-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/book-section-svgrepo-com.svg b/front/v2/public/assets/icons/book-section-svgrepo-com.svg deleted file mode 100644 index 841ea90..0000000 --- a/front/v2/public/assets/icons/book-section-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/browsers-svgrepo-com.svg b/front/v2/public/assets/icons/browsers-svgrepo-com.svg deleted file mode 100644 index 9bfecbc..0000000 --- a/front/v2/public/assets/icons/browsers-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/bubble-square-svgrepo-com.svg b/front/v2/public/assets/icons/bubble-square-svgrepo-com.svg deleted file mode 100644 index 02ca5a8..0000000 --- a/front/v2/public/assets/icons/bubble-square-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/calendar-day-svgrepo-com.svg b/front/v2/public/assets/icons/calendar-day-svgrepo-com.svg deleted file mode 100644 index d496692..0000000 --- a/front/v2/public/assets/icons/calendar-day-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/cart-minus-svgrepo-com.svg b/front/v2/public/assets/icons/cart-minus-svgrepo-com.svg deleted file mode 100644 index 3ef9090..0000000 --- a/front/v2/public/assets/icons/cart-minus-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/cart-plus-svgrepo-com.svg b/front/v2/public/assets/icons/cart-plus-svgrepo-com.svg deleted file mode 100644 index 88a8fac..0000000 --- a/front/v2/public/assets/icons/cart-plus-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/cart-shopping-fast-svgrepo-com.svg b/front/v2/public/assets/icons/cart-shopping-fast-svgrepo-com.svg deleted file mode 100644 index 355ca00..0000000 --- a/front/v2/public/assets/icons/cart-shopping-fast-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/cart-xmark-svgrepo-com.svg b/front/v2/public/assets/icons/cart-xmark-svgrepo-com.svg deleted file mode 100644 index 152c31e..0000000 --- a/front/v2/public/assets/icons/cart-xmark-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/chevron-down-svgrepo-com.svg b/front/v2/public/assets/icons/chevron-down-svgrepo-com.svg deleted file mode 100644 index 8bd725b..0000000 --- a/front/v2/public/assets/icons/chevron-down-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/chevron-left-svgrepo-com.svg b/front/v2/public/assets/icons/chevron-left-svgrepo-com.svg deleted file mode 100644 index 0dcb492..0000000 --- a/front/v2/public/assets/icons/chevron-left-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/chevron-right-svgrepo-com.svg b/front/v2/public/assets/icons/chevron-right-svgrepo-com.svg deleted file mode 100644 index eb5736f..0000000 --- a/front/v2/public/assets/icons/chevron-right-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/circle-svgrepo-com.svg b/front/v2/public/assets/icons/circle-svgrepo-com.svg deleted file mode 100644 index df9f2e2..0000000 --- a/front/v2/public/assets/icons/circle-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/clean_svgs.bat b/front/v2/public/assets/icons/clean_svgs.bat deleted file mode 100644 index 168bb57..0000000 --- a/front/v2/public/assets/icons/clean_svgs.bat +++ /dev/null @@ -1,2 +0,0 @@ -nvs latest -node .\_fix-svg-stroke.js \ No newline at end of file diff --git a/front/v2/public/assets/icons/clock-svgrepo-com.svg b/front/v2/public/assets/icons/clock-svgrepo-com.svg deleted file mode 100644 index 95a7942..0000000 --- a/front/v2/public/assets/icons/clock-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/code-svgrepo-com.svg b/front/v2/public/assets/icons/code-svgrepo-com.svg deleted file mode 100644 index defea8d..0000000 --- a/front/v2/public/assets/icons/code-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/compress-alt-2-svgrepo-com.svg b/front/v2/public/assets/icons/compress-alt-2-svgrepo-com.svg deleted file mode 100644 index 48c952f..0000000 --- a/front/v2/public/assets/icons/compress-alt-2-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/disc-svgrepo-com.svg b/front/v2/public/assets/icons/disc-svgrepo-com.svg deleted file mode 100644 index 4391cb8..0000000 --- a/front/v2/public/assets/icons/disc-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/door-open-svgrepo-com.svg b/front/v2/public/assets/icons/door-open-svgrepo-com.svg deleted file mode 100644 index db8c9dd..0000000 --- a/front/v2/public/assets/icons/door-open-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/download-svgrepo-com.svg b/front/v2/public/assets/icons/download-svgrepo-com.svg deleted file mode 100644 index 1610c42..0000000 --- a/front/v2/public/assets/icons/download-svgrepo-com.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/edit-svgrepo-com.svg b/front/v2/public/assets/icons/edit-svgrepo-com.svg deleted file mode 100644 index 7b02a97..0000000 --- a/front/v2/public/assets/icons/edit-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/engine-svgrepo-com.svg b/front/v2/public/assets/icons/engine-svgrepo-com.svg deleted file mode 100644 index b2dc8ab..0000000 --- a/front/v2/public/assets/icons/engine-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/expand-svgrepo-com.svg b/front/v2/public/assets/icons/expand-svgrepo-com.svg deleted file mode 100644 index 9527034..0000000 --- a/front/v2/public/assets/icons/expand-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/file-add-svgrepo-com.svg b/front/v2/public/assets/icons/file-add-svgrepo-com.svg deleted file mode 100644 index 46bd4ce..0000000 --- a/front/v2/public/assets/icons/file-add-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/file-remove-svgrepo-com.svg b/front/v2/public/assets/icons/file-remove-svgrepo-com.svg deleted file mode 100644 index 0ec15fd..0000000 --- a/front/v2/public/assets/icons/file-remove-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/file-text-svgrepo-com.svg b/front/v2/public/assets/icons/file-text-svgrepo-com.svg deleted file mode 100644 index c9ceb2c..0000000 --- a/front/v2/public/assets/icons/file-text-svgrepo-com.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/fingerprint-svgrepo-com.svg b/front/v2/public/assets/icons/fingerprint-svgrepo-com.svg deleted file mode 100644 index 4f97240..0000000 --- a/front/v2/public/assets/icons/fingerprint-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/folder-svgrepo-com.svg b/front/v2/public/assets/icons/folder-svgrepo-com.svg deleted file mode 100644 index 6f81e19..0000000 --- a/front/v2/public/assets/icons/folder-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/gauge-high-svgrepo-com.svg b/front/v2/public/assets/icons/gauge-high-svgrepo-com.svg deleted file mode 100644 index d2b9685..0000000 --- a/front/v2/public/assets/icons/gauge-high-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/gear-svgrepo-com.svg b/front/v2/public/assets/icons/gear-svgrepo-com.svg deleted file mode 100644 index 9510cba..0000000 --- a/front/v2/public/assets/icons/gear-svgrepo-com.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/grid-plus-svgrepo-com.svg b/front/v2/public/assets/icons/grid-plus-svgrepo-com.svg deleted file mode 100644 index e997734..0000000 --- a/front/v2/public/assets/icons/grid-plus-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/grid-search-svgrepo-com.svg b/front/v2/public/assets/icons/grid-search-svgrepo-com.svg deleted file mode 100644 index 970ca5e..0000000 --- a/front/v2/public/assets/icons/grid-search-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/grid-svgrepo-com.svg b/front/v2/public/assets/icons/grid-svgrepo-com.svg deleted file mode 100644 index 51e046f..0000000 --- a/front/v2/public/assets/icons/grid-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/id-badge-svgrepo-com.svg b/front/v2/public/assets/icons/id-badge-svgrepo-com.svg deleted file mode 100644 index c522e1a..0000000 --- a/front/v2/public/assets/icons/id-badge-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/info-circle-svgrepo-com.svg b/front/v2/public/assets/icons/info-circle-svgrepo-com.svg deleted file mode 100644 index f3d9536..0000000 --- a/front/v2/public/assets/icons/info-circle-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/info-square-svgrepo-com.svg b/front/v2/public/assets/icons/info-square-svgrepo-com.svg deleted file mode 100644 index 4650bb7..0000000 --- a/front/v2/public/assets/icons/info-square-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/lock-svgrepo-com.svg b/front/v2/public/assets/icons/lock-svgrepo-com.svg deleted file mode 100644 index 4aed4fb..0000000 --- a/front/v2/public/assets/icons/lock-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/mail-read-svgrepo-com.svg b/front/v2/public/assets/icons/mail-read-svgrepo-com.svg deleted file mode 100644 index ffd8a4a..0000000 --- a/front/v2/public/assets/icons/mail-read-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/mail-svgrepo-com.svg b/front/v2/public/assets/icons/mail-svgrepo-com.svg deleted file mode 100644 index 59f98b7..0000000 --- a/front/v2/public/assets/icons/mail-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/maximize-svgrepo-com.svg b/front/v2/public/assets/icons/maximize-svgrepo-com.svg deleted file mode 100644 index 9aa6af9..0000000 --- a/front/v2/public/assets/icons/maximize-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/menu-svgrepo-com.svg b/front/v2/public/assets/icons/menu-svgrepo-com.svg deleted file mode 100644 index b9360ff..0000000 --- a/front/v2/public/assets/icons/menu-svgrepo-com.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/front/v2/public/assets/icons/minimize-svgrepo-com.svg b/front/v2/public/assets/icons/minimize-svgrepo-com.svg deleted file mode 100644 index 6a51581..0000000 --- a/front/v2/public/assets/icons/minimize-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/minus-svgrepo-com.svg b/front/v2/public/assets/icons/minus-svgrepo-com.svg deleted file mode 100644 index 7d29ef7..0000000 --- a/front/v2/public/assets/icons/minus-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/more-horizontal-svgrepo-com.svg b/front/v2/public/assets/icons/more-horizontal-svgrepo-com.svg deleted file mode 100644 index 3b963ca..0000000 --- a/front/v2/public/assets/icons/more-horizontal-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/more-vertical-svgrepo-com.svg b/front/v2/public/assets/icons/more-vertical-svgrepo-com.svg deleted file mode 100644 index d2c8d68..0000000 --- a/front/v2/public/assets/icons/more-vertical-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/navigation-ne-svgrepo-com.svg b/front/v2/public/assets/icons/navigation-ne-svgrepo-com.svg deleted file mode 100644 index a30a1fc..0000000 --- a/front/v2/public/assets/icons/navigation-ne-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/navigation-nw-svgrepo-com.svg b/front/v2/public/assets/icons/navigation-nw-svgrepo-com.svg deleted file mode 100644 index 3e8081c..0000000 --- a/front/v2/public/assets/icons/navigation-nw-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/navigation-svgrepo-com.svg b/front/v2/public/assets/icons/navigation-svgrepo-com.svg deleted file mode 100644 index 32ee540..0000000 --- a/front/v2/public/assets/icons/navigation-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/objects-column-svgrepo-com.svg b/front/v2/public/assets/icons/objects-column-svgrepo-com.svg deleted file mode 100644 index 9c5c2db..0000000 --- a/front/v2/public/assets/icons/objects-column-svgrepo-com.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/push-down-svgrepo-com.svg b/front/v2/public/assets/icons/push-down-svgrepo-com.svg deleted file mode 100644 index 973912f..0000000 --- a/front/v2/public/assets/icons/push-down-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/push-left-svgrepo-com.svg b/front/v2/public/assets/icons/push-left-svgrepo-com.svg deleted file mode 100644 index d2c4f15..0000000 --- a/front/v2/public/assets/icons/push-left-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/push-right-svgrepo-com.svg b/front/v2/public/assets/icons/push-right-svgrepo-com.svg deleted file mode 100644 index 8e5bafc..0000000 --- a/front/v2/public/assets/icons/push-right-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/push-up-svgrepo-com.svg b/front/v2/public/assets/icons/push-up-svgrepo-com.svg deleted file mode 100644 index d51be51..0000000 --- a/front/v2/public/assets/icons/push-up-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/search-alt-1-svgrepo-com.svg b/front/v2/public/assets/icons/search-alt-1-svgrepo-com.svg deleted file mode 100644 index 4dfed1a..0000000 --- a/front/v2/public/assets/icons/search-alt-1-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/search-svgrepo-com.svg b/front/v2/public/assets/icons/search-svgrepo-com.svg deleted file mode 100644 index 616241e..0000000 --- a/front/v2/public/assets/icons/search-svgrepo-com.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/front/v2/public/assets/icons/send-alt-2-svgrepo-com.svg b/front/v2/public/assets/icons/send-alt-2-svgrepo-com.svg deleted file mode 100644 index bae8f5a..0000000 --- a/front/v2/public/assets/icons/send-alt-2-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/sidebar-bottom-svgrepo-com.svg b/front/v2/public/assets/icons/sidebar-bottom-svgrepo-com.svg deleted file mode 100644 index 1cd9053..0000000 --- a/front/v2/public/assets/icons/sidebar-bottom-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/sidebar-left-svgrepo-com.svg b/front/v2/public/assets/icons/sidebar-left-svgrepo-com.svg deleted file mode 100644 index 05aa48e..0000000 --- a/front/v2/public/assets/icons/sidebar-left-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/sidebar-right-svgrepo-com.svg b/front/v2/public/assets/icons/sidebar-right-svgrepo-com.svg deleted file mode 100644 index f460bf4..0000000 --- a/front/v2/public/assets/icons/sidebar-right-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/sidebar-top-svgrepo-com.svg b/front/v2/public/assets/icons/sidebar-top-svgrepo-com.svg deleted file mode 100644 index d29deb1..0000000 --- a/front/v2/public/assets/icons/sidebar-top-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/signal-svgrepo-com.svg b/front/v2/public/assets/icons/signal-svgrepo-com.svg deleted file mode 100644 index 1aa56a8..0000000 --- a/front/v2/public/assets/icons/signal-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/stopwatch-svgrepo-com.svg b/front/v2/public/assets/icons/stopwatch-svgrepo-com.svg deleted file mode 100644 index 8e16824..0000000 --- a/front/v2/public/assets/icons/stopwatch-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/support-svgrepo-com.svg b/front/v2/public/assets/icons/support-svgrepo-com.svg deleted file mode 100644 index 3c9d459..0000000 --- a/front/v2/public/assets/icons/support-svgrepo-com.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/table-cells-large-svgrepo-com.svg b/front/v2/public/assets/icons/table-cells-large-svgrepo-com.svg deleted file mode 100644 index e4005a6..0000000 --- a/front/v2/public/assets/icons/table-cells-large-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/tag-svgrepo-com.svg b/front/v2/public/assets/icons/tag-svgrepo-com.svg deleted file mode 100644 index abe4a05..0000000 --- a/front/v2/public/assets/icons/tag-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/tags-svgrepo-com.svg b/front/v2/public/assets/icons/tags-svgrepo-com.svg deleted file mode 100644 index f34f4ad..0000000 --- a/front/v2/public/assets/icons/tags-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/thumbs-down-svgrepo-com.svg b/front/v2/public/assets/icons/thumbs-down-svgrepo-com.svg deleted file mode 100644 index e2012ad..0000000 --- a/front/v2/public/assets/icons/thumbs-down-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/thumbs-up-svgrepo-com.svg b/front/v2/public/assets/icons/thumbs-up-svgrepo-com.svg deleted file mode 100644 index 7b8c1a5..0000000 --- a/front/v2/public/assets/icons/thumbs-up-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/tick-svgrepo-com.svg b/front/v2/public/assets/icons/tick-svgrepo-com.svg deleted file mode 100644 index bd30433..0000000 --- a/front/v2/public/assets/icons/tick-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/trash-svgrepo-com.svg b/front/v2/public/assets/icons/trash-svgrepo-com.svg deleted file mode 100644 index a09165b..0000000 --- a/front/v2/public/assets/icons/trash-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/unlock-svgrepo-com.svg b/front/v2/public/assets/icons/unlock-svgrepo-com.svg deleted file mode 100644 index 45d9636..0000000 --- a/front/v2/public/assets/icons/unlock-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/upload-svgrepo-com.svg b/front/v2/public/assets/icons/upload-svgrepo-com.svg deleted file mode 100644 index 7c4201d..0000000 --- a/front/v2/public/assets/icons/upload-svgrepo-com.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/user-add-svgrepo-com.svg b/front/v2/public/assets/icons/user-add-svgrepo-com.svg deleted file mode 100644 index 1c8b986..0000000 --- a/front/v2/public/assets/icons/user-add-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/user-question-svgrepo-com.svg b/front/v2/public/assets/icons/user-question-svgrepo-com.svg deleted file mode 100644 index 83c9434..0000000 --- a/front/v2/public/assets/icons/user-question-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/user-remove-svgrepo-com.svg b/front/v2/public/assets/icons/user-remove-svgrepo-com.svg deleted file mode 100644 index a9867aa..0000000 --- a/front/v2/public/assets/icons/user-remove-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/user-svgrepo-com.svg b/front/v2/public/assets/icons/user-svgrepo-com.svg deleted file mode 100644 index 3d131af..0000000 --- a/front/v2/public/assets/icons/user-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/user-x-svgrepo-com.svg b/front/v2/public/assets/icons/user-x-svgrepo-com.svg deleted file mode 100644 index 683277c..0000000 --- a/front/v2/public/assets/icons/user-x-svgrepo-com.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/volume-down-svgrepo-com.svg b/front/v2/public/assets/icons/volume-down-svgrepo-com.svg deleted file mode 100644 index 1ecc293..0000000 --- a/front/v2/public/assets/icons/volume-down-svgrepo-com.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/volume-mute-svgrepo-com.svg b/front/v2/public/assets/icons/volume-mute-svgrepo-com.svg deleted file mode 100644 index 693b2bd..0000000 --- a/front/v2/public/assets/icons/volume-mute-svgrepo-com.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/volume-off-svgrepo-com.svg b/front/v2/public/assets/icons/volume-off-svgrepo-com.svg deleted file mode 100644 index 1cb4105..0000000 --- a/front/v2/public/assets/icons/volume-off-svgrepo-com.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/volume-up-svgrepo-com.svg b/front/v2/public/assets/icons/volume-up-svgrepo-com.svg deleted file mode 100644 index a3f0adf..0000000 --- a/front/v2/public/assets/icons/volume-up-svgrepo-com.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/wand-magic-sparkles-svgrepo-com.svg b/front/v2/public/assets/icons/wand-magic-sparkles-svgrepo-com.svg deleted file mode 100644 index 78af396..0000000 --- a/front/v2/public/assets/icons/wand-magic-sparkles-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/x-circle-svgrepo-com.svg b/front/v2/public/assets/icons/x-circle-svgrepo-com.svg deleted file mode 100644 index 7d4be12..0000000 --- a/front/v2/public/assets/icons/x-circle-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/x-square-svgrepo-com.svg b/front/v2/public/assets/icons/x-square-svgrepo-com.svg deleted file mode 100644 index ba92413..0000000 --- a/front/v2/public/assets/icons/x-square-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/xmark-svgrepo-com.svg b/front/v2/public/assets/icons/xmark-svgrepo-com.svg deleted file mode 100644 index 84e4f19..0000000 --- a/front/v2/public/assets/icons/xmark-svgrepo-com.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/front/v2/public/assets/icons/zoom-out-svgrepo-com.svg b/front/v2/public/assets/icons/zoom-out-svgrepo-com.svg deleted file mode 100644 index 0b4ef8c..0000000 --- a/front/v2/public/assets/icons/zoom-out-svgrepo-com.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/v2/public/assets/logo.png b/front/v2/public/assets/logo.png deleted file mode 100644 index 5751f97c73b4cf0ea470a947353fa83d72d33f5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5783 zcmb7Ic|4R|`@d&nY-2DqcCzm?DZA`DW31W3V=XkO5Q&Lo9|qa8Z)IOvP(;?Dtceyx z5y_UGlKiIa`MvKy@B4YLIdksoT<3dz?{lAXKG%Jn`*7xP0qD>R_4NV(BO^%w4gdfR zzzTu@AgcD`&jo`0yxLNA?%%o#RTuw_0aJB0@c-j|ioEO1}|7=VCS05A&(!U8(%1$d~>4uXMxOu!$ZrQQlg0|!%k zQUBKQ6L2^SFhW287zsgA=k3#vS^FOa570;batVt_qJs{LBQ|q?wL#17hDyYfDp#9S zjye4@(cYwJKYzD#Q>ABGx8#?JS%8CLbytmo-(6V6{3Ze#4Eym~u}0E2yM9_gOJIzs zJe℘(PcD0tFkCWe3tEu^MUoGW@O)_&x>w+an5krG*NWJQwsS#f{233BtrxqRTO} zO&A=Q<_caPRk@1y8@20EFfa~WiqX6FbS1Gj;=H#ut_%EJy9iuvjFQBEIUyRgK@VB~ z8`cHDm^d5cZqjg)oW-3^GSGIDBKY;~sMED=aLwLwY>&zus6z-6U7F6*L6H)o{%t`2 zLjyuxB55Q5f`TAmC=GR0ehL%}fzf~fS~gY`l0!k0h5d*CmLMpG!BdwGPF+wC41Az* zuX)=dc%aGN*;RZlhw+`f+^!>vuvX^E|Sqzp2`MmO|7B#0ShK*G(taFxd1hA7pKOO{e!u*v(Q@5+DlV zo~?f8)_ZU6dAW4pxybCSa%_#5e|EI)=&qrC6%Eu9=f_z|M|YdK<>|Gi$KF2bF0J%kH&YRsVCYkH$&1yd zG_nSVdwM@AUkQQMoax>RtaS2y#&w~uAh6QdU&nkLKE#z%4pC0SEi4%y5l zm%{wnmtDvfA@I?h$EU6}ZoPeV=Q%3m#tQv`S>()tK={eOe^$ZY#un;P5qb(|R9w78 zBqS4G1=(GqHFC%fyXF-(MHWBfxz(Uj!|auYO>`#*^OQNBTY8>%hP94GKTIwzCi0=- z0g_F9a9ZS{&xEhtM!B0jT25>;$;BwVPEog7JqAsn1O=Uf>z~f@NGQ^Gg;oc1jawbhm(wo0i4 z4cVHaFSfX~t6R_DkA=Owc>*q!OUNj-=joS}HXMBSmfLarl!@Lge(9fbakjgJw0M!_ z#Zk9sSx$iz+;X+E7g6}xiSNb2PeYwMJ+D-*eD-cw=4CNRTYGv?_}h1!uU*DcbpF*R zl~vZ2EcsjMN(s_;8HVp$P4N^XOewVsQXb>DH~tgztE;Jz?x%YW8b4A@{=U-2x2fCv zh72PUB7FS~ymN-X&0O}>2~MBvR6*TxkApCnUV~@xSq^uKFt*gciIiY#W*a)m(a(Or zc0Q#k{Gjw@_Ls)5gF6Zpo~SN=>6p;Rq_bAfc@>wrdCpnv3l%uzpF*0GP2S0r6{-{N z-Mh2QvDgAA`J{FEa&KQ5(U|yEBPb))#MvD2t+T?@rOgMKtH(RaN1AJ9OpGPJ3Jzv@ zp?3Vgn6_nDry5qIEnqS1LdNfeSq0-`P1B^eO8AFtGIz((nO4h)hfC+QiB4Z6XWXhi z?|m0}i67FlHsI3PVNwtGvsTp%(BjtOc6W9UMV;(uk$h~~Ijj3L=&x5Tax>|-YqrWl zb(nI+MGVEmN?Xu9yakadl(rdjhkSd8E6cH#2PBbr=GS8~5jE@a1Y5^CZ9SC@#y)K+GD%3_l-_v61p{4)Hi~eWc2`&A}wmssJe|crSu-=cU<) zw)e*L{hn9Ecope6?tZ(zeA!y!Qp)Qa=n|vpW#4buxP-(y+|51gAS-*7CDYlN>leMe zjly!y+MVAhU>mEi>X*hscL|^Ii^zw>#k(mQ5yEQ20U4C)A(;~;EyXEzdYkiJXM!}VlweZ(Iy@=8nPpc^6=GG5%UiALx2AZCdc(%weR@tQjimBh zr82yb&kQT#D@vP`k0&X;y*s;;(e??hXH~tSLB6kAdOk#dWg~g)C3oq48A~l5M$246 zGVJJkhP!<$8wpl87Tq#o0t-P~`))Mb_=nj!vW&!$iQ5Th8I36(4|YUs@2B-Xt2+Tu z!O=n5)xF^vhIG6ne?zlSX3BXvJ&SC4yhTuGLf^&kFpX^&nUBf4pC9E>^xgHW^IDOW z8Qb)*i{fW-#dA!RSiu0%rJ}+#zUvOiMcXo;BC@5xac51!H*l@1h2}G_#$cRC?|Kc> zUt-Ff?Z#47yS<%>2--<}tiYsg%mHa0QIz$0rS`Syk>I%@F7{XA>V(8X?Q<_{u071N zq6?3-k*+qbE{S_w{gkf}PVkhN-!2d*WC~0veC}qdjcHr7XINn|VY(!=WteU2Dq$aH zXdzlu-@G*i_s>rVwvyDjKBjS7D6C{QYa+qk+)M=UQSGeYwYPFhha0ohKdN_mqDza< zdg&kR*I{IyWG1fK^3}EFPM!(q&YUrc={x4bC!O-)bIzqDB^T*0^v*&==v_ihQp8GL z4%H1=*i77hWNSNi^z6w@G3`Wn+#IMp!&uh2qvd>l^=#co-#8w6w>un*OxMlz<56>y z;o%aTIGJ*3qa6ILi)Zhw9E|>W14$sMi76OF&9TA1lOYg`Ab{1fa0}FoP7^3@+(Kdq z-J5^jA0Q3ELjZy^O83YSH6pLPvo(ST?;VpAkxa@|L^P03^qlr6+=|!VM@0tCEzd1^ z6pnw6>wj2UrFKa{3=|)&s^Z;c(vvsT&_}x1sB0SGQFT)%(iE~<#!TU-8?^37>B=|+ zo_fr9@LwUmn;W}{b#Dfxh#mrVM8+A9HA%a{E1yG=@ug9coYn7L%=gd&EO$%4_9S8}oQ$~tP)5*0NIgg*#!B2F&dhT+HIePGNLe+=v(snx}9v6+E8^^pB zv0HU{rzD6fV<|WFkWOhi-D9V%XE-5Xe5-quK3odO;t#f$a|Ch3a}xtQ?~6eEjzsUv zVCPLnwFNh{nhH6ZjKX&%=$JXh5Bh}SQ@KA}yA7fr6EdFa<6#BG9B+SNyY0B21YtR; za2e5nkAakOeA7U?bI>8lSNf2mqM{%71}n5$x4#qgZ|kL)lRpr-+Fl8BF*Uw^V4@At zO-Omf4(vJXyI~l3Cm(7=#C~8WhRBx}VvWl}Q)*}< z=?30-5@cwtpX3*2w|Y^0%tiTirRP(7xV%^GzfMOgnyv$b@~MI49=oh7o^!_KORi;$ zoP8ZO1<83dQVuhE-I)tc18xDvN=_=4tmk+#Pk4zBi#eU^O&=H-9%G}C_bY2PpKiEe zH!nNUOlW#SuG5vx)|e4u;UIEks(k5kuC`XUx(a2~59)1mK0!i1TB6(N)xuBi;xJ*y zqd05NDYJ>oDsCl@%vz}nKW1M9M;WK6ZYYEf#8oQilipy0%;h+)}NE42J#Tl5!ktj z{qu{8I4JlyA{Z>x!aNpbRK>4PE^UnNC;v~Q9>BUi5BrJu{@gXX@GY0}HJeCK;KENRc?zW^Tcm1s%v}Q{mH(+-UncGXNoELndz88`L5daI>o8#3zvz7VlB+A&gQsv1emn3KONe0 z0kjGGP7%&fKVMQZ6T9LFzYO@)@|^u(V`KA`B*;t!64N%mKASCC!<^gF{QOOdk)N44E3u?+n<$@Vg-E`fE7i&v1;&h2k`t&1tP_7hU{E!MBeo=@Hosx7i+96JqG84{=$;m64axxBc2 zTLn>^sxD+7qYXIBpsW=!jE2vwc)*SFAJh!PAJiUJ%4=7b;{_J#0AsW<<(rt+&WAL z;gQ(vDp%d8mla*hE=rEh-3;9Ejb?s(uJ(Ej6>RN3Y9DEvqM6cgPf=Thoq1sev2L?{ zmqsP^rfe=5lx1RcPDx0sL)3_LVu$l3dhxDa|H@`A0l1K?grl>PIBtB1tg0(Nt~T6n zKg-nHX|4DgZMe4nl85Z5sD}xESW?Y?%Teu7w3<8U{D~&`x*9Re;x)S6&nFCV??}YB zZpN10g*&&ohkQWMYSLPBd=xBSbV|O+av6FJacLmQ+J{et@IqSknwEu+mP8A2o@Lt4 z%1QIo(>qGvp;7HKYM=Xa4}nllFc%-Q)7#Xw6Qbou2J*Ldav}KYd6$mAv3L$Jg4X+_ z({lgR#E8mc1_B6Wi5A&O zsW=MtV`Q$}TTe+oNqxVg$*MPyvZ&n3+Qo|w$7Pgu=KCgcxn2$V4j8WYe@u|5w+riv zYS4Z)iJPFO!O_m%HR%yTH03@ofAihQ@7n&TnH$G+2mX(!r=FhpbCDZ+IfiP2i zx(`>Yxe{Y546!ueuUH*a5P(8oNDe+5hIO*?&O;ViPj|f%e#zI(o>IBAEqu0FV5&4? z5~ux%-@`CeMpfX^V!+$DqRsw8!1bsA2AROItok+T+V!lo6Wo1{fi{ZwX>N1@UBM}4 zv~#+w!2~D!9w}}e)Za0yJ=P-;e#oQtmUKnE1$Vy<%J{;AHr{eV?!a4)k2eI00Sq5* Q{&li(ZB_2;k;CWz2f?^Z `/photos/${id}`, - create: '/photos', - update: (id: string) => `/photos/${id}`, - delete: (id: string) => `/photos/${id}`, - }; -} diff --git a/front/v2/src/app/app.config.ts b/front/v2/src/app/app.config.ts deleted file mode 100644 index d953f4c..0000000 --- a/front/v2/src/app/app.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; -import { provideRouter } from '@angular/router'; - -import { routes } from './app.routes'; - -export const appConfig: ApplicationConfig = { - providers: [ - provideBrowserGlobalErrorListeners(), - provideZoneChangeDetection({ eventCoalescing: true }), - provideRouter(routes) - ] -}; diff --git a/front/v2/src/app/app.html b/front/v2/src/app/app.html deleted file mode 100644 index f97c181..0000000 --- a/front/v2/src/app/app.html +++ /dev/null @@ -1,4 +0,0 @@ - -
- -
diff --git a/front/v2/src/app/app.routes.ts b/front/v2/src/app/app.routes.ts deleted file mode 100644 index ab01f43..0000000 --- a/front/v2/src/app/app.routes.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Routes } from '@angular/router'; -import { HomeView } from './views/home-view/home-view'; -import { LoginView } from './views/login-view/login-view'; -import { UserProfileView } from './views/user-profile-view/user-profile-view'; -import { AdminView } from './views/admin-view/admin-view'; -import { ContentManagerView } from './views/content-manager-view/content-manager-view'; -import { ServicesView } from './views/services-view/services-view'; -import { UserGalleriesView } from './views/user-galleries-view/user-galleries-view'; -import { TagsView } from './views/tags-view/tags-view'; -import { EventsView } from './views/events-view/events-view'; -import { ForgotPasswordView } from './views/forgot-password-view/forgot-password-view'; -import { LoginOptionsView } from './views/login-options-view/login-options-view'; -import { RegisterView } from './views/register-view/register-view'; - -export const routes: Routes = [ - { path: '', component: HomeView }, - { path: 'home', component: HomeView }, - { path: 'login', component: LoginView }, - { path: 'forgot-password', component: ForgotPasswordView }, - { path: 'login-options', component: LoginOptionsView }, - { path: 'register', component: RegisterView }, - { path: 'tags', component: TagsView }, - { path: 'events', component: EventsView }, - { path: 'services', component: ServicesView }, - { path: 'my-profile', component: UserProfileView }, - { path: 'my-galleries', component: UserGalleriesView }, - { path: 'content-management', component: ContentManagerView }, - { path: 'admin', component: AdminView }, - { path: '**', redirectTo: '' }, -]; diff --git a/front/v2/src/app/app.scss b/front/v2/src/app/app.scss deleted file mode 100644 index b994af1..0000000 --- a/front/v2/src/app/app.scss +++ /dev/null @@ -1,8 +0,0 @@ -.main-content { - height: fit-content; - padding: 0; - margin: 0; - width: 100%; - overflow-x: hidden; /* Sin scroll horizontal */ - overflow-y: scroll; /* Permite scroll vertical */ -} diff --git a/front/v2/src/app/app.spec.ts b/front/v2/src/app/app.spec.ts deleted file mode 100644 index 297499a..0000000 --- a/front/v2/src/app/app.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { App } from './app'; - -describe('App', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [App], - }).compileComponents(); - }); - - it('should create the app', () => { - const fixture = TestBed.createComponent(App); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(App); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain('Hello, v2'); - }); -}); diff --git a/front/v2/src/app/app.ts b/front/v2/src/app/app.ts deleted file mode 100644 index cb6b9a1..0000000 --- a/front/v2/src/app/app.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component } from '@angular/core'; -import { RouterOutlet } from '@angular/router'; -import { Header } from './global-components/header/header'; -import { ThumbprintService } from './services/thumprint-service/thumbprint-service'; -import { setupAxiosThumbprint } from './interceptors/axiosSetup/axios-setup-interceptor'; - -@Component({ - selector: 'app-root', - imports: [Header, RouterOutlet], - templateUrl: './app.html', - styleUrl: './app.scss', -}) -export class App { - constructor(private thumbprintService: ThumbprintService) { - setupAxiosThumbprint(thumbprintService); - } -} diff --git a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.html b/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.html deleted file mode 100644 index 620d350..0000000 --- a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.scss b/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.scss deleted file mode 100644 index b1f9450..0000000 --- a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.scss +++ /dev/null @@ -1,79 +0,0 @@ -@use "../../../styles/variables" as *; - -.admin-panel-link { - a { - display: inline-flex; - align-items: center; - padding: 0.75rem 1.5rem; - text-decoration: none; - color: $text-dark; - font-size: 0.95rem; - font-weight: 500; - letter-spacing: 0.5px; - border-radius: 8px; - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - position: relative; - overflow: hidden; - - // Hover effect with special admin color - &:hover { - color: $warning; - background: rgba($warning, 0.08); - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba($warning, 0.15); - } - - // Active state - &:active { - transform: translateY(0); - box-shadow: 0 2px 4px rgba($warning, 0.2); - } - - // Focus state for accessibility - &:focus { - outline: 2px solid $warning; - outline-offset: 2px; - } - - // Subtle animation on hover with admin color - &::before { - content: ""; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient( - 90deg, - transparent, - rgba($warning, 0.1), - transparent - ); - transition: left 0.5s ease; - } - - &:hover::before { - left: 100%; - } - } -} - -// Responsive adjustments -@media (max-width: 768px) { - .admin-panel-link { - a { - padding: 0.6rem 1.2rem; - font-size: 0.9rem; - } - } -} - -@media (max-width: 480px) { - .admin-panel-link { - a { - padding: 0.5rem 1rem; - font-size: 0.85rem; - letter-spacing: 0.25px; - } - } -} diff --git a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.spec.ts b/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.spec.ts deleted file mode 100644 index 98e976e..0000000 --- a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AdminPanelLink } from './admin-panel-link'; - -describe('AdminPanelLink', () => { - let component: AdminPanelLink; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [AdminPanelLink] - }) - .compileComponents(); - - fixture = TestBed.createComponent(AdminPanelLink); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.ts b/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.ts deleted file mode 100644 index ed05c1a..0000000 --- a/front/v2/src/app/global-components/admin-panel-link/admin-panel-link.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; - -@Component({ - selector: 'admin-panel-link', - imports: [SvgButton], - templateUrl: './admin-panel-link.html', - styleUrl: './admin-panel-link.scss', -}) -export class AdminPanelLink {} diff --git a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.html b/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.html deleted file mode 100644 index 3b5fdc2..0000000 --- a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.spec.ts b/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.spec.ts deleted file mode 100644 index ba2c5d3..0000000 --- a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ContentManagerPanelLink } from './content-manager-panel-link'; - -describe('ContentManagerPanelLink', () => { - let component: ContentManagerPanelLink; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ContentManagerPanelLink] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ContentManagerPanelLink); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.ts b/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.ts deleted file mode 100644 index be62e25..0000000 --- a/front/v2/src/app/global-components/content-manager-panel-link/content-manager-panel-link.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; - -@Component({ - selector: 'content-manager-panel-link', - imports: [SvgButton], - templateUrl: './content-manager-panel-link.html', - styleUrl: './content-manager-panel-link.scss', -}) -export class ContentManagerPanelLink {} diff --git a/front/v2/src/app/global-components/events-link/events-link.html b/front/v2/src/app/global-components/events-link/events-link.html deleted file mode 100644 index ea54b59..0000000 --- a/front/v2/src/app/global-components/events-link/events-link.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/front/v2/src/app/global-components/events-link/events-link.spec.ts b/front/v2/src/app/global-components/events-link/events-link.spec.ts deleted file mode 100644 index cff5bd1..0000000 --- a/front/v2/src/app/global-components/events-link/events-link.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { EventsLink } from './events-link'; - -describe('EventsLink', () => { - let component: EventsLink; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [EventsLink] - }) - .compileComponents(); - - fixture = TestBed.createComponent(EventsLink); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/events-link/events-link.ts b/front/v2/src/app/global-components/events-link/events-link.ts deleted file mode 100644 index 0dd2be9..0000000 --- a/front/v2/src/app/global-components/events-link/events-link.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; - -@Component({ - selector: 'events-link', - imports: [SvgButton], - templateUrl: './events-link.html', - styleUrl: './events-link.scss', -}) -export class EventsLink {} diff --git a/front/v2/src/app/global-components/header/header.html b/front/v2/src/app/global-components/header/header.html deleted file mode 100644 index e890fd8..0000000 --- a/front/v2/src/app/global-components/header/header.html +++ /dev/null @@ -1,24 +0,0 @@ -
- - @if(!hideButtons) { - - } -
diff --git a/front/v2/src/app/global-components/header/header.scss b/front/v2/src/app/global-components/header/header.scss deleted file mode 100644 index de1e423..0000000 --- a/front/v2/src/app/global-components/header/header.scss +++ /dev/null @@ -1,38 +0,0 @@ -header { - position: sticky; - top: 0; - z-index: 1000; - background: transparent; - padding-left: 2rem; - max-width: 100%; - height: 10%; - display: flex; - flex-direction: row; - align-items: center; - align-content: center; - gap: 0; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - - logo { - width: 30%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - order: 0; - flex-grow: 1; - } - .header-links { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-around; - gap: 1rem; - margin: 0; - padding: 0; - flex-grow: 1; - .user-profile { - order: 9999; - } - } -} diff --git a/front/v2/src/app/global-components/header/header.spec.ts b/front/v2/src/app/global-components/header/header.spec.ts deleted file mode 100644 index 7da9515..0000000 --- a/front/v2/src/app/global-components/header/header.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { Header } from './header'; - -describe('Header', () => { - let component: Header; - let fixture: ComponentFixture
; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [Header] - }) - .compileComponents(); - - fixture = TestBed.createComponent(Header); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/header/header.ts b/front/v2/src/app/global-components/header/header.ts deleted file mode 100644 index 224b338..0000000 --- a/front/v2/src/app/global-components/header/header.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, inject, signal } from '@angular/core'; -import { Logo } from '../logo/logo'; -import { EventsLink } from '../events-link/events-link'; -import { UserGalleriesLink } from '../user-galleries-link/user-galleries-link'; -import { ContentManagerPanelLink } from '../content-manager-panel-link/content-manager-panel-link'; -import { AdminPanelLink } from '../admin-panel-link/admin-panel-link'; -import { UserProfileLink } from '../user-profile-link/user-profile-link'; -import { LoginLink } from '../login-link/login-link'; -import { TagsLink } from '../tags-link/tags-link'; -import { userService } from '../../services/userService/userService'; -import { OnInit } from '@angular/core'; -import { userModel } from '../../../models/userModel'; -import { ServicesLink } from '../services-link/services-link'; -import { Router, NavigationEnd } from '@angular/router'; - -@Component({ - selector: 'custom-header', - imports: [ - Logo, - EventsLink, - UserGalleriesLink, - ContentManagerPanelLink, - AdminPanelLink, - UserProfileLink, - LoginLink, - TagsLink, - ServicesLink, - ], - templateUrl: './header.html', - styleUrl: './header.scss', -}) -export class Header implements OnInit { - private router: Router = inject(Router); - - constructor(private userService: userService) {} - - currentUser = signal(userModel.DefaultUser); - - hideButtons = false; - ngOnInit() { - this.userService.getUser().subscribe((user) => { - this.currentUser.set(user); - }); - - // Escucha cambios de ruta - this.router.events.subscribe((event) => { - if (event instanceof NavigationEnd) { - // Si NO estamos en /login, muestra los botones - this.hideButtons = this.router.url === '/login'; - } - }); - } -} diff --git a/front/v2/src/app/global-components/login-link/login-link.html b/front/v2/src/app/global-components/login-link/login-link.html deleted file mode 100644 index 24ef1de..0000000 --- a/front/v2/src/app/global-components/login-link/login-link.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/front/v2/src/app/global-components/login-link/login-link.scss b/front/v2/src/app/global-components/login-link/login-link.scss deleted file mode 100644 index 9f28089..0000000 --- a/front/v2/src/app/global-components/login-link/login-link.scss +++ /dev/null @@ -1,68 +0,0 @@ -.login-button { - // Variables para el lenguaje visual (SCSS) - $primary-white: #fefcf8; // Blanco ahuevado gentil - $border-grey: #e0ddd8; // Gris suave para bordes - $text-dark: #2a2926; // Texto principal - $standard-button-icon: #8d8d8d; // Texto principal - $standard-button-border: #b8b8b891; // Texto principal - $standard-button-hovered: #494949; // Texto principal - $text-muted: #706b63; // Texto secundario - - svg-button { - button { - background: $primary-white; - border: 2px solid $standard-button-border; - color: $standard-button-icon; - border-radius: 12px; - overflow: hidden; - cursor: pointer; - transition: all 0.3s ease; - min-width: 3.2rem; - height: 3.2rem; - margin: 0; - padding: 0; - flex-shrink: 1; - display: flex; - flex-wrap: nowrap; - align-items: center; - align-content: center; - justify-content: space-evenly; - padding: 5%; - - label { - text-align: center; - flex-grow: 1; - } - - &:hover { - color: $standard-button-hovered; - transform: scale(1.07); - box-shadow: 0 6px 16px rgba(42, 41, 38, 0.1); - } - - &:disabled { - background: $primary-white; - color: $text-muted; - } - - svg-loader { - box-sizing: border-box; - pointer-events: none; - display: block; - height: 80%; - width: 80%; - margin: 0; - padding: 0; - } - - &:hover { - svg-loader { - fill: $primary-white; - } - label { - color: $primary-white; - } - } - } - } -} diff --git a/front/v2/src/app/global-components/login-link/login-link.spec.ts b/front/v2/src/app/global-components/login-link/login-link.spec.ts deleted file mode 100644 index 822951b..0000000 --- a/front/v2/src/app/global-components/login-link/login-link.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { LoginLink } from './login-link'; - -describe('LoginLink', () => { - let component: LoginLink; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [LoginLink] - }) - .compileComponents(); - - fixture = TestBed.createComponent(LoginLink); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/login-link/login-link.ts b/front/v2/src/app/global-components/login-link/login-link.ts deleted file mode 100644 index 61cebe2..0000000 --- a/front/v2/src/app/global-components/login-link/login-link.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, EventEmitter, Output, output } from '@angular/core'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; - -@Component({ - selector: 'login-link', - imports: [SvgButton], - templateUrl: './login-link.html', - styleUrl: './login-link.scss', -}) -export class LoginLink { - @Output() login = new EventEmitter(); -} diff --git a/front/v2/src/app/global-components/logo/logo.html b/front/v2/src/app/global-components/logo/logo.html deleted file mode 100644 index ec7e4fb..0000000 --- a/front/v2/src/app/global-components/logo/logo.html +++ /dev/null @@ -1,3 +0,0 @@ - - Logo - diff --git a/front/v2/src/app/global-components/logo/logo.scss b/front/v2/src/app/global-components/logo/logo.scss deleted file mode 100644 index 41a6bda..0000000 --- a/front/v2/src/app/global-components/logo/logo.scss +++ /dev/null @@ -1,14 +0,0 @@ -a { - max-width: 100%; - height: 100%; - margin: 0; - padding: 0; - img { - width: auto; - max-width: 100%; - height: 100%; - margin: 0; - padding: 0; - object-fit: scale-down; - } -} diff --git a/front/v2/src/app/global-components/logo/logo.spec.ts b/front/v2/src/app/global-components/logo/logo.spec.ts deleted file mode 100644 index 058f079..0000000 --- a/front/v2/src/app/global-components/logo/logo.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { Logo } from './logo'; - -describe('Logo', () => { - let component: Logo; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [Logo] - }) - .compileComponents(); - - fixture = TestBed.createComponent(Logo); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/logo/logo.ts b/front/v2/src/app/global-components/logo/logo.ts deleted file mode 100644 index 8f0cad2..0000000 --- a/front/v2/src/app/global-components/logo/logo.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; -import { config } from '../../../models/config'; - -@Component({ - selector: 'logo', - imports: [], - templateUrl: './logo.html', - styleUrl: './logo.scss', -}) -export class Logo { - protected logoSrc = config.get().logoSrc; -} diff --git a/front/v2/src/app/global-components/services-link/services-link.html b/front/v2/src/app/global-components/services-link/services-link.html deleted file mode 100644 index 3af5a5b..0000000 --- a/front/v2/src/app/global-components/services-link/services-link.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/front/v2/src/app/global-components/services-link/services-link.spec.ts b/front/v2/src/app/global-components/services-link/services-link.spec.ts deleted file mode 100644 index 5f39ac9..0000000 --- a/front/v2/src/app/global-components/services-link/services-link.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ServicesLink } from './services-link'; - -describe('ServicesLink', () => { - let component: ServicesLink; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ServicesLink] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ServicesLink); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/services-link/services-link.ts b/front/v2/src/app/global-components/services-link/services-link.ts deleted file mode 100644 index a549dd7..0000000 --- a/front/v2/src/app/global-components/services-link/services-link.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; - -@Component({ - selector: 'services-link', - imports: [SvgButton], - templateUrl: './services-link.html', - styleUrl: './services-link.scss', -}) -export class ServicesLink {} diff --git a/front/v2/src/app/global-components/tags-link/tags-link.html b/front/v2/src/app/global-components/tags-link/tags-link.html deleted file mode 100644 index a7c3544..0000000 --- a/front/v2/src/app/global-components/tags-link/tags-link.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/front/v2/src/app/global-components/tags-link/tags-link.spec.ts b/front/v2/src/app/global-components/tags-link/tags-link.spec.ts deleted file mode 100644 index 5963a45..0000000 --- a/front/v2/src/app/global-components/tags-link/tags-link.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TagsLink } from './tags-link'; - -describe('TagsLink', () => { - let component: TagsLink; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [TagsLink] - }) - .compileComponents(); - - fixture = TestBed.createComponent(TagsLink); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/tags-link/tags-link.ts b/front/v2/src/app/global-components/tags-link/tags-link.ts deleted file mode 100644 index ea126df..0000000 --- a/front/v2/src/app/global-components/tags-link/tags-link.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; - -@Component({ - selector: 'tags-link', - imports: [SvgButton], - templateUrl: './tags-link.html', - styleUrl: './tags-link.scss', -}) -export class TagsLink {} diff --git a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.html b/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.html deleted file mode 100644 index 78af224..0000000 --- a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.spec.ts b/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.spec.ts deleted file mode 100644 index 27e5a19..0000000 --- a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UserGalleriesLink } from './user-galleries-link'; - -describe('UserGalleriesLink', () => { - let component: UserGalleriesLink; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [UserGalleriesLink] - }) - .compileComponents(); - - fixture = TestBed.createComponent(UserGalleriesLink); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.ts b/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.ts deleted file mode 100644 index bbbb0a0..0000000 --- a/front/v2/src/app/global-components/user-galleries-link/user-galleries-link.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component, inject, signal } from '@angular/core'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; - -@Component({ - selector: 'user-galleries-link', - imports: [SvgButton], - templateUrl: './user-galleries-link.html', - styleUrl: './user-galleries-link.scss', -}) -export class UserGalleriesLink {} diff --git a/front/v2/src/app/global-components/user-profile-link/user-profile-link.html b/front/v2/src/app/global-components/user-profile-link/user-profile-link.html deleted file mode 100644 index 8687e84..0000000 --- a/front/v2/src/app/global-components/user-profile-link/user-profile-link.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/front/v2/src/app/global-components/user-profile-link/user-profile-link.scss b/front/v2/src/app/global-components/user-profile-link/user-profile-link.scss deleted file mode 100644 index 27f406a..0000000 --- a/front/v2/src/app/global-components/user-profile-link/user-profile-link.scss +++ /dev/null @@ -1,79 +0,0 @@ -@use "../../../styles/variables" as *; - -.user-profile-link { - a { - display: inline-flex; - align-items: center; - padding: 0.75rem 1.5rem; - text-decoration: none; - color: $text-dark; - font-size: 0.95rem; - font-weight: 500; - letter-spacing: 0.5px; - border-radius: 8px; - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - position: relative; - overflow: hidden; - - // Hover effect - &:hover { - color: $primary-accent; - background: rgba($primary-accent, 0.08); - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba($primary-accent, 0.15); - } - - // Active state - &:active { - transform: translateY(0); - box-shadow: 0 2px 4px rgba($primary-accent, 0.2); - } - - // Focus state for accessibility - &:focus { - outline: 2px solid $primary-accent; - outline-offset: 2px; - } - - // Subtle animation on hover - &::before { - content: ""; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient( - 90deg, - transparent, - rgba($primary-accent, 0.1), - transparent - ); - transition: left 0.5s ease; - } - - &:hover::before { - left: 100%; - } - } -} - -// Responsive adjustments -@media (max-width: 768px) { - .user-profile-link { - a { - padding: 0.6rem 1.2rem; - font-size: 0.9rem; - } - } -} - -@media (max-width: 480px) { - .user-profile-link { - a { - padding: 0.5rem 1rem; - font-size: 0.85rem; - letter-spacing: 0.25px; - } - } -} diff --git a/front/v2/src/app/global-components/user-profile-link/user-profile-link.spec.ts b/front/v2/src/app/global-components/user-profile-link/user-profile-link.spec.ts deleted file mode 100644 index 8264430..0000000 --- a/front/v2/src/app/global-components/user-profile-link/user-profile-link.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UserProfileLink } from './user-profile-link'; - -describe('UserProfileLink', () => { - let component: UserProfileLink; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [UserProfileLink] - }) - .compileComponents(); - - fixture = TestBed.createComponent(UserProfileLink); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/global-components/user-profile-link/user-profile-link.ts b/front/v2/src/app/global-components/user-profile-link/user-profile-link.ts deleted file mode 100644 index 40c31f0..0000000 --- a/front/v2/src/app/global-components/user-profile-link/user-profile-link.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'user-profile-link', - imports: [], - templateUrl: './user-profile-link.html', - styleUrl: './user-profile-link.scss' -}) -export class UserProfileLink { - -} diff --git a/front/v2/src/app/interceptors/axiosSetup/axios-setup-interceptor.spec.ts b/front/v2/src/app/interceptors/axiosSetup/axios-setup-interceptor.spec.ts deleted file mode 100644 index 69e7639..0000000 --- a/front/v2/src/app/interceptors/axiosSetup/axios-setup-interceptor.spec.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { HttpInterceptorFn } from '@angular/common/http'; - -import { axiosSetupInterceptor } from './axios-setup-interceptor'; - -describe('axiosSetupInterceptor', () => { - const interceptor: HttpInterceptorFn = (req, next) => - TestBed.runInInjectionContext(() => axiosSetupInterceptor(req, next)); - - beforeEach(() => { - TestBed.configureTestingModule({}); - }); - - it('should be created', () => { - expect(interceptor).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/interceptors/axiosSetup/axios-setup-interceptor.ts b/front/v2/src/app/interceptors/axiosSetup/axios-setup-interceptor.ts deleted file mode 100644 index 6c0e5a9..0000000 --- a/front/v2/src/app/interceptors/axiosSetup/axios-setup-interceptor.ts +++ /dev/null @@ -1,18 +0,0 @@ -import axios from 'axios'; -import { ThumbprintService } from '../../services/thumprint-service/thumbprint-service'; - -export function setupAxiosThumbprint(thumbprintService: ThumbprintService) { - axios.interceptors.request.use((config) => { - const thumbprint = thumbprintService.getThumbprint(); - config.headers = config.headers || {}; - config.headers['X-client-thumbprint'] = thumbprint; - - const jwt = localStorage.getItem('jwt'); - if (jwt) config.headers['Authorization'] = `Bearer ${jwt}`; - - const refresh = localStorage.getItem('refresh'); - if (refresh) config.headers['X-refresh-token'] = refresh; - - return config; - }); -} diff --git a/front/v2/src/app/services/crypto-service/crypto-service.spec.ts b/front/v2/src/app/services/crypto-service/crypto-service.spec.ts deleted file mode 100644 index 10013a4..0000000 --- a/front/v2/src/app/services/crypto-service/crypto-service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { CryptoService } from './crypto-service'; - -describe('CryptoService', () => { - let service: CryptoService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(CryptoService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/services/crypto-service/crypto-service.ts b/front/v2/src/app/services/crypto-service/crypto-service.ts deleted file mode 100644 index 2360e2e..0000000 --- a/front/v2/src/app/services/crypto-service/crypto-service.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Injectable } from '@angular/core'; -import axios from 'axios'; -import { ThumbprintService } from '../thumprint-service/thumbprint-service'; - -@Injectable({ - providedIn: 'root', -}) -export class CryptoService { - private readonly cryptoUrl = '/crypto/rsa'; - constructor(private thumbprintService: ThumbprintService) {} - - private pemToArrayBuffer(pem: string): ArrayBuffer { - const b64Lines = pem.replace( - /-----BEGIN PUBLIC KEY-----|-----END PUBLIC KEY-----|\s/g, - '' - ); - const binary = window.atob(b64Lines); - const array = new Uint8Array(binary.length); - for (let i = 0; i < binary.length; i++) array[i] = binary.charCodeAt(i); - return array.buffer; - } - - private async fetchPublicKey(): Promise { - try { - const response = await axios.get(`${this.cryptoUrl}`); - - if (response.status !== 200) { - throw new Error('Failed to fetch public key'); - } - - const pem = response.data.publicKey; - const binaryDer = this.pemToArrayBuffer(pem); - return await window.crypto.subtle.importKey( - 'spki', - binaryDer, - { - name: 'RSA-OAEP', - hash: 'SHA-256', - }, - false, - ['encrypt'] - ); - } catch (error) { - console.error('Error fetching public key:', error); - throw error; - } - } - - public async encryptData(data: string): Promise { - const publicKey = await this.fetchPublicKey(); - const encoded = new TextEncoder().encode(data); - const encrypted = await window.crypto.subtle.encrypt( - { - name: 'RSA-OAEP', - }, - publicKey, - encoded - ); - return btoa(String.fromCharCode(...new Uint8Array(encrypted))); - } -} diff --git a/front/v2/src/app/services/galleryService/gallery-service.spec.ts b/front/v2/src/app/services/galleryService/gallery-service.spec.ts deleted file mode 100644 index 9d9a240..0000000 --- a/front/v2/src/app/services/galleryService/gallery-service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { GalleryService } from './gallery-service'; - -describe('GalleryService', () => { - let service: GalleryService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(GalleryService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/services/galleryService/gallery-service.ts b/front/v2/src/app/services/galleryService/gallery-service.ts deleted file mode 100644 index b62ab85..0000000 --- a/front/v2/src/app/services/galleryService/gallery-service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Injectable } from '@angular/core'; -import { galleryModel } from '../../../models/gallery/galleryModel'; -import { galleryFactory } from '../../../models/gallery/galleryFactory'; -import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; - -@Injectable({ - providedIn: 'root', -}) -export class GalleryService { - private currentGallery: galleryModel = galleryFactory.createEmptyGallery(); - private userSubject = new BehaviorSubject(this.currentGallery); - - setGallery(gallery: galleryModel) { - this.currentGallery = gallery; - this.userSubject.next(gallery); - } - - getGallery() { - return this.userSubject.asObservable(); - } -} diff --git a/front/v2/src/app/services/theme/theme.spec.ts b/front/v2/src/app/services/theme/theme.spec.ts deleted file mode 100644 index e78dc3d..0000000 --- a/front/v2/src/app/services/theme/theme.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { Theme } from './theme'; - -describe('Theme', () => { - let service: Theme; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(Theme); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/services/theme/theme.ts b/front/v2/src/app/services/theme/theme.ts deleted file mode 100644 index 5892acc..0000000 --- a/front/v2/src/app/services/theme/theme.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root', -}) -export class Theme { - private isDarkTheme: boolean = false; - - toggleTheme() { - this.isDarkTheme = !this.isDarkTheme; - this.applyTheme(); - } - - isDark() { - return this.isDarkTheme; - } - - private applyTheme() { - const theme = this.isDarkTheme ? 'dark' : 'light'; - document.body.classList.remove('light-theme', 'dark-theme'); - document.body.classList.add(`${theme}-theme`); - } -} diff --git a/front/v2/src/app/services/thumprint-service/thumbprint-service.spec.ts b/front/v2/src/app/services/thumprint-service/thumbprint-service.spec.ts deleted file mode 100644 index ec39e71..0000000 --- a/front/v2/src/app/services/thumprint-service/thumbprint-service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ThumbprintService } from './thumbprint-service'; - -describe('ThumbprintService', () => { - let service: ThumbprintService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ThumbprintService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/services/thumprint-service/thumbprint-service.ts b/front/v2/src/app/services/thumprint-service/thumbprint-service.ts deleted file mode 100644 index c693556..0000000 --- a/front/v2/src/app/services/thumprint-service/thumbprint-service.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root', -}) -export class ThumbprintService { - private key: string | null = null; - private nextRotation: number = 0; - private intervalMinutes = 30; - - constructor() { - this.initializeKey(); - } - - private initializeKey(): void { - const now = Date.now(); - // Calcula el próximo intervalo de rotación (media hora) - const intervalMs = this.intervalMinutes * 60 * 1000; - this.nextRotation = now - (now % intervalMs) + intervalMs; - this.key = this.generateThumbprint(); - } - - // Genera el thumbprint único para el navegador/intervalo - private generateThumbprint(): string { - const epoch = Math.floor(Date.now() / 1000); - const interval = Math.floor(epoch / (this.intervalMinutes * 60)); - // fingerprint del navegador: puedes agregar más datos si quieres afinar - const fingerprint = window.navigator.userAgent; - // Random salt para evitar colisiones - const salt = this.randomString(16); - return btoa(`${interval}:${fingerprint}:${salt}`); - } - - private randomString(length: number) { - const array = new Uint8Array(length); - window.crypto.getRandomValues(array); - return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join(''); - } - - // Devuelve la clave actual, renueva si ha pasado el intervalo - public getThumbprint(): string { - if (Date.now() >= this.nextRotation) { - this.initializeKey(); - } - return this.key!; - } - - // Fuerza la regeneración (opcional) - public forceRotate(): void { - this.initializeKey(); - } -} diff --git a/front/v2/src/app/services/userService/userService.spec.ts b/front/v2/src/app/services/userService/userService.spec.ts deleted file mode 100644 index 1b76328..0000000 --- a/front/v2/src/app/services/userService/userService.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { userService } from './userService'; - -describe('userService', () => { - let service: userService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(userService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/services/userService/userService.ts b/front/v2/src/app/services/userService/userService.ts deleted file mode 100644 index 4634ebc..0000000 --- a/front/v2/src/app/services/userService/userService.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Injectable } from '@angular/core'; -import { userModel } from '../../../models/userModel'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { CryptoService } from '../crypto-service/crypto-service'; -import axios from 'axios'; - -@Injectable({ - providedIn: 'root', -}) -export class userService { - private currentUser: userModel = userModel.DefaultUser; - private userSubject = new BehaviorSubject(this.currentUser); - - constructor(private cryptoService: CryptoService) {} - - setUser(user: userModel) { - this.currentUser = user; - this.userSubject.next(user); - } - - getUser(): Observable { - return this.userSubject.asObservable(); - } - - async systemLogin( - email: string | null | undefined, - password: string | null | undefined, - systemKey: string | null | undefined - ) { - if (email == null || password == null || systemKey == null) { - return; - } - const encryptedPassword = await this.cryptoService.encryptData(password); - const encryptedSystemKey = await this.cryptoService.encryptData(systemKey); - return axios - .post('/users/login', { - email, - password: encryptedPassword, - systemKey: encryptedSystemKey, - }) - .then((response) => { - const { id, roles } = response.data; - const usermodel = new userModel(id, roles, true); - // localStorage.setItem('jwt', jwt); - // localStorage.setItem('refresh', refresh); - this.setUser(usermodel); - return usermodel; - }); - } - - async login( - email: string | null | undefined, - password: string | null | undefined - ): Promise { - if (email == null || password == null) { - throw new Error('Email and password must not be null'); - } - const encrypted = this.cryptoService.encryptData(password); - const response = await axios.post('/users/login', { - email, - password: await encrypted, - }); - const { jwt, refresh, usermodel } = response.data; - localStorage.setItem('jwt', jwt); - localStorage.setItem('refresh', refresh); - this.setUser(usermodel); - return usermodel; - } - - async register( - name: string | null | undefined, - email: string | null | undefined, - password: string | null | undefined - ): Promise { - if (email == null || password == null) { - throw new Error('Email and password must not be null'); - } - const encrypted = this.cryptoService.encryptData(password); - const response = await axios.post('/users/register', { - name, - email, - password: await encrypted, - }); - const { jwt, refresh, usermodel } = response.data; - localStorage.setItem('jwt', jwt); - localStorage.setItem('refresh', refresh); - this.setUser(usermodel); - return usermodel; - } -} diff --git a/front/v2/src/app/views/admin-view/admin-view.html b/front/v2/src/app/views/admin-view/admin-view.html deleted file mode 100644 index a503f10..0000000 --- a/front/v2/src/app/views/admin-view/admin-view.html +++ /dev/null @@ -1 +0,0 @@ -

admin-view works!

diff --git a/front/v2/src/app/views/admin-view/admin-view.spec.ts b/front/v2/src/app/views/admin-view/admin-view.spec.ts deleted file mode 100644 index 6201197..0000000 --- a/front/v2/src/app/views/admin-view/admin-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AdminView } from './admin-view'; - -describe('AdminView', () => { - let component: AdminView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [AdminView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(AdminView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/admin-view/admin-view.ts b/front/v2/src/app/views/admin-view/admin-view.ts deleted file mode 100644 index 5ff9144..0000000 --- a/front/v2/src/app/views/admin-view/admin-view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'admin-view', - imports: [], - templateUrl: './admin-view.html', - styleUrl: './admin-view.scss' -}) -export class AdminView { - -} diff --git a/front/v2/src/app/views/content-manager-view/content-manager-view.html b/front/v2/src/app/views/content-manager-view/content-manager-view.html deleted file mode 100644 index 018ac9e..0000000 --- a/front/v2/src/app/views/content-manager-view/content-manager-view.html +++ /dev/null @@ -1 +0,0 @@ -

content-manager-view works!

diff --git a/front/v2/src/app/views/content-manager-view/content-manager-view.scss b/front/v2/src/app/views/content-manager-view/content-manager-view.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/app/views/content-manager-view/content-manager-view.spec.ts b/front/v2/src/app/views/content-manager-view/content-manager-view.spec.ts deleted file mode 100644 index 59e7fbe..0000000 --- a/front/v2/src/app/views/content-manager-view/content-manager-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ContentManagerView } from './content-manager-view'; - -describe('ContentManagerView', () => { - let component: ContentManagerView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ContentManagerView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ContentManagerView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/content-manager-view/content-manager-view.ts b/front/v2/src/app/views/content-manager-view/content-manager-view.ts deleted file mode 100644 index 03e9f44..0000000 --- a/front/v2/src/app/views/content-manager-view/content-manager-view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'content-manager-view', - imports: [], - templateUrl: './content-manager-view.html', - styleUrl: './content-manager-view.scss' -}) -export class ContentManagerView { - -} diff --git a/front/v2/src/app/views/events-view/events-view.html b/front/v2/src/app/views/events-view/events-view.html deleted file mode 100644 index d03981b..0000000 --- a/front/v2/src/app/views/events-view/events-view.html +++ /dev/null @@ -1 +0,0 @@ -

events-view works!

diff --git a/front/v2/src/app/views/events-view/events-view.scss b/front/v2/src/app/views/events-view/events-view.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/app/views/events-view/events-view.spec.ts b/front/v2/src/app/views/events-view/events-view.spec.ts deleted file mode 100644 index 379e1c4..0000000 --- a/front/v2/src/app/views/events-view/events-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { EventsView } from './events-view'; - -describe('EventsView', () => { - let component: EventsView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [EventsView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(EventsView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/events-view/events-view.ts b/front/v2/src/app/views/events-view/events-view.ts deleted file mode 100644 index 5a58ff5..0000000 --- a/front/v2/src/app/views/events-view/events-view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'events-view', - imports: [], - templateUrl: './events-view.html', - styleUrl: './events-view.scss' -}) -export class EventsView { - -} diff --git a/front/v2/src/app/views/forgot-password-view/forgot-password-view.html b/front/v2/src/app/views/forgot-password-view/forgot-password-view.html deleted file mode 100644 index 42354a5..0000000 --- a/front/v2/src/app/views/forgot-password-view/forgot-password-view.html +++ /dev/null @@ -1,29 +0,0 @@ -
-

Recuperar contraseña

- @if(showingForm()) { -
-
- - - - - -
-
- -
-
- } @else{ -
-

- Si existe un usuario con ese correo electrónico, se enviará un enlace para - iniciar sesión y restablecer la contraseña. -

-
- } -
diff --git a/front/v2/src/app/views/forgot-password-view/forgot-password-view.scss b/front/v2/src/app/views/forgot-password-view/forgot-password-view.scss deleted file mode 100644 index 027a5b6..0000000 --- a/front/v2/src/app/views/forgot-password-view/forgot-password-view.scss +++ /dev/null @@ -1,18 +0,0 @@ -.forgot-password-form-container { - max-width: 400px; - margin: 0 auto; - padding: 20px; - border: 1px solid #ccc; - border-radius: 5px; - background-color: #fff; -} - -.forgot-password-form { - display: flex; - flex-direction: column; -} - -.form-buttons { - display: flex; - justify-content: flex-end; -} diff --git a/front/v2/src/app/views/forgot-password-view/forgot-password-view.spec.ts b/front/v2/src/app/views/forgot-password-view/forgot-password-view.spec.ts deleted file mode 100644 index 1892ff9..0000000 --- a/front/v2/src/app/views/forgot-password-view/forgot-password-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ForgotPasswordView } from './forgot-password-view'; - -describe('ForgotPasswordView', () => { - let component: ForgotPasswordView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ForgotPasswordView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ForgotPasswordView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/forgot-password-view/forgot-password-view.ts b/front/v2/src/app/views/forgot-password-view/forgot-password-view.ts deleted file mode 100644 index a8c11bd..0000000 --- a/front/v2/src/app/views/forgot-password-view/forgot-password-view.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, inject, signal } from '@angular/core'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; -import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; -import { emailValidator } from '../../../utils/validators/emailValidator'; -import axios from 'axios'; - -@Component({ - selector: 'forgot-password-view', - imports: [SvgButton, ReactiveFormsModule], - templateUrl: './forgot-password-view.html', - styleUrl: './forgot-password-view.scss', -}) -export class ForgotPasswordView { - private formBuilder = inject(FormBuilder); - form = this.formBuilder.group({ - email: ['', [Validators.required, emailValidator]], - }); - showingForm = signal(true); - - get email() { - return this.form.get('email'); - } - - hasEmailContent(): boolean { - const emailValue = this.email?.value; - return emailValue ? emailValue.trim().length > 0 : false; - } - - async onSubmit() { - if (this.form.valid) { - this.showingForm.set(false); - await axios.post('/users/forgot-password', { - email: this.email?.value, - }); - } - } -} diff --git a/front/v2/src/app/views/gallery-view/gallery-view.html b/front/v2/src/app/views/gallery-view/gallery-view.html deleted file mode 100644 index 20eb2a1..0000000 --- a/front/v2/src/app/views/gallery-view/gallery-view.html +++ /dev/null @@ -1,14 +0,0 @@ -
    - @if (this.gallery.photos) { @for (item of this.gallery.photos; track $index) { - - } } @if (this.user.isContentManager && this.gallery.isHome === false) { - - } -
diff --git a/front/v2/src/app/views/gallery-view/gallery-view.scss b/front/v2/src/app/views/gallery-view/gallery-view.scss deleted file mode 100644 index c7b5cf5..0000000 --- a/front/v2/src/app/views/gallery-view/gallery-view.scss +++ /dev/null @@ -1,51 +0,0 @@ -@use "../../../styles/variables" as *; - -$gap-size: 20px; - -.low-res-image-list { - column-count: 4; - column-gap: $gap-size; - list-style: none; - margin-top: 3%; - min-height: 100lvh; - box-sizing: border-box; - width: 100%; - padding: 0; -} - -/* Mobile - 1 column */ -@media (max-width: 639px) { - .low-res-image-list { - columns: 1; - } -} - -/* Tablets in portrait - 3 columns for better balance */ -@media (min-width: 640px) and (max-width: 1023px) and (orientation: portrait) { - .low-res-image-list { - columns: 3; - } -} - -/* Tablets in landscape - 1 column */ -@media (min-width: 640px) and (max-width: 1023px) and (orientation: landscape) { - .low-res-image-list { - columns: 1; - max-width: 90%; - min-height: 95vh; - display: flex; - flex-direction: column; - justify-content: center; - } -} - -/* Desktop - mosaic with margins */ -@media (min-width: 1024px) { - .low-res-image-list { - column-count: 4; - margin-left: 17svw; - margin-right: 17svw; - max-width: calc(100vw - 34svw); - overflow: visible; - } -} diff --git a/front/v2/src/app/views/gallery-view/gallery-view.spec.ts b/front/v2/src/app/views/gallery-view/gallery-view.spec.ts deleted file mode 100644 index 09bb34e..0000000 --- a/front/v2/src/app/views/gallery-view/gallery-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { GalleryView } from './gallery-view'; - -describe('GalleryView', () => { - let component: GalleryView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [GalleryView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(GalleryView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/gallery-view/gallery-view.ts b/front/v2/src/app/views/gallery-view/gallery-view.ts deleted file mode 100644 index 3b07b8a..0000000 --- a/front/v2/src/app/views/gallery-view/gallery-view.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Component, OnInit, signal } from '@angular/core'; -import { galleryModel } from '../../../models/gallery/galleryModel'; -import { galleryFactory } from '../../../models/gallery/galleryFactory'; -import { MidResImage } from './mid-res-image/mid-res-image'; -import { LowResImage } from './low-res-image/low-res-image'; -import { userModel } from '../../../models/userModel'; -import { GalleryService } from '../../services/galleryService/gallery-service'; -import { userService } from '../../services/userService/userService'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; - -@Component({ - selector: 'gallery-view', - imports: [LowResImage, SvgButton], - templateUrl: './gallery-view.html', - styleUrl: './gallery-view.scss', -}) -export class GalleryView implements OnInit { - public midResImage = signal(null); - public thereIsFullscreenImage = false; - constructor( - protected userService: userService, - protected galleryService: GalleryService - ) {} - - protected currentUser: userModel = userModel.DefaultUser; - protected currentGallery: galleryModel = galleryFactory.createEmptyGallery(); - - ngOnInit() { - this.userService.getUser().subscribe((user) => { - this.currentUser = user; - }); - this.galleryService.getGallery().subscribe((gallery) => { - this.currentGallery = gallery; - }); - } - - get user() { - return this.currentUser; - } - - get gallery() { - return this.currentGallery; - } -} diff --git a/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.html b/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.html deleted file mode 100644 index 59c3447..0000000 --- a/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.html +++ /dev/null @@ -1,9 +0,0 @@ -
  • - -
  • diff --git a/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.scss b/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.scss deleted file mode 100644 index 0a8e413..0000000 --- a/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.scss +++ /dev/null @@ -1,44 +0,0 @@ -$gap-size: 20px; - -.low-res-image-container { - display: inline-block; - width: 100%; - break-inside: avoid; - overflow: hidden; - border-radius: 8px; - cursor: pointer; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); - transition: box-shadow 0.3s ease, transform 0.3s ease; - margin-top: calc($gap-size / 2); - margin-bottom: calc($gap-size / 2); -} - -.low-res-image-container:hover { - box-shadow: 0 4px 18px rgba(0, 0, 0, 0.507); - transform: scale(1.15); -} - -.low-res-image-container:active { - transform: scale(1.05); - transition: transform 0.1s ease; -} - -.low-res-image { - width: 100%; - height: auto; - object-fit: cover; - display: block; - transition: transform 0.3s ease, filter 0.3s ease; -} - -.low-res-image-container:hover .low-res-image { - transform: scale(1.02); - filter: brightness(1.1); -} - -/* Tablets in landscape - 1 column */ -@media (min-width: 640px) and (max-width: 1023px) and (orientation: landscape) { - .low-res-image-container { - margin-bottom: calc($gap-size * 2); - } -} diff --git a/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.spec.ts b/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.spec.ts deleted file mode 100644 index da2f1a3..0000000 --- a/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { LowResImage } from './low-res-image'; - -describe('LowResImage', () => { - let component: LowResImage; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [LowResImage] - }) - .compileComponents(); - - fixture = TestBed.createComponent(LowResImage); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.ts b/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.ts deleted file mode 100644 index a664137..0000000 --- a/front/v2/src/app/views/gallery-view/low-res-image/low-res-image.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, Output, EventEmitter, signal } from '@angular/core'; -import { MidResImage } from '../mid-res-image/mid-res-image'; -import { photoModel } from '../../../../models/photoModel'; - -@Component({ - selector: 'low-res-image', - imports: [], - templateUrl: './low-res-image.html', - styleUrl: './low-res-image.scss', -}) -export class LowResImage { - public photo = signal(photoModel.DefaultPhotoModel); - - @Output() clicked = new EventEmitter<{ - midResImage: MidResImage; - event: MouseEvent; - }>(); - - openFullscreen(event: MouseEvent): void { - event.stopPropagation(); - const midResImage = new MidResImage(); - midResImage.photo.set(this.photo()); - this.clicked.emit({ midResImage, event }); - } -} diff --git a/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.html b/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.html deleted file mode 100644 index 7ad871f..0000000 --- a/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.html +++ /dev/null @@ -1,97 +0,0 @@ -
    -
    - -
    - @if(isInfoPanelHidden) { - - } @else { -
    -
    - - -
    -
    -

    {{photo().title}}

    -

    {{photo().description}}

    -
    -
    - - - - - -
    - -
    - } -
    diff --git a/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.scss b/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.scss deleted file mode 100644 index fdfa8d5..0000000 --- a/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.scss +++ /dev/null @@ -1,537 +0,0 @@ -@use "../../../../styles/variables" as *; - -.mid-res-image-container { - position: fixed; - top: 0; - left: 0; - width: 100lvw; - height: 100lvh; - background-color: rgba(42, 41, 38, 0.95); - display: flex; - z-index: 1000; - flex-grow: 1; - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px); - - // Entrada animada del contenedor - animation: fadeInContainer 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; - - // Animación coordinada desde la posición de la imagen clickeada - &.coordinated-animation { - animation: fadeInContainerCoordinated 0.5s cubic-bezier(0.4, 0, 0.2, 1) - forwards; - - .image-container { - animation: coordinatedImageTransition 0.7s - cubic-bezier(0.34, 1.56, 0.64, 1) forwards; - } - - .panel { - animation: slideInPanelDelayed 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.4s both; - } - - .show-button { - animation: fadeInButtonDelayed 0.4s cubic-bezier(0.4, 0, 0.2, 1) 0.5s both; - } - } - - // Animaciones de salida coordinada - &.coordinated-exit { - animation: fadeOutContainerCoordinated 0.6s cubic-bezier(0.4, 0, 0.2, 1) - forwards; - - .image-container { - animation: coordinatedImageExitTransition 0.6s - cubic-bezier(0.7, 0, 0.84, 0) forwards; - } - - .panel { - animation: slideOutPanel 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; - } - - .show-button { - animation: fadeOutButton 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards; - } - } - - // Animación de salida simple (sin coordinación) - &.simple-exit { - animation: fadeOutContainerSimple 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; - - .image-container { - animation: zoomOutImage 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; - } - - .panel { - animation: slideOutPanel 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards; - } - - .show-button { - animation: fadeOutButton 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards; - } - } - - @keyframes fadeInContainer { - from { - opacity: 0; - -webkit-backdrop-filter: blur(0px); - backdrop-filter: blur(0px); - } - to { - opacity: 1; - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px); - } - } - - // Image section - .image-container { - width: 70%; - height: 100lvh; - transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1); - display: flex; - align-items: center; - justify-content: center; - - // Animación de entrada de la imagen - animation: slideInImage 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards; - - img { - width: fit-content; - height: fit-content; - max-width: 100%; - max-height: 100%; - object-fit: scale-down; - - // Animación de zoom elegante - animation: zoomInImage 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; - } - } - - @keyframes slideInImage { - from { - transform: translateX(-30px); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - - @keyframes zoomInImage { - from { - transform: scale(0.8); - opacity: 0; - } - to { - transform: scale(1); - opacity: 1; - } - } - - // When panel is hidden, image takes full width - &.panel-hidden { - .image-container { - width: 100%; - } - - .panel { - transform: translateX(100%); - opacity: 0; - } - } - - &.panel-shown { - .image-container { - width: 75%; - } - .panel { - width: 25%; - transform: translateX(0); - opacity: 1; - } - } - - // Show panel button - positioned to always be visible - .show-button { - position: fixed; - top: 4rem; - right: 4rem; - z-index: 1001; - padding: 0; - margin: 0; - - // Animación de entrada del botón con retraso - animation: fadeInButton 0.4s cubic-bezier(0.4, 0, 0.2, 1) 0.3s both; - } - - @keyframes fadeInButton { - from { - transform: translateY(-20px) scale(0.8); - opacity: 0; - } - to { - transform: translateY(0) scale(1); - opacity: 1; - } - } - - // Animaciones coordinadas para transición suave desde galería - @keyframes fadeInContainerCoordinated { - from { - opacity: 0; - -webkit-backdrop-filter: blur(0px); - backdrop-filter: blur(0px); - } - to { - opacity: 1; - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px); - } - } - - @keyframes coordinatedImageTransition { - from { - transform: translate( - calc(var(--start-x, 50vw) - 50vw), - calc(var(--start-y, 50vh) - 50vh) - ) - scale(calc(var(--start-width, 200px) / 400)); - opacity: 0.8; - } - 50% { - transform: translate( - calc((var(--start-x, 50vw) - 50vw) * 0.3), - calc((var(--start-y, 50vh) - 50vh) * 0.3) - ) - scale(0.9); - opacity: 0.9; - } - to { - transform: translate(0, 0) scale(1); - opacity: 1; - } - } - - @keyframes slideInPanelDelayed { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - - @keyframes fadeInButtonDelayed { - from { - transform: translateY(-20px) scale(0.8); - opacity: 0; - } - to { - transform: translateY(0) scale(1); - opacity: 1; - } - } - - // Animaciones de salida coordinada - @keyframes fadeOutContainerCoordinated { - from { - opacity: 1; - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px); - } - to { - opacity: 0; - -webkit-backdrop-filter: blur(0px); - backdrop-filter: blur(0px); - } - } - - @keyframes coordinatedImageExitTransition { - from { - transform: translate(0, 0) scale(1); - opacity: 1; - } - 50% { - transform: translate( - calc((var(--end-x, 50vw) - 50vw) * 0.3), - calc((var(--end-y, 50vh) - 50vh) * 0.3) - ) - scale(0.7); - opacity: 0.8; - } - to { - transform: translate( - calc(var(--end-x, 50vw) - 50vw), - calc(var(--end-y, 50vh) - 50vh) - ) - scale(calc(var(--end-width, 200px) / 400)); - opacity: 0; - } - } - - @keyframes slideOutPanel { - from { - transform: translateX(0); - opacity: 1; - } - to { - transform: translateX(100%); - opacity: 0; - } - } - - @keyframes fadeOutButton { - from { - transform: translateY(0) scale(1); - opacity: 1; - } - to { - transform: translateY(-20px) scale(0.8); - opacity: 0; - } - } - - // Animaciones de salida simple - @keyframes fadeOutContainerSimple { - from { - opacity: 1; - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px); - } - to { - opacity: 0; - -webkit-backdrop-filter: blur(0px); - backdrop-filter: blur(0px); - } - } - - @keyframes zoomOutImage { - from { - transform: scale(1); - opacity: 1; - } - to { - transform: scale(0.8); - opacity: 0; - } - } - - // Panel section - .panel { - height: 100lvh; - background: $primary-white; - overflow-y: auto; - display: flex; - flex-direction: column; - box-shadow: -4px 0 20px rgba(42, 41, 38, 0.2); - border-left: 1px solid $border-grey; - padding: 2%; - transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), - opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), - width 0.4s cubic-bezier(0.4, 0, 0.2, 1); - - // Animación de entrada del panel - animation: slideInPanel 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.2s both; - - .infoPanelMenu { - display: flex; - flex-grow: 1; - align-items: center; - justify-content: space-between; - margin: 0; - padding: 0; - } - - div.content { - box-sizing: content-box; - height: 25%; - padding-top: 4rem; - padding-bottom: 4rem; - text-align: left; - vertical-align: middle; - align-content: center; - - h3 { - margin: 0 0 1rem 0; - font-size: 2rem; - font-weight: 600; - color: $text-dark; - line-height: 2; - } - - p { - margin: 0; - padding: 0; - font-size: 1.2rem; - color: $text-muted; - line-height: 1.6; - text-align: left; - text-indent: 0.1rem; - text-rendering: optimizeLegibility; - } - } - - .buttons-panel { - padding-top: 2rem; - padding-bottom: 2rem; - display: flex; - flex-wrap: wrap; - flex-grow: 1; - gap: 0.75rem; - border-bottom: 1px solid $border-grey; - justify-content: space-around; - width: 100%; - align-items: center; - } - - .comment-section { - flex: 1; - display: flex; - flex-direction: column; - - .header { - padding: 1.5rem 2rem; - border-bottom: 1px solid $border-grey; - - h4 { - margin: 0 0 1rem 0; - font-size: 1.25rem; - font-weight: 600; - color: $text-dark; - } - - textarea { - width: 100%; - min-height: 80px; - padding: 0.75rem; - background: $primary-white; - border: 2px solid $border-grey; - border-radius: 8px; - font-family: inherit; - font-size: 0.9rem; - color: $text-dark; - resize: vertical; - transition: border-color 0.2s ease; - box-sizing: border-box; - - &:focus { - outline: none; - border-color: $edit-color; - box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1); - } - - &::placeholder { - color: $text-muted; - } - } - - button { - margin-top: 1rem; - width: 100%; - padding: 0.75rem; - background: $primary-white; - color: $edit-color; - border: 2px solid $edit-color; - border-radius: 8px; - font-size: 0.9rem; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease; - - &:hover { - background: $edit-color; - color: $primary-white; - transform: translateY(-1px); - box-shadow: 0 4px 8px rgba(74, 144, 226, 0.2); - } - } - } - - .content { - flex: 1; - padding: 1.5rem 2rem; - - h4 { - margin: 0 0 1rem 0; - font-size: 1.1rem; - font-weight: 600; - color: $text-dark; - } - - .list { - min-height: 100px; - padding: 1rem; - background: $primary-white; - border-radius: 8px; - border: 1px dashed $border-grey; - display: flex; - align-items: center; - justify-content: center; - color: $text-muted; - font-style: italic; - - &:empty::after { - content: "No hay comentarios aún"; - } - } - } - } - } - - @keyframes slideInPanel { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - - // Responsive design - @media (max-width: 768px) { - flex-direction: column; - - .image-container { - width: 100%; - height: 60vh; - } - - .panel { - width: 100%; - height: 40vh; - - .buttons button { - min-width: 100%; - } - } - - // Adjust show button position for mobile - .show-button { - top: 1rem; - right: 1rem; - padding: 0.5rem; - } - } - - @media (max-width: 480px) { - .image-container { - height: 50vh; - } - - .panel { - height: 50vh; - - .content, - .buttons, - .comment-section .header { - padding: 1rem; - } - } - } -} diff --git a/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.spec.ts b/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.spec.ts deleted file mode 100644 index 39439c2..0000000 --- a/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { MidResImage } from './mid-res-image'; - -describe('MidResImage', () => { - let component: MidResImage; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [MidResImage] - }) - .compileComponents(); - - fixture = TestBed.createComponent(MidResImage); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.ts b/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.ts deleted file mode 100644 index 257e095..0000000 --- a/front/v2/src/app/views/gallery-view/mid-res-image/mid-res-image.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { - Component, - EventEmitter, - Input, - Output, - OnInit, - OnDestroy, - HostListener, - signal, -} from '@angular/core'; -import { SvgButton } from '../../../../utils/svg-button/svg-button'; -import { photoModel } from '../../../../models/photoModel'; - -// view: src/app/mid-res-image/mid-res-image.html - -@Component({ - selector: 'mid-res-image', - imports: [SvgButton], - templateUrl: './mid-res-image.html', - styleUrl: './mid-res-image.scss', -}) -export class MidResImage implements OnInit, OnDestroy { - public photo = signal(photoModel.DefaultPhotoModel); - - @Output() closed = new EventEmitter(); - - isInfoPanelHidden: boolean = false; - hasCoordinatedAnimation: boolean = false; - private originalPosition: any = null; - - comments: string[] = []; - - @HostListener('document:keydown', ['$event']) - handleKeyDown(event: KeyboardEvent): void { - if (event.key === 'Escape') { - this.closeFullscreenAnimated(); - } - } - - ngOnInit(): void { - // Bloquear el scroll del body cuando se abre la imagen en pantalla completa - document.body.style.overflow = 'hidden'; - - // Verificar si hay información de transición disponible - const transitionData = (document as any).__imageTransition; - if (transitionData && Date.now() - transitionData.timestamp < 200) { - this.hasCoordinatedAnimation = true; - this.setupCoordinatedAnimation(transitionData); - // Limpiar la información de transición - delete (document as any).__imageTransition; - } - } - - private setupCoordinatedAnimation(transitionData: any): void { - // Guardar la posición original para la animación de salida - this.originalPosition = { ...transitionData }; - - // Aplicar CSS variables para la animación coordinada - const container = document.querySelector( - '.mid-res-image-container' - ) as HTMLElement; - if (container) { - container.style.setProperty('--start-x', `${transitionData.x}px`); - container.style.setProperty('--start-y', `${transitionData.y}px`); - container.style.setProperty('--start-width', `${transitionData.width}px`); - container.style.setProperty( - '--start-height', - `${transitionData.height}px` - ); - container.classList.add('coordinated-animation'); - } - } - - ngOnDestroy(): void { - // Restaurar el scroll del body cuando se destruye el componente - document.body.style.overflow = 'auto'; - } - - hideInfoPanel(event: MouseEvent): void { - event.stopPropagation(); - this.isInfoPanelHidden = true; - // tienes que coger el div 'panel' y cambiar su display a none - // Esto es para que no se vea el panel de información cuando se cierra - // Ademas, tienes que mostrar un botón para mostrar de nuevo el panel - document.querySelector('.panel')?.setAttribute('style', 'display: none;'); - } - - showInfoPanel(event: MouseEvent): void { - event.stopPropagation(); - this.isInfoPanelHidden = false; - } - - closeFullscreen(event: MouseEvent): void { - event.stopPropagation(); - this.closeFullscreenAnimated(); - } - - private closeFullscreenAnimated(): void { - // Iniciar animación de salida - this.startExitAnimation(); - - // Emitir el evento de cerrado después de la animación - setTimeout(() => { - // Restaurar el scroll del body - document.body.style.overflow = 'auto'; - this.closed.emit(); - }, 600); // Duración de la animación de salida - } - - private startExitAnimation(): void { - const container = document.querySelector( - '.mid-res-image-container' - ) as HTMLElement; - if (container) { - // Remover animaciones de entrada - container.classList.remove('coordinated-animation'); - - // Si tenemos información de la posición original, configurar para retorno coordinado - if (this.hasCoordinatedAnimation && this.originalPosition) { - // Volver a establecer las variables CSS para la animación de retorno - container.style.setProperty('--end-x', `${this.originalPosition.x}px`); - container.style.setProperty('--end-y', `${this.originalPosition.y}px`); - container.style.setProperty( - '--end-width', - `${this.originalPosition.width}px` - ); - container.style.setProperty( - '--end-height', - `${this.originalPosition.height}px` - ); - container.classList.add('coordinated-exit'); - } else { - // Animación de salida simple si no hay coordinación - container.classList.add('simple-exit'); - } - } - } - - editImage(event: MouseEvent): void { - event.stopPropagation(); - } - - deleteImage(event: MouseEvent): void { - event.stopPropagation(); - } - - downloadImage(event: MouseEvent): void { - event.stopPropagation(); - // debe descargar la imagen en resolución media (720p) - } - - shareImage(event: MouseEvent): void { - event.stopPropagation(); - // tiene que abrir un modal para compartir la imagen en redes sociales - } - - buyImage(event: MouseEvent): void { - event.stopPropagation(); - // tiene que abrir un modal para comprar la imagen - } -} diff --git a/front/v2/src/app/views/home-view/home-view.spec.ts b/front/v2/src/app/views/home-view/home-view.spec.ts deleted file mode 100644 index a6f3fd9..0000000 --- a/front/v2/src/app/views/home-view/home-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { HomeView } from './home-view'; - -describe('HomeView', () => { - let component: HomeView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [HomeView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(HomeView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/home-view/home-view.ts b/front/v2/src/app/views/home-view/home-view.ts deleted file mode 100644 index 6ab3b80..0000000 --- a/front/v2/src/app/views/home-view/home-view.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Component, OnInit, signal } from '@angular/core'; -import { GalleryView } from '../gallery-view/gallery-view'; -// import { MidResImage } from '../gallery-view/mid-res-image/mid-res-image'; -import { LowResImage } from '../gallery-view/low-res-image/low-res-image'; -import { GalleryService } from '../../services/galleryService/gallery-service'; -import { userService } from '../../services/userService/userService'; -import { galleryFactory } from '../../../models/gallery/galleryFactory'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; - -@Component({ - selector: 'home-view', - imports: [LowResImage, SvgButton], - templateUrl: '../gallery-view/gallery-view.html', - styleUrl: '../gallery-view/gallery-view.scss', -}) -export class HomeView extends GalleryView implements OnInit { - constructor( - protected override userService: userService, - protected override galleryService: GalleryService - ) { - super(userService, galleryService); - this.currentGallery = galleryFactory.getHomeGallery(); - } -} diff --git a/front/v2/src/app/views/login-options-view/login-options-view.html b/front/v2/src/app/views/login-options-view/login-options-view.html deleted file mode 100644 index e50bf3c..0000000 --- a/front/v2/src/app/views/login-options-view/login-options-view.html +++ /dev/null @@ -1 +0,0 @@ -

    login-options-view works!

    diff --git a/front/v2/src/app/views/login-options-view/login-options-view.scss b/front/v2/src/app/views/login-options-view/login-options-view.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/app/views/login-options-view/login-options-view.spec.ts b/front/v2/src/app/views/login-options-view/login-options-view.spec.ts deleted file mode 100644 index 1ed9a8b..0000000 --- a/front/v2/src/app/views/login-options-view/login-options-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { LoginOptionsView } from './login-options-view'; - -describe('LoginOptionsView', () => { - let component: LoginOptionsView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [LoginOptionsView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(LoginOptionsView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/login-options-view/login-options-view.ts b/front/v2/src/app/views/login-options-view/login-options-view.ts deleted file mode 100644 index 4309780..0000000 --- a/front/v2/src/app/views/login-options-view/login-options-view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'login-options-view', - imports: [], - templateUrl: './login-options-view.html', - styleUrl: './login-options-view.scss' -}) -export class LoginOptionsView { - -} diff --git a/front/v2/src/app/views/login-view/login-view.html b/front/v2/src/app/views/login-view/login-view.html deleted file mode 100644 index 0d61b81..0000000 --- a/front/v2/src/app/views/login-view/login-view.html +++ /dev/null @@ -1,140 +0,0 @@ - diff --git a/front/v2/src/app/views/login-view/login-view.scss b/front/v2/src/app/views/login-view/login-view.scss deleted file mode 100644 index 06b41e0..0000000 --- a/front/v2/src/app/views/login-view/login-view.scss +++ /dev/null @@ -1,105 +0,0 @@ -@use "../styles/variables"; -@use "../styles/loaders"; - -.login-form-container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 20%; - padding-top: 2rem; - margin: 0 auto; - gap: 1.5rem; - - .login-form { - display: flex; - flex-direction: column; - gap: 1.5rem; - width: 100%; - } - - .provider-separator { - display: flex; - flex-direction: row; - flex-wrap: nowrap; - align-items: center; - justify-content: center; - width: 28.5rem; - margin: 1.2rem 0 0.7rem 0; - padding: 0; - gap: 0.5rem; - .line { - flex-grow: 1; - flex: 1; - height: 1px; - background: #e0ddd8; - border-radius: 1px; - min-width: 24px; - width: 100%; - } - .provider-separator-text { - color: #888; - font-size: 1.1rem; - font-weight: 400; - padding: 0; - white-space: nowrap; - } - } - - .login-buttons { - display: flex; - flex-direction: column; - gap: 1rem; - width: 100%; - } - - .provider-buttons { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1rem; - } - - // Contenedor para los botones finales - .additional-options { - display: flex; - flex-direction: column; - gap: 0.8rem; - width: 100%; - padding-top: 1rem; - border-top: 1px solid #e0ddd8; - - // Estilo especial para el botón "Más opciones" - svg-button[label="login-more-options"] { - opacity: 0.8; - transition: all 0.3s ease; - - &:hover { - opacity: 1; - transform: translateY(-1px); - } - } - - // Estilo destacado para el botón de registro - svg-button[label="register-link"] { - position: relative; - - &::before { - content: ""; - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - background: linear-gradient(45deg, #e0ddd8, #f0f0f0, #e0ddd8); - border-radius: 10px; - z-index: -1; - opacity: 0; - transition: opacity 0.3s ease; - } - - &:hover::before { - opacity: 1; - } - } - } -} diff --git a/front/v2/src/app/views/login-view/login-view.spec.ts b/front/v2/src/app/views/login-view/login-view.spec.ts deleted file mode 100644 index da347e5..0000000 --- a/front/v2/src/app/views/login-view/login-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { LoginView } from './login-view'; - -describe('LoginView', () => { - let component: LoginView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [LoginView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(LoginView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/login-view/login-view.ts b/front/v2/src/app/views/login-view/login-view.ts deleted file mode 100644 index b3a424f..0000000 --- a/front/v2/src/app/views/login-view/login-view.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { Component, inject, signal } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; -import { userService } from '../../services/userService/userService'; -import { SvgButton } from '../../../utils/svg-button/svg-button'; -import { Router } from '@angular/router'; -import { emailValidator } from '../../../utils/validators/emailValidator'; -import { PasswordValidator } from '../../../utils/validators/passwordValidator'; -import { emailPasswordDistinctValidator } from '../../../utils/validators/distinctEmailPasswordValidator'; -import { from } from 'rxjs'; - -@Component({ - selector: 'login-view', - imports: [ReactiveFormsModule, SvgButton], - templateUrl: './login-view.html', - styleUrl: './login-view.scss', -}) -export class LoginView { - private userService = inject(userService); - private formBuilder = inject(FormBuilder); - private router = inject(Router); - private timer: any; - cuentaAtras: number = 30; - disableLogin = signal(false); - entrando = signal(false); - submitError = signal(null); - showRegisterLink = signal(false); - - loginForm = this.formBuilder.group( - { - email: ['', [Validators.required, emailValidator]], - password: [ - '', - [Validators.required, Validators.minLength(8), PasswordValidator], - ], - systemKey: [''], - }, - { validators: emailPasswordDistinctValidator } - ); - - get email() { - return this.loginForm.get('email'); - } - - get password() { - return this.loginForm.get('password'); - } - - get systemKey() { - return this.loginForm.get('systemKey'); - } - - // Métodos para verificar si los campos tienen contenido - hasEmailContent(): boolean { - const emailValue = this.email?.value; - return emailValue ? emailValue.trim().length > 0 : false; - } - - emailHasErrors(): boolean { - const emailControl = this.email; - return emailControl - ? this.hasEmailContent() && - emailControl.invalid && - (emailControl.dirty || emailControl.touched) - : false; - } - - hasPasswordContent(): boolean { - const passwordValue = this.password?.value; - return passwordValue ? passwordValue.trim().length > 0 : false; - } - - passwordHasErrors(): boolean { - const passwordControl = this.password; - return passwordControl - ? this.hasPasswordContent() && - passwordControl.invalid && - (passwordControl.dirty || passwordControl.touched) - : false; - } - - isLoginSystem(): boolean { - const emailValue = this.email?.value; - if (emailValue && emailValue == 'sys@t.em') { - return true; - } - return false; - } - - hasSystemKeyContent(): boolean { - const systemKeyValue = this.systemKey?.value; - return systemKeyValue ? systemKeyValue.trim().length > 0 : false; - } - - ngOnDestroy() { - this.submitError.set(null); - this.limpiarTimer(); - } - - limpiarTimer() { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; - } - } - - iniciarCuentaAtras(segundos: number, mensajeBase: string) { - this.disableLogin.set(true); - this.cuentaAtras = segundos; - this.submitError.set(`${mensajeBase} (${this.cuentaAtras}s)`); - this.timer = setInterval(() => { - this.cuentaAtras--; - if (this.cuentaAtras <= 0) { - this.limpiarTimer(); - this.disableLogin.set(false); - this.submitError.set(null); - } else { - this.submitError.set(`${mensajeBase} (${this.cuentaAtras}s)`); - } - }, 1000); - } - - async onSubmit() { - const email = this.loginForm.value.email; - const password = this.loginForm.value.password; - if (this.isLoginSystem()) { - const systemKey = this.systemKey?.value; - await this.userService - .systemLogin(email, password, systemKey) - .finally(() => { - this.router.navigate(['/']); - }); - } else if (this.loginForm.valid) { - this.entrando.set(true); - from(this.userService.login(email, password)).subscribe({ - next: (user) => { - this.router.navigate(['/']); - }, - error: (error) => { - this.entrando.set(false); - console.error('Login error:', error); - if (error.status === 401) { - this.submitError.set( - 'Credenciales inválidas. Por favor, inténtalo de nuevo.' - ); - } else if (error.status === 400) { - this.submitError.set( - 'Por favor, completa todos los campos requeridos.' - ); - } else if (error.code === 'ETIMEDOUT' || error.status === 408) { - this.iniciarCuentaAtras( - 30, - 'La red es inestable y no se puede validar la conexión. Vuelve a intentarlo más tarde. Reconectando...' - ); - } else if (error.code === 'ERR_NETWORK' || error.status === 500) { - this.iniciarCuentaAtras( - 90, - 'No se ha podido conectar con el servidor. Vuelva a intentarlo más tarde. Reconectando...' - ); - } else if (error.status === 404) { - this.submitError.set('El usuario nunca ha existido.'); - this.showRegisterLink.set(true); - } - }, - }); - } - } - - onForgotPassword() { - this.router.navigate(['/forgot-password']); - } - - onLoginWithGoogle() { - // Implement Google login logic - } - - onLoginWithMicrosoft() { - // Implement Microsoft login logic - } - - onLoginWithApple() { - // Implement Apple login logic - } - - onLoginWithMeta() { - // Implement Meta login logic - } - - onMoreLoginOptions() { - // Implement more login options logic - this.router.navigate(['/login-options']); - } - - onRegister() { - this.router.navigate(['/register']); - } -} diff --git a/front/v2/src/app/views/register-view/register-view.html b/front/v2/src/app/views/register-view/register-view.html deleted file mode 100644 index 4cf4ee4..0000000 --- a/front/v2/src/app/views/register-view/register-view.html +++ /dev/null @@ -1,83 +0,0 @@ -
    -
    -
    - - - - - -
    -
    - - - - - -
    - @if(emailHasErrors()) { -
    - * El email no es válido. - @if(this.email?.hasError('email')) { - El email no tiene un formato válido. - } -
    - } -
    - - - - - -
    - @if(passwordHasErrors()) { -
    - * La contraseña no es válida.
    - @if(this.password?.hasError('minlength')) { - Debe tener al menos 8 caracteres. - } @else { @if(this.password?.hasError('passwordContainsEmailOrLeet')) { - No puede contener trazas del email. - } @if(this.password?.hasError('invalidPassword')) { - - No tiene un formato válido.
    - Tiene que contener al menos una letra mayúscula, una letra minúscula, un - número y un carácter especial. -
    - } } -
    - } -
    - - - - - -
    - @if(confirmPasswordHasErrors()) { -
    - * Las dos contraseñas tienen que coincidir. -
    - } - - -
    -
    diff --git a/front/v2/src/app/views/register-view/register-view.scss b/front/v2/src/app/views/register-view/register-view.scss deleted file mode 100644 index 27289a2..0000000 --- a/front/v2/src/app/views/register-view/register-view.scss +++ /dev/null @@ -1,67 +0,0 @@ -.register-view { - form { - display: flex; - flex-direction: column; - gap: 1rem; - } - - .text-input { - position: relative; - - input { - width: 100%; - padding: 0.5rem; - border: 1px solid #ccc; - border-radius: 4px; - - &:focus { - border-color: #007bff; - outline: none; - } - } - - label { - position: absolute; - top: 0.5rem; - left: 0.5rem; - transition: 0.2s; - } - - &.has-content { - label { - top: -1rem; - left: 0.5rem; - font-size: 0.8rem; - color: #007bff; - } - } - - .focus-border { - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: 2px; - background: #007bff; - transform: scaleX(0); - transition: transform 0.2s; - } - - &:focus-within .focus-border { - transform: scaleX(1); - } - } - - button[type="submit"] { - padding: 0.5rem 1rem; - border: none; - border-radius: 4px; - background: #007bff; - color: white; - cursor: pointer; - - &:hover { - background: darken(#007bff, 10%); - } - } -} diff --git a/front/v2/src/app/views/register-view/register-view.spec.ts b/front/v2/src/app/views/register-view/register-view.spec.ts deleted file mode 100644 index 410c474..0000000 --- a/front/v2/src/app/views/register-view/register-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { RegisterView } from './register-view'; - -describe('RegisterView', () => { - let component: RegisterView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [RegisterView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(RegisterView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/register-view/register-view.ts b/front/v2/src/app/views/register-view/register-view.ts deleted file mode 100644 index e0ea488..0000000 --- a/front/v2/src/app/views/register-view/register-view.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { Component, inject } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; -import { emailValidator } from '../../../utils/validators/emailValidator'; -import { SigningMethods, userModel } from '../../../models/userModel'; -import { emailPasswordDistinctValidator } from '../../../utils/validators/distinctEmailPasswordValidator'; -import { from } from 'rxjs'; -import { Router } from '@angular/router'; -import { userService } from '../../services/userService/userService'; - -@Component({ - selector: 'register-view', - imports: [ReactiveFormsModule], - templateUrl: './register-view.html', - styleUrl: './register-view.scss', -}) -export class RegisterView { - private userService = inject(userService); - private formBuilder = inject(FormBuilder); - private router = inject(Router); - form = this.formBuilder.group( - { - name: ['', [Validators.required]], - email: ['', [Validators.required, emailValidator]], - password: ['', [Validators.required, Validators.minLength(6)]], - confirmPassword: [''], - // preferredSigninMethod: [SigningMethods.Password], - // profilePicture: [null], - // bio: ['', [Validators.maxLength(500)]], - // socialMedia: this.formBuilder.group({ - // facebook: [''], - // twitter: [''], - // instagram: [''], - // }), - // termsAccepted: [false, [Validators.requiredTrue]], - }, - { validators: emailPasswordDistinctValidator } - ); - - get name() { - return this.form.get('name'); - } - - get email() { - return this.form.get('email'); - } - - get password() { - return this.form.get('password'); - } - - get confirmPassword() { - return this.form.get('confirmPassword'); - } - - get bio() { - return this.form.get('bio'); - } - - get socialMedia() { - return this.form.get('socialMedia'); - } - - get profilePicture() { - return this.form.get('profilePicture'); - } - - get preferredSigninMethod() { - return this.form.get('preferredSigninMethod'); - } - - // getTermsAccepted() { - // return this.form.value.termsAccepted; - // } - - onSubmit() { - if (this.form.valid) { - const email = this.form.value.email; - const password = this.form.value.password; - const name = this.form.value.name; - from(this.userService.register(name, email, password)).subscribe({ - next: (user) => { - this.router.navigate(['/']); - }, - error: (error) => { - console.error('Register error:', error); - }, - }); - } - } - - hasNameContent(): boolean { - const nameValue = this.name?.value; - return nameValue ? nameValue.trim().length > 0 : false; - } - - hasEmailContent(): boolean { - const emailValue = this.email?.value; - return emailValue ? emailValue.trim().length > 0 : false; - } - - hasPasswordContent(): boolean { - const passwordValue = this.password?.value; - return passwordValue ? passwordValue.trim().length > 0 : false; - } - - hasConfirmPasswordContent(): boolean { - const confirmPasswordValue = this.confirmPassword?.value; - return confirmPasswordValue - ? confirmPasswordValue.trim().length > 0 - : false; - } - - emailHasErrors(): boolean { - const emailControl = this.email; - return emailControl - ? this.hasEmailContent() && - emailControl.invalid && - (emailControl.dirty || emailControl.touched) - : false; - } - - passwordHasErrors(): boolean { - const passwordControl = this.password; - return passwordControl - ? this.hasPasswordContent() && - passwordControl.invalid && - (passwordControl.dirty || passwordControl.touched) - : false; - } - - confirmPasswordHasErrors(): boolean { - const confirmPasswordControl = this.confirmPassword; - return confirmPasswordControl - ? this.hasConfirmPasswordContent() && - confirmPasswordControl.invalid && - (confirmPasswordControl.dirty || confirmPasswordControl.touched) - : false; - } -} diff --git a/front/v2/src/app/views/services-view/services-view.html b/front/v2/src/app/views/services-view/services-view.html deleted file mode 100644 index 10252b8..0000000 --- a/front/v2/src/app/views/services-view/services-view.html +++ /dev/null @@ -1 +0,0 @@ -

    services-view works!

    diff --git a/front/v2/src/app/views/services-view/services-view.scss b/front/v2/src/app/views/services-view/services-view.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/app/views/services-view/services-view.spec.ts b/front/v2/src/app/views/services-view/services-view.spec.ts deleted file mode 100644 index 405b591..0000000 --- a/front/v2/src/app/views/services-view/services-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ServicesView } from './services-view'; - -describe('ServicesView', () => { - let component: ServicesView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ServicesView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ServicesView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/services-view/services-view.ts b/front/v2/src/app/views/services-view/services-view.ts deleted file mode 100644 index 9607110..0000000 --- a/front/v2/src/app/views/services-view/services-view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'services-view', - imports: [], - templateUrl: './services-view.html', - styleUrl: './services-view.scss' -}) -export class ServicesView { - -} diff --git a/front/v2/src/app/views/tags-view/tags-view.html b/front/v2/src/app/views/tags-view/tags-view.html deleted file mode 100644 index 0bb4638..0000000 --- a/front/v2/src/app/views/tags-view/tags-view.html +++ /dev/null @@ -1 +0,0 @@ -

    tags-view works!

    diff --git a/front/v2/src/app/views/tags-view/tags-view.scss b/front/v2/src/app/views/tags-view/tags-view.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/app/views/tags-view/tags-view.spec.ts b/front/v2/src/app/views/tags-view/tags-view.spec.ts deleted file mode 100644 index 249d4bf..0000000 --- a/front/v2/src/app/views/tags-view/tags-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TagsView } from './tags-view'; - -describe('TagsView', () => { - let component: TagsView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [TagsView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(TagsView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/tags-view/tags-view.ts b/front/v2/src/app/views/tags-view/tags-view.ts deleted file mode 100644 index 1a6a06a..0000000 --- a/front/v2/src/app/views/tags-view/tags-view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'tags-view', - imports: [], - templateUrl: './tags-view.html', - styleUrl: './tags-view.scss' -}) -export class TagsView { - -} diff --git a/front/v2/src/app/views/upload-image-view/upload-image-view.html b/front/v2/src/app/views/upload-image-view/upload-image-view.html deleted file mode 100644 index 31ec3e7..0000000 --- a/front/v2/src/app/views/upload-image-view/upload-image-view.html +++ /dev/null @@ -1,9 +0,0 @@ -galeria destino > subir fotos dentro de una galeria -titulo -descripcion -ubicacion -evento? -fecha -gente que sale -cosas que salen -foto diff --git a/front/v2/src/app/views/upload-image-view/upload-image-view.scss b/front/v2/src/app/views/upload-image-view/upload-image-view.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/app/views/upload-image-view/upload-image-view.spec.ts b/front/v2/src/app/views/upload-image-view/upload-image-view.spec.ts deleted file mode 100644 index 3c9d72e..0000000 --- a/front/v2/src/app/views/upload-image-view/upload-image-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UploadImageView } from './upload-image-view'; - -describe('UploadImageView', () => { - let component: UploadImageView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [UploadImageView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(UploadImageView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/upload-image-view/upload-image-view.ts b/front/v2/src/app/views/upload-image-view/upload-image-view.ts deleted file mode 100644 index 262dda7..0000000 --- a/front/v2/src/app/views/upload-image-view/upload-image-view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'upload-image-view', - imports: [], - templateUrl: './upload-image-view.html', - styleUrl: './upload-image-view.scss' -}) -export class UploadImageView { - -} diff --git a/front/v2/src/app/views/user-galleries-view/user-galleries-view.html b/front/v2/src/app/views/user-galleries-view/user-galleries-view.html deleted file mode 100644 index 3b380d6..0000000 --- a/front/v2/src/app/views/user-galleries-view/user-galleries-view.html +++ /dev/null @@ -1 +0,0 @@ -

    user-galleries-view works!

    diff --git a/front/v2/src/app/views/user-galleries-view/user-galleries-view.scss b/front/v2/src/app/views/user-galleries-view/user-galleries-view.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/app/views/user-galleries-view/user-galleries-view.spec.ts b/front/v2/src/app/views/user-galleries-view/user-galleries-view.spec.ts deleted file mode 100644 index a62750a..0000000 --- a/front/v2/src/app/views/user-galleries-view/user-galleries-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UserGalleriesView } from './user-galleries-view'; - -describe('UserGalleriesView', () => { - let component: UserGalleriesView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [UserGalleriesView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(UserGalleriesView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/user-galleries-view/user-galleries-view.ts b/front/v2/src/app/views/user-galleries-view/user-galleries-view.ts deleted file mode 100644 index d71de4a..0000000 --- a/front/v2/src/app/views/user-galleries-view/user-galleries-view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'user-galleries-view', - imports: [], - templateUrl: './user-galleries-view.html', - styleUrl: './user-galleries-view.scss' -}) -export class UserGalleriesView { - -} diff --git a/front/v2/src/app/views/user-profile-view/user-profile-view.html b/front/v2/src/app/views/user-profile-view/user-profile-view.html deleted file mode 100644 index 2eeb553..0000000 --- a/front/v2/src/app/views/user-profile-view/user-profile-view.html +++ /dev/null @@ -1 +0,0 @@ -

    user-profile-view works!

    diff --git a/front/v2/src/app/views/user-profile-view/user-profile-view.scss b/front/v2/src/app/views/user-profile-view/user-profile-view.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/app/views/user-profile-view/user-profile-view.spec.ts b/front/v2/src/app/views/user-profile-view/user-profile-view.spec.ts deleted file mode 100644 index c58c585..0000000 --- a/front/v2/src/app/views/user-profile-view/user-profile-view.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UserProfileView } from './user-profile-view'; - -describe('UserProfileView', () => { - let component: UserProfileView; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [UserProfileView] - }) - .compileComponents(); - - fixture = TestBed.createComponent(UserProfileView); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/front/v2/src/app/views/user-profile-view/user-profile-view.ts b/front/v2/src/app/views/user-profile-view/user-profile-view.ts deleted file mode 100644 index 0669baf..0000000 --- a/front/v2/src/app/views/user-profile-view/user-profile-view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'user-profile-view', - imports: [], - templateUrl: './user-profile-view.html', - styleUrl: './user-profile-view.scss' -}) -export class UserProfileView { - -} diff --git a/front/v2/src/index.html b/front/v2/src/index.html deleted file mode 100644 index 4d8e249..0000000 --- a/front/v2/src/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/front/v2/src/main.ts b/front/v2/src/main.ts deleted file mode 100644 index 86d1622..0000000 --- a/front/v2/src/main.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { bootstrapApplication } from '@angular/platform-browser'; -import { appConfig } from './app/app.config'; -import { App } from './app/app'; -import { config } from './models/config'; -import axios from 'axios'; -import { ThumbprintService } from './app/services/thumprint-service/thumbprint-service'; - -async function main() { - await config.load(); - const publicConfig: config = config.get(); - publicConfig.configure(); - // update axios base url - axios.defaults.allowAbsoluteUrls = true; - axios.defaults.baseURL = publicConfig.baseApiUrl || undefined; - axios.defaults.responseEncoding = 'utf8'; - - bootstrapApplication(App, appConfig).catch((err) => console.error(err)); -} - -main(); diff --git a/front/v2/src/models/config.ts b/front/v2/src/models/config.ts deleted file mode 100644 index 58ebf77..0000000 --- a/front/v2/src/models/config.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ providedIn: 'root' }) -export class config { - private constructor() {} // Evita instanciación - - private static instance: config | null = null; - - private dnsPrefecthBackend() { - const link = document.createElement('link'); - link.rel = 'dns-prefetch'; - link.href = config.instance!.baseApiUrl || 'http://localhost:3000/api'; - document.head.appendChild(link); - } - - private setIcon() { - const link = document.createElement('link'); - link.rel = 'icon'; - link.type = 'image/x-icon'; - link.href = config.instance!.faviconSrc || 'default.ico'; - document.head.appendChild(link); - } - - private setMetaTags() { - if (config.instance!.metaTags) { - for (const [key, value] of Object.entries(config.instance!.metaTags!)) { - const meta = document.createElement('meta'); - meta.name = key; - meta.content = value || ''; - document.head.appendChild(meta); - } - } - } - - private setFonts() { - // update font - config.instance!.fonts.preconnect.forEach((font) => { - const link = document.createElement('link'); - link.rel = 'preconnect'; - link.href = font.href; - if (font.crossorigin) { - link.crossOrigin = 'anonymous'; - } - document.head.appendChild(link); - }); - config.instance!.fonts.stylesheets.forEach((stylesheet) => { - const link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = stylesheet; - document.head.appendChild(link); - }); - } - - public configure() { - document.title = config.instance!.title || 'Default Title'; - this.dnsPrefecthBackend(); - this.setIcon(); - this.setMetaTags(); - this.setFonts(); - } - - static get(): config { - if (config.instance) { - return config.instance!; - } - throw new Error('Config not loaded. Call config.load() first.'); - } - - static async load(): Promise { - if (config.instance === null) { - config.instance = new config(); - const response = await fetch('/config.json'); - const data = await response.json(); - config.instance.version = data.version || '1.0.0'; - config.instance.baseApiUrl = - data.baseApiUrl || 'http://localhost:3000/api'; - config.instance.defaultTheme = data.defaultTheme || 'light'; - config.instance.logoSrc = data.logoSrc || '/assets/logo.png'; - config.instance.logoAlt = data.logoAlt || 'Logo'; - config.instance.faviconSrc = data.faviconSrc || '/assets/favicon.ico'; - config.instance.title = data.title || 'My Application'; - config.instance.metaTags = { - description: data.metaTags?.description || 'Default description', - keywords: data.metaTags?.keywords || 'default,keywords', - author: data.metaTags?.author || 'Default Author', - }; - config.instance.socialLinks = { - facebook: data.socialLinks?.facebook || null, - twitter: data.socialLinks?.twitter || null, - instagram: data.socialLinks?.instagram || null, - }; - config.instance.contactEmail = data.contactEmail || null; - config.instance.fonts = { - preconnect: data.fonts?.preconnect || [], - stylesheets: data.fonts?.stylesheets || [], - }; - } - return config.instance; - } - - public fonts: { - preconnect: { - href: string; - crossorigin?: boolean; - type?: string; - }[]; - stylesheets: string[]; - } = { - preconnect: [], - stylesheets: [], - }; - public version: string | null = null; - public baseApiUrl: string | null = null; - public defaultTheme: string | null = null; - public logoSrc: string | null = null; - public logoAlt: string | null = null; - public faviconSrc: string | null = null; - public title: string | null = null; - public metaTags: { - description: string | null; - keywords: string | null; - author: string | null; - } | null = null; - public socialLinks: { - facebook: string | null; - twitter: string | null; - instagram: string | null; - } | null = null; - public contactEmail: string | null = null; -} diff --git a/front/v2/src/models/eventModel.ts b/front/v2/src/models/eventModel.ts deleted file mode 100644 index bc76f77..0000000 --- a/front/v2/src/models/eventModel.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { tagModel } from './tagModel'; - -export class eventModel { - constructor( - public id: string, - public title: string, - public description: string, - public date: Date, - public location: string, - public relatedTags: tagModel[] = [], - public createdAt: Date, - public updatedAt: Date, - public createdBy: string, - public updatedBy: string - ) {} -} diff --git a/front/v2/src/models/gallery/galleryFactory.ts b/front/v2/src/models/gallery/galleryFactory.ts deleted file mode 100644 index 890411d..0000000 --- a/front/v2/src/models/gallery/galleryFactory.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { galleryModel } from './galleryModel'; -import { homeGallery } from './homeGallery'; -import { photoModel } from '../photoModel'; -import { eventModel } from '../eventModel'; -import { tagModel } from '../tagModel'; -import { personModel } from '../personModel'; -import { v4 as uuidv4 } from 'uuid'; - -type galleryArgs = { - title?: string | null; - description?: string | null; - createdBy?: string | null; - photos?: photoModel[]; - isPublic?: boolean; - isArchived?: boolean; - isFavorite?: boolean; - event?: eventModel | null; - tags?: tagModel[] | null; - personsInvolved?: personModel[] | null; - usersWhoCanSee?: personModel[] | null; -}; - -export class galleryFactory { - public static createEmptyGallery(): galleryModel { - return this.createGallery({}); - } - - public static getHomeGallery(): galleryModel { - return new homeGallery(); - } - - public static createGallery( - { - title = null, - description = null, - createdBy = null, - photos = [], - isPublic = true, - isArchived = false, - isFavorite = false, - event = null, - tags = null, - personsInvolved = null, - usersWhoCanSee = null, - } = {} as galleryArgs - ): galleryModel { - const now = new Date(); - - return new galleryModel({ - id: uuidv4(), - title, - description, - createdAt: now, - updatedAt: now, - createdBy, - updatedBy: createdBy, - photos, - isPublic, - isArchived, - isFavorite, - event, - tags, - personsInvolved, - usersWhoCanSee, - }); - } -} diff --git a/front/v2/src/models/gallery/galleryModel.ts b/front/v2/src/models/gallery/galleryModel.ts deleted file mode 100644 index 1414aee..0000000 --- a/front/v2/src/models/gallery/galleryModel.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { dataApi } from '../../apiContracts/dataApi'; -import { paginator } from '../../utils/paginator'; -import { eventModel } from '../eventModel'; -import { personModel } from '../personModel'; -import { photoModel } from '../photoModel'; -import { tagModel } from '../tagModel'; - -type galleryArgs = { - id: string; - title?: string | null; - description?: string | null; - createdAt?: Date | null; - updatedAt?: Date | null; - createdBy?: string | null; - updatedBy?: string | null; - photos?: photoModel[]; - isPublic?: boolean; - isArchived?: boolean; - isFavorite?: boolean; - event?: eventModel | null; - tags?: tagModel[] | null; - personsInvolved?: personModel[] | null; - usersWhoCanSee?: personModel[] | null; -}; - -export class galleryModel { - constructor({ - id, - title, - description, - createdAt, - updatedAt, - createdBy, - updatedBy, - photos, - isPublic, - isArchived, - isFavorite, - event, - tags, - personsInvolved, - usersWhoCanSee, - }: galleryArgs) { - this.id = id; - this.title = title; - this.description = description; - this.createdAt = createdAt; - this.updatedAt = updatedAt; - this.createdBy = createdBy; - this.updatedBy = updatedBy; - this.photos = photos || []; - this.isPublic = isPublic; - this.isArchived = isArchived; - this.isFavorite = isFavorite; - this.event = event; - this.tags = tags; - this.personsInvolved = personsInvolved; - this.usersWhoCanSee = usersWhoCanSee; - - this.loadNextPage(); - } - - public id: string; - public title?: string | null = null; - public description?: string | null = null; - public createdAt?: Date | null = null; - public updatedAt?: Date | null = null; - public createdBy?: string | null = null; - public updatedBy?: string | null = null; - public photos: photoModel[] = []; - public isPublic?: boolean = true; - public isArchived?: boolean = false; - public isFavorite?: boolean = false; - public event?: eventModel | null = null; - public tags?: tagModel[] | null = null; - public personsInvolved?: personModel[] | null = null; - public usersWhoCanSee?: personModel[] | null = null; - public readonly isHome: boolean = false; - - private paginator = new paginator({ - url: dataApi.Photos.getAll, - }); - - public addPhotos(photos: photoModel[]) { - if (!this.photos) { - this.photos = []; - } - this.photos.push(...photos); - } - - public loadNextPage() { - const nextPage = this.paginator.loadNextPage(); - nextPage.then((photos) => { - if (photos) { - this.addPhotos(photos); - } - }); - } -} diff --git a/front/v2/src/models/gallery/homeGallery.ts b/front/v2/src/models/gallery/homeGallery.ts deleted file mode 100644 index c969aa3..0000000 --- a/front/v2/src/models/gallery/homeGallery.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { galleryModel } from './galleryModel'; -import { v4 as uuidv4 } from 'uuid'; - -export class homeGallery extends galleryModel { - public override readonly isHome: boolean = true; - - constructor() { - super({ - id: uuidv4(), - title: 'Home Gallery', - description: 'This is the home gallery.', - }); - } -} diff --git a/front/v2/src/models/permissionModel.ts b/front/v2/src/models/permissionModel.ts deleted file mode 100644 index 6819257..0000000 --- a/front/v2/src/models/permissionModel.ts +++ /dev/null @@ -1,67 +0,0 @@ -export class permissionModel { - constructor( - public id: string, - public name: string, - public description: string - ) {} - - static ViewContentPermission = new permissionModel( - '1', - 'VIEW_CONTENT', - 'Permission to view content' - ); - - static LikeContentPermission = new permissionModel( - '2', - 'LIKE_CONTENT', - 'Permission to like content' - ); - - static EditContentPermission = new permissionModel( - '3', - 'EDIT_CONTENT', - 'Permission to edit content' - ); - - static DeleteContentPermission = new permissionModel( - '4', - 'DELETE_CONTENT', - 'Permission to delete content' - ); - - static CreateContentPermission = new permissionModel( - '5', - 'CREATE_CONTENT', - 'Permission to create new content' - ); - - static EditUserPermission = new permissionModel( - '6', - 'EDIT_USER', - 'Permission to edit user' - ); - - static DeleteUserPermission = new permissionModel( - '7', - 'DELETE_USER', - 'Permission to delete user' - ); - - static DisableUserPermission = new permissionModel( - '8', - 'DISABLE_USER', - 'Permission to disable user' - ); - - static CreateUserPermission = new permissionModel( - '9', - 'CREATE_USER', - 'Permission to create new user' - ); - - static EditWebConfigPermission = new permissionModel( - '10', - 'EDIT_WEB_CONFIG', - 'Permission to edit web configuration' - ); -} diff --git a/front/v2/src/models/personModel.ts b/front/v2/src/models/personModel.ts deleted file mode 100644 index 10bb67f..0000000 --- a/front/v2/src/models/personModel.ts +++ /dev/null @@ -1,68 +0,0 @@ -type socialMediaType = { - facebook: string | null; - instagram: string | null; - twitter: string | null; - blueSky: string | null; - tiktok: string | null; - linkedin: string | null; - pinterest: string | null; - discord: string | null; - reddit: string | null; - other: string | null; -}; - -type personModelType = { - id: string; - name: string; - profilePicture?: string | null; - avatar?: string | null; - socialMedia?: socialMediaType | null; - bio?: string | null; -}; - -export class personModel { - constructor({ - id, - name, - profilePicture, - avatar, - socialMedia, - bio, - }: personModelType) { - this.id = id; - this.name = name; - this.profilePicture = profilePicture || null; - this.avatar = avatar || null; - this.socialMedia = socialMedia || null; - this.bio = bio || null; - } - - public id: string; - public name: string; - public profilePicture: string | null = null; - public avatar: string | null = null; - public bio: string | null = null; - public socialMedia: { - facebook: string | null; - instagram: string | null; - twitter: string | null; - blueSky: string | null; - tiktok: string | null; - linkedin: string | null; - pinterest: string | null; - discord: string | null; - reddit: string | null; - other: string | null; - } | null = { - facebook: null, - instagram: null, - twitter: null, - blueSky: null, - tiktok: null, - linkedin: null, - pinterest: null, - discord: null, - reddit: null, - other: null, - }; -} diff --git a/front/v2/src/models/photoModel.ts b/front/v2/src/models/photoModel.ts deleted file mode 100644 index 4b19ea7..0000000 --- a/front/v2/src/models/photoModel.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { eventModel } from './eventModel'; -import { personModel } from './personModel'; -import { rankingModel } from './rankingModel'; -import { tagModel } from './tagModel'; - -export class photoModel { - constructor( - public id: string, - public title: string, - public description: string, - public lowResUrl: string, - public midResUrl: string, - public highResUrl: string, - public createdAt: Date, - public updatedAt: Date, - public createdBy: string, - public updatedBy: string, - public event: eventModel | null = null, - public tags: tagModel[] = [], - public ranking: rankingModel = new rankingModel(0), - public isFavorite: boolean = false, - public isPublic: boolean = true, - public isArchived: boolean = false, - public persons: personModel[] = [] - ) {} - - static DefaultPhotoModel = new photoModel( - '', - 'Default Title', - 'Default Description', - 'assets/images/default-lowres.jpg', - 'assets/images/default-midres.jpg', - 'assets/images/default-highres.jpg', - new Date(), - new Date(), - 'user123', - 'user123', - null, - [], - new rankingModel(0), - false, - true, - false, - [] - ); -} diff --git a/front/v2/src/models/rankingModel.ts b/front/v2/src/models/rankingModel.ts deleted file mode 100644 index e1d76b7..0000000 --- a/front/v2/src/models/rankingModel.ts +++ /dev/null @@ -1,25 +0,0 @@ -export class rankingModel { - constructor( - private totalVotes: number, - private upVotes: number = 0, - private downVotes: number = 0 - ) {} - - downVote(): void { - this.downVotes++; - this.totalVotes++; - } - - upVote(): void { - this.upVotes++; - this.totalVotes++; - } - - get score(): number { - if (this.totalVotes === 0) { - return 0; - } else { - return (this.upVotes - this.downVotes) / this.totalVotes; - } - } -} diff --git a/front/v2/src/models/roleModel.ts b/front/v2/src/models/roleModel.ts deleted file mode 100644 index 05ddb4d..0000000 --- a/front/v2/src/models/roleModel.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { permissionModel } from './permissionModel'; - -export class roleModel { - constructor( - public id: string, - public name: string, - public description: string, - public permissions: permissionModel[] = [], - public baseRoleModel: roleModel | null = null - ) { - this.id = id; - this.name = name; - this.description = description; - this.permissions = []; - for (const p of permissions) { - this.permissions.push(new permissionModel(p.id, '', '')); - } - if (baseRoleModel) { - this.permissions = baseRoleModel.permissions.concat(this.permissions); - } - } - - get isAdmin(): boolean { - return this.id === roleModel.AdminRole.id; - } - - get isContentManager(): boolean { - return this.isAdmin || this.id === roleModel.ContentManagerRole.id; - } - - get isUser(): boolean { - return this.isContentManager || this.id === roleModel.UserRole.id; - } - - hasPermission(permission: permissionModel): boolean { - return this.permissions.some((p) => p.id === permission.id); - } - - static UserRole = new roleModel('1', 'User', 'Role for regular users', [ - permissionModel.ViewContentPermission, - permissionModel.LikeContentPermission, - ]); - - static ContentManagerRole = new roleModel( - '2', - 'Content Manager', - 'Role for managing content', - [ - permissionModel.CreateUserPermission, - permissionModel.DisableUserPermission, - permissionModel.CreateContentPermission, - permissionModel.EditContentPermission, - permissionModel.DeleteContentPermission, - ], - this.UserRole - ); - - static AdminRole = new roleModel( - '3', - 'Admin', - 'Administrator role with full permissions', - [ - permissionModel.CreateUserPermission, - permissionModel.EditUserPermission, - permissionModel.DeleteUserPermission, - permissionModel.EditWebConfigPermission, - ], - this.ContentManagerRole - ); -} diff --git a/front/v2/src/models/tagModel.ts b/front/v2/src/models/tagModel.ts deleted file mode 100644 index 8387ef8..0000000 --- a/front/v2/src/models/tagModel.ts +++ /dev/null @@ -1,3 +0,0 @@ -export class tagModel { - constructor(public id: string, public name: string) {} -} diff --git a/front/v2/src/models/userModel.ts b/front/v2/src/models/userModel.ts deleted file mode 100644 index 4b41793..0000000 --- a/front/v2/src/models/userModel.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { personModel } from './personModel'; -import { roleModel } from './roleModel'; - -enum SigningMethods { - Password = 'password', - MagicLink = 'magic-link', - Passkeys = 'passkeys', - Google = 'google', - Meta = 'meta', - Apple = 'apple', - Microsoft = 'microsoft', -} - -class userModel { - constructor( - public id: string, - public role: roleModel[], - public isLoggedIn: boolean - ) { - this.id = id; - for (const r of role) { - this.role.push(new roleModel(r.id, '', '', r.permissions, null)); - } - this.isLoggedIn = isLoggedIn; - } - - // constructor( - // public override id: string, - // public email: string, - // public password: string, - // public override name: string, - // public role: roleModel[], - // public createdAt: Date, - // public updatedAt: Date, - // public isLoggedIn: boolean, - // public preferredSigningMethod: SigningMethods = SigningMethods.Password - // ) { - // super({ - // id, - // name, - // profilePicture: null, - // avatar: null, - // socialMedia: null, - // }); - // } - - get isAdmin(): boolean { - return this.role.some((r) => r.isAdmin); - } - - get isContentManager(): boolean { - return this.role.some((r) => r.isContentManager); - } - - get isUser(): boolean { - return this.role.some((r) => r.isUser); - } - - public static readonly DefaultUser: userModel = new userModel( - '0', - // 'default@example.com', - // '', - // 'Default User', - [roleModel.UserRole], - // new Date(), - // new Date(), - false - ); -} - -export { SigningMethods, userModel }; diff --git a/front/v2/src/styles.scss b/front/v2/src/styles.scss deleted file mode 100644 index 6b7ac21..0000000 --- a/front/v2/src/styles.scss +++ /dev/null @@ -1,37 +0,0 @@ -@use "./styles/variables"; -@use "./styles/buttons"; -@use "./styles/inputs"; -// @use "./styles/themes/light"; -// @use "./styles/themes/dark"; -@use "./styles/loaders"; - -/* You can add global styles to this file, and also import other style files */ -::-webkit-scrollbar { - width: 0px; - background: transparent; -} - -html, -body { - width: 100%; - height: 100%; - margin: 0; - padding: 0; - overflow-x: hidden; /* Elimina scroll horizontal */ - overflow-y: scroll; /* Permite scroll vertical */ - scroll-behavior: smooth; - box-sizing: border-box; -} - -body { - // Default the application to a light color theme. This can be changed to - // `dark` to enable the dark color theme, or to `light dark` to defer to the - // user's system settings. - color-scheme: light dark; - margin: 0; - font-family: "Atkinson Hyperlegible Next", Arial, sans-serif; -} - -.font-mono { - font-family: "Atkinson Hyperlegible Mono", monospace; -} diff --git a/front/v2/src/styles/_buttons.scss b/front/v2/src/styles/_buttons.scss deleted file mode 100644 index 647b731..0000000 --- a/front/v2/src/styles/_buttons.scss +++ /dev/null @@ -1,152 +0,0 @@ -@use "sass:color"; -@use "variables" as *; - -.login-button { - color: #43a047 !important; - background-color: rgba(#43a047, 0.05) !important; - border-color: #43a047 !important; - &:hover { - color: $primary-white !important; - background-color: #43a047 !important; - border-color: #43a047 !important; - } - &:disabled { - $disabled-color: rgba( - $color: #ff3939, - $alpha: 0.45, - ); - color: $primary-white !important; - background-color: $disabled-color !important; - border-color: $disabled-color !important; - } -} - -.forgot-password-button { - color: #607d8b !important; - background-color: rgba(#607d8b, 0.05) !important; - border-color: #607d8b !important; - &:hover { - color: $primary-white !important; - background-color: #607d8b !important; - border-color: #607d8b !important; - } -} - -.register-link-button { - color: #607d8b; - background-color: rgba(#607d8b, 0.08); - border-color: #607d8b; - &:hover { - color: $primary-white; - background-color: #607d8b; - border-color: #607d8b; - } -} - -.logout-button { - color: #607d8b; - border-color: #607d8b; - &:hover { - color: $primary-white; - background-color: #7d9c7a; - border-color: #7d9c7a; - } -} - -.services-button { - color: #1976d2; - border-color: #1976d2; - &:hover { - color: $primary-white; - background-color: #7d9c7a; - border-color: #7d9c7a; - } -} - -.events-button { - color: #1976d2; - border-color: #1976d2; - &:hover { - color: $primary-white; - background-color: #7d9c7a; - border-color: #7d9c7a; - } -} - -.tags-button { - color: #1976d2; - border-color: #1976d2; - &:hover { - color: $primary-white; - background-color: #7d9c7a; - border-color: #7d9c7a; - } -} - -.buy-button { - color: #43a047; - border-color: #43a047; - &:hover { - color: $primary-white; - background-color: #7d9c7a; - border-color: #7d9c7a; - } -} - -.upload-button { - color: #43a047; - border-color: #43a047; - &:hover { - color: $primary-white; - background-color: #7d9c7a; - border-color: #7d9c7a; - } -} - -.edit-button { - color: #fbc02d; - border-color: #fbc02d; - &:hover { - color: $primary-white; - background-color: #7d9c7a; - border-color: #7d9c7a; - } -} - -.delete-button { - color: #e53935; - border-color: #e53935; - &:hover { - color: $primary-white; - background-color: #7d9c7a; - border-color: #7d9c7a; - } -} - -.download-button { - color: #00897b; - border-color: #00897b; - &:hover { - color: $primary-white; - background-color: #7d9c7a; - border-color: #7d9c7a; - } -} - -.add-image-button { - border: 0.25rem dashed $standard-button-border; - aspect-ratio: 1 / 1; - height: auto; - svg-loader { - height: 3.2rem; - width: 3.2rem; - transition: transform 0.3s ease-out; - } - &:hover { - border: 0.25rem dashed - color.scale($standard-button-border, $lightness: -10%); - svg-loader { - transform: scale(1.5); - } - } -} diff --git a/front/v2/src/styles/_inputs.scss b/front/v2/src/styles/_inputs.scss deleted file mode 100644 index ab498e1..0000000 --- a/front/v2/src/styles/_inputs.scss +++ /dev/null @@ -1,160 +0,0 @@ -@use "../styles/variables" as *; - -$error: #f44336; // Red for error state -$success: #4caf50; // Green for success state -$no-validated: #0603a1; // Example color for effect 20 border - -.text-input { - width: 100%; - font-size: larger; -} - -// Contenedor para el efecto -.effect-20 { - position: relative; - display: inline-block; - - input { - border: 1px solid #ccc; - transition: $transition-medium; - background: transparent; - color: $text-dark; - width: 100%; - height: 2.8rem; - padding-left: 1rem; - box-sizing: border-box; - font-size: 1rem; - &:focus { - outline: none; - color: $text-dark; - } - &::placeholder { - color: $text-muted; - } - } - - .focus-border { - &:before, - &:after { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 0; - height: 2px; - background-color: $effect20-border-color; - transition: $transition-fast; - } - - &:after { - top: auto; - bottom: 0; - left: auto; - right: 0; - } - - i { - &:before, - &:after { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 2px; - height: 0; - background-color: $effect20-border-color; - transition: $transition-medium; - } - - &:after { - left: auto; - right: 0; - top: auto; - bottom: 0; - } - } - } - - label { - position: absolute; - left: 1rem; - width: 100%; - top: 10px; - color: $effect20-label-color; - transition: $transition-fast; - z-index: -1; - letter-spacing: 0.5px; - pointer-events: none; - &.ng-invalid.ng-touched { - color: $error; - } - &.ng-valid.ng-touched { - color: $success; - } - } - - // Cuando el input interno tiene focus - input:focus ~ .focus-border, - &.has-content .focus-border { - &:before, - &:after { - width: 100%; - } - i { - &:before, - &:after { - height: 100%; - } - } - } - - // Estados de validación - Error (rojo) - &.ng-invalid.ng-touched .focus-border { - &:before, - &:after { - background-color: $error; - width: 100%; - } - i { - &:before, - &:after { - background-color: $error; - height: 100%; - } - } - } - - // Estados de validación - Válido (verde) - &.ng-valid.ng-touched .focus-border { - &:before, - &:after { - background-color: $success; - width: 100%; - } - i { - &:before, - &:after { - background-color: $success; - height: 100%; - } - } - } - - // Animación de la etiqueta flotante - input:focus ~ label, - &.has-content label { - top: -18px; - left: 0; - font-size: 12px; - color: $effect20-label-active-color; - } - - // Color de label para estados de validación - &.ng-invalid.ng-touched label { - color: $error; - } - - &.ng-valid.ng-touched label { - color: $success; - } -} diff --git a/front/v2/src/styles/_loaders.scss b/front/v2/src/styles/_loaders.scss deleted file mode 100644 index 6d94565..0000000 --- a/front/v2/src/styles/_loaders.scss +++ /dev/null @@ -1,2 +0,0 @@ -@use "./loaders/paper-plane-loader"; -@use "./loaders/loader-spinner"; diff --git a/front/v2/src/styles/_variables.scss b/front/v2/src/styles/_variables.scss deleted file mode 100644 index 2d9301c..0000000 --- a/front/v2/src/styles/_variables.scss +++ /dev/null @@ -1,33 +0,0 @@ -$grid-breakpoints: ( - xs: 0, - sm: 576px, - md: 768px, - lg: 992px, - xl: 1200px, - xxl: 1400px, -); - -$text-dark: #333; -$text-light: #fff; -$text-muted: #6c757d; - -$primary-accent: #007bff; -$warning: #ffc107; - -$edit-color: #28a745; -$primary-white: #fefcf8; // Blanco ahuevado gentil -$border-grey: #e0ddd8; // Gris suave para bordes -$text-dark: #2a2926; // Texto principal -$standard-button-icon: #8d8d8d; // Texto principal -$standard-button-border: #d8d8d8; // Texto principal -$standard-button-hovered: #494949; // Texto principal -$text-muted: #706b63; // Texto secundario -// $standard-button-border-radius: 12px; -$standard-button-border-radius: 0px; - -// Variables configurables -$effect20-border-color: #4caf50; -$effect20-label-color: #aaa; -$effect20-label-active-color: $effect20-border-color; -$transition-fast: 0.3s; -$transition-medium: 0.4s; diff --git a/front/v2/src/styles/loaders/_loader-spinner.scss b/front/v2/src/styles/loaders/_loader-spinner.scss deleted file mode 100644 index 7e903c8..0000000 --- a/front/v2/src/styles/loaders/_loader-spinner.scss +++ /dev/null @@ -1,40 +0,0 @@ -.loader { - width: 48px; - height: 48px; - border-radius: 50%; - position: relative; - animation: rotate 1s linear infinite; -} -.loader::before { - content: ""; - box-sizing: border-box; - position: absolute; - inset: 0px; - border-radius: 50%; - border: 5px solid #ffc400; - animation: prixClipFix 2s linear infinite; -} - -@keyframes rotate { - 100% { - transform: rotate(360deg); - } -} - -@keyframes prixClipFix { - 0% { - clip-path: polygon(50% 50%, 0 0, 0 0, 0 0, 0 0, 0 0); - } - 25% { - clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 0, 100% 0, 100% 0); - } - 50% { - clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 100% 100%, 100% 100%); - } - 75% { - clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 100%); - } - 100% { - clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 0); - } -} diff --git a/front/v2/src/styles/loaders/_paper-plane-loader.scss b/front/v2/src/styles/loaders/_paper-plane-loader.scss deleted file mode 100644 index 491feb5..0000000 --- a/front/v2/src/styles/loaders/_paper-plane-loader.scss +++ /dev/null @@ -1,110 +0,0 @@ -.paper-plane { - display: flex; - justify-content: center; - align-items: center; - height: 100%; - position: relative; - margin-top: -10px; - transform: translate(0, 0); -} - -.trail { - width: 20px; - height: 8px; - border-radius: 20px; - position: absolute; - background-color: #fffef6; - transform: rotate(-45deg) translate(-60px, 20px); -} - -.paper-plane::before { - content: ""; - width: 35px; - height: 8px; - border-radius: 20px; - background-color: #fffef6; - position: absolute; - transform: rotate(-45deg) translate(-35px, 40px); -} - -.paper-plane::after { - content: ""; - width: 30px; - height: 8px; - border-radius: 20px; - background-color: #fffef6; - position: absolute; - transform: rotate(-45deg) translate(-55px, -5px); -} - -.paper-plane { - animation: plane 3s 0s ease-in-out infinite; -} - -.paper-plane.end { - animation: go 2s 0s ease-in-out forwards; -} - -.trail, -.paper-plane::before, -.paper-plane::after { - animation: trail 3s 0s ease-in-out infinite; -} - -@keyframes plane { - 0% { - transform: translate(0, 0); - } - 25% { - transform: translate(-10px, 15px); - } - 50% { - transform: translate(5px, -15px); - } - 75% { - transform: translate(10px, -15px); - } - 100% { - transform: translate(0, 0); - } -} - -@keyframes trail { - 0% { - opacity: 0.8; - scale: 1; - } - 50% { - opacity: 0.2; - scale: 1.1; - } - 100% { - opacity: 0.8; - scale: 1; - } -} - -@keyframes go { - 0% { - transform: translate(0, 0); - } - 25% { - transform: translate(-5%, 10%); - } - 60% { - opacity: 1; - transform: translate(50%, -100%); - } - 75% { - opacity: 0; - transform: translate(-100%, -100%); - } - 80% { - opacity: 0; - transform: translate(-25%, 50%); - } - 100% { - opacity: 1; - transform: translate(0, 0); - } -} diff --git a/front/v2/src/styles/themes/_dark.scss b/front/v2/src/styles/themes/_dark.scss deleted file mode 100644 index 6bd3b19..0000000 --- a/front/v2/src/styles/themes/_dark.scss +++ /dev/null @@ -1,18 +0,0 @@ -/** Dark theme variables **/ -$principal-background: #223a5e; // Azul marino (oscurecido) -$principal-text-color: #f5f3e7; // Arena claro -$secondary-text-color: #a1a1aa; // Gris pizarra -$principal-color: #3a6351; // Verde bosque -$accent-color: #d4af37; // Dorado suave -$border-color: #27272a; // Gris oscuro -$shadow-color: rgba(245, 243, 231, 0.07); -$surface-color: #181a1b; // Fondo oscuro -$warning-color: #ff9800; - -.dark-theme { - --background: $principal-background; - --text-color: $principal-text-color; - --border-color: $border-color; - --shadow-color: $shadow-color; - --surface-color: $surface-color; -} diff --git a/front/v2/src/styles/themes/_light.scss b/front/v2/src/styles/themes/_light.scss deleted file mode 100644 index ee121f1..0000000 --- a/front/v2/src/styles/themes/_light.scss +++ /dev/null @@ -1,18 +0,0 @@ -/** Light theme variables **/ -$principal-background: #f5f3e7; // Arena claro -$principal-text-color: #223a5e; // Azul marino -$secondary-text-color: #3a6351; // Verde bosque -$principal-color: #223a5e; // Azul marino -$accent-color: #d4af37; // Dorado suave -$border-color: #e5e7eb; // Gris claro -$shadow-color: rgba(34, 39, 42, 0.07); -$surface-color: #f7f7f8; // Blanco humo -$warning-color: #ff9800; - -.light-theme { - --background: $principal-background; - --text-color: $principal-text-color; - --border-color: $border-color; - --shadow-color: $shadow-color; - --surface-color: $surface-color; -} diff --git a/front/v2/src/styles/themes/dark.scss b/front/v2/src/styles/themes/dark.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/styles/themes/light.scss b/front/v2/src/styles/themes/light.scss deleted file mode 100644 index e69de29..0000000 diff --git a/front/v2/src/utils/paginator.ts b/front/v2/src/utils/paginator.ts deleted file mode 100644 index 18982d2..0000000 --- a/front/v2/src/utils/paginator.ts +++ /dev/null @@ -1,83 +0,0 @@ -import axios from 'axios'; - -type paginatorArgs = { - url: string; - maxItemPerPage?: number; - params?: Record; - headers?: Record; -}; - -export class paginator { - constructor({ - url, - maxItemPerPage = 20, - params = {}, - headers = {}, - }: paginatorArgs) { - this.url = url; - this.maxItemPerPage = maxItemPerPage; - this.params = params; - this.headers = headers; - } - - private url: string; - private maxItemPerPage: number; - private headers: Record; - private params: Record = {}; - - private page: number = 1; - private totalItems: number = 20; - private isLoading: boolean = false; - private alreadyLoadedPages: Record = {}; - - get totalPages(): number { - return Math.ceil(this.totalItems / this.maxItemPerPage); - } - - get hasNextPage(): boolean { - return this.page <= this.totalPages; - } - - public async getPage(number: number): Promise { - if (number < 1) { - return this.alreadyLoadedPages[1] || null; - } - if (number > this.totalPages) { - if (this.hasNextPage) { - this.loadNextPage(); - return this.alreadyLoadedPages[number] || null; - } - return this.alreadyLoadedPages[this.totalPages] || null; - } - return this.alreadyLoadedPages[number] || null; - } - - public async loadNextPage(): Promise { - if (this.isLoading || !this.hasNextPage) return null; - - this.isLoading = true; - - try { - const response = await axios.get(this.url, { - params: { - page: this.page, - limit: this.maxItemPerPage, - ...this.params, - }, - headers: this.headers, - }); - this.totalItems = response.headers['x-total-count'] - ? parseInt(response.headers['x-total-count'], 10) - : 0; - const data = response.data as T[]; - this.alreadyLoadedPages[this.page] = data; - this.page++; - return data; - } catch (error) { - console.error('Error loading photos:', error); - } finally { - this.isLoading = false; - } - return null; - } -} diff --git a/front/v2/src/utils/svg-button/svg-button.html b/front/v2/src/utils/svg-button/svg-button.html deleted file mode 100644 index 391de74..0000000 --- a/front/v2/src/utils/svg-button/svg-button.html +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/front/v2/src/utils/svg-button/svg-button.scss b/front/v2/src/utils/svg-button/svg-button.scss deleted file mode 100644 index ae13942..0000000 --- a/front/v2/src/utils/svg-button/svg-button.scss +++ /dev/null @@ -1,81 +0,0 @@ -@use "../../styles/buttons" as *; -@use "../../styles/variables" as *; - -button { - font-size: larger; - background: $primary-white; - border: 2px solid $standard-button-border; - color: $standard-button-icon; - border-radius: $standard-button-border-radius; - overflow: hidden; - cursor: pointer; - transition: all 0.3s ease; - height: 3.2rem; - min-width: 3.2rem; - width: 100%; - margin: 0; - padding: 0; - flex-shrink: 1; - display: flex; - flex-wrap: nowrap; - align-items: center; - align-content: center; - justify-content: space-evenly; - &:disabled { - $disabled-color: rgba( - $color: #999999, - $alpha: 0.45, - ); - color: $primary-white !important; - background-color: $disabled-color !important; - border-color: $disabled-color !important; - &:hover { - transform: scale(1); - box-shadow: none; - } - } - - label { - text-align: center; - flex-grow: 1; - } - - // .button-text-left { - // margin-right: 1rem; - // margin-left: 1rem; - // } - // .button-text-right { - // margin-right: 1rem; - // margin-left: 1rem; - // } - - &:hover { - color: $standard-button-hovered; - transform: scale(1.07); - box-shadow: 0 6px 16px rgba(42, 41, 38, 0.1); - } - - &:disabled { - background: $primary-white; - color: $text-muted; - } - - svg-loader { - box-sizing: border-box; - pointer-events: none; - display: block; - height: 80%; - width: 80%; - margin: 0; - padding: 0; - } - - &:hover { - svg-loader { - fill: $primary-white; - } - label { - color: $primary-white; - } - } -} diff --git a/front/v2/src/utils/svg-button/svg-button.ts b/front/v2/src/utils/svg-button/svg-button.ts deleted file mode 100644 index b33596c..0000000 --- a/front/v2/src/utils/svg-button/svg-button.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; -import { SvgLoader } from '../svg/svg'; -import { RouterLink } from '@angular/router'; - -@Component({ - selector: 'svg-button', - imports: [SvgLoader, RouterLink], - templateUrl: './svg-button.html', - styleUrl: './svg-button.scss', -}) -export class SvgButton implements OnInit { - @Input({ required: true }) label: string = ''; - @Input() type: 'button' | 'reset' | 'submit' = 'button'; - @Input() disabled: boolean = false; - @Input() icon: string | null = null; - @Input() iconPosition: 'left' | 'right' = 'left'; - @Input() tooltip: string = ''; - @Input() ariaLabel: string = ''; - @Input() ngClass: string = ''; - @Input() text: string | null = null; - @Input() routerLink: string | null = null; - - ngOnInit() { - this.ngClass = this.ngClass ? `${this.ngClass}` : ``; - if (this.tooltip === '') { - this.tooltip = this.label; - } - this.icon = this.icon?.replace(/.*\/assets\//, 'assets/') ?? null; - } -} diff --git a/front/v2/src/utils/svg/svg.ts b/front/v2/src/utils/svg/svg.ts deleted file mode 100644 index 2785cf0..0000000 --- a/front/v2/src/utils/svg/svg.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Component, Input, OnInit, ViewChild, ElementRef } from '@angular/core'; - -@Component({ - selector: 'svg-loader', - template: ``, -}) -export class SvgLoader implements OnInit { - @Input() - path: string = ''; - - static elementCache: { [key: string]: HTMLElement } = {}; - - @ViewChild('svgContainer', { static: true }) - svgContainer!: ElementRef; - - ngOnInit() { - if (this.path) { - if (SvgLoader.elementCache[this.path]) { - this.svgContainer.nativeElement.outerHTML = - SvgLoader.elementCache[this.path].outerHTML; - return; - } - - fetch(this.path) - .then((response) => response.text()) - .then((data) => { - const parser = new DOMParser(); - const svgDoc = parser.parseFromString(data, 'image/svg+xml'); - svgDoc.documentElement.removeAttribute('height'); - svgDoc.documentElement.removeAttribute('width'); - svgDoc.documentElement.style.width = '100%'; - svgDoc.documentElement.style.height = '100%'; - - this.svgContainer.nativeElement.outerHTML = - svgDoc.documentElement.outerHTML; - - SvgLoader.elementCache[this.path] = svgDoc.documentElement; - }); - } - } -} diff --git a/front/v2/src/utils/validators/distinctEmailPasswordValidator.ts b/front/v2/src/utils/validators/distinctEmailPasswordValidator.ts deleted file mode 100644 index 799c447..0000000 --- a/front/v2/src/utils/validators/distinctEmailPasswordValidator.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { AbstractControl, ValidationErrors } from '@angular/forms'; - -// Normalización fuerte: pasa a minúsculas, sin acentos ni caracteres especiales -function normalize(str: string): string { - return str - .toLocaleLowerCase() - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') // elimina acentos - .replace(/[^a-z0-9]/g, ''); // elimina todo lo que no sea letra o número -} - -// Para cada letra con equivalentes leet, crea una variante para cada sustitución posible -// por ejemplo: -// "hola" podría convertirse en "h0l@", "h0l4" -// "aaaa" podría convertirse en "4aaa", "@aaa", "a4aa", "a@aa", "aa4a", "aa@a", "aaa4", "aaa@" -// "ala" podría convertirse en "4la", "@la", "a1a", "a!a", "a|a", "a7a", "41a", "4!a", "4|a", "47a", "a7a", "@1a", "@!a", "@|a", "@7a", "a14", "a!4", "a|4", "a74", "414", "4!4", "4|4", "474", "a74", "@14", "@!4", "@|4", "@74", "a1@", "a!@", "a|@", "a7@", "41@", "4!@", "4|@", "47@", "a7@", "@1@", "@!@", "@|@", "@7@" -function leetVariants(str: string): string[] { - const patterns: { [key: string]: (string | RegExp)[] } = { - a: ['4', '@'], - b: ['8', '|3'], - c: ['(', '{', '['], - d: ['|)', '|}', '|]'], - e: ['3'], - f: ['|='], - g: ['6', '9'], - h: ['#'], - i: ['1', '!', '|'], - j: ['_|', '_|_'], - k: ['|<', '|{'], - l: ['1', '|', '!', '7'], - m: ['|/|', '|V|', '|/|\\'], - o: ['0'], - p: ['|o', '|0', '|O'], - q: ['9', '0'], - r: ['|2', '|?'], - s: ['5', '$'], - t: ['7'], - u: ['|_|', '(_)', '(_)'], - v: ['/'], - x: ['%'], - y: ['¥'], - z: ['2', '7'], - }; - const variants = [str]; - - // Genera todas las combinaciones posibles de sustituciones leet - function generateLeetCombinations( - str: string, - patterns: { [key: string]: (string | RegExp)[] } - ): string[] { - const chars = str.split(''); - const options: string[][] = chars.map((char) => { - const subs = patterns[char]; - return subs ? [char, ...subs.map((s) => s as string)] : [char]; - }); - - // Genera el producto cartesiano de las opciones - function cartesian(arr: string[][]): string[] { - return arr.reduce( - (acc, curr) => acc.flatMap((a) => curr.map((c) => a + c)), - [''] - ); - } - - return cartesian(options).filter((v) => v !== str); // Excluye el original (ya está en variants) - } - - variants.push(...generateLeetCombinations(str, patterns)); - return [...new Set(variants)]; -} - -function emailPasswordDistinctValidator( - control: AbstractControl -): ValidationErrors | null { - const emailControl = control.get('email'); - const passwordControl = control.get('password'); - if (emailControl?.invalid || passwordControl?.invalid) { - return null; // Si alguno de los campos es inválido, no validamos - } - const email = emailControl?.value || ''; - const password = passwordControl?.value || ''; - if (!email || !password) return null; - - // Parte local y dominio principal - const [local, domainAll] = email.split('@'); - const domain = (domainAll || '').split('.')[0]; - - const localNorm = normalize(local || ''); - const domainNorm = normalize(domain || ''); - const pwdNorm = normalize(password); - - // Genera variantes leet del email local y dominio - const toCheck = [ - localNorm, - ...leetVariants(localNorm), - domainNorm, - ...leetVariants(domainNorm), - ]; - - // Si cualquier variante está incluida en la contraseña, no es válido - const isWeak = toCheck.some( - (variant) => variant.length > 2 && pwdNorm.includes(variant) - ); - - if (isWeak) { - return { passwordContainsEmailOrLeet: true }; - } - - return null; -} - -export { emailPasswordDistinctValidator, normalize, leetVariants }; diff --git a/front/v2/src/utils/validators/emailValidator.ts b/front/v2/src/utils/validators/emailValidator.ts deleted file mode 100644 index 98c1c17..0000000 --- a/front/v2/src/utils/validators/emailValidator.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; - -const EMAIL_REGEX: RegExp = /^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{1,}$/; - -function emailValidator(control: AbstractControl): ValidationErrors | null { - const email = control.value; - return email && !EMAIL_REGEX.test(email) ? { invalidEmail: true } : null; -} - -export { EMAIL_REGEX, emailValidator }; diff --git a/front/v2/src/utils/validators/passwordValidator.ts b/front/v2/src/utils/validators/passwordValidator.ts deleted file mode 100644 index 964835a..0000000 --- a/front/v2/src/utils/validators/passwordValidator.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; - -const PASSWORD_REGEX: RegExp = - /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9])[\s\S]{8,}$/; - -function PasswordValidator(control: AbstractControl): ValidationErrors | null { - const password = control.value; - return password && !PASSWORD_REGEX.test(password) - ? { invalidPassword: true } - : null; -} - -export { PASSWORD_REGEX, PasswordValidator }; diff --git a/front/v2/tsconfig.app.json b/front/v2/tsconfig.app.json deleted file mode 100644 index 264f459..0000000 --- a/front/v2/tsconfig.app.json +++ /dev/null @@ -1,15 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "src/**/*.spec.ts" - ] -} diff --git a/front/v2/tsconfig.json b/front/v2/tsconfig.json deleted file mode 100644 index e4955f2..0000000 --- a/front/v2/tsconfig.json +++ /dev/null @@ -1,34 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "compileOnSave": false, - "compilerOptions": { - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "skipLibCheck": true, - "isolatedModules": true, - "experimentalDecorators": true, - "importHelpers": true, - "target": "ES2022", - "module": "preserve" - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "typeCheckHostBindings": true, - "strictTemplates": true - }, - "files": [], - "references": [ - { - "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.spec.json" - } - ] -} diff --git a/front/v2/tsconfig.spec.json b/front/v2/tsconfig.spec.json deleted file mode 100644 index 04df34c..0000000 --- a/front/v2/tsconfig.spec.json +++ /dev/null @@ -1,14 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/spec", - "types": [ - "jasmine" - ] - }, - "include": [ - "src/**/*.ts" - ] -} diff --git a/pruebas/login-form-icons-readme.txt b/pruebas/login-form-icons-readme.txt deleted file mode 100644 index e69de29..0000000 diff --git a/pruebas/login-form.css b/pruebas/login-form.css deleted file mode 100644 index e69de29..0000000 diff --git a/pruebas/login-form.html b/pruebas/login-form.html deleted file mode 100644 index 0ca162d..0000000 --- a/pruebas/login-form.html +++ /dev/null @@ -1,234 +0,0 @@ - - - From 55e7e000a909fe6cf8ecd2e13b38c86b5e0d8072 Mon Sep 17 00:00:00 2001 From: Manuel Date: Thu, 28 Aug 2025 18:26:28 +0200 Subject: [PATCH 03/11] =?UTF-8?q?a=C3=B1ade=20primeras=20documentaciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/acta-constitucion.md | 57 ++++++++++++++++++ docs/analisis-funcional.md | 0 docs/analisis-tecnico.md | 0 docs/cronograma.md | 0 docs/index.md | 0 docs/introduccion.md | 102 ++++++++++++++++++++++++++++++++- docs/manual-usuario.md | 0 docs/plan-proyecto.md | 0 docs/pruebas.md | 0 docs/requisitos-funcionales.md | 4 ++ docs/requisitos.md | 0 11 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 docs/acta-constitucion.md delete mode 100644 docs/analisis-funcional.md delete mode 100644 docs/analisis-tecnico.md delete mode 100644 docs/cronograma.md delete mode 100644 docs/index.md delete mode 100644 docs/manual-usuario.md delete mode 100644 docs/plan-proyecto.md delete mode 100644 docs/pruebas.md create mode 100644 docs/requisitos-funcionales.md delete mode 100644 docs/requisitos.md diff --git a/docs/acta-constitucion.md b/docs/acta-constitucion.md new file mode 100644 index 0000000..70586cf --- /dev/null +++ b/docs/acta-constitucion.md @@ -0,0 +1,57 @@ +# Galerías Fotográficas - Acta de Constitución + +--- + +## Propósito + +Crear una plataforma web que permita a fotógrafos profesionales almacenar, distribuir y colaborar con sus clientes en la gestión de imágenes digitales de manera eficiente y segura. + +## Objetivos + +1. Facilitar el almacenamiento y la organización de imágenes digitales. +2. Mejorar la comunicación y colaboración entre fotógrafos y clientes. +3. Proporcionar herramientas para la retroalimentación y revisión de imágenes. +4. Ofrecer una experiencia de usuario intuitiva y accesible. +5. Ofrecer una solución integral que unifique todos los aspectos de la gestión de imágenes digitales. +6. Ofrecer un portfolio público para atraer nuevos clientes. + +## Alcance + +Funcionalidades incluidas: + +- Subida y almacenamiento de imágenes. +- Visualización y descarga de imágenes en diferentes tamaños y resoluciones. +- Etiquetado y clasificación manual de imágenes. +- Creación y gestión de colecciones de imágenes. +- Creación y gestión de eventos temporales asociados a colecciones. +- Compra de sesiones por parte de clientes. +- Compra de imágenes individuales o colecciones. +- Generación de portfolio para el profesional. +- Gestión de usuarios con diferentes roles (anónimo, cliente, profesional, administrador). +- Sistema de feedback y comentarios en imágenes, colecciones, sesiones y portfolio general. + +Funcionalidades excluidas o relegadas a futuro: + +- Generación de títulos y descripciones automáticas para imágenes. +- Etiquetado y clasificación automática de imágenes. +- Integración con redes sociales para compartir imágenes. +- Edición avanzada de imágenes dentro de la plataforma. +- Soporte para videos y otros formatos multimedia. +- Integración con servicios de impresión y productos físicos. +- Funcionalidades de inteligencia artificial para la mejora automática de imágenes. +- Soporte para múltiples idiomas y localización. +- Integración con herramientas de marketing y análisis de datos. +- Funcionalidades de automatización de flujos de trabajo. +- Soporte para la gestión de derechos de autor y licencias de imágenes. + +## Interesados + +- Fotógrafos profesionales y empresas de imagen + +## Restricciones y limitaciones + +- Todas las imágenes vistas en la web tendrán una resolución máxima de 1080p. +- No se permitirá la descarga de imágenes en alta resolución sin comprarla. +- No se generarán rutas para las imágenes. +- Solo se permitirá la subida de imágenes en formatos JPEG, JPG y PNG. +- No se permitirá comprar a usuarios no autenticados. diff --git a/docs/analisis-funcional.md b/docs/analisis-funcional.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/analisis-tecnico.md b/docs/analisis-tecnico.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/cronograma.md b/docs/cronograma.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/introduccion.md b/docs/introduccion.md index e584c2c..abc6f6c 100644 --- a/docs/introduccion.md +++ b/docs/introduccion.md @@ -53,4 +53,104 @@ El cliente no quiere recibir las imágenes en un zip o tener que descargarlas de ### Trabajo colaborativo -El profesional quiere que el cliente escoja la imagen que más el guste y le ayude a +El profesional quiere que el cliente escoja la imagen que más el guste y le de feedback sobre el retoque y la edición de la imágen. +El cliente queire revisar el trabajo del profesional para escoger las imágenes que más le gusten. + +### Feedback + +El cliente puede dar feedback mediante comentarios en cada imágen como votando la imagen. +La nota asignada a cada imágen se determinará como: (votos positivos - votos negativos) / votos totales +Los comentarios se puntuarán de la misma forma. +El profesional podrá responder a los comentarios y los leerá de forma que el comentario con mejor puntuación quede el primero, en su defecto se ordenarán por fecha. + +El feedback también podrá ser dado a imágenes y colecciones del portfolio público, solamente lo podrán hacer los clientes autenticados. Aquellos que adquieran una sesión podrán dejar feedback al profesional de forma pública. + +### Portfolio + +El profesional no quiere gastar en otro servicio más para alojar el protfolio. +El profesional quiere subir las imágenes al servicio y escoger cuales van a conformar el portfolio. +El profesional quiere que la primera ojeada que tenga el cliente sobre el servicio sea el portfolio. + +### Colecciones + +El profesional quiere organizar las imágenes por fecha, personas que salen en ellas, categorías, eventos... +El profesional quiere poder reunir imágenes que se relacionen entre sí por categoría, evento, fechas, motivos... +El profesional quiere juntar todas las imágenes que van destinadas a un cliente. + +### Sesiones + +El profesional hará varias imágenes que revisará con el cliente. +El cliente escogerá únicamente las mejoras y que más le gusten. +El profesional revisará esas imágenes, con un límite numérico de imágenes totales. +El cliente recibirá una colección de esas imágenes. +Múltiples clientes y profesionales podrán trabajar en una única sesión. +Durante el proceso, debe existir una colaboración mutua mediante feedback. + +### Multiples clientes + +El profesional quiere poder trabajar sobre un proyecto y poder enviar el resultado del proyecto a multiples clientes. + +### Venta del servicio + +El profesional quiere cobrar una imágen única, una o varias colecciones, o una sesión. +Un cliente pagará por una imágen, una o diversas colección premaquetadas, y por una sesión. +Muchos clientes podrán pagar conjuntamente el servicio. + +### Usuarios + +Existirán 4 tipos de usuarios: + +- Anonimo +- Cliente +- Profesional +- Administrador + +El usuario anónimo podrá consultar el portfolio y ver los diferentes botones y enlaces para ver el resto de imágenes públicas, redes sociales, blog o identificarse. + +El cliente, o usuario identificado, podrá hacer lo mismo que el anónimo. También podrá comprar las diferentes imágenes y colecciones disponibles. Además, podrá contratar una sesión, interactuar con la sesión que tenga activa dando feedback o escogiendo las imágenes; y consultar pedidos anteriores para descargar las imágenes, publicarlas en redes sociales o compartirlas de forma directa con otros clientes identificados. + +El profesional, podrá editar las imágenes y colecciones públicas que haya en el portfolio; organizar nuevas sesiones, editar las sesiones en marcha y actualizarlas; crear y editar nuevas colecciones; crear y editar eventos y categorías. + +El administrador, podrá hacer lo mismo que el profesional y además podrá añadir profesionales y editar aspectos clave de la web. + +Para facilitar el registro y el inicio de sesión, los usuarios podrán iniciar sesión con Google, Microsoft, Meta y Apple. Además, contarán con la opción de usar correo y contraseña. Para ello nos adaptaremos a OpenId y OAuth 2. +Todos los usuarios tendrán un método MFA como sms o passkeys. +Aquellos usuarios que inicien sesión con contraseña, recibirán un magic link para entrar. + +### Conexiones lentas + +Todas las imágenes subidas se procesarán en 3 categorías: + +- Baja resolución: 360p, comprimidas en WebP +- Media resolución: 720p, comprimidas en WebP +- Resolución Nativa: nativa, sin compresión + +### Pagos + +Se establecerá como recomendación el uso de linkpay o servicios como google wallet. + +--- + +## Tecnologías a usar + +Back: +JWT, OpenId + OAuth 2 -> Duende Identity Server +DDD con CQRS -> MediatR +Entity Framework Core + sqlite -> Base de datos +AutoMapper -> Mapeo de objetos +Serilog + OpenTelemetry -> Logging y trazabilidad +Scalar + OpenApi -> Documentación y pruebas de API +FluentValidation -> Validación de modelos +Redis -> Almacenamiento en caché +mailkit -> Envío de correos electrónicos +ImageSharp -> Procesamiento de imágenes + +Front: +TailwindCSS -> Estilos +Angular -> Framework +RxJS -> Programación reactiva +NgRx -> Manejo del estado +scss -> Preprocesador CSS +axios -> Cliente HTTP +Vite -> Bundler +Typescript -> Lenguaje diff --git a/docs/manual-usuario.md b/docs/manual-usuario.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/plan-proyecto.md b/docs/plan-proyecto.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/pruebas.md b/docs/pruebas.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/requisitos-funcionales.md b/docs/requisitos-funcionales.md new file mode 100644 index 0000000..8d1d83d --- /dev/null +++ b/docs/requisitos-funcionales.md @@ -0,0 +1,4 @@ +# Galerías Fotográficas - Requisitos funcionales + +--- + diff --git a/docs/requisitos.md b/docs/requisitos.md deleted file mode 100644 index e69de29..0000000 From 585eca042021bdec6c06f4f0e4f435511da06cab Mon Sep 17 00:00:00 2001 From: Manuel Date: Thu, 28 Aug 2025 19:36:16 +0200 Subject: [PATCH 04/11] docu --- docs/acta-constitucion.md | 4 + docs/requisitos-funcionales.md | 141 +++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) diff --git a/docs/acta-constitucion.md b/docs/acta-constitucion.md index 70586cf..8368611 100644 --- a/docs/acta-constitucion.md +++ b/docs/acta-constitucion.md @@ -29,6 +29,7 @@ Funcionalidades incluidas: - Generación de portfolio para el profesional. - Gestión de usuarios con diferentes roles (anónimo, cliente, profesional, administrador). - Sistema de feedback y comentarios en imágenes, colecciones, sesiones y portfolio general. +- Compresión de imágenes para optimizar su almacenamiento y distribución. Funcionalidades excluidas o relegadas a futuro: @@ -43,6 +44,9 @@ Funcionalidades excluidas o relegadas a futuro: - Integración con herramientas de marketing y análisis de datos. - Funcionalidades de automatización de flujos de trabajo. - Soporte para la gestión de derechos de autor y licencias de imágenes. +- Integración con servicios de terceros para la importación de las colecciones compradas por el usuario. +- Uso de CDNs para la distribución de imágenes. +- Uso de la nube para almacenar las imágenes. ## Interesados diff --git a/docs/requisitos-funcionales.md b/docs/requisitos-funcionales.md index 8d1d83d..31908b4 100644 --- a/docs/requisitos-funcionales.md +++ b/docs/requisitos-funcionales.md @@ -2,3 +2,144 @@ --- +## Gestión de usuarios (4 tipos: anónimo, cliente, profesional, administrador) + +Existirán 4 tipos de usuarios: + +- Anonimo +- Cliente +- Profesional +- Administrador + +Todos los tipos parten de la base de anónimo, es decir, que un usuario anónimo podrá convertirse en cliente, profesional o administrador a través de un proceso de registro y autenticación y conservará los permisos básicos del anónimo. + +### Anónimo + +Podrá consultar el portfolio y ver los enlaces y botones de la página principal y navegar por ella para ver las imágenes públicas, los últimos eventos realizados a modo de blog, las redes sociales del profesional e identificarse como cliente registrado. + +Para registrarse, necesitará correo electrónico, nombre y apellidos, y una contraseña. En su defecto podrá registrarse usando un proveedor de identidad (Google, Microsoft, Meta o Apple). Adaptaremos a OpenId y OAuth 2. +A todos los usuarios se les recomendará habilitar la autenticación de dos factores para mejorar la seguridad de sus cuentas. Aquellos que no la habilitén serán forzados a usar magic links (se les enviará un enlace de acceso por correo electrónico). + +### Cliente + +Podrá puntuar imágenes, colecciones, sesiones o el portfolio. +También podrá dejar comentarios que justifiquen su puntuación. + +Podrá comprar imágenes individuales o colecciones. También podrá contratar una sesión fotográfica. + +Si contrata una sesión tendrá que seleccionar las imágenes que desea incluir en la sesión y proporcionar feedback sobre el avance de la misma. + +Podrá acceder a un historico de sus compras y sesiones para descargarse las imágenes y compartirlas con otros clientes. + +### Profesional + +Podrá editar el panel principal del portfolio, añadiendo, organizando y eliminando imágenes. +Podrá editar las subsecciones del portfolio añadiendo, organizando y eliminando categorias y colecciones. +Podrá editar la información asociada a una imágen, como el título, la descripción, las etiquetas, el evento en la que se tomó, si se debe ocultar al público, a que collección pertenece o si pertenece a una sesión. +Podrá crear y editar las colecciones y eventos, modificando fechas, títulos, descripciones, visibilidad y otros metadatos. +Podrá crear y editar las sesiones, añadiendo y eliminando clientes, imágenes, fechas, descripciones y otros metadatos. + +### Administrador + +Podrá añadir, editar y eliminar profesionales. +También moderará el contenido generado por los usuarios. +Será responsable de la gestión de la plataforma y de la atención al cliente. + +## Sistema de almacenamiento + +Solo se permitirán subir imágenes en formato JPEG, JPG y PNG. + +Las imágenes se subirán sin compresión, manteniendo su calidad original. + +Al momento de subirlas, se crearán 3 copias. +La copia 1, se almacenará en 360p en formato Webp. Se usará a modo de vista previa o thumbnail de la imágen original, actuará de proxy. Se llamará `low-res-proxy-`. +La copia 2, se almacenará en 720p en formato Webp. Se usará a modo de detalle o ampliación en las visualizaciones desde pantallas superiores a 720p. Se llamará `mid-res-proxy-`. +La copia 3, se almacenará en 1080p en formato Webp. Se usará a modo de detalle o ampliación en las visualizaciones desde pantallas superiores a 1080p. Se llamará `high-res-proxy-`. +La imagen original se almacenará en su formato original, sin pérdidas. Solo será visible desde las galerías o colecciones a las que pertenezca y solo cuando se descargue por un cliente que haya pagado por ella. Se llamará `original-`. + +## Distribución a clientes + +Las imágenes se servirán de forma diferida o lazy-loading. +El profesional creará una colección, añadirá las imágenes que la compongan, y añadirá a los usuarios que tengan acceso a ella. +Los usuarios podrán ver y comentar las imágenes de la colección que les haya sido compartida. +Los usuarios podrán ver colecciones que estén marcadas como públicas o a las que hayan sido invitados. +Los usuarios podrán compartir las colecciones que les hayan sido asignadas pero no podrán compartir las imágenes de esas colecciones fuera de la plataforma. + +## Funcionalidades de trabajo colaborativo + +El profesional creará una sesión fotográfica, añadirá las imágenes que la compongan, y añadirá a los usuarios que tengan acceso a ella. +Los clientes podrá votar y comentar las imágenes de la sesión. +El profesional podrá leer y responder a los comentarios de los clientes, que se leerán ordenados según su fecha de creación y votación. +El profesional podrá entonces escoger un número limite de imágenes para actualizar, todas las demás se deshabilitarán y ya no se podrán descargar por parte del cliente. +Las imágenes marcadas se podrán actualizar, subiendo la nueva versión de la imagen. +Se mantendrá un historial de versiones de cada imagen, permitiendo al cliente acceder a versiones anteriores y votar cual quiere conservar y cual quiere descartar. + +## Sistema de feedback y valoraciones + +Los clientes podrán dejar comentarios y valoraciones sobre las imágenes y colecciones que hayan adquirido. +El profesional podrá leer y responder a los comentarios de los clientes. + +Hay 2 tipos de votos: + +- Positivo +- Negativo + +El cómputo total de valoración se hará como: (positivo - negativo) / ( totales ) + +El cliente identificado podrá dejar un comentario, anónimo o no, sobre la imagen, colección o profesional. +Los comentarios se ordenarán descendentemente según su fecha de creación y votación. +Las imágenes en una colección se ordenarán descendentemente según su puntuación. +Los comentarios de una colección se ordenarán descendentemente según su fecha de creación y votación. +Las colecciones se ordenarán manualmente y las votaciones no afectarán su orden. + +## Gestión de portfolio y colecciones + +El portfolio contendrá 2 secciones destacadas: + +1. **Colección principal**: Contendrá la lista de imágenes ordenadas escogidas por el profesional. +2. **Timeline de colecciones**: Contendrá un registro de las colecciones destacadas por el profesional y un enlace al resto de ellas. + +Estas secciones se verán como 2 paneles en la página del portfolio cuando se visauliza en pantallas grandes. +En pantallas pequeñas, se visualizará únicamente la colección principal. + +Un profesional podrá crear y gestionar el portfolio de su página principal. +Podrá añadir, organizar y eliminar imágenes en el portfolio. +Podrá añadir, organizar y eliminar colecciones en el portfolio. + +La sección de colección principal: + +- El profesional podrá añadir hasta un número límite de imágenes. +- Podrá cambiar el orden y tamaño de las tarjetas de cada imagen, haciendo uso de un sistema de arrastrar y soltar (drag-and-drop) para reorganizarlas. +- Podrá eliminar imágenes de la colección principal. + +* Cada imagen se visualizará en una tarjeta de dimensiones variables, sin datos asociados. Y al hacerle click, se expandirá para verla a mayor tamaño, solo en dispositivos de resolución mayor a 720p. Todas las colecciones compartirán el mismo diseño de tarjeta. + +La sección de timeline de colecciones: + +- El profesional podrá añadir hasta un número límite de colecciones. +- Podrá cambiar el orden las colecciones que aparecen. +- Podrá eliminar colecciones del timeline. + +* Cada colección se visualizará con su imagen destacada, título, descripción y fecha. + +Al final del portfolio se incluirá una sección de comentarios y votaciones al portfolio. +Los clientes podrán dejar comentarios y valoraciones sobre el portfolio. +El profesional podrá leer y responder a los comentarios de los clientes. + +## Sistema de sesiones fotográficas + +Una sesión es una colección de imágenes que no se pueden descargar por parte del cliente hasta finalizar la sesión. +Todas las imágenes de la sesión tendrán una valoración inicial de 0, y una lista de comentarios vacia. +El profesional puede versionar las imágenes de la sesión. +El cliente puede votar las imágenes de la sesión. +Para cerrar una sesión y finalizarla, el cliente tiene que haber escogido al menos una imagen hasta un número máximo definido por el profesional. +Una vez finalizada la sesión, el cliente podrá descargar todas las imágenes de la sesión que haya seleccionado, todas las demás se eliminarán. + +## Funcionalidades de venta y pagos + +Todas las imágenes se pueden comprar y descargar. +Todas las colecciones se pueden comprar y descargar. +Todos los clientes puede reservar una sesión. + +Para los pagos se usará google pay o linkpay o stripe. +Se intentará ofrecer una experiencia de pago fluida y segura para los clientes. \ No newline at end of file From cbcf1f245b5aab9d5772428f7a86f3848c0b050a Mon Sep 17 00:00:00 2001 From: Manuel Date: Thu, 28 Aug 2025 23:41:06 +0200 Subject: [PATCH 05/11] docu --- docs/analisis-tecnico.md | 142 +++++++++++++++++ docs/casos-uso.md | 275 ++++++++++++++++++++++++++++++++ docs/decisiones-arquitectura.md | 40 +++++ docs/documentacion-api.md | 11 ++ docs/guia-estilo.md | 9 ++ docs/manual-usuario.md | 7 + docs/plan-desarrollo.md | 11 ++ docs/plan-testing.md | 9 ++ docs/requisitos-funcionales.md | 2 +- 9 files changed, 505 insertions(+), 1 deletion(-) create mode 100644 docs/analisis-tecnico.md create mode 100644 docs/casos-uso.md create mode 100644 docs/decisiones-arquitectura.md create mode 100644 docs/documentacion-api.md create mode 100644 docs/guia-estilo.md create mode 100644 docs/manual-usuario.md create mode 100644 docs/plan-desarrollo.md create mode 100644 docs/plan-testing.md diff --git a/docs/analisis-tecnico.md b/docs/analisis-tecnico.md new file mode 100644 index 0000000..eba20df --- /dev/null +++ b/docs/analisis-tecnico.md @@ -0,0 +1,142 @@ +# Galerías Fotográficas - Análisis técnico + +## Arquitectura del sistema + +Queremos hacer un sistema modular, con componentes independientes que se puedan desarrollar, probar e implementar de forma aislada. +Esto permitirá una mayor flexibilidad y escalabilidad en el desarrollo del sistema. + +Queremos abstraer todo lo posible las dependencias entre capas. De tal forma que el frontal y backend puedan intercambiarse con diferentes implementaciones sin afectar al resto del sistema. +Para ello, vamos a hacer el backend database-agnostic, puediendo conectar con diferentes servidores de bases de datos. La responsabilidad de escoger motor de base de datos recaerá sobre el cliente. +Nosotros usaremos Sqlite para desarrollo local y PostgreSQL para producción. + +Para poder desarrollarlo rápidamente y tener una base sobre la que iterar, empezaremos con un monolito modular. +Este monolito quedará estructurado en módulos que puedan migrarse a microservicios en el futuro. +Comandaremos el desarrollo mediante DDD (Domain-Driven Design) y CQRS (Command Query Responsibility Segregation). +Algunos procesos como el procesado de imágenes se harán de forma desacoplada y asíncrona. + +Para el frontal, Angular nos ofrece componentes que usaremos para componer vistas siguiendo una arquitectura MVVM (Model-View-ViewModel). + +Para que el frontend y el backend no dependan entre ellos, vamos a establecer una serie de estándares de comunicación. +Siempre usaremos el estandar HTTP mediante TLS. (HTTPS) +En toda comunicación se preferirá enviar y recibir los datos mediante el body de la petición. + +Toda la información sensible, como contraseñas, se enviará cifrada mediante RSA 256. +Para ello, el cliente generará un thumprint único que incluirá el user-agent y un dato único del navegador mas un UUIDv4; hará una petición HEAD al endpoint `/security/rsa` enviando el thumbprint en el header `XXX-Thumbprint`. +El cliente recibirá una respuesta vacía (204 No Content) con un header `XXX-encryption-key` que se utilizará para cifrar los valores de los campos concretos. +En la siguiente petición, donde se enviarán los datos sensibles, el cliente incluirá `XXX-Thumbprint` en el header. +Al recibir la petición, tendrá que rotar el thumbprint. +Cada thumbprint será válido durante 5 minutos en caso de conexiones lentas. Sin embargo, no se permitirá su reutilización. +En caso de que hubiese un MIM (Man-In-The-Middle) o cualquier otro tipo de atacante tratando de interceptar la comunicación, debe ser capaz de detectar y leer el doble cifrado de HTTPS + thumbprint-rsa. + +De esta forma, todas las peticiones deben cumplir con el siguiente contrato: + +0. Como requisito indispensable, toda la comunicación debe realizarse mediante HTTPS. +1. Todas las peticiones deben incluir un header `XXX-Thumbprint` con el thumbprint actual. +2. Todas las peticiones incluirán un body que sigue el patron `Request`. +3. Las peticiones con datos sensibles, tendrán sus datos cifrados mediante RSA 256. + +El patrón `Request` incluirá un campo con los datos de la petición, otro con el thumprint duplicado y un último campo que indica si tiene datos sensibles o no. +Con una implementación como la que sigue: + +```c# Request.cs +public class Request where T : IDTOSerializable +{ + public T Data { get; set; } + public string Thumbprint { get; set; } + public bool HasSensitiveData { get; set; } +} +``` + +En el caso de errores, seguiremos el estandar Problem Details extendido. +En el caso de respuestas exitosas, las apis responderan mediante el patron `Response`. +Una `Response` estará compuesta por diferentes campos que indicarán el estado de la transacción, el resultado de la transacción, y los posibles errores lógicos pertenecientes a los datos enviados. +De esta forma, garantizamos un contrato como el siguiente: + +```c# Response.cs +public class Response where T : IDTOSerializable +{ + public bool IsSuccess { get; set; } = false; + public T Result { get; set; } + public List? Errors { get; set; } = null; + + public static Response Success(T result) + { + return new Response + { + IsSuccess = true, + Result = result + }; + } + + public static Response Failure(T result, List errors) + { + return new Response + { + IsSuccess = false, + Result = result, + Errors = errors + }; + } +} +``` + +En caso de que los datos enviados al backend provoquen un error lógico, por ejemplo: una imagen que se ha subido no se puede guardar por que ha llegado corrupta; devolveremos una `Response` que contenga un `DataError` como este: + +``````c# +public class DataError +{ + public string Message { get; set; } + public string? Details { get; set; } +} +`````` + +De esta forma, el cliente podrá interpretar los errores y mostrarlos al usuario de forma adecuada. + +La autenticación y autorización se manejarán mediante JWT (JSON Web Tokens) y OAuth 2.0. +Para ello el front atacará al backend para obtener el token de acceso y luego lo incluirá en las cabeceras de las peticiones con este formato `Authorization: Bearer `. +También incluirá el token de refresco en las peticiones que requieran autenticación, con este formato `XXX-Refresh-Token: `. + +## El stack + +### Backend + +Vamos a usar ASP.NET Core como framework principal, junto con Entity Framework Core para la gestión de la base de datos. +Redis se utilizará como caché distribuido para mejorar el rendimiento. +PostgreSQL se utilizará como sistema de gestión de bases de datos relacional. En desarrollo se utilizará SQLite. + +### Frontend + +Vamos a usar Angular como framework principal, junto con TailwindCSS para el diseño y NgRx para la gestión del estado. +Vite como empaquetador y Node.js como entorno de ejecución. +Usaremos RxJS para la programación reactiva. + +## Base de datos: Esquema y relaciones + +## Infraestructura + +Inicialmente se utilizará un enfoque monolítico, pero se diseñará con la posibilidad de escalar a microservicios en el futuro. +El producto final debe poder desplegarse en docker y kubernetes. Para ello usarmos Podman como herramienta para gestionar los contenedores. +Usaremos una caché para resultados intermedios, como el portfolio. + +## Seguridad + +Para mantener seguro el sistema obligaremos el uso de HTTPS en todas las comunicaciones. +Los usuarios deberán autenticarse mediante OAuth 2.0 y OpenID Connect usando JWT (JSON Web Tokens) para la gestión de sesiones. Firmaremos los tokens JWT con una clave secreta almacenada de forma segura. Validaremos la firma siempre. El certificado usado variará cada 24 horas y en cada reinicio. +Los JWT tendrán asociados un Refresh Token que permitirá obtener nuevos tokens de acceso sin necesidad de volver a autenticarse. +Para protegernos contra ataques CSRF (Cross-Site Request Forgery), implementaremos tokens CSRF en todas las solicitudes que modifiquen datos. +Habilitaremos CORS (Cross-Origin Resource Sharing) para permitir que solo dominios específicos puedan acceder a nuestra API. +Implementaremos políticas de contraseñas seguras, incluyendo longitud mínima, complejidad y expiración periódica. +Además, se instará a los usuarios a habilitar la autenticación de dos factores (2FA) para añadir una capa adicional de seguridad. +Todos los usuarios que inicien sesión mediante usuario y contraseña recibirán un correo electrónico de acceso único, con un token de acceso que caducará en 5 minutos. +Para proteger los datos sensibles, como contraseñas y tokens, se utilizará hashing y cifrado. +Implementaremos un sistema de roles y permisos para controlar el acceso a diferentes partes del sistema. + +Para evitar ataques de fuerza bruta y ataques de tiempo, implementaremos 4 políticas: + +- Limitar el número de intentos de inicio de sesión fallidos y bloquear el acceso temporalmente. +- Implementar un sistema de CAPTCHA que aparecerá aleatoriamente en cada intento de inicio de sesión y después de 3 intentos fallidos. +- Monitorear y registrar los intentos de inicio de sesión para detectar patrones sospechosos. +- Retrasar aleatoriamente las respuestas del servidor una cantidad de tiempo variable inferior a los 3 segundos. (Sacrificamos un poco de la experiencia por algo más de seguridad) + +Guardaremos el mínimo número de cookies posibles y evitaremos usar cookies de sesión. +Todas las cookies que usemos serán seguras, HttpOnly y SameSite=Strict. diff --git a/docs/casos-uso.md b/docs/casos-uso.md new file mode 100644 index 0000000..60f8ba3 --- /dev/null +++ b/docs/casos-uso.md @@ -0,0 +1,275 @@ +# Galerías Fotográficas - Casos de Uso + +## Caso de uso 1: Administrador da de alta un nuevo profesional + +1. El administrador accede al sistema. +2. El administrador navega a la sección de gestión de profesionales. +3. El administrador selecciona la opción "Agregar nuevo profesional". +4. El administrador completa el formulario con los datos del nuevo profesional. +5. El administrador envía el formulario. +6. El sistema confirma la creación del nuevo profesional. + +## Caso de uso 2: Administrador crea un portfolio + +1. El administrador accede al sistema. +2. El administrador navega a la sección de gestión de portfolios. +3. El administrador selecciona la opción "Crear nuevo portfolio". +4. El administrador completa el formulario con los datos del nuevo portfolio. +5. El administrador envía el formulario. +6. El sistema confirma la creación del nuevo portfolio. + +## Caso de uso 3: Profesional crea una imagen + +1. El profesional accede al sistema. +2. El profesional navega a la sección de gestión de imágenes. +3. El profesional selecciona la opción "Crear nueva imagen". +4. El profesional completa el formulario con los datos de la nueva imagen. +5. El profesional envía el formulario. +6. El sistema confirma la creación de la nueva imagen. + +## Caso de uso 4: Profesional crea un conjunto de imágenes + +1. El profesional accede al sistema. +2. El profesional navega a la sección de gestión de conjuntos de imágenes. +3. El profesional selecciona la opción "Crear nuevo conjunto de imágenes". +4. El profesional completa el formulario con los datos del nuevo conjunto de imágenes. +5. El profesional envía el formulario. +6. El sistema confirma la creación del nuevo conjunto de imágenes. + +## Caso de uso 5: Profesional crea una colección + +1. El profesional accede al sistema. +2. El profesional navega a la sección de gestión de colecciones. +3. El profesional selecciona la opción "Crear nueva colección". +4. El profesional completa el formulario con los datos de la nueva colección. +5. El profesional envía el formulario. +6. El sistema confirma la creación de la nueva colección. + +## Caso de uso 6: Profesional añade una imagen al portfolio + +1. El profesional accede al sistema. +2. El profesional navega a la sección de gestión de portfolios. +3. El profesional selecciona el portfolio al que desea añadir la imagen. +4. El profesional selecciona la opción "Añadir imagen". +5. El profesional completa el formulario con los datos de la imagen. +6. El profesional envía el formulario. +7. El sistema confirma la adición de la imagen al portfolio. + +## Caso de uso 7: Profesional añade varias imágenes al portfolio + +1. El profesional accede al sistema. +2. El profesional navega a la sección de gestión de portfolios. +3. El profesional selecciona el portfolio al que desea añadir las imágenes. +4. El profesional selecciona la opción "Añadir varias imágenes". +5. El profesional completa el formulario con los datos de las imágenes. +6. El profesional envía el formulario. +7. El sistema confirma la adición de las imágenes al portfolio. + +## Caso de uso 8: Profesional añade una colección al portfolio + +1. El profesional accede al sistema. +2. El profesional navega a la sección de gestión de portfolios. +3. El profesional selecciona el portfolio al que desea añadir la colección. +4. El profesional selecciona la opción "Añadir colección". +5. El profesional completa el formulario con los datos de la colección. +6. El profesional envía el formulario. +7. El sistema confirma la adición de la colección al portfolio. + +## Caso de uso 9: Profesional añade varias colecciones al portfolio + +1. El profesional accede al sistema. +2. El profesional navega a la sección de gestión de portfolios. +3. El profesional selecciona el portfolio al que desea añadir las colecciones. +4. El profesional selecciona la opción "Añadir varias colecciones". +5. El profesional completa el formulario con los datos de las colecciones. +6. El profesional envía el formulario. +7. El sistema confirma la adición de las colecciones al portfolio. + +## Caso de uso 10: Cliente compra una imagen individual + +1. El cliente accede al sistema. +2. El cliente navega a la sección de imágenes. +3. El cliente selecciona la imagen que desea comprar. +4. El cliente añade la imagen al carrito de compras. +5. El cliente procede al pago. +6. El sistema confirma la compra de la imagen. + +## Caso de uso 11: Cliente compra un conjunto de imágenes individuales + +1. El cliente accede al sistema. +2. El cliente navega a la sección de conjuntos de imágenes. +3. El cliente selecciona el conjunto de imágenes que desea comprar. +4. El cliente añade el conjunto de imágenes al carrito de compras. +5. El cliente procede al pago. +6. El sistema confirma la compra del conjunto de imágenes. + +## Caso de uso 12: Cliente compra una colección + +1. El cliente accede al sistema. +2. El cliente navega a la sección de colecciones. +3. El cliente selecciona la colección que desea comprar. +4. El cliente añade la colección al carrito de compras. +5. El cliente procede al pago. +6. El sistema confirma la compra de la colección. + +## Caso de uso 13: Cliente ve en el historial de compras una imagen individual + +1. El cliente accede al sistema. +2. El cliente navega a la sección de historial de compras. +3. El cliente selecciona la imagen individual que desea ver. +4. El sistema muestra los detalles de la imagen individual. + +## Caso de uso 14: Cliente ve en el historial de compras un conjunto de imágenes individuales + +1. El cliente accede al sistema. +2. El cliente navega a la sección de historial de compras. +3. El cliente selecciona el conjunto de imágenes individuales que desea ver. +4. El sistema muestra los detalles del conjunto de imágenes individuales. + +## Caso de uso 15: Cliente ve en el historial de compras una colección + +1. El cliente accede al sistema. +2. El cliente navega a la sección de historial de compras. +3. El cliente selecciona la colección que desea ver. +4. El sistema muestra los detalles de la colección. + +## Caso de uso 16: Cliente contrata una sesión + +1. El cliente accede al sistema. +2. El cliente navega a la sección de sesiones. +3. El cliente selecciona la sesión que desea contratar. +4. El cliente completa el formulario de contratación. +5. El cliente envía el formulario. +6. El sistema confirma la contratación de la sesión. + +## Caso de uso 17: Profesional acepta una sesión + +1. El profesional accede al sistema. +2. El profesional navega a la sección de sesiones. +3. El profesional selecciona la sesión que desea aceptar. +4. El profesional confirma la aceptación de la sesión. +5. El sistema notifica al cliente sobre la aceptación de la sesión. + +## Caso de uso 18: Profesional rechaza una sesión + +1. El profesional accede al sistema. +2. El profesional navega a la sección de sesiones. +3. El profesional selecciona la sesión que desea rechazar. +4. El profesional confirma el rechazo de la sesión. +5. El sistema notifica al cliente sobre el rechazo de la sesión. + +## Caso de uso 19: Profesional añade una imagen a una sesión + +1. El profesional accede al sistema. +2. El profesional navega a la sección de sesiones. +3. El profesional selecciona la sesión a la que desea añadir la imagen. +4. El profesional sube la imagen. +5. El sistema confirma la adición de la imagen a la sesión. + +## Caso de uso 20: Cliente da feedback de una imagen + +1. El cliente accede al sistema. +2. El cliente navega a la sección de imágenes. +3. El cliente selecciona la imagen a la que desea dar feedback. +4. El cliente proporciona su feedback. +5. El sistema confirma la recepción del feedback. + +## Caso de uso 21: Profesional crea una versión de una imagen + +1. El profesional accede al sistema. +2. El profesional navega a la sección de imágenes. +3. El profesional selecciona la imagen de la que desea crear una versión. +4. El profesional realiza las modificaciones necesarias en la imagen. +5. El profesional guarda la nueva versión de la imagen. +6. El sistema confirma la creación de la nueva versión de la imagen. + +## Caso de uso 22: Cliente da feedback de una version de una imagen + +1. El cliente accede al sistema. +2. El cliente navega a la sección de imágenes. +3. El cliente selecciona la versión de la imagen a la que desea dar feedback. +4. El cliente proporciona su feedback. +5. El sistema confirma la recepción del feedback. + +## Caso de uso 23: Cliente selecciona imagen para finalizar sesión + +1. El cliente accede al sistema. +2. El cliente navega a la sección de imágenes. +3. El cliente selecciona la imagen que desea utilizar para finalizar la sesión. +4. El sistema muestra la imagen seleccionada. + +## Caso de uso 24: Profesional finaliza una sesión + +1. El profesional accede al sistema. +2. El profesional navega a la sección de sesiones. +3. El profesional selecciona la sesión que desea finalizar. +4. El profesional confirma la finalización de la sesión. +5. El sistema notifica al cliente sobre la finalización de la sesión. + +## Caso de uso 25: Profesional crea un evento-colección + +1. El profesional accede al sistema. +2. El profesional navega a la sección de eventos. +3. El profesional selecciona la opción de crear un nuevo evento-colección. +4. El profesional completa el formulario de creación del evento-colección. +5. El profesional envía el formulario. +6. El sistema confirma la creación del evento-colección. + +## Caso de uso 26: Profesional añade una imagen a un evento + +1. El profesional accede al sistema. +2. El profesional navega a la sección de eventos. +3. El profesional selecciona el evento al que desea añadir la imagen. +4. El profesional sube la imagen. +5. El sistema confirma la adición de la imagen al evento. + +## Caso de uso 27: Profesional añade un tag a un evento + +1. El profesional accede al sistema. +2. El profesional navega a la sección de eventos. +3. El profesional selecciona el evento al que desea añadir el tag. +4. El profesional introduce el tag. +5. El sistema confirma la adición del tag al evento. + +## Caso de uso 28: Profesional añade un tag a una imagen + +1. El profesional accede al sistema. +2. El profesional navega a la sección de imágenes. +3. El profesional selecciona la imagen a la que desea añadir el tag. +4. El profesional introduce el tag. +5. El sistema confirma la adición del tag a la imagen. + +## Caso de uso 29: Anónimo busca imagen por tags + +1. El anónimo accede al sistema. +2. El anónimo navega a la sección de imágenes. +3. El anónimo introduce el tag por el que desea buscar. +4. El sistema muestra las imágenes que coinciden con el tag. + +## Caso de uso 30: Anónimo busca evento por tags + +1. El anónimo accede al sistema. +2. El anónimo navega a la sección de eventos. +3. El anónimo introduce el tag por el que desea buscar. +4. El sistema muestra los eventos que coinciden con el tag. + +## Caso de uso 31: Anónimo busca colección por tags + +1. El anónimo accede al sistema. +2. El anónimo navega a la sección de colecciones. +3. El anónimo introduce el tag por el que desea buscar. +4. El sistema muestra las colecciones que coinciden con el tag. + +## Caso de uso 32: Anónimo filtra imagen por fecha + +1. El anónimo accede al sistema. +2. El anónimo navega a la sección de imágenes. +3. El anónimo selecciona el rango de fechas para filtrar las imágenes. +4. El sistema muestra las imágenes que coinciden con el rango de fechas. + +## Caso de uso 33: Anónimo filtra eventos por fecha + +1. El anónimo accede al sistema. +2. El anónimo navega a la sección de eventos. +3. El anónimo selecciona el rango de fechas para filtrar los eventos. +4. El sistema muestra los eventos que coinciden con el rango de fechas. diff --git a/docs/decisiones-arquitectura.md b/docs/decisiones-arquitectura.md new file mode 100644 index 0000000..22be379 --- /dev/null +++ b/docs/decisiones-arquitectura.md @@ -0,0 +1,40 @@ +# Galerías Fotográficas - Decisiones de Arquitectura + +## ¿Por qué Angular en lugar de React? + +Como producto final, se pretende vender varias plantillas frontales. +Vamos a empezar por el diseño de la primera plantilla con Angular por su fácil escalabilidad y modularidad para el caso en que se incorporen nuevo programadores. + +## ¿Por qué .NET en lugar de Node.js? + +.NET ofrece un rendimiento superior y una mejor integración con herramientas empresariales, lo que lo hace más adecuado para aplicaciones de gran escala. +Además, permite un desarrollo más rápido y eficiente gracias a su robusto ecosistema de bibliotecas y herramientas. + +## Decisiones sobre manejo de imágenes + +Como objetivo final, se pretende tener una independencia total del proveedor de almacenamiento de imágenes. Para ello, se optará por una arquitectura que permita cambiar de proveedor sin afectar al resto del sistema. +Por facilidad y sencillez durante el desarrollo, se comenzará con un sqlite + el sistema de archivos local. + +Para tratar los datos usaremos EntityFramework con una visión Data First, es decir, primero se definirá el modelo de datos y las relaciones en base de datos y posteriorimente se generarán las migraciones y se modificará el modelo del back. +Usaremos Serilog + OpenTelemetry para el monitoreo y trazabilidad de las aplicaciones de forma sencilla. +Usaremos Scalar + OpenApi para documentar la API de forma sencilla y visual. +Usaremos MailKit para enviar correos electrónicos de forma sencilla y eficiente. +Usaremos MediatR para la implementación de patrones CQRS (Command Query Responsibility Segregation) en el backend. +Usaremos Polly para la gestión de resiliencia y manejo de fallos en las aplicaciones. +Usaremos FluentValidation para la validación de datos de forma sencilla y eficiente. +Usaremos Hangfire para la gestión de trabajos en segundo plano. +Usaremos Redis como sistema de caché distribuido. +Usaremos PostgreSQL como sistema de gestión de bases de datos. Durante el desarrollo, y en entornos locales, usaremos sqlite. +Usaremos AutoMapper para la mapeo de objetos de forma sencilla y eficiente. + +Para el front usaremos TailwindCSS para el diseño de interfaces de usuario de forma rápida. +Usaremos NgRx para la gestión del estado de la aplicación de forma predecible y eficiente. + +## Elección de patrones arquitectónicos + +En el backend se usará DDD ( Domain-Driven Design ) y CQRS ( Command Query Responsibility Segregation ). +Esto facilitará la escalabilidad y el mantenimiento del sistema a largo plazo. +Además, permite una rápida implementación de nuevas funcionalidades y una adaptación más simple para nuevo programadores. + +En el frontend se utilizará una arquitectura MVVM (Model-View-ViewModel) repartida en componentes reutilizables. +Esto ayudará en la separación de responsabilidades de cada componente y facilitará la adición de nuevas pantallas. diff --git a/docs/documentacion-api.md b/docs/documentacion-api.md new file mode 100644 index 0000000..59422f3 --- /dev/null +++ b/docs/documentacion-api.md @@ -0,0 +1,11 @@ +Autenticación y autorización + +Endpoints de usuarios + +Endpoints de imágenes y colecciones + +Endpoints de sesiones y feedback + +Endpoints de pagos + +Códigos de error y manejo de excepciones \ No newline at end of file diff --git a/docs/guia-estilo.md b/docs/guia-estilo.md new file mode 100644 index 0000000..788dbea --- /dev/null +++ b/docs/guia-estilo.md @@ -0,0 +1,9 @@ +Paleta de colores y tipografías + +Componentes reutilizables de Angular + +Patrones de diseño UX/UI + +Responsive design guidelines + +Accesibilidad \ No newline at end of file diff --git a/docs/manual-usuario.md b/docs/manual-usuario.md new file mode 100644 index 0000000..9bf6dc8 --- /dev/null +++ b/docs/manual-usuario.md @@ -0,0 +1,7 @@ +Guía para profesionales + +Guía para clientes + +FAQ y resolución de problemas + +Videos tutoriales (cuando aplique) \ No newline at end of file diff --git a/docs/plan-desarrollo.md b/docs/plan-desarrollo.md new file mode 100644 index 0000000..4aab893 --- /dev/null +++ b/docs/plan-desarrollo.md @@ -0,0 +1,11 @@ +Fase 1: Configuración inicial y autenticación + +Fase 2: Gestión básica de usuarios y almacenamiento + +Fase 3: Sistema de portfolios y colecciones + +Fase 4: Funcionalidades de colaboración y feedback + +Fase 5: Sistema de pagos y comercialización + +Fase 6: Optimizaciones y características avanzadas \ No newline at end of file diff --git a/docs/plan-testing.md b/docs/plan-testing.md new file mode 100644 index 0000000..b884a15 --- /dev/null +++ b/docs/plan-testing.md @@ -0,0 +1,9 @@ +Pruebas unitarias: Backend y frontend + +Pruebas de integración: APIs y base de datos + +Pruebas E2E: Flujos completos de usuario + +Pruebas de rendimiento: Carga de imágenes + +Criterios de aceptación \ No newline at end of file diff --git a/docs/requisitos-funcionales.md b/docs/requisitos-funcionales.md index 31908b4..1d15e44 100644 --- a/docs/requisitos-funcionales.md +++ b/docs/requisitos-funcionales.md @@ -142,4 +142,4 @@ Todas las colecciones se pueden comprar y descargar. Todos los clientes puede reservar una sesión. Para los pagos se usará google pay o linkpay o stripe. -Se intentará ofrecer una experiencia de pago fluida y segura para los clientes. \ No newline at end of file +Se intentará ofrecer una experiencia de pago fluida y segura para los clientes. From 1360ccb46c6bf3e0915ec80eb567c17aea4a5614 Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 29 Aug 2025 00:31:56 +0200 Subject: [PATCH 06/11] docu --- docs/documentacion-api.md | 108 +++++++++++++++++++++++++++++++++++--- docs/guia-estilo.md | 4 +- docs/manual-usuario.md | 4 +- docs/plan-desarrollo.md | 4 +- docs/plan-testing.md | 4 +- 5 files changed, 114 insertions(+), 10 deletions(-) diff --git a/docs/documentacion-api.md b/docs/documentacion-api.md index 59422f3..f48499d 100644 --- a/docs/documentacion-api.md +++ b/docs/documentacion-api.md @@ -1,11 +1,107 @@ -Autenticación y autorización +# Galerías Fotográficas - Documentación API -Endpoints de usuarios +## Autenticación y autorización -Endpoints de imágenes y colecciones +POST `/auth/login` -> Inicia sesión y devuelve un token de autenticación. -Endpoints de sesiones y feedback +POST `/auth/logout` -> Cierra sesión y revoca el token de autenticación. -Endpoints de pagos +## Endpoints de usuarios -Códigos de error y manejo de excepciones \ No newline at end of file +GET `/users/` -> Obtiene la lista de usuarios. + +GET `/users/{id}` -> Obtiene los detalles de un usuario específico. + +POST `/users/` -> Crea un nuevo usuario. Se espera que el cuerpo de la solicitud contenga los datos del usuario. + +PUT `/users/{id}` -> Actualiza los detalles de un usuario específico. Se espera que el cuerpo de la solicitud contenga los datos actualizados del usuario. + +DELETE `/users/{id}` -> Elimina un usuario específico. + +## Endpoints de imágenes + +GET `/images/` -> Obtiene la lista de imágenes. En el body se incluirá una variable indicando si tiene que devolver las imágenes de un usuario específico o de un profesional. + +POST `/images/` -> Crea una nueva imagen. Se espera que el cuerpo de la solicitud contenga los datos de la imagen, incluidos los metadatos. + +GET `/images/{id}` -> Obtiene los detalles de una imagen específica. Incluye los metadatos asociados a la imagen. Según la querystring, devolverá la imagen en 360p, 720p o 1080p. + +PUT `/images/{id}` -> Actualiza los detalles de una imagen específica. Se espera que el cuerpo de la solicitud contenga los datos actualizados de la imagen. + +DELETE `/images/{id}` -> Elimina una imagen específica. + +## Endpoints de eventos + +GET `/events/` -> Obtiene la lista de eventos. En el body se incluirá una variable indicando si tiene que devolver los eventos de un usuario específico o de un profesional. + +POST `/events/` -> Crea un nuevo evento. Se espera que el cuerpo de la solicitud contenga los datos del evento, incluidos los metadatos. + +GET `/events/{id}` -> Obtiene los detalles de un evento específico. Incluye los metadatos asociados al evento. + +PUT `/events/{id}` -> Actualiza los detalles de un evento específico. Se espera que el cuerpo de la solicitud contenga los datos actualizados del evento. + +DELETE `/events/{id}` -> Elimina un evento específico. + +## Endpoints de colecciones + +GET `/collection/` -> Obtiene la lista de colecciones. En el body se incluirá una variable indicando si tiene que devolver las colecciones de un usuario específico o de un profesional. + +POST `/collection/` -> Crea una nueva colección. Devuelve los detalles de la colección creada. + +GET `/collection/{id}` -> Obtiene los detalles de una colección específica. En el body se indica el ID del usuario que la consulta, si no está relacionado con esa colección, se devolverá un error 404 (Not Found). + +PUT `/collection/{id}` -> Actualiza una colección existente. + +DELETE `/collection/{id}` -> Elimina una colección. + +GET `/collection/{id}/images` -> Obtiene la lista de imágenes de una colección específica. Cada imagen incluirá información como el ID de la imagen, la URL de la imagen y los metadatos asociados. + +POST `/collection/{id}/images` -> Crea una nueva imagen en una colección específica. Se espera que el cuerpo de la solicitud contenga los datos de la imagen, incluidos los metadatos. + +GET `/collection/{id}/images/{id}` -> Obtiene los detalles de una imagen específica de una colección. Incluye los metadatos asociados a la imagen. + +PUT `/collection/{id}/images/{id}` -> Actualiza los detalles de una imagen específica de una colección. Se espera que el cuerpo de la solicitud contenga los datos actualizados de la imagen. + +DELETE `/collection/{id}/images/{id}` -> Elimina una imagen específica de una colección. + +## Endpoints de sesiones + +GET `/session/` -> Obtiene la lista de sesiones. En el body se incluirá una variable indicando si tiene que devolver las sesiones activas de un usuario específico o de un profesional. + +POST `/session/` -> Crea una nueva sesión. Devuelve los detalles de la sesión creada. + +GET `/session/{id}` -> Obtiene los detalles de una sesión específica. En el body se indica el ID del usuario que la consulta, si no está relacionado con esa sesión, se devolverá un error 404 (Not Found). + +PUT `/session/{id}` -> Actualiza una sesión existente. + +DELETE `/session/{id}` -> Elimina una sesión. + +GET `/session/{id}/image/` -> Obtiene la lista de imágenes de una sesión específica. Cada imagen incluirá información como el ID de la imagen, la URL de la imagen y los metadatos asociados y el feedback asociado. + +POST `/session/{sessionId}/image` -> Crea una nueva imagen en una sesión específica. Se espera que el cuerpo de la solicitud contenga los datos de la imagen, incluidos los metadatos. + +GET `/session/{sessionId}/image/{imageId}` -> Obtiene los detalles de una imagen específica de una sesión. Incluye el feedback asociado a la imagen. + +PUT `/session/{sessionId}/image/{imageId}` -> Actualiza los detalles de una imagen específica de una sesión. Incluye el feedback asociado a la imagen. + +PATCH `/session/{sessionId}/image/{imageId}` -> Actualiza el feedback asociado a una imagen específica de una sesión. + +DELETE `/session/{sessionId}/image/{imageId}` -> Elimina una imagen específica de una sesión. + +GET `/session/{sessionId}/image/{imageId}/revision/{revisionId}` -> Obtiene los detalles de una revisión específica de una imagen en una sesión. + +POST `/session/{sessionId}/image/{imageId}/revision/{revisionId}` -> Crea una nueva revisión para una imagen específica en una sesión. Se espera que el cuerpo de la solicitud contenga los datos de la revisión. + +PUT `/session/{sessionId}/image/{imageId}/revision/{revisionId}` -> Actualiza los detalles de una revisión específica de una imagen en una sesión. + +DELETE `/session/{sessionId}/image/{imageId}/revision/{revisionId}` -> Elimina una revisión específica de una imagen en una sesión. + +## Endpoints de pagos + +TODO + +## Códigos de error y manejo de excepciones + +Todos los errores se manejarán mediante el patrón `Response` descrito anteriormente. +En caso de que sean errores de validación, se devolverá un código de estado 400 (Bad Request) junto con una lista de errores detallados. +En cualquier otro caso, se tratarán mediante el estandar Problem Details. diff --git a/docs/guia-estilo.md b/docs/guia-estilo.md index 788dbea..d933964 100644 --- a/docs/guia-estilo.md +++ b/docs/guia-estilo.md @@ -1,3 +1,5 @@ + \ No newline at end of file diff --git a/docs/manual-usuario.md b/docs/manual-usuario.md index 9bf6dc8..c679c91 100644 --- a/docs/manual-usuario.md +++ b/docs/manual-usuario.md @@ -1,7 +1,9 @@ + \ No newline at end of file diff --git a/docs/plan-desarrollo.md b/docs/plan-desarrollo.md index 4aab893..60943d0 100644 --- a/docs/plan-desarrollo.md +++ b/docs/plan-desarrollo.md @@ -1,3 +1,5 @@ + \ No newline at end of file diff --git a/docs/plan-testing.md b/docs/plan-testing.md index b884a15..491db2b 100644 --- a/docs/plan-testing.md +++ b/docs/plan-testing.md @@ -1,3 +1,5 @@ + \ No newline at end of file From f7fb9c4b1220efb32d6e4ed5088f3e7430920eef Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 29 Aug 2025 00:34:45 +0200 Subject: [PATCH 07/11] docu --- README.md | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..abc6f6c --- /dev/null +++ b/README.md @@ -0,0 +1,156 @@ +# Galerías Fotográficas + +--- + +## Que problema identificamos + +Existen multiples alternativas para la distribución de imágenes digitales, como redes sociales o proveedores de almacenamiento en la nube. +Las redes sociales exponen publicamente y con poco control el contenido de las imágenes. +Los proveedores de almacenamiento ofrecen un control mayor sobre la exposición de las imágenes a cambio de una suscripción o pago por uso. + +Como profesional que espera cobrar por el trabajo, publicar fotos privadas en redes sociales abre camino a múltiples problemas: perdida de privacidad para el cliente, mala exposición y pobre posicionamiento web, perdida de calidad en la imágen, se impide reutilizar la imagen con otros fines sin herramientas de terceros que pueden ser perjudiciales para clientes y profesionales. +Usar proveedores como WeTransfer, Google Drive o Dropbox, requiere de pagos y un conocimiento mínimo sobre el uso de estos servicios por parte del cliente; además, para ahorrar costes los profesionales deben eliminar los grupos de imágenes con cierta frequencia o fracturar por tiempo de almacenamiento al cliente. +Ambas opciones limitan la cooperatividad y la recuperación de las imágenes por parte del cliente. +Además, expone fácilmente al profesional a varios riesgos y problemáticas emergentes con la evolución constante del software: la perdida de credenciales, el robo de identidad, el plagio, la pérdida de control sobre la calidad de transmisión de la imagen. + +Como cliente, recibir una sesión por WeTransfer limita las opciones de feedback y mejora o personalización. Recibirla por correo electrónico limita la cantidad de imágenes recibidas. Recibirlas por Google Drive o similares nos quita espacio de nuestro almacenamiento en la nube. Si el profesional publica las imágenes, referenciándos puede afectar a nuestra huella digital e imagen en redes. +Además, según la configuración del servicio que use el profesional, es común tener a disposición las imágenes solamente durante un tiempo determinado, haciendo imposible recuperarlas o acceder a ellas pasado ese tiempo. + +Ambos participantes de la actividad recaen en un moderno problema: necesitar diversos servicios para controlar un único recurso. +Como profesional, necesitas una web-portfolio, un perfil en redes, un servicio de almacenamiento y una forma de contacto con el cliente. +Como cliente, necesitas poder ver el trabajo anterior del profesional, contactar con él y poder revisar el trabajo de forma conjunta para lograr el resultado que uno espera. + +## Que queremos resolver + +Desde el punto de vista del profesional, podemos agrupar todos los servicios en un único servico. +Una especie de Amazon para imágenes. + +Desde el punto de vista del cliente, agrupandolo todo, evitamos la necesidad de acceder a tantos servicios diferentes y familiarizamos al usuario con una interfaz sencilla y directa, minimizando el roce con el aplicativo. + +## Alternativas a nuestra solución + +Existen multitud de alternativas a una web hecha a mano, como Wix o Joomla. +Existen alternativas cloud-native para alojar un portfolio. +Existen muchos proveedores de almacenamiento web. +Existen muchas redes sociales donde compartir las imágenes. +Existen metodos de comunicación y trabajo colaborativo. +En su gran mayoría, en servicios diferenciados. +Sin embargo no existe servicios unificados. + +--- + +## Despiece del problema + +### Almacenamiento + +El profesional no quiere tener que gastar en almacenamiento ni preocuparse del estado de un proveedor. +Por tanto, el sistema tiene que poder almacenar las imágenes durante mucho tiempo y mantenerlas en linea el mismo tiempo. + +### Distribución + +El profesional no quiere tener que usar más de un servicio para enviar las imágenes al cliente o subirlas a redes sociales. +El cliente no quiere recibir las imágenes en un zip o tener que descargarlas desde un servicio de terceros. + +### Trabajo colaborativo + +El profesional quiere que el cliente escoja la imagen que más el guste y le de feedback sobre el retoque y la edición de la imágen. +El cliente queire revisar el trabajo del profesional para escoger las imágenes que más le gusten. + +### Feedback + +El cliente puede dar feedback mediante comentarios en cada imágen como votando la imagen. +La nota asignada a cada imágen se determinará como: (votos positivos - votos negativos) / votos totales +Los comentarios se puntuarán de la misma forma. +El profesional podrá responder a los comentarios y los leerá de forma que el comentario con mejor puntuación quede el primero, en su defecto se ordenarán por fecha. + +El feedback también podrá ser dado a imágenes y colecciones del portfolio público, solamente lo podrán hacer los clientes autenticados. Aquellos que adquieran una sesión podrán dejar feedback al profesional de forma pública. + +### Portfolio + +El profesional no quiere gastar en otro servicio más para alojar el protfolio. +El profesional quiere subir las imágenes al servicio y escoger cuales van a conformar el portfolio. +El profesional quiere que la primera ojeada que tenga el cliente sobre el servicio sea el portfolio. + +### Colecciones + +El profesional quiere organizar las imágenes por fecha, personas que salen en ellas, categorías, eventos... +El profesional quiere poder reunir imágenes que se relacionen entre sí por categoría, evento, fechas, motivos... +El profesional quiere juntar todas las imágenes que van destinadas a un cliente. + +### Sesiones + +El profesional hará varias imágenes que revisará con el cliente. +El cliente escogerá únicamente las mejoras y que más le gusten. +El profesional revisará esas imágenes, con un límite numérico de imágenes totales. +El cliente recibirá una colección de esas imágenes. +Múltiples clientes y profesionales podrán trabajar en una única sesión. +Durante el proceso, debe existir una colaboración mutua mediante feedback. + +### Multiples clientes + +El profesional quiere poder trabajar sobre un proyecto y poder enviar el resultado del proyecto a multiples clientes. + +### Venta del servicio + +El profesional quiere cobrar una imágen única, una o varias colecciones, o una sesión. +Un cliente pagará por una imágen, una o diversas colección premaquetadas, y por una sesión. +Muchos clientes podrán pagar conjuntamente el servicio. + +### Usuarios + +Existirán 4 tipos de usuarios: + +- Anonimo +- Cliente +- Profesional +- Administrador + +El usuario anónimo podrá consultar el portfolio y ver los diferentes botones y enlaces para ver el resto de imágenes públicas, redes sociales, blog o identificarse. + +El cliente, o usuario identificado, podrá hacer lo mismo que el anónimo. También podrá comprar las diferentes imágenes y colecciones disponibles. Además, podrá contratar una sesión, interactuar con la sesión que tenga activa dando feedback o escogiendo las imágenes; y consultar pedidos anteriores para descargar las imágenes, publicarlas en redes sociales o compartirlas de forma directa con otros clientes identificados. + +El profesional, podrá editar las imágenes y colecciones públicas que haya en el portfolio; organizar nuevas sesiones, editar las sesiones en marcha y actualizarlas; crear y editar nuevas colecciones; crear y editar eventos y categorías. + +El administrador, podrá hacer lo mismo que el profesional y además podrá añadir profesionales y editar aspectos clave de la web. + +Para facilitar el registro y el inicio de sesión, los usuarios podrán iniciar sesión con Google, Microsoft, Meta y Apple. Además, contarán con la opción de usar correo y contraseña. Para ello nos adaptaremos a OpenId y OAuth 2. +Todos los usuarios tendrán un método MFA como sms o passkeys. +Aquellos usuarios que inicien sesión con contraseña, recibirán un magic link para entrar. + +### Conexiones lentas + +Todas las imágenes subidas se procesarán en 3 categorías: + +- Baja resolución: 360p, comprimidas en WebP +- Media resolución: 720p, comprimidas en WebP +- Resolución Nativa: nativa, sin compresión + +### Pagos + +Se establecerá como recomendación el uso de linkpay o servicios como google wallet. + +--- + +## Tecnologías a usar + +Back: +JWT, OpenId + OAuth 2 -> Duende Identity Server +DDD con CQRS -> MediatR +Entity Framework Core + sqlite -> Base de datos +AutoMapper -> Mapeo de objetos +Serilog + OpenTelemetry -> Logging y trazabilidad +Scalar + OpenApi -> Documentación y pruebas de API +FluentValidation -> Validación de modelos +Redis -> Almacenamiento en caché +mailkit -> Envío de correos electrónicos +ImageSharp -> Procesamiento de imágenes + +Front: +TailwindCSS -> Estilos +Angular -> Framework +RxJS -> Programación reactiva +NgRx -> Manejo del estado +scss -> Preprocesador CSS +axios -> Cliente HTTP +Vite -> Bundler +Typescript -> Lenguaje From 89a553a95b17f0d4347115237079b74036172cb0 Mon Sep 17 00:00:00 2001 From: Manuel Date: Sat, 30 Aug 2025 15:28:44 +0200 Subject: [PATCH 08/11] docu --- docs/guia-estilo.md | 78 +++++++++++++++++++++++++++++++++++--- docs/manual-usuario.md | 2 +- docs/plan-desarrollo.md | 83 +++++++++++++++++++++++++++++++++++++---- docs/plan-testing.md | 2 +- 4 files changed, 150 insertions(+), 15 deletions(-) diff --git a/docs/guia-estilo.md b/docs/guia-estilo.md index d933964..b1f68cb 100644 --- a/docs/guia-estilo.md +++ b/docs/guia-estilo.md @@ -1,11 +1,77 @@ - \ No newline at end of file +## Tipografías + +Se seleccionarán tipografías que sean legibles y que se alineen con la estética de la marca. Se establecerán jerarquías tipográficas claras para títulos, subtítulos y texto de cuerpo. + +## Componentes reutilizables de Angular + +Se crearán diferentes componentes reutilizables en Angular para garantizar la consistencia y facilitar el desarrollo. +Los principales componentes serán: + +- Inputs de texto: Los labels aparecerán dentro del campo. El campo tendrá un borde inferior resaltado en un color neutro al tema (gris suave para el modo claro y gris oscuro para el modo oscuro). Al clicar en el campo, el label se desplazará hacia arriba y se reducirá de tamaño y aparecerán los bordes faltantes. Si el campo tiene validación, al terminar de validarse, el color del borde cambiará al color de acento en caso de que sea correcto; rojo en caso contrario. Los errores de validación de mostrarán a continuación del input. + +- Los botones: Borde, texto e iconos del color de boton; fondo trasparente al 90%. Al hacer hover, incremento de opacidad al 100% e invertir el color del texto y los iconos por el fondo primario. + + - Login: mismo funcionamiento que los botones pero con color de acento login. + - Registro: mismo funcionamiento que los botones pero con color de acento registro. + - Cerrar sesión: mismo funcionamiento que los botones pero con color de acento cerrar sesión. + - Recuperar contraseña: mismo funcionamiento que los botones pero con color de acento recuperar contraseña. + - Comprar: mismo funcionamiento que los botones pero con color de acento comprar. + - Añadir al carrito: mismo funcionamiento que los botones pero con color de acento comprar oscurecido un 20%. + - Eliminar del carrito: mismo funcionamiento que los botones pero con color de acento eliminar. + - Confirmar compra: mismo funcionamiento que los botones pero con color de acento comprar. + +- Tarjetas de imagen: tendrán los bordes ligeramente redondeados, al estilo windows 11. Como tamaño máximo tendrán un alto de 360p. Como máximo ocuparán un 1/4 del ancho de la pantalla y un máximo de 1/4 del alto de la pantalla. En pantallas pequeñas, se adaptarán para ocupar un 100% del ancho disponible para crear un feed infinito de imágenes. Se mantendrá siempre la relación de aspecto de la imágen original. + +- Galería de tarjetas: se organizarán en cuadrícula. Las imágenes se ajustarán automáticamente al espacio disponible, manteniendo siempre su proporción original. El espacio entre las imágenes será consistente y se adaptará al tamaño de la pantalla. Las imágenes muy largas o muy anchas desplazarán a todas las demás imágenes hacía arriba o abajo. Las imágenes mas altas, ocuparán más espacio vertical, empujando las imágenes de su columna hacia arriba o abajo. En tablets, al estar en vertical, se mostrarán en el mismo formato que en móviles, ocupando todo el ancho de la pantalla; en horizontal, se mostrará una cuadrícula. lo más pequeña posible respetando el tamaño mínimo de cada imagen. + +## Patrones de diseño UX/UI + +Nos basaremos en principios de diseño centrados en el usuario. +Usaremos ejemplos de [UI Patterns](https://ui-patterns.com/explore) para inspirar nuestras decisiones de diseño. + +Todas las galerías menos la del portfolio, seguirán el mismo diseño, basado en un scroll infinito, hasta alcanzar el total de imágenes disponibles. + +Cada imagen se podrá ampliar y ver en detalle, accediendo a una página detalle donde se podrá descargar, comprar, compartir, votar y comentar la imagen. + +Cuando se sube una nueva imagen o se inicie un proceso que llame al back, se cargará una animación de carga. + +Siempre habrá un header horizontal presente, que muestre el logo de la aplicación, un botón de eventos, un botón de colecciones, un botón de búsqueda y un botón de login. Para usuarios autenticados, se mostrará un botón de menú que expondrá opciones adicionales como el historial de compra, edición de perfil, etc. Al autenticarse, el botón de login se convertirá en el botón de logout. Para usuarios profesionales, en el menú se incluirán opciones adicionales como la gestión del portfolio o la configuración del aplicativo. El menú se mostrará como un menu de hamburguesa. + +Habrán imágenes agrupadas por colecciones que corresponden a agrupaciones de categorias y fechas. +Habrán eventos, que serán colecciones definidas con una fecha de inicio/fin y una agrupación de categorias repetidas en la colección. +Al ver las colecciones, se podrá filtrar por fecha, categoría y otros metadatos relevantes. +Al ver los eventos, se podrá filtrar por fecha, categoría y localización. +En la vista de colecciones, aparecerán todas las colecciones en una cuadrícula que se adaptará al tamaño de la pantalla. Sobre el grid, aparecerán los diferentes filtros (fecha y categorías) y un cuadro de búsqueda para buscar palabras relevantes. +En la vista de eventos, aparecerán listados los eventos en una cuadrícula similar a la de colecciones, con filtros para la localización, la fecha de inicio y fin del evento, y categoría del evento y un cuadro de búsqueda para buscar palabras clave de cada evento. +Además, habrá una vista con todas las imágenes subidas y que sean públicas, ordenadas por fecha. Al lateral aparecerán los filtros de evento, colección y categorías. Esta vista será un scroll infinito hasta el fin del contenido. + +## Responsive design guidelines + +Como unidad base usaremos `svw` y `svh`. Para tamaños relativos usaremos `rem` y porcentajes. +Usaremos `flexbox` para la disposición de los elementos. +Las cuadrículas usarán `grid` para organizar las imágenes de manera eficiente. + +Nos aseguraremos que la aplicación sea usable en dispositivos de diferentes tamaños. +Usaremos `media queries` para adaptar el diseño a diferentes resoluciones de pantalla. +Como referencia de dispositivos usaremos: +Móvil: Oppo A94 +Tablet: Samsung Galaxy Tab S6 Lite +Escritorio: Monitor 1920x1080 + +Nos basaremos en componentes Tailwind CSS para la creación de la interfaz de usuario y adaptar las interfaces. + +## Accesibilidad + +Se implementarán prácticas de accesibilidad para garantizar que la aplicación sea usable por personas con discapacidades. Esto incluirá el uso de etiquetas ARIA y la navegación por teclado. diff --git a/docs/manual-usuario.md b/docs/manual-usuario.md index c679c91..5907dc8 100644 --- a/docs/manual-usuario.md +++ b/docs/manual-usuario.md @@ -1,4 +1,4 @@ - \ No newline at end of file +- Implementación de roles y permisos. +- Integración con el sistema de autenticación. +- Protección de rutas y gestión de sesiones. + +## Fase 3 Backend: Gestión de imágenes + +- Implementación de la gestión de imágenes (subida, edición, eliminación). +- Integración con el sistema de almacenamiento (local o en la nube). +- Implementación del sistema de colecciones de imágenes y eventos. +- Implementación del sistema de etiquetado de imágenes. +- Implementación del sistema de búsqueda y filtrado de imágenes. + +## Fase 3 Frontend: Gestión de imágenes + +- Implementación de la interfaz de usuario para la gestión de imágenes. +- Integración con el backend para la subida, edición y eliminación de imágenes. +- Implementación de la lógica de búsqueda y filtrado de imágenes. +- Implementación de la interfaz de colecciones y eventos. + +## Fase 4 Backend: Sistema de portfolios + +- Implementación de la gestión de portfolios (CRUD). +- Integración con el sistema de roles. + +## Fase 4 Frontend: Sistema de portfolios + +- Implementación de la interfaz de usuario para la gestión de portfolios. +- Integración con el backend para la creación, edición y eliminación de portfolios. +- Implementación de la lógica de visualización de portfolios. + +## Fase 4 Backend: Funcionalidades de colaboración y feedback + +- Implementación de un sistema de comentarios en imágenes y portfolios. +- Implementación de un sistema de notificaciones para interacciones relevantes. +- Implementacion del sistema de versionado de imagenes. + +## Fase 4 Frontend: Funcionalidades de colaboración y feedback + +- Implementación de la interfaz de usuario para el sistema de comentarios. +- Implementación de la interfaz de usuario para las notificaciones. +- Implementación de la interfaz de usuario para el versionado de imágenes. + +## Fase 5: Sistema de pagos y comercialización + +- Implementación de la pasarela de pagos. +- Integración con plataformas de pago (linkpay, google wallet...). +- Implementación de la lógica de compras. +- Implementación de la interfaz de usuario para la gestión de pagos. +- Maquetación de galería del usuario e historial de compras. + +## Fase 6: Optimizaciones y características avanzadas + +Queda abierta a ser completada durante la realización del proyecto. Esta sección se usará a modo de backlog. + +- Implemntación propia de IdentityServer. +- Añadir más integraciones para proveedores de base de datos. +- Añadir más integraciones con proveedores de almacenamiento. +- Implementación de un sistema de caché para mejorar el rendimiento. +- Implementación de un sistema de logging y monitoreo. +- Implementación de un sistema de pruebas automatizadas. +- Implementación de un sistema de CI/CD. +- Implementación de un sistema de análisis y reportes. +- Implementar frontends alternativos (React, Vue, etc.). +- Añadir más integraciones con proveedores de servicios de terceros. diff --git a/docs/plan-testing.md b/docs/plan-testing.md index 491db2b..12db0d2 100644 --- a/docs/plan-testing.md +++ b/docs/plan-testing.md @@ -1,4 +1,4 @@ -