From 1c9c39bab1bf8271c321c03c4f5f5e17812b12f7 Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Sun, 30 Nov 2025 20:26:42 -0500 Subject: [PATCH 01/10] Add database initialization and seeding scripts for contacts management - Created 01-init-db.sh to initialize the contacts database if it doesn't exist. - Added 02-seed-data.sql to create necessary tables and insert initial data including users, roles, permissions, and sample contacts. - Implemented foreign key constraints and unique constraints for data integrity. - Seeded initial roles (Admin, Reader, Editor) and assigned permissions accordingly. --- .../src/Contact.Api.sln => Contact.Api.sln | 26 +++- Dockerfile.api | 39 ++++++ .../Contacts/Delete Contacts.bru | 0 .../Contacts/Get Contacts By Id.bru | 0 .../Contacts/Get Contacts.bru | 0 .../Contacts/Save Contact.bru | 0 .../Contacts/Update Contacts.bru | 0 .../Operations/Get Operations.bru | 0 .../Pages/Add Page.bru | 0 .../Pages/Delete Page.bru | 0 .../Pages/Get Pages.bru | 0 .../Pages/Update Page.bru | 0 .../Permissions/Add Permission.bru | 0 .../Permissions/Delete Permission.bru | 0 .../Permissions/Get Permissions.bru | 0 .../Permissions/Update Permission.bru | 0 .../RolePermission/Add Role Permission.bru | 0 .../RolePermission/Delete Role Permission.bru | 0 .../Get Role Permissions Mapping.bru | 0 .../RolePermission/Get Role Permissions.bru | 0 .../Update Role Permissions.bru | 0 .../Roles/Add Role.bru | 0 .../Roles/Delete Role.bru | 0 .../Roles/Get Roles.bru | 0 .../Roles/Update Role.bru | 0 .../UserRoles/Get UserRoles.bru | 0 .../Users/Autenticate.bru | 0 .../Users/Create User.bru | 0 .../Users/Get Current User.bru | 0 .../Users/Register User.bru | 0 .../Users/Update User.bru | 0 .../bruno.json | 0 .../environments/Local.bru | 0 aspire/AppHost/AppHost.cs | 33 +++++ aspire/AppHost/Contact.AppHost.csproj | 23 ++++ aspire/AppHost/Properties/launchSettings.json | 29 ++++ aspire/AppHost/appsettings.Development.json | 11 ++ aspire/AppHost/appsettings.json | 9 ++ .../Contact.ServiceDefaults.csproj | 22 +++ aspire/ServiceDefaults/Extensions.cs | 127 ++++++++++++++++++ .../{src => }/Contact.Api/Contact.Api.csproj | 1 + .../{src => }/Contact.Api/Contact.Api.http | 0 .../Controllers/ContactPersonController.cs | 0 .../Controllers/OperationsController.cs | 0 .../Controllers/PagesController.cs | 0 .../Controllers/PermissionsController.cs | 0 .../RolePermissionMappingController.cs | 0 .../Controllers/RolePermissionsController.cs | 0 .../Controllers/RolesController.cs | 0 .../Controllers/UserRolesController.cs | 0 .../Controllers/UsersController.cs | 0 .../Core/Attributes/ActivityLogAttribute.cs | 0 .../AuthorizePermissionAttribute.cs | 0 .../Core/Authorization/PermissionHandler.cs | 0 .../Authorization/PermissionRequirement.cs | 0 .../Middleware/ActivityLoggingMiddleware.cs | 0 .../CustomAuthorizationPolicyProvider.cs | 0 .../Core/Middleware/ExceptionMiddleware.cs | 0 backend/{src => }/Contact.Api/Program.cs | 4 + .../Properties/launchSettings.json | 0 .../appsettings.Development-sample.json | 0 .../Contact.Api/appsettings.Development.json | 0 .../{src => }/Contact.Api/appsettings.json | 0 .../wwwroot/data/role-permissions.json | 0 .../Contact.Application/AppSettings.cs | 0 .../ApplicationServiceCollectionExtensions.cs | 0 .../Contact.Application.csproj | 0 .../Interfaces/IActivityLogService.cs | 0 .../Interfaces/IContactPersonService.cs | 0 .../Interfaces/IGenericService.cs | 0 .../Interfaces/IOperationService.cs | 0 .../Interfaces/IPageService.cs | 0 .../Interfaces/IPermissionService.cs | 0 .../Interfaces/IRolePermissionService.cs | 0 .../Interfaces/IRoleService.cs | 0 .../Interfaces/IUnitOfWork.cs | 0 .../Interfaces/IUserService.cs | 0 .../Mappings/BaseMappingProfile.cs | 0 .../Mappings/ContactPersonPofile.cs | 0 .../Mappings/OperationMappingProfile.cs | 0 .../Mappings/PageMappingProfile.cs | 0 .../Mappings/PermissionMappingProfile.cs | 0 .../Mappings/RoleMappingProfile.cs | 0 .../Mappings/RolePermissionMappingProfile.cs | 1 - .../Mappings/UserMappingProfile.cs | 0 .../Services/ActivityLogService.cs | 0 .../Services/ContactPersonService.cs | 0 .../Services/GenericService.cs | 0 .../Services/OperationService.cs | 0 .../Services/PageService.cs | 0 .../Services/PermissionService.cs | 0 .../Services/RolePermissionService.cs | 0 .../Services/RoleService.cs | 0 .../Services/UserService.cs | 0 .../ContactPerson/ContactPersonResponse.cs | 0 .../ContactPerson/CreateContactPerson.cs | 0 .../CreateContactPersonValidator.cs | 0 .../ContactPerson/UpdateContactPerson.cs | 0 .../UseCases/Operations/CreateOperation.cs | 0 .../UseCases/Operations/OperationResponse.cs | 0 .../UseCases/Operations/UpdateOperation.cs | 0 .../UseCases/Pages/CreatePage.cs | 0 .../UseCases/Pages/PageResponse.cs | 0 .../UseCases/Pages/UpdatePage.cs | 0 .../UseCases/Permissions/CreatePermission.cs | 0 .../Permissions/PermissionResponse.cs | 0 .../UseCases/Permissions/UpdatePermission.cs | 0 .../RolePermissions/CreateRolePermission.cs | 0 .../RolePermissionMappingRequest.cs | 0 .../RolePermissionMappingResponse.cs | 0 .../RolePermissions/RolePermissionResponse.cs | 0 .../RolePermissions/UpdateRolePermission.cs | 0 .../UseCases/Roles/CreateRole.cs | 0 .../UseCases/Roles/RoleResponse.cs | 0 .../UseCases/Roles/UpdateRole.cs | 0 .../UseCases/Users/AuthenticateRequest.cs | 0 .../UseCases/Users/AuthenticateResponse.cs | 0 .../UseCases/Users/ChangePassword.cs | 0 .../UseCases/Users/CreateUser.cs | 0 .../UseCases/Users/RegisterUser.cs | 0 .../UseCases/Users/RegisterUserValidator.cs | 0 .../UseCases/Users/ResetPassword.cs | 0 .../UseCases/Users/UpdateUser.cs | 0 .../UseCases/Users/UpdateUserRoles.cs | 0 .../UseCases/Users/UserResponse.cs | 0 .../UseCases/Users/UserWithRolesResponse.cs | 0 .../Contact.Common/Contact.Common.csproj | 0 .../Contact.Domain/Contact.Domain.csproj | 0 .../Entities/ActivityLogEntry.cs | 0 .../Contact.Domain/Entities/BaseEntity.cs | 0 .../Contact.Domain/Entities/ContactPerson.cs | 0 .../Contact.Domain/Entities/Operation.cs | 0 .../{src => }/Contact.Domain/Entities/Page.cs | 0 .../Entities/PageOperationMapping.cs | 0 .../Contact.Domain/Entities/Permission.cs | 0 .../{src => }/Contact.Domain/Entities/Role.cs | 0 .../Contact.Domain/Entities/RolePermission.cs | 0 .../Entities/RolePermissionMapping.cs | 0 .../Contact.Domain/Entities/UpdatePassword.cs | 0 .../{src => }/Contact.Domain/Entities/User.cs | 0 .../Contact.Domain/Entities/UserRole.cs | 0 .../Exceptions/BusinessException.cs | 0 .../Exceptions/ForbiddenException.cs | 0 .../Exceptions/NotAuthenticatedException.cs | 0 .../Exceptions/NotFoundException.cs | 0 .../Interfaces/IActivityLogRepository.cs | 0 .../Interfaces/IContactPersonRepository.cs | 0 .../Interfaces/IEmailService.cs | 0 .../Interfaces/IGenericRepository.cs | 0 .../Interfaces/IOperationRepository.cs | 0 .../Interfaces/IPageRepository.cs | 0 .../Interfaces/IPermissionRepository.cs | 0 .../Interfaces/IRolePermissionRepository.cs | 0 .../Interfaces/IRoleRepository.cs | 0 .../Interfaces/IUserRepository.cs | 0 .../Interfaces/IUserRoleRepository.cs | 0 .../Mappings/PermissionsByRoleMapping.cs | 0 .../Contact.Infrastructure/AppSettings.cs | 0 .../Contact.Infrastructure.csproj | 0 .../ExternalServices/EmailService.cs | 0 ...frastructureServiceCollectionExtensions.cs | 0 .../Persistence/Helper/DapperHelper.cs | 0 .../Persistence/Helper/IDapperHelper.cs | 0 .../Repositories/ActivityLogRepository.cs | 0 .../Repositories/ContactPersonRepository.cs | 0 .../Repositories/GenericRepository.cs | 0 .../Repositories/OperationRepository.cs | 0 .../PageOperationMappingRepository.cs | 0 .../Repositories/PageRepository.cs | 0 .../Repositories/PermissionRepository.cs | 0 .../Repositories/RolePermissionRepository.cs | 0 .../Repositories/RoleRepository.cs | 0 .../Repositories/UserRepository.cs | 0 .../Repositories/UserRoleRepository.cs | 0 .../Persistence/UnitOfWork.cs | 0 .../Contact.Infrastructure/SmtpSettings.cs | 0 backend/{src => }/Dockerfile | 18 +-- docker-compose.yml | 6 +- frontend/package.json | 2 +- frontend/proxy.conf.js | 16 +++ frontend/proxy.conf.json | 5 +- scripts/01-init-db.sh | 11 ++ .../seed-data.sql => scripts/02-seed-data.sql | 0 183 files changed, 361 insertions(+), 22 deletions(-) rename backend/src/Contact.Api.sln => Contact.Api.sln (62%) create mode 100644 Dockerfile.api rename {backend/ApiCollection => api-collection}/Contacts/Delete Contacts.bru (100%) rename {backend/ApiCollection => api-collection}/Contacts/Get Contacts By Id.bru (100%) rename {backend/ApiCollection => api-collection}/Contacts/Get Contacts.bru (100%) rename {backend/ApiCollection => api-collection}/Contacts/Save Contact.bru (100%) rename {backend/ApiCollection => api-collection}/Contacts/Update Contacts.bru (100%) rename {backend/ApiCollection => api-collection}/Operations/Get Operations.bru (100%) rename {backend/ApiCollection => api-collection}/Pages/Add Page.bru (100%) rename {backend/ApiCollection => api-collection}/Pages/Delete Page.bru (100%) rename {backend/ApiCollection => api-collection}/Pages/Get Pages.bru (100%) rename {backend/ApiCollection => api-collection}/Pages/Update Page.bru (100%) rename {backend/ApiCollection => api-collection}/Permissions/Add Permission.bru (100%) rename {backend/ApiCollection => api-collection}/Permissions/Delete Permission.bru (100%) rename {backend/ApiCollection => api-collection}/Permissions/Get Permissions.bru (100%) rename {backend/ApiCollection => api-collection}/Permissions/Update Permission.bru (100%) rename {backend/ApiCollection => api-collection}/RolePermission/Add Role Permission.bru (100%) rename {backend/ApiCollection => api-collection}/RolePermission/Delete Role Permission.bru (100%) rename {backend/ApiCollection => api-collection}/RolePermission/Get Role Permissions Mapping.bru (100%) rename {backend/ApiCollection => api-collection}/RolePermission/Get Role Permissions.bru (100%) rename {backend/ApiCollection => api-collection}/RolePermission/Update Role Permissions.bru (100%) rename {backend/ApiCollection => api-collection}/Roles/Add Role.bru (100%) rename {backend/ApiCollection => api-collection}/Roles/Delete Role.bru (100%) rename {backend/ApiCollection => api-collection}/Roles/Get Roles.bru (100%) rename {backend/ApiCollection => api-collection}/Roles/Update Role.bru (100%) rename {backend/ApiCollection => api-collection}/UserRoles/Get UserRoles.bru (100%) rename {backend/ApiCollection => api-collection}/Users/Autenticate.bru (100%) rename {backend/ApiCollection => api-collection}/Users/Create User.bru (100%) rename {backend/ApiCollection => api-collection}/Users/Get Current User.bru (100%) rename {backend/ApiCollection => api-collection}/Users/Register User.bru (100%) rename {backend/ApiCollection => api-collection}/Users/Update User.bru (100%) rename {backend/ApiCollection => api-collection}/bruno.json (100%) rename {backend/ApiCollection => api-collection}/environments/Local.bru (100%) create mode 100644 aspire/AppHost/AppHost.cs create mode 100644 aspire/AppHost/Contact.AppHost.csproj create mode 100644 aspire/AppHost/Properties/launchSettings.json create mode 100644 aspire/AppHost/appsettings.Development.json create mode 100644 aspire/AppHost/appsettings.json create mode 100644 aspire/ServiceDefaults/Contact.ServiceDefaults.csproj create mode 100644 aspire/ServiceDefaults/Extensions.cs rename backend/{src => }/Contact.Api/Contact.Api.csproj (88%) rename backend/{src => }/Contact.Api/Contact.Api.http (100%) rename backend/{src => }/Contact.Api/Controllers/ContactPersonController.cs (100%) rename backend/{src => }/Contact.Api/Controllers/OperationsController.cs (100%) rename backend/{src => }/Contact.Api/Controllers/PagesController.cs (100%) rename backend/{src => }/Contact.Api/Controllers/PermissionsController.cs (100%) rename backend/{src => }/Contact.Api/Controllers/RolePermissionMappingController.cs (100%) rename backend/{src => }/Contact.Api/Controllers/RolePermissionsController.cs (100%) rename backend/{src => }/Contact.Api/Controllers/RolesController.cs (100%) rename backend/{src => }/Contact.Api/Controllers/UserRolesController.cs (100%) rename backend/{src => }/Contact.Api/Controllers/UsersController.cs (100%) rename backend/{src => }/Contact.Api/Core/Attributes/ActivityLogAttribute.cs (100%) rename backend/{src => }/Contact.Api/Core/Attributes/AuthorizePermissionAttribute.cs (100%) rename backend/{src => }/Contact.Api/Core/Authorization/PermissionHandler.cs (100%) rename backend/{src => }/Contact.Api/Core/Authorization/PermissionRequirement.cs (100%) rename backend/{src => }/Contact.Api/Core/Middleware/ActivityLoggingMiddleware.cs (100%) rename backend/{src => }/Contact.Api/Core/Middleware/CustomAuthorizationPolicyProvider.cs (100%) rename backend/{src => }/Contact.Api/Core/Middleware/ExceptionMiddleware.cs (100%) rename backend/{src => }/Contact.Api/Program.cs (98%) rename backend/{src => }/Contact.Api/Properties/launchSettings.json (100%) rename backend/{src => }/Contact.Api/appsettings.Development-sample.json (100%) rename backend/{src => }/Contact.Api/appsettings.Development.json (100%) rename backend/{src => }/Contact.Api/appsettings.json (100%) rename backend/{src => }/Contact.Api/wwwroot/data/role-permissions.json (100%) rename backend/{src => }/Contact.Application/AppSettings.cs (100%) rename backend/{src => }/Contact.Application/ApplicationServiceCollectionExtensions.cs (100%) rename backend/{src => }/Contact.Application/Contact.Application.csproj (100%) rename backend/{src => }/Contact.Application/Interfaces/IActivityLogService.cs (100%) rename backend/{src => }/Contact.Application/Interfaces/IContactPersonService.cs (100%) rename backend/{src => }/Contact.Application/Interfaces/IGenericService.cs (100%) rename backend/{src => }/Contact.Application/Interfaces/IOperationService.cs (100%) rename backend/{src => }/Contact.Application/Interfaces/IPageService.cs (100%) rename backend/{src => }/Contact.Application/Interfaces/IPermissionService.cs (100%) rename backend/{src => }/Contact.Application/Interfaces/IRolePermissionService.cs (100%) rename backend/{src => }/Contact.Application/Interfaces/IRoleService.cs (100%) rename backend/{src => }/Contact.Application/Interfaces/IUnitOfWork.cs (100%) rename backend/{src => }/Contact.Application/Interfaces/IUserService.cs (100%) rename backend/{src => }/Contact.Application/Mappings/BaseMappingProfile.cs (100%) rename backend/{src => }/Contact.Application/Mappings/ContactPersonPofile.cs (100%) rename backend/{src => }/Contact.Application/Mappings/OperationMappingProfile.cs (100%) rename backend/{src => }/Contact.Application/Mappings/PageMappingProfile.cs (100%) rename backend/{src => }/Contact.Application/Mappings/PermissionMappingProfile.cs (100%) rename backend/{src => }/Contact.Application/Mappings/RoleMappingProfile.cs (100%) rename backend/{src => }/Contact.Application/Mappings/RolePermissionMappingProfile.cs (94%) rename backend/{src => }/Contact.Application/Mappings/UserMappingProfile.cs (100%) rename backend/{src => }/Contact.Application/Services/ActivityLogService.cs (100%) rename backend/{src => }/Contact.Application/Services/ContactPersonService.cs (100%) rename backend/{src => }/Contact.Application/Services/GenericService.cs (100%) rename backend/{src => }/Contact.Application/Services/OperationService.cs (100%) rename backend/{src => }/Contact.Application/Services/PageService.cs (100%) rename backend/{src => }/Contact.Application/Services/PermissionService.cs (100%) rename backend/{src => }/Contact.Application/Services/RolePermissionService.cs (100%) rename backend/{src => }/Contact.Application/Services/RoleService.cs (100%) rename backend/{src => }/Contact.Application/Services/UserService.cs (100%) rename backend/{src => }/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs (100%) rename backend/{src => }/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs (100%) rename backend/{src => }/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs (100%) rename backend/{src => }/Contact.Application/UseCases/ContactPerson/UpdateContactPerson.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Operations/CreateOperation.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Operations/OperationResponse.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Operations/UpdateOperation.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Pages/CreatePage.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Pages/PageResponse.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Pages/UpdatePage.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Permissions/CreatePermission.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Permissions/PermissionResponse.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Permissions/UpdatePermission.cs (100%) rename backend/{src => }/Contact.Application/UseCases/RolePermissions/CreateRolePermission.cs (100%) rename backend/{src => }/Contact.Application/UseCases/RolePermissions/RolePermissionMappingRequest.cs (100%) rename backend/{src => }/Contact.Application/UseCases/RolePermissions/RolePermissionMappingResponse.cs (100%) rename backend/{src => }/Contact.Application/UseCases/RolePermissions/RolePermissionResponse.cs (100%) rename backend/{src => }/Contact.Application/UseCases/RolePermissions/UpdateRolePermission.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Roles/CreateRole.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Roles/RoleResponse.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Roles/UpdateRole.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/AuthenticateRequest.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/AuthenticateResponse.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/ChangePassword.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/CreateUser.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/RegisterUser.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/RegisterUserValidator.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/ResetPassword.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/UpdateUser.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/UpdateUserRoles.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/UserResponse.cs (100%) rename backend/{src => }/Contact.Application/UseCases/Users/UserWithRolesResponse.cs (100%) rename backend/{src => }/Contact.Common/Contact.Common.csproj (100%) rename backend/{src => }/Contact.Domain/Contact.Domain.csproj (100%) rename backend/{src => }/Contact.Domain/Entities/ActivityLogEntry.cs (100%) rename backend/{src => }/Contact.Domain/Entities/BaseEntity.cs (100%) rename backend/{src => }/Contact.Domain/Entities/ContactPerson.cs (100%) rename backend/{src => }/Contact.Domain/Entities/Operation.cs (100%) rename backend/{src => }/Contact.Domain/Entities/Page.cs (100%) rename backend/{src => }/Contact.Domain/Entities/PageOperationMapping.cs (100%) rename backend/{src => }/Contact.Domain/Entities/Permission.cs (100%) rename backend/{src => }/Contact.Domain/Entities/Role.cs (100%) rename backend/{src => }/Contact.Domain/Entities/RolePermission.cs (100%) rename backend/{src => }/Contact.Domain/Entities/RolePermissionMapping.cs (100%) rename backend/{src => }/Contact.Domain/Entities/UpdatePassword.cs (100%) rename backend/{src => }/Contact.Domain/Entities/User.cs (100%) rename backend/{src => }/Contact.Domain/Entities/UserRole.cs (100%) rename backend/{src => }/Contact.Domain/Exceptions/BusinessException.cs (100%) rename backend/{src => }/Contact.Domain/Exceptions/ForbiddenException.cs (100%) rename backend/{src => }/Contact.Domain/Exceptions/NotAuthenticatedException.cs (100%) rename backend/{src => }/Contact.Domain/Exceptions/NotFoundException.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IActivityLogRepository.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IContactPersonRepository.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IEmailService.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IGenericRepository.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IOperationRepository.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IPageRepository.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IPermissionRepository.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IRolePermissionRepository.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IRoleRepository.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IUserRepository.cs (100%) rename backend/{src => }/Contact.Domain/Interfaces/IUserRoleRepository.cs (100%) rename backend/{src => }/Contact.Domain/Mappings/PermissionsByRoleMapping.cs (100%) rename backend/{src => }/Contact.Infrastructure/AppSettings.cs (100%) rename backend/{src => }/Contact.Infrastructure/Contact.Infrastructure.csproj (100%) rename backend/{src => }/Contact.Infrastructure/ExternalServices/EmailService.cs (100%) rename backend/{src => }/Contact.Infrastructure/InfrastructureServiceCollectionExtensions.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Helper/DapperHelper.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Helper/IDapperHelper.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/ActivityLogRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/ContactPersonRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/GenericRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/OperationRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/PageOperationMappingRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/PageRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/PermissionRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/RolePermissionRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/RoleRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/UserRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/Repositories/UserRoleRepository.cs (100%) rename backend/{src => }/Contact.Infrastructure/Persistence/UnitOfWork.cs (100%) rename backend/{src => }/Contact.Infrastructure/SmtpSettings.cs (100%) rename backend/{src => }/Dockerfile (58%) create mode 100644 frontend/proxy.conf.js create mode 100644 scripts/01-init-db.sh rename backend/scripts/seed-data.sql => scripts/02-seed-data.sql (100%) diff --git a/backend/src/Contact.Api.sln b/Contact.Api.sln similarity index 62% rename from backend/src/Contact.Api.sln rename to Contact.Api.sln index 0ae873e..babecb9 100644 --- a/backend/src/Contact.Api.sln +++ b/Contact.Api.sln @@ -1,17 +1,21 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.11.35208.52 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11222.15 d18.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Contact.Api", "Contact.Api\Contact.Api.csproj", "{E71B9B65-032D-4CC7-86B9-4712CC4E4B8E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Contact.Api", "backend\Contact.Api\Contact.Api.csproj", "{E71B9B65-032D-4CC7-86B9-4712CC4E4B8E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.Infrastructure", "Contact.Infrastructure\Contact.Infrastructure.csproj", "{AD68A223-AFC1-4A11-B056-82D1DEF146F0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.Infrastructure", "backend\Contact.Infrastructure\Contact.Infrastructure.csproj", "{AD68A223-AFC1-4A11-B056-82D1DEF146F0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.Application", "Contact.Application\Contact.Application.csproj", "{42EF202E-6AA6-42B8-9AE6-E4B06C36EB36}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.Application", "backend\Contact.Application\Contact.Application.csproj", "{42EF202E-6AA6-42B8-9AE6-E4B06C36EB36}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.Domain", "Contact.Domain\Contact.Domain.csproj", "{41338193-C8C7-4348-9011-C7D2C437B36C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.Domain", "backend\Contact.Domain\Contact.Domain.csproj", "{41338193-C8C7-4348-9011-C7D2C437B36C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.Common", "Contact.Common\Contact.Common.csproj", "{32C9230B-EE1E-4F3C-806F-685EB36C55F4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.Common", "backend\Contact.Common\Contact.Common.csproj", "{32C9230B-EE1E-4F3C-806F-685EB36C55F4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.AppHost", "aspire\AppHost\Contact.AppHost.csproj", "{9E5B8B78-8F0B-403E-A7AA-71A75C60D128}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contact.ServiceDefaults", "aspire\ServiceDefaults\Contact.ServiceDefaults.csproj", "{B649DAF0-42CE-92EA-0381-374285B927BF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,6 +43,14 @@ Global {32C9230B-EE1E-4F3C-806F-685EB36C55F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {32C9230B-EE1E-4F3C-806F-685EB36C55F4}.Release|Any CPU.ActiveCfg = Release|Any CPU {32C9230B-EE1E-4F3C-806F-685EB36C55F4}.Release|Any CPU.Build.0 = Release|Any CPU + {9E5B8B78-8F0B-403E-A7AA-71A75C60D128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E5B8B78-8F0B-403E-A7AA-71A75C60D128}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E5B8B78-8F0B-403E-A7AA-71A75C60D128}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E5B8B78-8F0B-403E-A7AA-71A75C60D128}.Release|Any CPU.Build.0 = Release|Any CPU + {B649DAF0-42CE-92EA-0381-374285B927BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B649DAF0-42CE-92EA-0381-374285B927BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B649DAF0-42CE-92EA-0381-374285B927BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B649DAF0-42CE-92EA-0381-374285B927BF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Dockerfile.api b/Dockerfile.api new file mode 100644 index 0000000..9cf7ce6 --- /dev/null +++ b/Dockerfile.api @@ -0,0 +1,39 @@ +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +WORKDIR /app +EXPOSE 8000 +ENV ASPNETCORE_URLS=http://+:8000 +RUN groupadd -g 2000 dotnet \ + && useradd -m -u 2000 -g 2000 dotnet +USER dotnet + +# This stage is used to build the service project +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +ARG BUILD_CONFIGURATION=Release +ARG DOTNET_SKIP_POLICY_LOADING=true +WORKDIR /src +COPY ["backend/Contact.Api/Contact.Api.csproj", "backend/Contact.Api/"] +COPY ["backend/Contact.Application/Contact.Application.csproj", "backend/Contact.Application/"] +COPY ["backend/Contact.Domain/Contact.Domain.csproj", "backend/Contact.Domain/"] +COPY ["backend/Contact.Infrastructure/Contact.Infrastructure.csproj", "backend/Contact.Infrastructure/"] +COPY ["backend/Contact.Common/Contact.Common.csproj", "backend/Contact.Common/"] +COPY ["aspire/ServiceDefaults/Contact.ServiceDefaults.csproj", "aspire/ServiceDefaults/"] + +RUN dotnet restore "./backend/Contact.Api/Contact.Api.csproj" +COPY backend/ backend/ +COPY aspire/ServiceDefaults/ aspire/ServiceDefaults/ +WORKDIR "/src/backend/Contact.Api" +RUN dotnet build "./Contact.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build + +RUN ls /app/build + +# This stage is used to publish the service project to be copied to the final stage +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./Contact.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration) +FROM base AS final +WORKDIR /app +# COPY --from=publish /app/publish/Contact.Api.dll . +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Contact.Api.dll"] diff --git a/backend/ApiCollection/Contacts/Delete Contacts.bru b/api-collection/Contacts/Delete Contacts.bru similarity index 100% rename from backend/ApiCollection/Contacts/Delete Contacts.bru rename to api-collection/Contacts/Delete Contacts.bru diff --git a/backend/ApiCollection/Contacts/Get Contacts By Id.bru b/api-collection/Contacts/Get Contacts By Id.bru similarity index 100% rename from backend/ApiCollection/Contacts/Get Contacts By Id.bru rename to api-collection/Contacts/Get Contacts By Id.bru diff --git a/backend/ApiCollection/Contacts/Get Contacts.bru b/api-collection/Contacts/Get Contacts.bru similarity index 100% rename from backend/ApiCollection/Contacts/Get Contacts.bru rename to api-collection/Contacts/Get Contacts.bru diff --git a/backend/ApiCollection/Contacts/Save Contact.bru b/api-collection/Contacts/Save Contact.bru similarity index 100% rename from backend/ApiCollection/Contacts/Save Contact.bru rename to api-collection/Contacts/Save Contact.bru diff --git a/backend/ApiCollection/Contacts/Update Contacts.bru b/api-collection/Contacts/Update Contacts.bru similarity index 100% rename from backend/ApiCollection/Contacts/Update Contacts.bru rename to api-collection/Contacts/Update Contacts.bru diff --git a/backend/ApiCollection/Operations/Get Operations.bru b/api-collection/Operations/Get Operations.bru similarity index 100% rename from backend/ApiCollection/Operations/Get Operations.bru rename to api-collection/Operations/Get Operations.bru diff --git a/backend/ApiCollection/Pages/Add Page.bru b/api-collection/Pages/Add Page.bru similarity index 100% rename from backend/ApiCollection/Pages/Add Page.bru rename to api-collection/Pages/Add Page.bru diff --git a/backend/ApiCollection/Pages/Delete Page.bru b/api-collection/Pages/Delete Page.bru similarity index 100% rename from backend/ApiCollection/Pages/Delete Page.bru rename to api-collection/Pages/Delete Page.bru diff --git a/backend/ApiCollection/Pages/Get Pages.bru b/api-collection/Pages/Get Pages.bru similarity index 100% rename from backend/ApiCollection/Pages/Get Pages.bru rename to api-collection/Pages/Get Pages.bru diff --git a/backend/ApiCollection/Pages/Update Page.bru b/api-collection/Pages/Update Page.bru similarity index 100% rename from backend/ApiCollection/Pages/Update Page.bru rename to api-collection/Pages/Update Page.bru diff --git a/backend/ApiCollection/Permissions/Add Permission.bru b/api-collection/Permissions/Add Permission.bru similarity index 100% rename from backend/ApiCollection/Permissions/Add Permission.bru rename to api-collection/Permissions/Add Permission.bru diff --git a/backend/ApiCollection/Permissions/Delete Permission.bru b/api-collection/Permissions/Delete Permission.bru similarity index 100% rename from backend/ApiCollection/Permissions/Delete Permission.bru rename to api-collection/Permissions/Delete Permission.bru diff --git a/backend/ApiCollection/Permissions/Get Permissions.bru b/api-collection/Permissions/Get Permissions.bru similarity index 100% rename from backend/ApiCollection/Permissions/Get Permissions.bru rename to api-collection/Permissions/Get Permissions.bru diff --git a/backend/ApiCollection/Permissions/Update Permission.bru b/api-collection/Permissions/Update Permission.bru similarity index 100% rename from backend/ApiCollection/Permissions/Update Permission.bru rename to api-collection/Permissions/Update Permission.bru diff --git a/backend/ApiCollection/RolePermission/Add Role Permission.bru b/api-collection/RolePermission/Add Role Permission.bru similarity index 100% rename from backend/ApiCollection/RolePermission/Add Role Permission.bru rename to api-collection/RolePermission/Add Role Permission.bru diff --git a/backend/ApiCollection/RolePermission/Delete Role Permission.bru b/api-collection/RolePermission/Delete Role Permission.bru similarity index 100% rename from backend/ApiCollection/RolePermission/Delete Role Permission.bru rename to api-collection/RolePermission/Delete Role Permission.bru diff --git a/backend/ApiCollection/RolePermission/Get Role Permissions Mapping.bru b/api-collection/RolePermission/Get Role Permissions Mapping.bru similarity index 100% rename from backend/ApiCollection/RolePermission/Get Role Permissions Mapping.bru rename to api-collection/RolePermission/Get Role Permissions Mapping.bru diff --git a/backend/ApiCollection/RolePermission/Get Role Permissions.bru b/api-collection/RolePermission/Get Role Permissions.bru similarity index 100% rename from backend/ApiCollection/RolePermission/Get Role Permissions.bru rename to api-collection/RolePermission/Get Role Permissions.bru diff --git a/backend/ApiCollection/RolePermission/Update Role Permissions.bru b/api-collection/RolePermission/Update Role Permissions.bru similarity index 100% rename from backend/ApiCollection/RolePermission/Update Role Permissions.bru rename to api-collection/RolePermission/Update Role Permissions.bru diff --git a/backend/ApiCollection/Roles/Add Role.bru b/api-collection/Roles/Add Role.bru similarity index 100% rename from backend/ApiCollection/Roles/Add Role.bru rename to api-collection/Roles/Add Role.bru diff --git a/backend/ApiCollection/Roles/Delete Role.bru b/api-collection/Roles/Delete Role.bru similarity index 100% rename from backend/ApiCollection/Roles/Delete Role.bru rename to api-collection/Roles/Delete Role.bru diff --git a/backend/ApiCollection/Roles/Get Roles.bru b/api-collection/Roles/Get Roles.bru similarity index 100% rename from backend/ApiCollection/Roles/Get Roles.bru rename to api-collection/Roles/Get Roles.bru diff --git a/backend/ApiCollection/Roles/Update Role.bru b/api-collection/Roles/Update Role.bru similarity index 100% rename from backend/ApiCollection/Roles/Update Role.bru rename to api-collection/Roles/Update Role.bru diff --git a/backend/ApiCollection/UserRoles/Get UserRoles.bru b/api-collection/UserRoles/Get UserRoles.bru similarity index 100% rename from backend/ApiCollection/UserRoles/Get UserRoles.bru rename to api-collection/UserRoles/Get UserRoles.bru diff --git a/backend/ApiCollection/Users/Autenticate.bru b/api-collection/Users/Autenticate.bru similarity index 100% rename from backend/ApiCollection/Users/Autenticate.bru rename to api-collection/Users/Autenticate.bru diff --git a/backend/ApiCollection/Users/Create User.bru b/api-collection/Users/Create User.bru similarity index 100% rename from backend/ApiCollection/Users/Create User.bru rename to api-collection/Users/Create User.bru diff --git a/backend/ApiCollection/Users/Get Current User.bru b/api-collection/Users/Get Current User.bru similarity index 100% rename from backend/ApiCollection/Users/Get Current User.bru rename to api-collection/Users/Get Current User.bru diff --git a/backend/ApiCollection/Users/Register User.bru b/api-collection/Users/Register User.bru similarity index 100% rename from backend/ApiCollection/Users/Register User.bru rename to api-collection/Users/Register User.bru diff --git a/backend/ApiCollection/Users/Update User.bru b/api-collection/Users/Update User.bru similarity index 100% rename from backend/ApiCollection/Users/Update User.bru rename to api-collection/Users/Update User.bru diff --git a/backend/ApiCollection/bruno.json b/api-collection/bruno.json similarity index 100% rename from backend/ApiCollection/bruno.json rename to api-collection/bruno.json diff --git a/backend/ApiCollection/environments/Local.bru b/api-collection/environments/Local.bru similarity index 100% rename from backend/ApiCollection/environments/Local.bru rename to api-collection/environments/Local.bru diff --git a/aspire/AppHost/AppHost.cs b/aspire/AppHost/AppHost.cs new file mode 100644 index 0000000..6116d6b --- /dev/null +++ b/aspire/AppHost/AppHost.cs @@ -0,0 +1,33 @@ +var builder = DistributedApplication.CreateBuilder(args); + +// PostgreSQL with pgAdmin +var postgresPassword = builder.AddParameter("postgres-password", secret: true); + +// Get the path to scripts folder relative to the solution +var scriptsPath = Path.Combine(builder.AppHostDirectory, "..", "..", "scripts"); + +var postgres = builder.AddPostgres("postgres", password: postgresPassword) + .WithDataVolume("postgres-data") + .WithPgAdmin() + .WithBindMount(scriptsPath, "/docker-entrypoint-initdb.d"); + +var contactsDb = postgres.AddDatabase("contactsdb", "contacts"); + +// Backend API - reference the PostgreSQL database +var api = builder.AddProject("contact-api") + .WithReference(contactsDb) + .WaitFor(contactsDb) + .WithEnvironment(context => + { + context.EnvironmentVariables["AppSettings__ConnectionStrings__DefaultConnection"] = contactsDb.Resource.ConnectionStringExpression; + }); + +// Angular Frontend +var frontend = builder.AddNpmApp("frontend", "../../frontend", "serve") + .WithReference(api) + .WaitFor(api) + .WithHttpEndpoint(targetPort: 4200, env: "PORT") + .WithExternalHttpEndpoints() + .PublishAsDockerFile(); + +builder.Build().Run(); diff --git a/aspire/AppHost/Contact.AppHost.csproj b/aspire/AppHost/Contact.AppHost.csproj new file mode 100644 index 0000000..7c6a1d5 --- /dev/null +++ b/aspire/AppHost/Contact.AppHost.csproj @@ -0,0 +1,23 @@ + + + + + + Exe + net9.0 + enable + enable + bb5b77e4-f73c-4004-b644-1baad7c5156e + + + + + + + + + + + + + diff --git a/aspire/AppHost/Properties/launchSettings.json b/aspire/AppHost/Properties/launchSettings.json new file mode 100644 index 0000000..c28488a --- /dev/null +++ b/aspire/AppHost/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:17216;http://localhost:15231", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21141", + "ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22224" + } + }, + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:15231", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19284", + "ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20156" + } + } + } +} diff --git a/aspire/AppHost/appsettings.Development.json b/aspire/AppHost/appsettings.Development.json new file mode 100644 index 0000000..959be71 --- /dev/null +++ b/aspire/AppHost/appsettings.Development.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "Parameters": { + "postgres-password": "YourStrongPassword123!" + } +} diff --git a/aspire/AppHost/appsettings.json b/aspire/AppHost/appsettings.json new file mode 100644 index 0000000..31c092a --- /dev/null +++ b/aspire/AppHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Aspire.Hosting.Dcp": "Warning" + } + } +} diff --git a/aspire/ServiceDefaults/Contact.ServiceDefaults.csproj b/aspire/ServiceDefaults/Contact.ServiceDefaults.csproj new file mode 100644 index 0000000..74b27d1 --- /dev/null +++ b/aspire/ServiceDefaults/Contact.ServiceDefaults.csproj @@ -0,0 +1,22 @@ + + + + net9.0 + enable + enable + true + + + + + + + + + + + + + + + diff --git a/aspire/ServiceDefaults/Extensions.cs b/aspire/ServiceDefaults/Extensions.cs new file mode 100644 index 0000000..b72c875 --- /dev/null +++ b/aspire/ServiceDefaults/Extensions.cs @@ -0,0 +1,127 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.ServiceDiscovery; +using OpenTelemetry; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; + +namespace Microsoft.Extensions.Hosting; + +// Adds common Aspire services: service discovery, resilience, health checks, and OpenTelemetry. +// This project should be referenced by each service project in your solution. +// To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults +public static class Extensions +{ + private const string HealthEndpointPath = "/health"; + private const string AlivenessEndpointPath = "/alive"; + + public static TBuilder AddServiceDefaults(this TBuilder builder) where TBuilder : IHostApplicationBuilder + { + builder.ConfigureOpenTelemetry(); + + builder.AddDefaultHealthChecks(); + + builder.Services.AddServiceDiscovery(); + + builder.Services.ConfigureHttpClientDefaults(http => + { + // Turn on resilience by default + http.AddStandardResilienceHandler(); + + // Turn on service discovery by default + http.AddServiceDiscovery(); + }); + + // Uncomment the following to restrict the allowed schemes for service discovery. + // builder.Services.Configure(options => + // { + // options.AllowedSchemes = ["https"]; + // }); + + return builder; + } + + public static TBuilder ConfigureOpenTelemetry(this TBuilder builder) where TBuilder : IHostApplicationBuilder + { + builder.Logging.AddOpenTelemetry(logging => + { + logging.IncludeFormattedMessage = true; + logging.IncludeScopes = true; + }); + + builder.Services.AddOpenTelemetry() + .WithMetrics(metrics => + { + metrics.AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddRuntimeInstrumentation(); + }) + .WithTracing(tracing => + { + tracing.AddSource(builder.Environment.ApplicationName) + .AddAspNetCoreInstrumentation(tracing => + // Exclude health check requests from tracing + tracing.Filter = context => + !context.Request.Path.StartsWithSegments(HealthEndpointPath) + && !context.Request.Path.StartsWithSegments(AlivenessEndpointPath) + ) + // Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package) + //.AddGrpcClientInstrumentation() + .AddHttpClientInstrumentation(); + }); + + builder.AddOpenTelemetryExporters(); + + return builder; + } + + private static TBuilder AddOpenTelemetryExporters(this TBuilder builder) where TBuilder : IHostApplicationBuilder + { + var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); + + if (useOtlpExporter) + { + builder.Services.AddOpenTelemetry().UseOtlpExporter(); + } + + // Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.AspNetCore package) + //if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"])) + //{ + // builder.Services.AddOpenTelemetry() + // .UseAzureMonitor(); + //} + + return builder; + } + + public static TBuilder AddDefaultHealthChecks(this TBuilder builder) where TBuilder : IHostApplicationBuilder + { + builder.Services.AddHealthChecks() + // Add a default liveness check to ensure app is responsive + .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]); + + return builder; + } + + public static WebApplication MapDefaultEndpoints(this WebApplication app) + { + // Adding health checks endpoints to applications in non-development environments has security implications. + // See https://aka.ms/dotnet/aspire/healthchecks for details before enabling these endpoints in non-development environments. + if (app.Environment.IsDevelopment()) + { + // All health checks must pass for app to be considered ready to accept traffic after starting + app.MapHealthChecks(HealthEndpointPath); + + // Only health checks tagged with the "live" tag must pass for app to be considered alive + app.MapHealthChecks(AlivenessEndpointPath, new HealthCheckOptions + { + Predicate = r => r.Tags.Contains("live") + }); + } + + return app; + } +} diff --git a/backend/src/Contact.Api/Contact.Api.csproj b/backend/Contact.Api/Contact.Api.csproj similarity index 88% rename from backend/src/Contact.Api/Contact.Api.csproj rename to backend/Contact.Api/Contact.Api.csproj index 6b9130d..5fda93b 100644 --- a/backend/src/Contact.Api/Contact.Api.csproj +++ b/backend/Contact.Api/Contact.Api.csproj @@ -14,6 +14,7 @@ + diff --git a/backend/src/Contact.Api/Contact.Api.http b/backend/Contact.Api/Contact.Api.http similarity index 100% rename from backend/src/Contact.Api/Contact.Api.http rename to backend/Contact.Api/Contact.Api.http diff --git a/backend/src/Contact.Api/Controllers/ContactPersonController.cs b/backend/Contact.Api/Controllers/ContactPersonController.cs similarity index 100% rename from backend/src/Contact.Api/Controllers/ContactPersonController.cs rename to backend/Contact.Api/Controllers/ContactPersonController.cs diff --git a/backend/src/Contact.Api/Controllers/OperationsController.cs b/backend/Contact.Api/Controllers/OperationsController.cs similarity index 100% rename from backend/src/Contact.Api/Controllers/OperationsController.cs rename to backend/Contact.Api/Controllers/OperationsController.cs diff --git a/backend/src/Contact.Api/Controllers/PagesController.cs b/backend/Contact.Api/Controllers/PagesController.cs similarity index 100% rename from backend/src/Contact.Api/Controllers/PagesController.cs rename to backend/Contact.Api/Controllers/PagesController.cs diff --git a/backend/src/Contact.Api/Controllers/PermissionsController.cs b/backend/Contact.Api/Controllers/PermissionsController.cs similarity index 100% rename from backend/src/Contact.Api/Controllers/PermissionsController.cs rename to backend/Contact.Api/Controllers/PermissionsController.cs diff --git a/backend/src/Contact.Api/Controllers/RolePermissionMappingController.cs b/backend/Contact.Api/Controllers/RolePermissionMappingController.cs similarity index 100% rename from backend/src/Contact.Api/Controllers/RolePermissionMappingController.cs rename to backend/Contact.Api/Controllers/RolePermissionMappingController.cs diff --git a/backend/src/Contact.Api/Controllers/RolePermissionsController.cs b/backend/Contact.Api/Controllers/RolePermissionsController.cs similarity index 100% rename from backend/src/Contact.Api/Controllers/RolePermissionsController.cs rename to backend/Contact.Api/Controllers/RolePermissionsController.cs diff --git a/backend/src/Contact.Api/Controllers/RolesController.cs b/backend/Contact.Api/Controllers/RolesController.cs similarity index 100% rename from backend/src/Contact.Api/Controllers/RolesController.cs rename to backend/Contact.Api/Controllers/RolesController.cs diff --git a/backend/src/Contact.Api/Controllers/UserRolesController.cs b/backend/Contact.Api/Controllers/UserRolesController.cs similarity index 100% rename from backend/src/Contact.Api/Controllers/UserRolesController.cs rename to backend/Contact.Api/Controllers/UserRolesController.cs diff --git a/backend/src/Contact.Api/Controllers/UsersController.cs b/backend/Contact.Api/Controllers/UsersController.cs similarity index 100% rename from backend/src/Contact.Api/Controllers/UsersController.cs rename to backend/Contact.Api/Controllers/UsersController.cs diff --git a/backend/src/Contact.Api/Core/Attributes/ActivityLogAttribute.cs b/backend/Contact.Api/Core/Attributes/ActivityLogAttribute.cs similarity index 100% rename from backend/src/Contact.Api/Core/Attributes/ActivityLogAttribute.cs rename to backend/Contact.Api/Core/Attributes/ActivityLogAttribute.cs diff --git a/backend/src/Contact.Api/Core/Attributes/AuthorizePermissionAttribute.cs b/backend/Contact.Api/Core/Attributes/AuthorizePermissionAttribute.cs similarity index 100% rename from backend/src/Contact.Api/Core/Attributes/AuthorizePermissionAttribute.cs rename to backend/Contact.Api/Core/Attributes/AuthorizePermissionAttribute.cs diff --git a/backend/src/Contact.Api/Core/Authorization/PermissionHandler.cs b/backend/Contact.Api/Core/Authorization/PermissionHandler.cs similarity index 100% rename from backend/src/Contact.Api/Core/Authorization/PermissionHandler.cs rename to backend/Contact.Api/Core/Authorization/PermissionHandler.cs diff --git a/backend/src/Contact.Api/Core/Authorization/PermissionRequirement.cs b/backend/Contact.Api/Core/Authorization/PermissionRequirement.cs similarity index 100% rename from backend/src/Contact.Api/Core/Authorization/PermissionRequirement.cs rename to backend/Contact.Api/Core/Authorization/PermissionRequirement.cs diff --git a/backend/src/Contact.Api/Core/Middleware/ActivityLoggingMiddleware.cs b/backend/Contact.Api/Core/Middleware/ActivityLoggingMiddleware.cs similarity index 100% rename from backend/src/Contact.Api/Core/Middleware/ActivityLoggingMiddleware.cs rename to backend/Contact.Api/Core/Middleware/ActivityLoggingMiddleware.cs diff --git a/backend/src/Contact.Api/Core/Middleware/CustomAuthorizationPolicyProvider.cs b/backend/Contact.Api/Core/Middleware/CustomAuthorizationPolicyProvider.cs similarity index 100% rename from backend/src/Contact.Api/Core/Middleware/CustomAuthorizationPolicyProvider.cs rename to backend/Contact.Api/Core/Middleware/CustomAuthorizationPolicyProvider.cs diff --git a/backend/src/Contact.Api/Core/Middleware/ExceptionMiddleware.cs b/backend/Contact.Api/Core/Middleware/ExceptionMiddleware.cs similarity index 100% rename from backend/src/Contact.Api/Core/Middleware/ExceptionMiddleware.cs rename to backend/Contact.Api/Core/Middleware/ExceptionMiddleware.cs diff --git a/backend/src/Contact.Api/Program.cs b/backend/Contact.Api/Program.cs similarity index 98% rename from backend/src/Contact.Api/Program.cs rename to backend/Contact.Api/Program.cs index c023b86..0841e72 100644 --- a/backend/src/Contact.Api/Program.cs +++ b/backend/Contact.Api/Program.cs @@ -10,6 +10,8 @@ var builder = WebApplication.CreateBuilder(args); +builder.AddServiceDefaults(); + // Add services to the container. builder.Services.AddInfrastrcutureServices(builder.Configuration); builder.Services.AddApplicationServices(builder.Configuration); @@ -67,6 +69,8 @@ var app = builder.Build(); +app.MapDefaultEndpoints(); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { diff --git a/backend/src/Contact.Api/Properties/launchSettings.json b/backend/Contact.Api/Properties/launchSettings.json similarity index 100% rename from backend/src/Contact.Api/Properties/launchSettings.json rename to backend/Contact.Api/Properties/launchSettings.json diff --git a/backend/src/Contact.Api/appsettings.Development-sample.json b/backend/Contact.Api/appsettings.Development-sample.json similarity index 100% rename from backend/src/Contact.Api/appsettings.Development-sample.json rename to backend/Contact.Api/appsettings.Development-sample.json diff --git a/backend/src/Contact.Api/appsettings.Development.json b/backend/Contact.Api/appsettings.Development.json similarity index 100% rename from backend/src/Contact.Api/appsettings.Development.json rename to backend/Contact.Api/appsettings.Development.json diff --git a/backend/src/Contact.Api/appsettings.json b/backend/Contact.Api/appsettings.json similarity index 100% rename from backend/src/Contact.Api/appsettings.json rename to backend/Contact.Api/appsettings.json diff --git a/backend/src/Contact.Api/wwwroot/data/role-permissions.json b/backend/Contact.Api/wwwroot/data/role-permissions.json similarity index 100% rename from backend/src/Contact.Api/wwwroot/data/role-permissions.json rename to backend/Contact.Api/wwwroot/data/role-permissions.json diff --git a/backend/src/Contact.Application/AppSettings.cs b/backend/Contact.Application/AppSettings.cs similarity index 100% rename from backend/src/Contact.Application/AppSettings.cs rename to backend/Contact.Application/AppSettings.cs diff --git a/backend/src/Contact.Application/ApplicationServiceCollectionExtensions.cs b/backend/Contact.Application/ApplicationServiceCollectionExtensions.cs similarity index 100% rename from backend/src/Contact.Application/ApplicationServiceCollectionExtensions.cs rename to backend/Contact.Application/ApplicationServiceCollectionExtensions.cs diff --git a/backend/src/Contact.Application/Contact.Application.csproj b/backend/Contact.Application/Contact.Application.csproj similarity index 100% rename from backend/src/Contact.Application/Contact.Application.csproj rename to backend/Contact.Application/Contact.Application.csproj diff --git a/backend/src/Contact.Application/Interfaces/IActivityLogService.cs b/backend/Contact.Application/Interfaces/IActivityLogService.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IActivityLogService.cs rename to backend/Contact.Application/Interfaces/IActivityLogService.cs diff --git a/backend/src/Contact.Application/Interfaces/IContactPersonService.cs b/backend/Contact.Application/Interfaces/IContactPersonService.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IContactPersonService.cs rename to backend/Contact.Application/Interfaces/IContactPersonService.cs diff --git a/backend/src/Contact.Application/Interfaces/IGenericService.cs b/backend/Contact.Application/Interfaces/IGenericService.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IGenericService.cs rename to backend/Contact.Application/Interfaces/IGenericService.cs diff --git a/backend/src/Contact.Application/Interfaces/IOperationService.cs b/backend/Contact.Application/Interfaces/IOperationService.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IOperationService.cs rename to backend/Contact.Application/Interfaces/IOperationService.cs diff --git a/backend/src/Contact.Application/Interfaces/IPageService.cs b/backend/Contact.Application/Interfaces/IPageService.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IPageService.cs rename to backend/Contact.Application/Interfaces/IPageService.cs diff --git a/backend/src/Contact.Application/Interfaces/IPermissionService.cs b/backend/Contact.Application/Interfaces/IPermissionService.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IPermissionService.cs rename to backend/Contact.Application/Interfaces/IPermissionService.cs diff --git a/backend/src/Contact.Application/Interfaces/IRolePermissionService.cs b/backend/Contact.Application/Interfaces/IRolePermissionService.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IRolePermissionService.cs rename to backend/Contact.Application/Interfaces/IRolePermissionService.cs diff --git a/backend/src/Contact.Application/Interfaces/IRoleService.cs b/backend/Contact.Application/Interfaces/IRoleService.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IRoleService.cs rename to backend/Contact.Application/Interfaces/IRoleService.cs diff --git a/backend/src/Contact.Application/Interfaces/IUnitOfWork.cs b/backend/Contact.Application/Interfaces/IUnitOfWork.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IUnitOfWork.cs rename to backend/Contact.Application/Interfaces/IUnitOfWork.cs diff --git a/backend/src/Contact.Application/Interfaces/IUserService.cs b/backend/Contact.Application/Interfaces/IUserService.cs similarity index 100% rename from backend/src/Contact.Application/Interfaces/IUserService.cs rename to backend/Contact.Application/Interfaces/IUserService.cs diff --git a/backend/src/Contact.Application/Mappings/BaseMappingProfile.cs b/backend/Contact.Application/Mappings/BaseMappingProfile.cs similarity index 100% rename from backend/src/Contact.Application/Mappings/BaseMappingProfile.cs rename to backend/Contact.Application/Mappings/BaseMappingProfile.cs diff --git a/backend/src/Contact.Application/Mappings/ContactPersonPofile.cs b/backend/Contact.Application/Mappings/ContactPersonPofile.cs similarity index 100% rename from backend/src/Contact.Application/Mappings/ContactPersonPofile.cs rename to backend/Contact.Application/Mappings/ContactPersonPofile.cs diff --git a/backend/src/Contact.Application/Mappings/OperationMappingProfile.cs b/backend/Contact.Application/Mappings/OperationMappingProfile.cs similarity index 100% rename from backend/src/Contact.Application/Mappings/OperationMappingProfile.cs rename to backend/Contact.Application/Mappings/OperationMappingProfile.cs diff --git a/backend/src/Contact.Application/Mappings/PageMappingProfile.cs b/backend/Contact.Application/Mappings/PageMappingProfile.cs similarity index 100% rename from backend/src/Contact.Application/Mappings/PageMappingProfile.cs rename to backend/Contact.Application/Mappings/PageMappingProfile.cs diff --git a/backend/src/Contact.Application/Mappings/PermissionMappingProfile.cs b/backend/Contact.Application/Mappings/PermissionMappingProfile.cs similarity index 100% rename from backend/src/Contact.Application/Mappings/PermissionMappingProfile.cs rename to backend/Contact.Application/Mappings/PermissionMappingProfile.cs diff --git a/backend/src/Contact.Application/Mappings/RoleMappingProfile.cs b/backend/Contact.Application/Mappings/RoleMappingProfile.cs similarity index 100% rename from backend/src/Contact.Application/Mappings/RoleMappingProfile.cs rename to backend/Contact.Application/Mappings/RoleMappingProfile.cs diff --git a/backend/src/Contact.Application/Mappings/RolePermissionMappingProfile.cs b/backend/Contact.Application/Mappings/RolePermissionMappingProfile.cs similarity index 94% rename from backend/src/Contact.Application/Mappings/RolePermissionMappingProfile.cs rename to backend/Contact.Application/Mappings/RolePermissionMappingProfile.cs index 0eb5557..c0f2127 100644 --- a/backend/src/Contact.Application/Mappings/RolePermissionMappingProfile.cs +++ b/backend/Contact.Application/Mappings/RolePermissionMappingProfile.cs @@ -12,7 +12,6 @@ public RolePermissionMappingProfile(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor) { CreateMap(); - CreateMap(); CreateMap() .AfterMap((src, dest) => SetAuditFields(src, dest)); CreateMap() diff --git a/backend/src/Contact.Application/Mappings/UserMappingProfile.cs b/backend/Contact.Application/Mappings/UserMappingProfile.cs similarity index 100% rename from backend/src/Contact.Application/Mappings/UserMappingProfile.cs rename to backend/Contact.Application/Mappings/UserMappingProfile.cs diff --git a/backend/src/Contact.Application/Services/ActivityLogService.cs b/backend/Contact.Application/Services/ActivityLogService.cs similarity index 100% rename from backend/src/Contact.Application/Services/ActivityLogService.cs rename to backend/Contact.Application/Services/ActivityLogService.cs diff --git a/backend/src/Contact.Application/Services/ContactPersonService.cs b/backend/Contact.Application/Services/ContactPersonService.cs similarity index 100% rename from backend/src/Contact.Application/Services/ContactPersonService.cs rename to backend/Contact.Application/Services/ContactPersonService.cs diff --git a/backend/src/Contact.Application/Services/GenericService.cs b/backend/Contact.Application/Services/GenericService.cs similarity index 100% rename from backend/src/Contact.Application/Services/GenericService.cs rename to backend/Contact.Application/Services/GenericService.cs diff --git a/backend/src/Contact.Application/Services/OperationService.cs b/backend/Contact.Application/Services/OperationService.cs similarity index 100% rename from backend/src/Contact.Application/Services/OperationService.cs rename to backend/Contact.Application/Services/OperationService.cs diff --git a/backend/src/Contact.Application/Services/PageService.cs b/backend/Contact.Application/Services/PageService.cs similarity index 100% rename from backend/src/Contact.Application/Services/PageService.cs rename to backend/Contact.Application/Services/PageService.cs diff --git a/backend/src/Contact.Application/Services/PermissionService.cs b/backend/Contact.Application/Services/PermissionService.cs similarity index 100% rename from backend/src/Contact.Application/Services/PermissionService.cs rename to backend/Contact.Application/Services/PermissionService.cs diff --git a/backend/src/Contact.Application/Services/RolePermissionService.cs b/backend/Contact.Application/Services/RolePermissionService.cs similarity index 100% rename from backend/src/Contact.Application/Services/RolePermissionService.cs rename to backend/Contact.Application/Services/RolePermissionService.cs diff --git a/backend/src/Contact.Application/Services/RoleService.cs b/backend/Contact.Application/Services/RoleService.cs similarity index 100% rename from backend/src/Contact.Application/Services/RoleService.cs rename to backend/Contact.Application/Services/RoleService.cs diff --git a/backend/src/Contact.Application/Services/UserService.cs b/backend/Contact.Application/Services/UserService.cs similarity index 100% rename from backend/src/Contact.Application/Services/UserService.cs rename to backend/Contact.Application/Services/UserService.cs diff --git a/backend/src/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs b/backend/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs rename to backend/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs diff --git a/backend/src/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs b/backend/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs rename to backend/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs diff --git a/backend/src/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs b/backend/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs rename to backend/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs diff --git a/backend/src/Contact.Application/UseCases/ContactPerson/UpdateContactPerson.cs b/backend/Contact.Application/UseCases/ContactPerson/UpdateContactPerson.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/ContactPerson/UpdateContactPerson.cs rename to backend/Contact.Application/UseCases/ContactPerson/UpdateContactPerson.cs diff --git a/backend/src/Contact.Application/UseCases/Operations/CreateOperation.cs b/backend/Contact.Application/UseCases/Operations/CreateOperation.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Operations/CreateOperation.cs rename to backend/Contact.Application/UseCases/Operations/CreateOperation.cs diff --git a/backend/src/Contact.Application/UseCases/Operations/OperationResponse.cs b/backend/Contact.Application/UseCases/Operations/OperationResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Operations/OperationResponse.cs rename to backend/Contact.Application/UseCases/Operations/OperationResponse.cs diff --git a/backend/src/Contact.Application/UseCases/Operations/UpdateOperation.cs b/backend/Contact.Application/UseCases/Operations/UpdateOperation.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Operations/UpdateOperation.cs rename to backend/Contact.Application/UseCases/Operations/UpdateOperation.cs diff --git a/backend/src/Contact.Application/UseCases/Pages/CreatePage.cs b/backend/Contact.Application/UseCases/Pages/CreatePage.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Pages/CreatePage.cs rename to backend/Contact.Application/UseCases/Pages/CreatePage.cs diff --git a/backend/src/Contact.Application/UseCases/Pages/PageResponse.cs b/backend/Contact.Application/UseCases/Pages/PageResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Pages/PageResponse.cs rename to backend/Contact.Application/UseCases/Pages/PageResponse.cs diff --git a/backend/src/Contact.Application/UseCases/Pages/UpdatePage.cs b/backend/Contact.Application/UseCases/Pages/UpdatePage.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Pages/UpdatePage.cs rename to backend/Contact.Application/UseCases/Pages/UpdatePage.cs diff --git a/backend/src/Contact.Application/UseCases/Permissions/CreatePermission.cs b/backend/Contact.Application/UseCases/Permissions/CreatePermission.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Permissions/CreatePermission.cs rename to backend/Contact.Application/UseCases/Permissions/CreatePermission.cs diff --git a/backend/src/Contact.Application/UseCases/Permissions/PermissionResponse.cs b/backend/Contact.Application/UseCases/Permissions/PermissionResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Permissions/PermissionResponse.cs rename to backend/Contact.Application/UseCases/Permissions/PermissionResponse.cs diff --git a/backend/src/Contact.Application/UseCases/Permissions/UpdatePermission.cs b/backend/Contact.Application/UseCases/Permissions/UpdatePermission.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Permissions/UpdatePermission.cs rename to backend/Contact.Application/UseCases/Permissions/UpdatePermission.cs diff --git a/backend/src/Contact.Application/UseCases/RolePermissions/CreateRolePermission.cs b/backend/Contact.Application/UseCases/RolePermissions/CreateRolePermission.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/RolePermissions/CreateRolePermission.cs rename to backend/Contact.Application/UseCases/RolePermissions/CreateRolePermission.cs diff --git a/backend/src/Contact.Application/UseCases/RolePermissions/RolePermissionMappingRequest.cs b/backend/Contact.Application/UseCases/RolePermissions/RolePermissionMappingRequest.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/RolePermissions/RolePermissionMappingRequest.cs rename to backend/Contact.Application/UseCases/RolePermissions/RolePermissionMappingRequest.cs diff --git a/backend/src/Contact.Application/UseCases/RolePermissions/RolePermissionMappingResponse.cs b/backend/Contact.Application/UseCases/RolePermissions/RolePermissionMappingResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/RolePermissions/RolePermissionMappingResponse.cs rename to backend/Contact.Application/UseCases/RolePermissions/RolePermissionMappingResponse.cs diff --git a/backend/src/Contact.Application/UseCases/RolePermissions/RolePermissionResponse.cs b/backend/Contact.Application/UseCases/RolePermissions/RolePermissionResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/RolePermissions/RolePermissionResponse.cs rename to backend/Contact.Application/UseCases/RolePermissions/RolePermissionResponse.cs diff --git a/backend/src/Contact.Application/UseCases/RolePermissions/UpdateRolePermission.cs b/backend/Contact.Application/UseCases/RolePermissions/UpdateRolePermission.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/RolePermissions/UpdateRolePermission.cs rename to backend/Contact.Application/UseCases/RolePermissions/UpdateRolePermission.cs diff --git a/backend/src/Contact.Application/UseCases/Roles/CreateRole.cs b/backend/Contact.Application/UseCases/Roles/CreateRole.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Roles/CreateRole.cs rename to backend/Contact.Application/UseCases/Roles/CreateRole.cs diff --git a/backend/src/Contact.Application/UseCases/Roles/RoleResponse.cs b/backend/Contact.Application/UseCases/Roles/RoleResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Roles/RoleResponse.cs rename to backend/Contact.Application/UseCases/Roles/RoleResponse.cs diff --git a/backend/src/Contact.Application/UseCases/Roles/UpdateRole.cs b/backend/Contact.Application/UseCases/Roles/UpdateRole.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Roles/UpdateRole.cs rename to backend/Contact.Application/UseCases/Roles/UpdateRole.cs diff --git a/backend/src/Contact.Application/UseCases/Users/AuthenticateRequest.cs b/backend/Contact.Application/UseCases/Users/AuthenticateRequest.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/AuthenticateRequest.cs rename to backend/Contact.Application/UseCases/Users/AuthenticateRequest.cs diff --git a/backend/src/Contact.Application/UseCases/Users/AuthenticateResponse.cs b/backend/Contact.Application/UseCases/Users/AuthenticateResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/AuthenticateResponse.cs rename to backend/Contact.Application/UseCases/Users/AuthenticateResponse.cs diff --git a/backend/src/Contact.Application/UseCases/Users/ChangePassword.cs b/backend/Contact.Application/UseCases/Users/ChangePassword.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/ChangePassword.cs rename to backend/Contact.Application/UseCases/Users/ChangePassword.cs diff --git a/backend/src/Contact.Application/UseCases/Users/CreateUser.cs b/backend/Contact.Application/UseCases/Users/CreateUser.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/CreateUser.cs rename to backend/Contact.Application/UseCases/Users/CreateUser.cs diff --git a/backend/src/Contact.Application/UseCases/Users/RegisterUser.cs b/backend/Contact.Application/UseCases/Users/RegisterUser.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/RegisterUser.cs rename to backend/Contact.Application/UseCases/Users/RegisterUser.cs diff --git a/backend/src/Contact.Application/UseCases/Users/RegisterUserValidator.cs b/backend/Contact.Application/UseCases/Users/RegisterUserValidator.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/RegisterUserValidator.cs rename to backend/Contact.Application/UseCases/Users/RegisterUserValidator.cs diff --git a/backend/src/Contact.Application/UseCases/Users/ResetPassword.cs b/backend/Contact.Application/UseCases/Users/ResetPassword.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/ResetPassword.cs rename to backend/Contact.Application/UseCases/Users/ResetPassword.cs diff --git a/backend/src/Contact.Application/UseCases/Users/UpdateUser.cs b/backend/Contact.Application/UseCases/Users/UpdateUser.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/UpdateUser.cs rename to backend/Contact.Application/UseCases/Users/UpdateUser.cs diff --git a/backend/src/Contact.Application/UseCases/Users/UpdateUserRoles.cs b/backend/Contact.Application/UseCases/Users/UpdateUserRoles.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/UpdateUserRoles.cs rename to backend/Contact.Application/UseCases/Users/UpdateUserRoles.cs diff --git a/backend/src/Contact.Application/UseCases/Users/UserResponse.cs b/backend/Contact.Application/UseCases/Users/UserResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/UserResponse.cs rename to backend/Contact.Application/UseCases/Users/UserResponse.cs diff --git a/backend/src/Contact.Application/UseCases/Users/UserWithRolesResponse.cs b/backend/Contact.Application/UseCases/Users/UserWithRolesResponse.cs similarity index 100% rename from backend/src/Contact.Application/UseCases/Users/UserWithRolesResponse.cs rename to backend/Contact.Application/UseCases/Users/UserWithRolesResponse.cs diff --git a/backend/src/Contact.Common/Contact.Common.csproj b/backend/Contact.Common/Contact.Common.csproj similarity index 100% rename from backend/src/Contact.Common/Contact.Common.csproj rename to backend/Contact.Common/Contact.Common.csproj diff --git a/backend/src/Contact.Domain/Contact.Domain.csproj b/backend/Contact.Domain/Contact.Domain.csproj similarity index 100% rename from backend/src/Contact.Domain/Contact.Domain.csproj rename to backend/Contact.Domain/Contact.Domain.csproj diff --git a/backend/src/Contact.Domain/Entities/ActivityLogEntry.cs b/backend/Contact.Domain/Entities/ActivityLogEntry.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/ActivityLogEntry.cs rename to backend/Contact.Domain/Entities/ActivityLogEntry.cs diff --git a/backend/src/Contact.Domain/Entities/BaseEntity.cs b/backend/Contact.Domain/Entities/BaseEntity.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/BaseEntity.cs rename to backend/Contact.Domain/Entities/BaseEntity.cs diff --git a/backend/src/Contact.Domain/Entities/ContactPerson.cs b/backend/Contact.Domain/Entities/ContactPerson.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/ContactPerson.cs rename to backend/Contact.Domain/Entities/ContactPerson.cs diff --git a/backend/src/Contact.Domain/Entities/Operation.cs b/backend/Contact.Domain/Entities/Operation.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/Operation.cs rename to backend/Contact.Domain/Entities/Operation.cs diff --git a/backend/src/Contact.Domain/Entities/Page.cs b/backend/Contact.Domain/Entities/Page.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/Page.cs rename to backend/Contact.Domain/Entities/Page.cs diff --git a/backend/src/Contact.Domain/Entities/PageOperationMapping.cs b/backend/Contact.Domain/Entities/PageOperationMapping.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/PageOperationMapping.cs rename to backend/Contact.Domain/Entities/PageOperationMapping.cs diff --git a/backend/src/Contact.Domain/Entities/Permission.cs b/backend/Contact.Domain/Entities/Permission.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/Permission.cs rename to backend/Contact.Domain/Entities/Permission.cs diff --git a/backend/src/Contact.Domain/Entities/Role.cs b/backend/Contact.Domain/Entities/Role.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/Role.cs rename to backend/Contact.Domain/Entities/Role.cs diff --git a/backend/src/Contact.Domain/Entities/RolePermission.cs b/backend/Contact.Domain/Entities/RolePermission.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/RolePermission.cs rename to backend/Contact.Domain/Entities/RolePermission.cs diff --git a/backend/src/Contact.Domain/Entities/RolePermissionMapping.cs b/backend/Contact.Domain/Entities/RolePermissionMapping.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/RolePermissionMapping.cs rename to backend/Contact.Domain/Entities/RolePermissionMapping.cs diff --git a/backend/src/Contact.Domain/Entities/UpdatePassword.cs b/backend/Contact.Domain/Entities/UpdatePassword.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/UpdatePassword.cs rename to backend/Contact.Domain/Entities/UpdatePassword.cs diff --git a/backend/src/Contact.Domain/Entities/User.cs b/backend/Contact.Domain/Entities/User.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/User.cs rename to backend/Contact.Domain/Entities/User.cs diff --git a/backend/src/Contact.Domain/Entities/UserRole.cs b/backend/Contact.Domain/Entities/UserRole.cs similarity index 100% rename from backend/src/Contact.Domain/Entities/UserRole.cs rename to backend/Contact.Domain/Entities/UserRole.cs diff --git a/backend/src/Contact.Domain/Exceptions/BusinessException.cs b/backend/Contact.Domain/Exceptions/BusinessException.cs similarity index 100% rename from backend/src/Contact.Domain/Exceptions/BusinessException.cs rename to backend/Contact.Domain/Exceptions/BusinessException.cs diff --git a/backend/src/Contact.Domain/Exceptions/ForbiddenException.cs b/backend/Contact.Domain/Exceptions/ForbiddenException.cs similarity index 100% rename from backend/src/Contact.Domain/Exceptions/ForbiddenException.cs rename to backend/Contact.Domain/Exceptions/ForbiddenException.cs diff --git a/backend/src/Contact.Domain/Exceptions/NotAuthenticatedException.cs b/backend/Contact.Domain/Exceptions/NotAuthenticatedException.cs similarity index 100% rename from backend/src/Contact.Domain/Exceptions/NotAuthenticatedException.cs rename to backend/Contact.Domain/Exceptions/NotAuthenticatedException.cs diff --git a/backend/src/Contact.Domain/Exceptions/NotFoundException.cs b/backend/Contact.Domain/Exceptions/NotFoundException.cs similarity index 100% rename from backend/src/Contact.Domain/Exceptions/NotFoundException.cs rename to backend/Contact.Domain/Exceptions/NotFoundException.cs diff --git a/backend/src/Contact.Domain/Interfaces/IActivityLogRepository.cs b/backend/Contact.Domain/Interfaces/IActivityLogRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IActivityLogRepository.cs rename to backend/Contact.Domain/Interfaces/IActivityLogRepository.cs diff --git a/backend/src/Contact.Domain/Interfaces/IContactPersonRepository.cs b/backend/Contact.Domain/Interfaces/IContactPersonRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IContactPersonRepository.cs rename to backend/Contact.Domain/Interfaces/IContactPersonRepository.cs diff --git a/backend/src/Contact.Domain/Interfaces/IEmailService.cs b/backend/Contact.Domain/Interfaces/IEmailService.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IEmailService.cs rename to backend/Contact.Domain/Interfaces/IEmailService.cs diff --git a/backend/src/Contact.Domain/Interfaces/IGenericRepository.cs b/backend/Contact.Domain/Interfaces/IGenericRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IGenericRepository.cs rename to backend/Contact.Domain/Interfaces/IGenericRepository.cs diff --git a/backend/src/Contact.Domain/Interfaces/IOperationRepository.cs b/backend/Contact.Domain/Interfaces/IOperationRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IOperationRepository.cs rename to backend/Contact.Domain/Interfaces/IOperationRepository.cs diff --git a/backend/src/Contact.Domain/Interfaces/IPageRepository.cs b/backend/Contact.Domain/Interfaces/IPageRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IPageRepository.cs rename to backend/Contact.Domain/Interfaces/IPageRepository.cs diff --git a/backend/src/Contact.Domain/Interfaces/IPermissionRepository.cs b/backend/Contact.Domain/Interfaces/IPermissionRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IPermissionRepository.cs rename to backend/Contact.Domain/Interfaces/IPermissionRepository.cs diff --git a/backend/src/Contact.Domain/Interfaces/IRolePermissionRepository.cs b/backend/Contact.Domain/Interfaces/IRolePermissionRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IRolePermissionRepository.cs rename to backend/Contact.Domain/Interfaces/IRolePermissionRepository.cs diff --git a/backend/src/Contact.Domain/Interfaces/IRoleRepository.cs b/backend/Contact.Domain/Interfaces/IRoleRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IRoleRepository.cs rename to backend/Contact.Domain/Interfaces/IRoleRepository.cs diff --git a/backend/src/Contact.Domain/Interfaces/IUserRepository.cs b/backend/Contact.Domain/Interfaces/IUserRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IUserRepository.cs rename to backend/Contact.Domain/Interfaces/IUserRepository.cs diff --git a/backend/src/Contact.Domain/Interfaces/IUserRoleRepository.cs b/backend/Contact.Domain/Interfaces/IUserRoleRepository.cs similarity index 100% rename from backend/src/Contact.Domain/Interfaces/IUserRoleRepository.cs rename to backend/Contact.Domain/Interfaces/IUserRoleRepository.cs diff --git a/backend/src/Contact.Domain/Mappings/PermissionsByRoleMapping.cs b/backend/Contact.Domain/Mappings/PermissionsByRoleMapping.cs similarity index 100% rename from backend/src/Contact.Domain/Mappings/PermissionsByRoleMapping.cs rename to backend/Contact.Domain/Mappings/PermissionsByRoleMapping.cs diff --git a/backend/src/Contact.Infrastructure/AppSettings.cs b/backend/Contact.Infrastructure/AppSettings.cs similarity index 100% rename from backend/src/Contact.Infrastructure/AppSettings.cs rename to backend/Contact.Infrastructure/AppSettings.cs diff --git a/backend/src/Contact.Infrastructure/Contact.Infrastructure.csproj b/backend/Contact.Infrastructure/Contact.Infrastructure.csproj similarity index 100% rename from backend/src/Contact.Infrastructure/Contact.Infrastructure.csproj rename to backend/Contact.Infrastructure/Contact.Infrastructure.csproj diff --git a/backend/src/Contact.Infrastructure/ExternalServices/EmailService.cs b/backend/Contact.Infrastructure/ExternalServices/EmailService.cs similarity index 100% rename from backend/src/Contact.Infrastructure/ExternalServices/EmailService.cs rename to backend/Contact.Infrastructure/ExternalServices/EmailService.cs diff --git a/backend/src/Contact.Infrastructure/InfrastructureServiceCollectionExtensions.cs b/backend/Contact.Infrastructure/InfrastructureServiceCollectionExtensions.cs similarity index 100% rename from backend/src/Contact.Infrastructure/InfrastructureServiceCollectionExtensions.cs rename to backend/Contact.Infrastructure/InfrastructureServiceCollectionExtensions.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Helper/DapperHelper.cs b/backend/Contact.Infrastructure/Persistence/Helper/DapperHelper.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Helper/DapperHelper.cs rename to backend/Contact.Infrastructure/Persistence/Helper/DapperHelper.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Helper/IDapperHelper.cs b/backend/Contact.Infrastructure/Persistence/Helper/IDapperHelper.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Helper/IDapperHelper.cs rename to backend/Contact.Infrastructure/Persistence/Helper/IDapperHelper.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/ActivityLogRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/ActivityLogRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/ActivityLogRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/ActivityLogRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/ContactPersonRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/ContactPersonRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/ContactPersonRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/ContactPersonRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/GenericRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/GenericRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/GenericRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/GenericRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/OperationRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/OperationRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/OperationRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/OperationRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/PageOperationMappingRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/PageOperationMappingRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/PageOperationMappingRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/PageOperationMappingRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/PageRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/PageRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/PageRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/PageRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/PermissionRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/PermissionRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/PermissionRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/PermissionRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/RolePermissionRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/RolePermissionRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/RolePermissionRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/RolePermissionRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/RoleRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/RoleRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/RoleRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/RoleRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/UserRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/UserRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/UserRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/UserRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/Repositories/UserRoleRepository.cs b/backend/Contact.Infrastructure/Persistence/Repositories/UserRoleRepository.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/Repositories/UserRoleRepository.cs rename to backend/Contact.Infrastructure/Persistence/Repositories/UserRoleRepository.cs diff --git a/backend/src/Contact.Infrastructure/Persistence/UnitOfWork.cs b/backend/Contact.Infrastructure/Persistence/UnitOfWork.cs similarity index 100% rename from backend/src/Contact.Infrastructure/Persistence/UnitOfWork.cs rename to backend/Contact.Infrastructure/Persistence/UnitOfWork.cs diff --git a/backend/src/Contact.Infrastructure/SmtpSettings.cs b/backend/Contact.Infrastructure/SmtpSettings.cs similarity index 100% rename from backend/src/Contact.Infrastructure/SmtpSettings.cs rename to backend/Contact.Infrastructure/SmtpSettings.cs diff --git a/backend/src/Dockerfile b/backend/Dockerfile similarity index 58% rename from backend/src/Dockerfile rename to backend/Dockerfile index 570516c..9cf7ce6 100644 --- a/backend/src/Dockerfile +++ b/backend/Dockerfile @@ -11,15 +11,17 @@ FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release ARG DOTNET_SKIP_POLICY_LOADING=true WORKDIR /src -COPY ["Contact.Api/Contact.Api.csproj", "Contact.Api/"] -COPY ["Contact.Application/Contact.Application.csproj", "Contact.Application/"] -COPY ["Contact.Domain/Contact.Domain.csproj", "Contact.Domain/"] -COPY ["Contact.Infrastructure/Contact.Infrastructure.csproj", "Contact.Infrastructure/"] -COPY ["Contact.Common/Contact.Common.csproj", "Contact.Common/"] +COPY ["backend/Contact.Api/Contact.Api.csproj", "backend/Contact.Api/"] +COPY ["backend/Contact.Application/Contact.Application.csproj", "backend/Contact.Application/"] +COPY ["backend/Contact.Domain/Contact.Domain.csproj", "backend/Contact.Domain/"] +COPY ["backend/Contact.Infrastructure/Contact.Infrastructure.csproj", "backend/Contact.Infrastructure/"] +COPY ["backend/Contact.Common/Contact.Common.csproj", "backend/Contact.Common/"] +COPY ["aspire/ServiceDefaults/Contact.ServiceDefaults.csproj", "aspire/ServiceDefaults/"] -RUN dotnet restore "./Contact.Api/Contact.Api.csproj" -COPY . . -WORKDIR "/src/Contact.Api" +RUN dotnet restore "./backend/Contact.Api/Contact.Api.csproj" +COPY backend/ backend/ +COPY aspire/ServiceDefaults/ aspire/ServiceDefaults/ +WORKDIR "/src/backend/Contact.Api" RUN dotnet build "./Contact.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build RUN ls /app/build diff --git a/docker-compose.yml b/docker-compose.yml index faf94e3..09f9f30 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,8 +10,8 @@ services: api: build: - context: ./backend/src - dockerfile: Dockerfile + context: . + dockerfile: Dockerfile.api args: - configuration=Release environment: @@ -43,7 +43,7 @@ services: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - - ./backend/scripts:/docker-entrypoint-initdb.d + - ./scripts:/docker-entrypoint-initdb.d networks: - postgres_network diff --git a/frontend/package.json b/frontend/package.json index 9de5834..f2e72eb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,7 +5,7 @@ "ng": "ng", "start": "ng serve", "dev": "ng serve --proxy-config proxy.conf.json", - "serve": "ng serve --host 0.0.0.0 --port 4200 --disable-host-check --proxy-config proxy.conf.json", + "serve": "ng serve --host 0.0.0.0 --port 4200 --proxy-config proxy.conf.js", "build": "ng build", "watch": "ng build --watch --configuration development", "test": "ng test", diff --git a/frontend/proxy.conf.js b/frontend/proxy.conf.js new file mode 100644 index 0000000..cf61cc6 --- /dev/null +++ b/frontend/proxy.conf.js @@ -0,0 +1,16 @@ +const PROXY_CONFIG = [ + { + context: ['/api'], + target: process.env['services__contact-api__https__0'] || + process.env['services__contact-api__http__0'] || + 'http://localhost:5217', + secure: false, + changeOrigin: true, + logLevel: 'debug', + ws: true + } +]; + +console.log('API Proxy Target:', PROXY_CONFIG[0].target); + +module.exports = PROXY_CONFIG; diff --git a/frontend/proxy.conf.json b/frontend/proxy.conf.json index 1558dc9..2d5bd32 100644 --- a/frontend/proxy.conf.json +++ b/frontend/proxy.conf.json @@ -1,8 +1,9 @@ { "/api": { - "target": "http://backend:5000", + "target": "http://localhost:5217", "secure": false, "changeOrigin": true, - "logLevel": "debug" + "logLevel": "debug", + "ws": true } } diff --git a/scripts/01-init-db.sh b/scripts/01-init-db.sh new file mode 100644 index 0000000..3a3b2a9 --- /dev/null +++ b/scripts/01-init-db.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +# Create the contacts database if it doesn't exist +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "postgres" <<-EOSQL + SELECT 'CREATE DATABASE contacts' + WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'contacts')\gexec +EOSQL + +# Run the seed script against the contacts database +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "contacts" -f /docker-entrypoint-initdb.d/02-seed-data.sql diff --git a/backend/scripts/seed-data.sql b/scripts/02-seed-data.sql similarity index 100% rename from backend/scripts/seed-data.sql rename to scripts/02-seed-data.sql From 557dfb2ccdf769d4dcb881ba96e8638c3ffe9e04 Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Sun, 30 Nov 2025 20:40:40 -0500 Subject: [PATCH 02/10] Upgrade .NET SDK and dependencies to version 10.0; update PostgreSQL image to 17-alpine and add pgAdmin service to docker-compose. --- Dockerfile.api | 4 +- aspire/AppHost/Contact.AppHost.csproj | 2 +- .../Contact.ServiceDefaults.csproj | 16 +++---- backend/Contact.Api/Contact.Api.csproj | 8 ++-- backend/Contact.Api/Program.cs | 47 +++++++------------ .../Properties/launchSettings.json | 8 ++-- .../Contact.Application.csproj | 10 ++-- backend/Contact.Common/Contact.Common.csproj | 2 +- backend/Contact.Domain/Contact.Domain.csproj | 2 +- .../Contact.Infrastructure.csproj | 12 ++--- docker-compose.yml | 15 +++++- 11 files changed, 64 insertions(+), 62 deletions(-) diff --git a/Dockerfile.api b/Dockerfile.api index 9cf7ce6..0dae24f 100644 --- a/Dockerfile.api +++ b/Dockerfile.api @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base WORKDIR /app EXPOSE 8000 ENV ASPNETCORE_URLS=http://+:8000 @@ -7,7 +7,7 @@ RUN groupadd -g 2000 dotnet \ USER dotnet # This stage is used to build the service project -FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG BUILD_CONFIGURATION=Release ARG DOTNET_SKIP_POLICY_LOADING=true WORKDIR /src diff --git a/aspire/AppHost/Contact.AppHost.csproj b/aspire/AppHost/Contact.AppHost.csproj index 7c6a1d5..7117496 100644 --- a/aspire/AppHost/Contact.AppHost.csproj +++ b/aspire/AppHost/Contact.AppHost.csproj @@ -4,7 +4,7 @@ Exe - net9.0 + net10.0 enable enable bb5b77e4-f73c-4004-b644-1baad7c5156e diff --git a/aspire/ServiceDefaults/Contact.ServiceDefaults.csproj b/aspire/ServiceDefaults/Contact.ServiceDefaults.csproj index 74b27d1..1aa2ba9 100644 --- a/aspire/ServiceDefaults/Contact.ServiceDefaults.csproj +++ b/aspire/ServiceDefaults/Contact.ServiceDefaults.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable enable true @@ -10,13 +10,13 @@ - - - - - - - + + + + + + + diff --git a/backend/Contact.Api/Contact.Api.csproj b/backend/Contact.Api/Contact.Api.csproj index 5fda93b..5bed9aa 100644 --- a/backend/Contact.Api/Contact.Api.csproj +++ b/backend/Contact.Api/Contact.Api.csproj @@ -1,16 +1,18 @@ - net9.0 + net10.0 enable enable 49b39230-4f26-4ba3-94cd-9738b4b66435 Linux + true - - + + + diff --git a/backend/Contact.Api/Program.cs b/backend/Contact.Api/Program.cs index 0841e72..66f7f9c 100644 --- a/backend/Contact.Api/Program.cs +++ b/backend/Contact.Api/Program.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; using Microsoft.IdentityModel.Tokens; +using Scalar.AspNetCore; using System.Text; @@ -32,40 +33,15 @@ ValidAudience = appSettings.Audience, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(appSettings.Secret)) }; - //options.Events = new JwtBearerEvents() - //{ - // OnAuthenticationFailed = c => - // { - // c.NoResult(); - // c.Response.StatusCode = 500; - // c.Response.ContentType = "text/plain"; - // return c.Response.WriteAsync(c.Exception.ToString()); - // }, - // OnChallenge = context => - // { - // context.HandleResponse(); - // context.Response.StatusCode = 401; - // context.Response.ContentType = "application/json"; - // var result = JsonSerializer.Serialize(new { Message = "You are not Authorized" }); - // return context.Response.WriteAsync(result); - // }, - // OnForbidden = context => - // { - // context.Response.StatusCode = 403; - // context.Response.ContentType = "application/json"; - // var result = JsonSerializer.Serialize(new { Message = "You are not authorized to access this resource" }); - // return context.Response.WriteAsync(result); - // }, - //}; }); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddControllers(); -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle -builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); + +// Configure OpenAPI +builder.Services.AddOpenApi(); var app = builder.Build(); @@ -74,9 +50,20 @@ // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { - app.UseSwagger(); - app.UseSwaggerUI(); + app.MapOpenApi(); + app.MapScalarApiReference(options => + { + options.WithTitle("Contact API") + .WithTheme(ScalarTheme.BluePlanet) + .WithDefaultHttpClient(ScalarTarget.CSharp, ScalarClient.HttpClient) + .WithPreferredScheme("Bearer") + .WithHttpBearerAuthentication(bearer => + { + bearer.Token = ""; + }); + }); } + app.UseMiddleware(); app.UseMiddleware(); app.UseHttpsRedirection(); diff --git a/backend/Contact.Api/Properties/launchSettings.json b/backend/Contact.Api/Properties/launchSettings.json index 56ad8a5..c157ad5 100644 --- a/backend/Contact.Api/Properties/launchSettings.json +++ b/backend/Contact.Api/Properties/launchSettings.json @@ -3,7 +3,7 @@ "http": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "swagger", + "launchUrl": "scalar/v1", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, @@ -13,7 +13,7 @@ "https": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "swagger", + "launchUrl": "scalar/v1", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, @@ -23,7 +23,7 @@ "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, - "launchUrl": "swagger", + "launchUrl": "scalar/v1", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } @@ -31,7 +31,7 @@ "Container (Dockerfile)": { "commandName": "Docker", "launchBrowser": true, - "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/scalar/v1", "environmentVariables": { "ASPNETCORE_HTTPS_PORTS": "8081", "ASPNETCORE_HTTP_PORTS": "8080" diff --git a/backend/Contact.Application/Contact.Application.csproj b/backend/Contact.Application/Contact.Application.csproj index a787525..a677d89 100644 --- a/backend/Contact.Application/Contact.Application.csproj +++ b/backend/Contact.Application/Contact.Application.csproj @@ -1,16 +1,16 @@  - net9.0 + net10.0 enable enable - - - - + + + + diff --git a/backend/Contact.Common/Contact.Common.csproj b/backend/Contact.Common/Contact.Common.csproj index d502bd5..c0da314 100644 --- a/backend/Contact.Common/Contact.Common.csproj +++ b/backend/Contact.Common/Contact.Common.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable diff --git a/backend/Contact.Domain/Contact.Domain.csproj b/backend/Contact.Domain/Contact.Domain.csproj index 8732b82..e4e596c 100644 --- a/backend/Contact.Domain/Contact.Domain.csproj +++ b/backend/Contact.Domain/Contact.Domain.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable diff --git a/backend/Contact.Infrastructure/Contact.Infrastructure.csproj b/backend/Contact.Infrastructure/Contact.Infrastructure.csproj index efd4523..dcfa142 100644 --- a/backend/Contact.Infrastructure/Contact.Infrastructure.csproj +++ b/backend/Contact.Infrastructure/Contact.Infrastructure.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 enable enable @@ -13,11 +13,11 @@ - - - - - + + + + + diff --git a/docker-compose.yml b/docker-compose.yml index 09f9f30..6c6463b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,7 +33,7 @@ services: - postgres_network postgres: - image: postgres:16-alpine + image: postgres:17-alpine container_name: postgres_db environment: - POSTGRES_USER=${POSTGRES_USER} @@ -47,6 +47,19 @@ services: networks: - postgres_network + pgadmin: + image: dpage/pgadmin4:latest + container_name: pgadmin + environment: + - PGADMIN_DEFAULT_EMAIL=${PGADMIN_EMAIL:-admin@admin.com} + - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD:-admin} + ports: + - "5050:80" + depends_on: + - postgres + networks: + - postgres_network + nginx: build: loadbalancer container_name: nginx From a2eff71251eb666c364d761b65d02b18777d74bd Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Sun, 30 Nov 2025 21:14:27 -0500 Subject: [PATCH 03/10] chore: update dependencies and version; refactor header and layout components - Bump Angular and related dependencies to version 21.0.1 - Update Express to version 4.21.0 - Update TypeScript to version 5.9.0 - Update Tailwind CSS and PostCSS dependencies - Refactor HostListener decorators in HeaderComponent and LayoutComponent to remove unused event parameters - Add Fluent 2 Design System tokens and utility classes to Tailwind CSS for consistent styling --- README.md | 123 +- docs/aspire-guide.md | 248 + docs/backend.md | 67 +- docs/development-guide.md | 52 +- docs/docker-guide.md | 17 +- docs/frontend.md | 14 +- docs/index.md | 88 +- frontend/.nvmrc | 1 + frontend/angular.json | 2 +- frontend/package-lock.json | 5976 ++++++++--------- frontend/package.json | 44 +- .../@core/layout/header/header.component.ts | 2 +- .../src/app/@core/layout/layout.component.ts | 2 +- frontend/src/app/styles/tailwind.css | 292 + 14 files changed, 3686 insertions(+), 3242 deletions(-) create mode 100644 docs/aspire-guide.md create mode 100644 frontend/.nvmrc diff --git a/README.md b/README.md index b890cdd..ac5a322 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,5 @@ # 🚀 Clean Architecture Full-Stack Starter: .NET, Angular, and PostgreSQL - -

Angular Build @@ -16,9 +10,10 @@ MIT License - Angular 20 - .NET 9 - PostgreSQL 16 + Angular 21 + .NET 10 + PostgreSQL 17 + .NET Aspire 9.5

@@ -32,9 +27,10 @@ A production-ready **full-stack starter kit** built with modern technologies and best practices: -- **Frontend**: Angular 20 with signals, Material Design, and TailwindCSS -- **Backend**: .NET 9 API with Clean Architecture -- **Database**: PostgreSQL with Dapper +- **Frontend**: Angular 21 with signals, Material Design, TailwindCSS v4, and Fluent Design +- **Backend**: .NET 10 API with Clean Architecture and Scalar API documentation +- **Database**: PostgreSQL 17 with pgAdmin and Dapper ORM +- **Orchestration**: .NET Aspire 9.5 for local development with service discovery - **DevOps**: Docker, GitHub Actions, NGINX Perfect for developers who want to **focus on business logic** instead of configuring infrastructure. @@ -56,6 +52,43 @@ Clean Architecture provides **significant benefits** for your application: ## 🚀 Quick Start +### Option 1: Using .NET Aspire (Recommended for Development) + +**.NET Aspire** provides a streamlined local development experience with automatic service discovery, health monitoring, and an integrated dashboard. + +#### Prerequisites + +> ⚠️ **Important**: Make sure you have the correct versions installed before proceeding. + +- [.NET SDK 10.0](https://dotnet.microsoft.com/download/dotnet/10.0) or later +- [Node.js 22 LTS](https://nodejs.org/) (**not** Node 23 - use LTS version only) +- [Docker Desktop](https://www.docker.com/products/docker-desktop) (for PostgreSQL container) + +#### Steps + +```bash +# Clone the repository +git clone https://github.com/nitin27may/clean-architecture-docker-dotnet-angular.git clean-app +cd clean-app + +# IMPORTANT: Install Angular dependencies first +cd frontend +npm install +cd .. + +# Run with Aspire +dotnet run --project aspire/AppHost +``` + +🔗 Then access: +- **Aspire Dashboard**: https://localhost:17178 (see all services, logs, traces) +- **Frontend**: http://localhost:4200 +- **API**: http://localhost:5217 +- **Scalar API Docs**: http://localhost:5217/scalar/v1 +- **pgAdmin**: Check Aspire dashboard for the assigned port + +### Option 2: Using Docker Compose (Production-like) + ```bash # Clone the repository git clone https://github.com/nitin27may/clean-architecture-docker-dotnet-angular.git clean-app @@ -71,7 +104,7 @@ docker-compose up 🔗 Then access: - Frontend: http://localhost - API: http://localhost/api -- Swagger: http://localhost/swagger +- Scalar API Docs: http://localhost/scalar/v1 ### 👤 Default Users @@ -88,12 +121,13 @@ docker-compose up

📱 Modern Frontend

    -
  • Angular 20 with standalone components
  • +
  • Angular 21 with standalone components
  • Signal-based state management
  • -
  • Material Design + TailwindCSS
  • +
  • Material Design + TailwindCSS v4
  • +
  • Fluent Design System tokens
  • Dark/light theme support
  • Responsive mobile-first design
  • -
  • Role Based Routing and Menu
  • +
  • Role-based routing and menu
@@ -103,24 +137,56 @@ docker-compose up
  • Generic Repository pattern
  • JWT authentication
  • Role-based permissions
  • -
  • User Activity Logging
  • -
  • Golbal Exception Handling
  • -
  • PostgreSQL with Dapper
  • +
  • User activity logging
  • +
  • Global exception handling
  • +
  • Scalar API documentation
  • +
  • PostgreSQL 17 with Dapper
  • 🚢 DevOps Ready

      +
    • .NET Aspire orchestration
    • Docker containerization
    • GitHub Actions workflows
    • NGINX reverse proxy
    • +
    • pgAdmin database management
    • Multi-environment configs
    • -
    • Database migrations
    • +
    • Database seeding
    +## 📁 Project Structure + +``` +clean-architecture-docker-dotnet-angular/ +├── aspire/ # .NET Aspire orchestration +│ ├── AppHost/ # Aspire host application +│ │ └── AppHost.cs # Service configuration +│ └── ServiceDefaults/ # Shared Aspire defaults +├── backend/ # .NET 10 API (Clean Architecture) +│ ├── Contact.Api/ # API Layer (Controllers, Middleware) +│ ├── Contact.Application/ # Application Layer (Services, DTOs) +│ ├── Contact.Domain/ # Domain Layer (Entities, Interfaces) +│ ├── Contact.Infrastructure/ # Infrastructure Layer (Repositories) +│ └── Contact.Common/ # Shared utilities +├── frontend/ # Angular 21 SPA +│ ├── src/app/@core/ # Core module (guards, interceptors, layout) +│ ├── src/app/feature/ # Feature modules (contact, user, admin) +│ └── src/app/styles/ # Global styles, Tailwind config +├── scripts/ # Database initialization +│ ├── 01-init-db.sh # Create database +│ └── 02-seed-data.sql # Seed initial data +├── api-collection/ # Bruno API collection for testing +├── docs/ # Documentation +├── loadbalancer/ # NGINX configuration +├── Contact.Api.sln # .NET Solution file +├── docker-compose.yml # Docker Compose configuration +└── Dockerfile.api # API Dockerfile +``` + ## 🧩 Architecture

    @@ -133,13 +199,28 @@ docker-compose up 📖 Comprehensive documentation is available: +- [Aspire Guide](./docs/aspire-guide.md) - Running with .NET Aspire - [Development Guide](./docs/development-guide.md) - Get started with development - [Frontend Documentation](./docs/frontend.md) - Angular architecture details - [Backend Documentation](./docs/backend.md) - .NET API implementation +- [Docker Guide](./docs/docker-guide.md) - Container configuration - [Feature List](./docs/visual-feature-guide.md) - Detailed feature breakdown - [Clean Architecture Series](./docs/architecture-series.md) - In-depth articles - [Roadmap](./docs/roadmap.md) - Upcoming features +## 🛠️ Technology Stack + +| Layer | Technology | Version | +|-------|------------|---------| +| Frontend | Angular | 21.0 | +| UI Components | Angular Material | 21.0 | +| CSS Framework | TailwindCSS | 4.1 | +| Backend | .NET | 10.0 | +| API Docs | Scalar | 2.1 | +| Database | PostgreSQL | 17 | +| ORM | Dapper | 2.1 | +| Orchestration | .NET Aspire | 9.5 | +| Containerization | Docker | Latest | ## 🤝 Contributing @@ -155,4 +236,4 @@ For questions or support, please contact Nitin Singh at nitin27may@gmail.com. ## 🌟 Star the Repository -If you find this project useful, please consider giving it a star on GitHub to show your support! \ No newline at end of file +If you find this project useful, please consider giving it a star on GitHub to show your support! diff --git a/docs/aspire-guide.md b/docs/aspire-guide.md new file mode 100644 index 0000000..464e595 --- /dev/null +++ b/docs/aspire-guide.md @@ -0,0 +1,248 @@ +# .NET Aspire Guide + +This guide explains how to run the Clean Architecture application using .NET Aspire for local development. + +## What is .NET Aspire? + +.NET Aspire is a cloud-ready stack for building observable, production-ready, distributed applications. It provides: + +- **Service Discovery**: Automatic service registration and discovery +- **Orchestration**: Start and manage all application components from a single command +- **Observability**: Built-in dashboard with logs, traces, and metrics +- **Container Management**: Automatic container lifecycle management +- **Health Monitoring**: Real-time health checks for all services + +## Prerequisites + +Before running the application with Aspire, ensure you have: + +| Requirement | Version | Download | +|-------------|---------|----------| +| .NET SDK | 10.0+ | [Download](https://dotnet.microsoft.com/download/dotnet/10.0) | +| Node.js | 22 LTS | [Download](https://nodejs.org/) | +| Docker Desktop | Latest | [Download](https://www.docker.com/products/docker-desktop) | + +> ⚠️ **Important**: Use Node.js 22 LTS, not Node.js 23. Odd-numbered Node.js versions are not LTS and may have compatibility issues with Angular. + +### Verify Installations + +```powershell +# Check .NET version +dotnet --version +# Should output: 10.0.x or higher + +# Check Node.js version +node --version +# Should output: v22.x.x + +# Check npm version +npm --version +# Should output: 10.x.x or higher + +# Check Docker is running +docker --version +``` + +## Project Structure + +``` +clean-architecture-docker-dotnet-angular/ +├── aspire/ +│ ├── AppHost/ # Aspire orchestration host +│ │ ├── AppHost.cs # Service definitions +│ │ └── AppHost.csproj # Project file +│ └── ServiceDefaults/ # Shared Aspire configurations +│ ├── Extensions.cs # Extension methods +│ └── ServiceDefaults.csproj +``` + +## Running with Aspire + +### Step 1: Install Frontend Dependencies + +Before starting Aspire, you must install the Angular dependencies: + +```bash +cd frontend +npm install +cd .. +``` + +### Step 2: Start Aspire + +From the repository root: + +```bash +dotnet run --project aspire/AppHost +``` + +### Step 3: Access the Dashboard + +Once started, Aspire will display URLs in the console. Open the **Aspire Dashboard** (typically at `https://localhost:17178`) to see all services. + +## Services Overview + +When running with Aspire, the following services are orchestrated: + +| Service | Description | Default Port | +|---------|-------------|--------------| +| **postgres** | PostgreSQL 17 database | 5432 | +| **pgadmin** | PostgreSQL admin interface | Dynamic | +| **contact-api** | .NET 10 backend API | 5217 | +| **frontend** | Angular 21 application | 4200 | + +## Aspire Dashboard Features + +### Resources View + +View all running services, their status, and endpoints: + +![Aspire Resources](screenshots/aspire-resources.png) + +### Console Logs + +Real-time aggregated logs from all services: + +- Filter by service +- Search within logs +- Color-coded log levels + +### Traces + +Distributed tracing across services: + +- Request timelines +- Service dependencies +- Performance bottlenecks + +### Metrics + +Built-in metrics collection: + +- Request rates +- Response times +- Error rates + +## Configuration + +### AppHost.cs Overview + +The `aspire/AppHost/AppHost.cs` file defines all services: + +```csharp +var builder = DistributedApplication.CreateBuilder(args); + +// PostgreSQL with pgAdmin +var postgres = builder.AddPostgres("postgres") + .WithPgAdmin() + .WithDataVolume(); + +var contactsDb = postgres.AddDatabase("contacts"); + +// .NET API with reference to database +var api = builder.AddProject("contact-api") + .WithReference(contactsDb); + +// Angular frontend with reference to API +builder.AddNpmApp("frontend", "../../frontend", "serve") + .WithReference(api) + .WithEndpoint(port: 4200, scheme: "http"); +``` + +### Database Connection + +Aspire automatically: +1. Creates the PostgreSQL container +2. Generates connection strings +3. Injects them into the API service + +No manual connection string configuration needed! + +### Environment Variables + +Aspire injects these automatically: +- `ConnectionStrings__contacts` - Database connection string +- `services__contact-api__http__0` - API URL for frontend + +## Troubleshooting + +### Error: Cannot find module '@angular/cli' + +**Solution**: Install frontend dependencies first: +```bash +cd frontend +npm install +cd .. +``` + +### Error: Port already in use + +**Solution**: Stop any services using the conflicting ports: +```powershell +# Find process using port 5217 +netstat -ano | findstr :5217 +# Kill the process +taskkill /PID /F +``` + +### Error: Docker not running + +**Solution**: Start Docker Desktop and wait for it to fully initialize. + +### Error: Database not initialized + +**Solution**: The database is automatically created on first run. If issues persist: +1. Stop Aspire +2. Remove the PostgreSQL volume: `docker volume rm ` +3. Restart Aspire + +### Error: Frontend not building + +**Solution**: Check Node.js version: +```bash +node --version # Should be v22.x.x +``` + +If using nvm: +```bash +nvm use 22 +``` + +## Development Workflow + +### Hot Reload + +- **Frontend**: Angular uses `ng serve` with automatic hot reload +- **Backend**: .NET uses hot reload by default in development mode + +### Making Changes + +1. **Frontend changes**: Save files, Angular CLI automatically rebuilds +2. **Backend changes**: Save files, .NET hot reload applies changes +3. **Database changes**: Update seed scripts in `scripts/` folder + +### Viewing Logs + +Use the Aspire Dashboard to view logs from all services in one place, or check individual terminal outputs. + +## Stopping Aspire + +Press `Ctrl+C` in the terminal running Aspire to gracefully stop all services. + +## Comparison: Aspire vs Docker Compose + +| Feature | Aspire | Docker Compose | +|---------|--------|----------------| +| Best for | Local development | Production deployment | +| Service discovery | Automatic | Manual configuration | +| Hot reload | Built-in | Requires volume mounts | +| Dashboard | Included | Separate tools needed | +| Container management | Automatic | Manual | +| Debug integration | Native VS/VS Code | Requires attach | + +## Next Steps + +- [Development Guide](./development-guide.md) - Detailed development setup +- [Backend Documentation](./backend.md) - API architecture +- [Frontend Documentation](./frontend.md) - Angular structure +- [Docker Guide](./docker-guide.md) - Production deployment diff --git a/docs/backend.md b/docs/backend.md index 5ccba37..da10295 100644 --- a/docs/backend.md +++ b/docs/backend.md @@ -8,7 +8,7 @@ permalink: /backend ## Overview -The backend of this project is built with .NET 9, following Clean Architecture principles. It provides a robust API layer for the Angular frontend, using Dapper for efficient data access and PostgreSQL as the database. +The backend of this project is built with **.NET 10**, following Clean Architecture principles. It provides a robust API layer for the Angular frontend, using Dapper for efficient data access and PostgreSQL 17 as the database. API documentation is provided via **Scalar** (replacing Swagger/Swashbuckle).

    @@ -19,15 +19,16 @@ The backend of this project is built with .NET 9, following Clean Architecture p ## Technology Stack -- **.NET 9** +- **.NET 10** - ASP.NET Core Web API - Minimal API approach where applicable - Modern dependency injection system - Middleware pipeline + - .NET Aspire 9.5 for orchestration - **Data Access** - Dapper for efficient data access - - PostgreSQL database + - PostgreSQL 17 database - Generic Repository pattern - Unit of Work for transaction management @@ -187,55 +188,33 @@ namespace Contact.Api.Controllers } ``` -## API Documentation with Swagger +## API Documentation with Scalar -The API is fully documented using Swagger/OpenAPI: +The API is documented using **Scalar**, a modern API documentation tool that replaces Swagger UI:
    -

    API documentation with Swagger UI available at /swagger endpoint

    +

    API documentation with Scalar available at /scalar/v1 endpoint

    ```csharp -// Swagger Configuration in Program.cs -builder.Services.AddSwaggerGen(c => +// Scalar Configuration in Program.cs +builder.Services.AddOpenApi(); + +// In the middleware pipeline +if (app.Environment.IsDevelopment()) { - c.SwaggerDoc("v1", new OpenApiInfo - { - Title = "Contact API", - Version = "v1", - Description = "API for managing contacts in Clean Architecture" - }); - - // Security Definition for JWT - c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme - { - Description = "JWT Authorization header using the Bearer scheme", - Name = "Authorization", - In = ParameterLocation.Header, - Type = SecuritySchemeType.Http, - Scheme = "bearer" - }); - - c.AddSecurityRequirement(new OpenApiSecurityRequirement + app.MapOpenApi(); + app.MapScalarApiReference(options => { - { - new OpenApiSecurityScheme + options + .WithTitle("Contact API") + .WithPreferredScheme("Bearer") + .WithHttpBearerAuthentication(bearer => { - Reference = new OpenApiReference - { - Type = ReferenceType.SecurityScheme, - Id = "Bearer" - } - }, - Array.Empty() - } + bearer.Token = "your-jwt-token"; + }); }); - - // Include XML Comments - var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; - var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - c.IncludeXmlComments(xmlPath); -}); +} ``` ## Key Design Patterns @@ -841,7 +820,7 @@ The backend is containerized with Docker for both production and development env ```dockerfile # Production Dockerfile -FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base WORKDIR /app EXPOSE 8000 ENV ASPNETCORE_URLS=http://+:8000 @@ -850,7 +829,7 @@ RUN groupadd -g 2000 dotnet \ USER dotnet # Build stage -FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG BUILD_CONFIGURATION=Release ARG DOTNET_SKIP_POLICY_LOADING=true WORKDIR /src diff --git a/docs/development-guide.md b/docs/development-guide.md index b3f99ca..dd64bc6 100644 --- a/docs/development-guide.md +++ b/docs/development-guide.md @@ -15,8 +15,12 @@ Before you begin, ensure you have the following installed: - [Docker Desktop](https://www.docker.com/products/docker-desktop) (latest version) - [Git](https://git-scm.com/downloads) - [Visual Studio Code](https://code.visualstudio.com/) (recommended) or another IDE -- [.NET 9 SDK](https://dotnet.microsoft.com/download) (for local development without Docker) -- [Node.js](https://nodejs.org/) (LTS version, for local development without Docker) +- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) (for local development without Docker) +- [Node.js 22 LTS](https://nodejs.org/) (**Not** Node 23 - use LTS version only) + +> ⚠️ **Important**: When running with .NET Aspire, ensure you have the correct versions installed: +> - .NET SDK 10.0 or later +> - Node.js 22 LTS (not Node 23) ## Getting the Code @@ -29,10 +33,45 @@ cd clean-architecture-docker-dotnet-angular ## Development Options -You have two primary options for development: +You have three primary options for development: + +1. **.NET Aspire** (recommended for local development) +2. **Docker-based development** (recommended for production-like environment) +3. Local development (separate setup for frontend and backend) + +## .NET Aspire Development (Recommended) + +.NET Aspire provides the best local development experience with automatic service discovery, integrated dashboard, and easy debugging. + +### Starting with Aspire + +```bash +# Install frontend dependencies first +cd frontend +npm install +cd .. + +# Run with Aspire +dotnet run --project aspire/AppHost +``` + +### Aspire Dashboard + +Once started, access the Aspire Dashboard (typically at `https://localhost:17178`) to: +- View all running services and their status +- Access aggregated logs from all services +- View distributed traces +- Monitor service health + +### Aspire URLs + +- **Aspire Dashboard**: https://localhost:17178 +- **Frontend**: http://localhost:4200 +- **API**: http://localhost:5217 +- **API Docs (Scalar)**: http://localhost:5217/scalar/v1 +- **pgAdmin**: Check Aspire dashboard for assigned port -1. **Docker-based development** (recommended) -2. Local development (separate setup for frontend and backend) +For more details, see the [Aspire Guide](./aspire-guide.md). ## Docker-based Development @@ -69,7 +108,8 @@ This will start the following services: ### Development URLs - **Frontend**: http://localhost:4200 -- **API**: http://localhost:5000/swagger +- **API**: http://localhost:5217 +- **API Docs (Scalar)**: http://localhost:5217/scalar/v1 - **API through NGINX**: http://localhost/api ### Rebuilding Containers diff --git a/docs/docker-guide.md b/docs/docker-guide.md index 0c25378..fb136aa 100644 --- a/docs/docker-guide.md +++ b/docs/docker-guide.md @@ -27,11 +27,14 @@ The application uses Docker to containerize all services for consistent developm The Docker setup includes: -- Frontend container (Angular 20) -- Backend API container (.NET 9) -- Database container (PostgreSQL) +- Frontend container (Angular 21) +- Backend API container (.NET 10) +- Database container (PostgreSQL 17) +- pgAdmin container (Database management) - Nginx container (Reverse proxy/Load balancer) +> **Tip**: For local development, consider using [.NET Aspire](./aspire-guide.md) which provides a streamlined experience with automatic service discovery and an integrated dashboard. + ## Dockerfiles ### Frontend Dockerfile @@ -40,7 +43,7 @@ Located at `frontend/Dockerfile`, this file builds the Angular application: ```dockerfile # Build stage -FROM node:20-alpine AS build +FROM node:22-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci @@ -77,7 +80,7 @@ This is a multi-stage build that: Located at `backend/src/Dockerfile`, this file builds the .NET API: ```dockerfile -FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base WORKDIR /app EXPOSE 8000 ENV ASPNETCORE_URLS=http://+:8000 @@ -86,7 +89,7 @@ RUN groupadd -g 2000 dotnet \ USER dotnet # Build stage -FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG BUILD_CONFIGURATION=Release ARG DOTNET_SKIP_POLICY_LOADING=true WORKDIR /src @@ -209,7 +212,7 @@ services: - db db: - image: postgres:16-alpine + image: postgres:17-alpine container_name: db restart: always environment: diff --git a/docs/frontend.md b/docs/frontend.md index 2a9162b..8fa9125 100644 --- a/docs/frontend.md +++ b/docs/frontend.md @@ -8,7 +8,7 @@ permalink: /Frontend ## Overview -The frontend of this project is built with Angular 20, leveraging modern Angular features including standalone components, signals for state management, the inject() function for dependency injection, and a powerful combination of Angular Material and TailwindCSS for styling. +The frontend of this project is built with **Angular 21**, leveraging modern Angular features including standalone components, signals for state management, the inject() function for dependency injection, and a powerful combination of Angular Material 21 and TailwindCSS v4 with **Fluent Design System** tokens for styling.
    @@ -19,23 +19,25 @@ The frontend of this project is built with Angular 20, leveraging modern Angular ## Technology Stack -- **Angular 20** +- **Angular 21** - Standalone components architecture - Modern dependency injection with `inject()` - Signal-based state management - Reactive programming with RxJS - Lazy-loaded routes for optimized performance -- **Angular Material 19** +- **Angular Material 21** - Comprehensive UI component library - Custom theme configuration - Dark mode support - Accessibility features -- **TailwindCSS v4** +- **TailwindCSS v4 with Fluent Design** - Utility-first CSS framework - - Integration with Material Design - - Custom color schemes + - Fluent Design System 2 tokens + - Microsoft-style elevation shadows + - Comprehensive color system (neutral, brand, status) + - Motion and animation tokens - Responsive design utilities - **Additional Libraries** diff --git a/docs/index.md b/docs/index.md index 18dc5be..2a29866 100644 --- a/docs/index.md +++ b/docs/index.md @@ -9,7 +9,7 @@ permalink: / # Clean Architecture Full-Stack Starter {: .fs-9 } -A production-ready full-stack application with Angular 20, .NET 9, and PostgreSQL using Clean Architecture principles +A production-ready full-stack application with Angular 21, .NET 10, and PostgreSQL 17 using Clean Architecture principles, orchestrated with .NET Aspire {: .fs-6 .fw-300 } [Get Started](#-quick-start-in-60-seconds){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 } @@ -26,45 +26,57 @@ A production-ready full-stack application with Angular 20, .NET 9, and PostgreSQ

    -A modern, full-stack contact management system built with Angular 20, .NET 9, and PostgreSQL following Clean Architecture principles. This project demonstrates how to structure enterprise applications for maintainability, testability, and scalability while providing a complete development workflow with Docker containerization. +A modern, full-stack contact management system built with **Angular 21**, **.NET 10**, and **PostgreSQL 17** following Clean Architecture principles. This project demonstrates how to structure enterprise applications for maintainability, testability, and scalability while providing a complete development workflow with **.NET Aspire** orchestration and Docker containerization. ## 🌟 What You'll Learn - **Clean Architecture** principles and implementation -- **Angular 20** with signals, standalone components, and Material Design -- **.NET 9** with dependency injection and repository pattern -- **PostgreSQL** with Dapper for efficient data access +- **Angular 21** with signals, standalone components, and Fluent Design +- **.NET 10** with dependency injection and repository pattern +- **PostgreSQL 17** with Dapper for efficient data access +- **.NET Aspire 9.5** for local development orchestration +- **Scalar** for modern API documentation - **JWT Authentication** with role-based permissions - **Docker** containerization for development and production - **NGINX** as a reverse proxy and API gateway - **CI/CD** with GitHub Actions -## 🚀 Quick Start in 60 Seconds +## 🚀 Quick Start -### Prerequisites +### Option 1: Using .NET Aspire (Recommended for Development) -- [Docker](https://www.docker.com/products/docker-desktop){:target="_blank"} and Docker Compose -- [Git](https://git-scm.com/downloads){:target="_blank"} +**Prerequisites:** +- [.NET SDK 10.0](https://dotnet.microsoft.com/download/dotnet/10.0){:target="_blank"} or later +- [Node.js 22 LTS](https://nodejs.org/){:target="_blank"} (not Node 23) +- [Docker Desktop](https://www.docker.com/products/docker-desktop){:target="_blank"} -### Launch Commands - -Clone the repository: ```bash git clone https://github.com/nitin27may/clean-architecture-docker-dotnet-angular.git clean-app cd clean-app -``` -Create environment file: -```bash -cp .env.example .env +# Install frontend dependencies +cd frontend && npm install && cd .. + +# Run with Aspire +dotnet run --project aspire/AppHost ``` -Start the application: +Access the Aspire Dashboard at `https://localhost:17178` to see all services. + +### Option 2: Using Docker Compose (Production-like) + +**Prerequisites:** +- [Docker](https://www.docker.com/products/docker-desktop){:target="_blank"} and Docker Compose +- [Git](https://git-scm.com/downloads){:target="_blank"} + ```bash +git clone https://github.com/nitin27may/clean-architecture-docker-dotnet-angular.git clean-app +cd clean-app +cp .env.example .env docker-compose up ``` -That's it! Visit [http://localhost](http://localhost) in your browser. +Visit [http://localhost](http://localhost) in your browser. ## 👤 Default Users @@ -84,12 +96,15 @@ That's it! Visit [http://localhost](http://localhost) in your browser. ### Container Architecture -The application is structured into multiple containers that work together: +The application is structured into multiple services that work together: + +- **Frontend**: Angular 21 with Material Design, TailwindCSS, and Fluent Design +- **API**: .NET 10 RESTful API built with Clean Architecture and Scalar docs +- **Database**: PostgreSQL 17 for data persistence +- **pgAdmin**: Database management interface +- **NGINX**: Reverse proxy that routes requests to the appropriate service -- **Frontend Container**: Angular 20 with Material Design and TailwindCSS -- **API Container**: .NET 9 RESTful API built with Clean Architecture -- **Database Container**: PostgreSQL for data persistence -- **NGINX Container**: Reverse proxy that routes requests to the appropriate service +When using **.NET Aspire**, all services are orchestrated automatically with service discovery and health monitoring. ## 📐 Clean Architecture Explained @@ -119,16 +134,18 @@ Clean Architecture provides **significant benefits** for your application: ### Modern Angular Frontend -- **Signals-based state management** -- **Material Design with TailwindCSS** for responsive UI +- **Signals-based state management** with Angular 21 +- **Material Design with TailwindCSS v4** for responsive UI +- **Fluent Design System 2** tokens and styling - **Role-based routing and permissions** - **Dark/light theme support** ### Secure .NET Backend -- **Clean Architecture implementation** -- **Generic Repository pattern** -- **JWT authentication** +- **Clean Architecture implementation** with .NET 10 +- **Generic Repository pattern** with Dapper +- **JWT authentication** with role-based permissions +- **Scalar API documentation** (replacing Swagger) - **Global exception handling** ### Contact Management @@ -142,13 +159,14 @@ Clean Architecture provides **significant benefits** for your application: For more detailed information, explore these documentation pages: -- [Development Guide](development-guide.md) -- [Clean Architecture Series](architecture-series.md) -- [Frontend Documentation](frontend.md) -- [Backend Documentation](backend.md) -- [Feature List](visual-feature-guide.md) -- [Roadmap](roadmap.md) -- [Visual Feature Guide](visual-feature-guide.md) +- [Aspire Guide](aspire-guide.md) - Running with .NET Aspire +- [Development Guide](development-guide.md) - Setting up your environment +- [Clean Architecture Series](architecture-series.md) - Architecture deep dives +- [Frontend Documentation](frontend.md) - Angular 21 implementation +- [Backend Documentation](backend.md) - .NET 10 API details +- [Docker Guide](docker-guide.md) - Container configuration +- [Feature List](visual-feature-guide.md) - Visual feature breakdown +- [Roadmap](roadmap.md) - Upcoming features ## 🤝 Contributing diff --git a/frontend/.nvmrc b/frontend/.nvmrc new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/frontend/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/frontend/angular.json b/frontend/angular.json index 1c023c7..9238348 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -37,7 +37,7 @@ ], "scripts": [], "server": "src/main.server.ts", - "prerender": true, + "prerender": false, "ssr": { "entry": "src/server.ts" } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c894b70..c027c6e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,41 +1,41 @@ { "name": "contact-portal", - "version": "0.0.0", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "contact-portal", - "version": "0.0.0", - "dependencies": { - "@angular/animations": "^20.1.2", - "@angular/cdk": "^20.1.2", - "@angular/common": "^20.1.2", - "@angular/compiler": "^20.1.2", - "@angular/core": "^20.1.2", - "@angular/forms": "^20.1.2", - "@angular/material": "^20.1.2", - "@angular/platform-browser": "^20.1.2", - "@angular/platform-browser-dynamic": "^20.1.2", - "@angular/platform-server": "^20.1.2", - "@angular/router": "^20.1.2", - "@angular/ssr": "^20.1.1", + "version": "1.0.0", + "dependencies": { + "@angular/animations": "^21.0.1", + "@angular/cdk": "^21.0.1", + "@angular/common": "^21.0.1", + "@angular/compiler": "^21.0.1", + "@angular/core": "^21.0.1", + "@angular/forms": "^21.0.1", + "@angular/material": "^21.0.1", + "@angular/platform-browser": "^21.0.1", + "@angular/platform-browser-dynamic": "^21.0.1", + "@angular/platform-server": "^21.0.1", + "@angular/router": "^21.0.1", + "@angular/ssr": "^21.0.1", "@tailwindcss/postcss": "^4.1.1", - "express": "^4.18.2", + "express": "^4.21.0", "postcss": "^8.5.3", - "rxjs": "~7.8.0", + "rxjs": "~7.8.1", "tailwindcss": "^4.1.1", - "tslib": "^2.3.0", + "tslib": "^2.8.0", "zone.js": "~0.15.0" }, "devDependencies": { - "@angular/build": "^20.1.1", - "@angular/cli": "^20.1.1", - "@angular/compiler-cli": "^20.1.2", + "@angular/build": "^21.0.1", + "@angular/cli": "^21.0.1", + "@angular/compiler-cli": "^21.0.1", "@tailwindcss/typography": "^0.5.16", - "@types/express": "^4.17.17", + "@types/express": "^5.0.0", "@types/jasmine": "~5.1.0", - "@types/node": "^18.18.0", + "@types/node": "^22.0.0", "jasmine-core": "~5.5.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", @@ -43,197 +43,199 @@ "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", "postcss": "^8.5.3", - "typescript": "~5.8.3" + "typescript": "~5.9.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.6.1.tgz", + "integrity": "sha512-wV/gNRkzb7sI9vs1OneG129hwe3Q5zPj7zigz3Ps7M5Lpo2hSorrOnXNodHEOV+yXE/ks4Pd+G3CDFIjFTWhMQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.40.1.tgz", + "integrity": "sha512-cxKNATPY5t+Mv8XAVTI57altkaPH+DZi4uMrnexPxPHODMljhGYY+GDZyHwv9a+8CbZHcY372OkxXrDMZA4Lnw==", "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" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.40.1.tgz", + "integrity": "sha512-XP008aMffJCRGAY8/70t+hyEyvqqV7YKm502VPu0+Ji30oefrTn2al7LXkITz7CK6I4eYXWRhN6NaIUi65F1OA==", "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" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.40.1.tgz", + "integrity": "sha512-gWfQuQUBtzUboJv/apVGZMoxSaB0M4Imwl1c9Ap+HpCW7V0KhjBddqF2QQt5tJZCOFsfNIgBbZDGsEPaeKUosw==", "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.40.1.tgz", + "integrity": "sha512-RTLjST/t+lsLMouQ4zeLJq2Ss+UNkLGyNVu+yWHanx6kQ3LT5jv8UvPwyht9s7R6jCPnlSI77WnL80J32ZuyJg==", "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" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.40.1.tgz", + "integrity": "sha512-2FEK6bUomBzEYkTKzD0iRs7Ljtjb45rKK/VSkyHqeJnG+77qx557IeSO0qVFE3SfzapNcoytTofnZum0BQ6r3Q==", "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" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.40.1.tgz", + "integrity": "sha512-Nju4NtxAvXjrV2hHZNLKVJLXjOlW6jAXHef/CwNzk1b2qIrCWDO589ELi5ZHH1uiWYoYyBXDQTtHmhaOVVoyXg==", "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" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.40.1.tgz", + "integrity": "sha512-Mw6pAUF121MfngQtcUb5quZVqMC68pSYYjCRZkSITC085S3zdk+h/g7i6FxnVdbSU6OztxikSDMh1r7Z+4iPlA==", "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" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.40.1.tgz", + "integrity": "sha512-z+BPlhs45VURKJIxsR99NNBWpUEEqIgwt10v/fATlNxc4UlXvALdOsWzaFfe89/lbP5Bu4+mbO59nqBC87ZM/g==", "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" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.40.1.tgz", + "integrity": "sha512-VJMUMbO0wD8Rd2VVV/nlFtLJsOAQvjnVNGkMkspFiFhpBA7s/xJOb+fJvvqwKFUjbKTUA7DjiSi1ljSMYBasXg==", "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" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.40.1.tgz", + "integrity": "sha512-ehvJLadKVwTp9Scg9NfzVSlBKH34KoWOQNTaN8i1Ac64AnO6iH2apJVSP6GOxssaghZ/s8mFQsDH3QIZoluFHA==", "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" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.40.1.tgz", + "integrity": "sha512-PbidVsPurUSQIr6X9/7s34mgOMdJnn0i6p+N6Ab+lsNhY5eiu+S33kZEpZwkITYBCIbhzDLOvb7xZD3gDi+USA==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0" + "@algolia/client-common": "5.40.1" }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.40.1.tgz", + "integrity": "sha512-ThZ5j6uOZCF11fMw9IBkhigjOYdXGXQpj6h4k+T9UkZrF2RlKcPynFzDeRgaLdpYk8Yn3/MnFbwUmib7yxj5Lw==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0" + "@algolia/client-common": "5.40.1" }, "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==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.40.1.tgz", + "integrity": "sha512-H1gYPojO6krWHnUXu/T44DrEun/Wl95PJzMXRcM/szstNQczSbwq6wIFJPI9nyE95tarZfUNU3rgorT+wZ6iCQ==", "dev": true, - "license": "MIT", "dependencies": { - "@algolia/client-common": "5.32.0" + "@algolia/client-common": "5.40.1" }, "engines": { "node": ">= 14.0.0" @@ -264,13 +266,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2001.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.1.tgz", - "integrity": "sha512-jU+fvaiS5bjh3znpHLEeKQIYb+ZVKNP0xRu3+E9EmweyG4E8AdvZnLvKTe61Ikhul2zBTFBUv46er7CHjAGEEg==", + "version": "0.2100.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2100.1.tgz", + "integrity": "sha512-MLxTT6EE7NHuCen9yGdv9iT2vtB/fAdXTRnulOWfVa/SVmGoKawBGCNOAPpI2yA8Fb/D5xlU6ThS1ggDsiCqrQ==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.1", + "@angular-devkit/core": "21.0.1", "rxjs": "7.8.2" }, "engines": { @@ -280,18 +281,17 @@ } }, "node_modules/@angular-devkit/core": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.1.tgz", - "integrity": "sha512-5rKL/WfMhZOi0MyYWXK95kPwxSd7zhZieyo3Idtg0B1VMFP4jIa4jRkV7uz55HRPOl5/kK3aIrsxgtKuxQg50Q==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.1.tgz", + "integrity": "sha512-AGdAu0hV2TLCWYHiyVSxUFbpR2chO+xA4OkRrG2YirQGcqJTmr651C4rWDkheWqeWDxMicZklqKaTw66mNSUkw==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", + "picomatch": "4.0.3", "rxjs": "7.8.2", - "source-map": "0.7.4" + "source-map": "0.7.6" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -308,16 +308,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.1.tgz", - "integrity": "sha512-G87e0u3V9E2iqwoV8nBIuLNtMUAnb/A62LNq9eTJguyVEC0HSRWQnByhUvmv6mlABLa4worZJnE5vMbXW1LeQg==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.0.1.tgz", + "integrity": "sha512-3koB1xJNkqMg7g6JwH2rhQO268WjnPVA852lwoLW7wzSZRpJH0kHtZsnY9FYOC2kbmAGnCWWbnPLJ5/T1wemoA==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.1", + "@angular-devkit/core": "21.0.1", "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "8.2.0", + "magic-string": "0.30.19", + "ora": "9.0.0", "rxjs": "7.8.2" }, "engines": { @@ -327,10 +326,9 @@ } }, "node_modules/@angular/animations": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.1.2.tgz", - "integrity": "sha512-r1JnNXZEg2Rrz53Mr4D4/S7v6ozZ3FPzJJo38lDq2WJKSkKc09R9fjFWIB/rXwEXUuiWEfNfxx+O4g6rrbXWWA==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.0.1.tgz", + "integrity": "sha512-P7i/jpNnzXwo0vHEG0cDXYojwTz0WQlXJHrmOJzLVveyfcFwgXYXJxhGGUI2+k21YrlJTKkR/4QZTEJ0GP0f8Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -338,42 +336,41 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.1.2", - "@angular/core": "20.1.2" + "@angular/core": "21.0.1" } }, "node_modules/@angular/build": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.1.1.tgz", - "integrity": "sha512-N9tKfHatZEdy/uGX9atJQKVIejAvRbOMwpBj9Z5Y2RtR2vTDOOm0q86OYQW8baK19b2/HkHRe6PSPeiHpTG+8g==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.0.1.tgz", + "integrity": "sha512-AQFZWG5TtujCRs7ncajeBZpl/hLBKkuF0lZSziJL8tsgBru0hz0OobOkEuS/nb3FuCRQfva8YP2EPhLdcuo50g==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2001.1", - "@babel/core": "7.27.7", + "@angular-devkit/architect": "0.2100.1", + "@babel/core": "7.28.4", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.13", + "@inquirer/confirm": "5.1.19", "@vitejs/plugin-basic-ssl": "2.1.0", - "beasties": "0.3.4", - "browserslist": "^4.23.0", - "esbuild": "0.25.5", + "beasties": "0.3.5", + "browserslist": "^4.26.0", + "esbuild": "0.26.0", "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", + "listr2": "9.0.5", + "magic-string": "0.30.19", "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", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "rolldown": "1.0.0-beta.47", + "sass": "1.93.2", + "semver": "7.7.3", "source-map-support": "0.5.21", - "tinyglobby": "0.2.14", - "vite": "7.0.0", + "tinyglobby": "0.2.15", + "undici": "7.16.0", + "vite": "7.2.2", "watchpack": "2.4.4" }, "engines": { @@ -382,25 +379,25 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.4.1" + "lmdb": "3.4.3" }, "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.1", + "@angular/compiler": "^21.0.0", + "@angular/compiler-cli": "^21.0.0", + "@angular/core": "^21.0.0", + "@angular/localize": "^21.0.0", + "@angular/platform-browser": "^21.0.0", + "@angular/platform-server": "^21.0.0", + "@angular/service-worker": "^21.0.0", + "@angular/ssr": "^21.0.1", "karma": "^6.4.0", "less": "^4.2.0", - "ng-packagr": "^20.0.0", + "ng-packagr": "^21.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" + "typescript": ">=5.9 <6.0", + "vitest": "^4.0.8" }, "peerDependenciesMeta": { "@angular/core": { @@ -441,241 +438,45 @@ } } }, - "node_modules/@angular/build/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/@angular/build/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/build/node_modules/@types/node": { - "version": "24.0.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz", - "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~7.8.0" - } - }, - "node_modules/@angular/build/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/@angular/build/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/build/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/@angular/build/node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@angular/build/node_modules/vite": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.0.tgz", - "integrity": "sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.2", - "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/@angular/cdk": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.1.2.tgz", - "integrity": "sha512-mmQdXfC86FMnH6iZvXvEmHunQpp2KULfoMQ1KhIMzVEuAmHRpkct7onjLeGUqZ+VEXchRG7/gYkMKYQxtG8sag==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.0.1.tgz", + "integrity": "sha512-9u1oUf6TGf9Wh+XuQFb9txIGAqfXbAX9ba+dyOTIJ7V3weX3kTRWeGjxad4ydjTPkJ3RaF1/upMwzLuZgnhDMQ==", "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", + "@angular/common": "^21.0.0 || ^22.0.0", + "@angular/core": "^21.0.0 || ^22.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.1", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.1.1.tgz", - "integrity": "sha512-/lS7haW6YWy+KWkITtmfcKqq9Qsi2PP5mnPnZ2CqPgnYe6PCw+yx57tsU3qHHmYNGWnqHIvZWafBbabie18g8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.2001.1", - "@angular-devkit/core": "20.1.1", - "@angular-devkit/schematics": "20.1.1", - "@inquirer/prompts": "7.6.0", - "@listr2/prompt-adapter-inquirer": "2.0.22", - "@modelcontextprotocol/sdk": "1.13.3", - "@schematics/angular": "20.1.1", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.0.1.tgz", + "integrity": "sha512-i0+7jwf19D73yAzR/lL4+eKVhooM+J055qfSaJWL5QLCF9/JSSjMPCG8I/qIGNdVr+lVmWvvxqpt7O7kR3zfUw==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.2100.1", + "@angular-devkit/core": "21.0.1", + "@angular-devkit/schematics": "21.0.1", + "@inquirer/prompts": "7.9.0", + "@listr2/prompt-adapter-inquirer": "3.0.5", + "@modelcontextprotocol/sdk": "1.20.1", + "@schematics/angular": "21.0.1", "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.32.0", + "algoliasearch": "5.40.1", "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", + "listr2": "9.0.5", + "npm-package-arg": "13.0.1", + "pacote": "21.0.3", + "parse5-html-rewriting-stream": "8.0.0", + "resolve": "1.22.11", + "semver": "7.7.3", "yargs": "18.0.0", - "zod": "3.25.75" + "zod": "3.25.76" }, "bin": { "ng": "bin/ng.js" @@ -686,24 +487,10 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/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/@angular/common": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.1.2.tgz", - "integrity": "sha512-MQYP+4lvw81jBRknNYgIye7N36SD68SADUB7xO+7pF5+KbGundfmZkO29uWCnTBU86C4xU4DshlFVhzFK1lreQ==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.0.1.tgz", + "integrity": "sha512-EqdTGpFp7PVdTVztO7TB6+QxdzUbYXKKT2jwG2Gg+PIQZ2A8XrLPRmGXyH/DLlc5IhnoJlLbngmBRCLCO4xWog==", "dependencies": { "tslib": "^2.3.0" }, @@ -711,15 +498,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.1.2", + "@angular/core": "21.0.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.1.2.tgz", - "integrity": "sha512-BCYQArXAknOyMB5rgx9yK3p5uYFhgN91Jxo5Fbuso6M+7p1PoxOE4E9XrqQfhpVJOl9hcz7vNFnQ4Oer0R83UQ==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.0.1.tgz", + "integrity": "sha512-YRzHpThgCaC9b3xzK1Wx859ePeHEPR7ewQklUB5TYbpzVacvnJo38PcSAx/nzOmgX9y4mgyros6LzECmBb8d8w==", "dependencies": { "tslib": "^2.3.0" }, @@ -728,13 +514,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.1.2.tgz", - "integrity": "sha512-NMSDavN+CJYvSze6wq7DpbrUA/EqiAD7GQoeJtuOknzUpPlWQmFOoHzTMKW+S34XlNEw+YQT0trv3DKcrE+T/w==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.0.1.tgz", + "integrity": "sha512-BxGLtL5bxlaaAs/kSN4oyXhMfvzqsj1Gc4Jauz39R4xtgOF5cIvjBtj6dJ9mD3PK0s6zaFi7WYd0YwWkxhjgMA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/core": "7.28.0", + "@babel/core": "7.28.4", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", @@ -751,8 +536,8 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.1.2", - "typescript": ">=5.8 <5.9" + "@angular/compiler": "21.0.1", + "typescript": ">=5.9 <6.0" }, "peerDependenciesMeta": { "typescript": { @@ -761,10 +546,9 @@ } }, "node_modules/@angular/core": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.1.2.tgz", - "integrity": "sha512-8jAvpkHoXHSH0HoqNVgPstSMGmC0oaYN93HW7K2rMRxj1Uhtahkeb/7/kfnj7yLi5FDfm98ofOFT4Lxzf2eZXQ==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.0.1.tgz", + "integrity": "sha512-z0G9Bwzgqr0fQVbtMgqwl+SbbiqtJD7I2xT6U5p45LetKHojcfigH29dxi/vqALPwEdgb2nSIx7RqVhoyynraQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -772,9 +556,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.1.2", + "@angular/compiler": "21.0.1", "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" + "zone.js": "~0.15.0 || ~0.16.0" }, "peerDependenciesMeta": { "@angular/compiler": { @@ -786,10 +570,9 @@ } }, "node_modules/@angular/forms": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.1.2.tgz", - "integrity": "sha512-ziOaeN0by1cTCNzwCo/IC2ekFzrM7ehc8uQHMQ6dYprSX45lJmdCsNnn+R0lx68VugvbMhHHO5ieOORf5sEmew==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.0.1.tgz", + "integrity": "sha512-BVFPuKjxkzjzKMmpc6KxUKICpVs6J2/KzA4HjtPp/UKvdZPe8dj8vIXuc9pGf8DA4XdkjCwvv8szCgzTWi02LQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -797,34 +580,33 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.1.2", - "@angular/core": "20.1.2", - "@angular/platform-browser": "20.1.2", + "@angular/common": "21.0.1", + "@angular/core": "21.0.1", + "@angular/platform-browser": "21.0.1", + "@standard-schema/spec": "^1.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.1.2.tgz", - "integrity": "sha512-xs/6yl8e/8PGvHihFSg+/6C6MupxGN0S8ym2ITKQI4vwViL1MRL274r7Ppl9N+23Kq2qeYBzFsRkxx01vxdaEA==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-21.0.1.tgz", + "integrity": "sha512-UJ/8r7n2JN5Iz2qrQ/1xMGz0diUc/SUFC4t+KMlF6KIdnGlNdGlGOA0Js1uOSXvo/YCCnDVw4IyLCG9CAVZ/4Q==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/cdk": "20.1.2", - "@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", + "@angular/cdk": "21.0.1", + "@angular/common": "^21.0.0 || ^22.0.0", + "@angular/core": "^21.0.0 || ^22.0.0", + "@angular/forms": "^21.0.0 || ^22.0.0", + "@angular/platform-browser": "^21.0.0 || ^22.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.1.2.tgz", - "integrity": "sha512-jsgO4atyh6T3Rt+idHI29ENaq1a4VKfvtTgWf1S0qSCsfMt2kv5AAO+LkL6lYx8TtJu5zjAETiUwSiWUqY1jOg==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.0.1.tgz", + "integrity": "sha512-68StH9HILKUqNhQKz6KKNHzpgk1n88CIusWlmJvnb0l6iWGf3ydq5lTMKAKiZQmSDAVP5unTGfNvIkh59GRyVg==", "dependencies": { "tslib": "^2.3.0" }, @@ -832,9 +614,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "20.1.2", - "@angular/common": "20.1.2", - "@angular/core": "20.1.2" + "@angular/animations": "21.0.1", + "@angular/common": "21.0.1", + "@angular/core": "21.0.1" }, "peerDependenciesMeta": { "@angular/animations": { @@ -843,10 +625,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.1.2.tgz", - "integrity": "sha512-KssXr0nDZxNjJChdyNFE1wFGaR374qEKBU6mburr2dTauV+jfaL7NrBRzQuTh7GfOOwHnW0uJ4b2dGK6m1tkNw==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.0.1.tgz", + "integrity": "sha512-TzCKf3p1NBK1NYoPJXLScSjVeiQ52DaXf9gweNUGtCmX3EkVKf1sx4Ny1x4DxaTwB5XZn+O+L3nVLstPBj7UGA==", "dependencies": { "tslib": "^2.3.0" }, @@ -854,17 +635,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.1.2", - "@angular/compiler": "20.1.2", - "@angular/core": "20.1.2", - "@angular/platform-browser": "20.1.2" + "@angular/common": "21.0.1", + "@angular/compiler": "21.0.1", + "@angular/core": "21.0.1", + "@angular/platform-browser": "21.0.1" } }, "node_modules/@angular/platform-server": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-20.1.2.tgz", - "integrity": "sha512-88AmEaS74pvADz8rzRu3uINAPBpXcjMvqAa2O+lwWBGb7Ia4fdVp/VnX4Y2xwH8PM14pA4xraEUTkE6tGoTTkg==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-21.0.1.tgz", + "integrity": "sha512-SfDn9u2YG2UaFtuUL35UFedTz6xiMphVD2sbLLYPpYVd3nRZUziUV3VjeZ2xM6mbZTtT4m2zA8XGUbbWVkxOPg==", "dependencies": { "tslib": "^2.3.0", "xhr2": "^0.2.0" @@ -873,18 +653,17 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.1.2", - "@angular/compiler": "20.1.2", - "@angular/core": "20.1.2", - "@angular/platform-browser": "20.1.2", + "@angular/common": "21.0.1", + "@angular/compiler": "21.0.1", + "@angular/core": "21.0.1", + "@angular/platform-browser": "21.0.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/router": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.1.2.tgz", - "integrity": "sha512-xMRDARfSgwDZSorrTMtv9Gdb9UtWflwn8LOgmPbj3waXyuGWUbgpoJCD0Mh6necc9fhQ60GbBRG5K2EVVr3ATQ==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.0.1.tgz", + "integrity": "sha512-EnNbiScESZ0op9XS9qUNncWc1UcSYy90uCbDMVTTChikZt9b+e19OusFMf50zecb96VMMz+BzNY1see7Rmvx4g==", "dependencies": { "tslib": "^2.3.0" }, @@ -892,25 +671,24 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.1.2", - "@angular/core": "20.1.2", - "@angular/platform-browser": "20.1.2", + "@angular/common": "21.0.1", + "@angular/core": "21.0.1", + "@angular/platform-browser": "21.0.1", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/ssr": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-20.1.1.tgz", - "integrity": "sha512-BME3D7wrTUvi5nqGfVQ51UuOsYtJ4yjowaT90VErU2sQTRdP3y8vQ6YtefrUICMaZoEKIpqDCUZ4Df8+Z+uWaw==", - "license": "MIT", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-21.0.1.tgz", + "integrity": "sha512-rbShURMPg7Lca81cUJGOFN3vGVVVESOj4HOwtemjex75R+AEKC7Pm5q0FMhlrc+Xr0DHB1M9gMSEbmUewcByrg==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/platform-server": "^20.0.0", - "@angular/router": "^20.0.0" + "@angular/common": "^21.0.0", + "@angular/core": "^21.0.0", + "@angular/platform-server": "^21.0.0", + "@angular/router": "^21.0.0" }, "peerDependenciesMeta": { "@angular/platform-server": { @@ -923,7 +701,6 @@ "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", @@ -934,32 +711,30 @@ } }, "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==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, - "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.3", "@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/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -974,23 +749,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/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/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", @@ -1007,16 +765,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -1028,7 +785,6 @@ "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" }, @@ -1041,7 +797,6 @@ "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", @@ -1058,7 +813,6 @@ "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" } @@ -1068,7 +822,6 @@ "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" } @@ -1078,7 +831,6 @@ "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" @@ -1088,15 +840,14 @@ } }, "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==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -1110,7 +861,6 @@ "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" }, @@ -1123,17 +873,15 @@ "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==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1143,33 +891,30 @@ "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.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" + "@babel/types": "^7.28.4" }, "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==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -1183,7 +928,6 @@ "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", @@ -1194,50 +938,31 @@ } }, "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==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/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/types": { - "version": "7.28.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz", - "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1252,15 +977,42 @@ "node": ">=0.1.90" } }, + "node_modules/@emnapi/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.26.0.tgz", + "integrity": "sha512-hj0sKNCQOOo2fgyII3clmJXP28VhgDfU5iy3GNHlWO76KG6N7x4D9ezH5lJtQTG+1J6MFDAJXC1qsI+W+LvZoA==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "aix" @@ -1270,14 +1022,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.26.0.tgz", + "integrity": "sha512-C0hkDsYNHZkBtPxxDx177JN90/1MiCpvBNjz1f5yWJo1+5+c5zr8apjastpEG+wtPjo9FFtGG7owSsAxyKiHxA==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -1287,14 +1038,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.26.0.tgz", + "integrity": "sha512-DDnoJ5eoa13L8zPh87PUlRd/IyFaIKOlRbxiwcSbeumcJ7UZKdtuMCHa1Q27LWQggug6W4m28i4/O2qiQQ5NZQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -1304,14 +1054,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.26.0.tgz", + "integrity": "sha512-bKDkGXGZnj0T70cRpgmv549x38Vr2O3UWLbjT2qmIkdIWcmlg8yebcFWoT9Dku7b5OV3UqPEuNKRzlNhjwUJ9A==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -1321,14 +1070,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.26.0.tgz", + "integrity": "sha512-6Z3naJgOuAIB0RLlJkYc81An3rTlQ/IeRdrU3dOea8h/PvZSgitZV+thNuIccw0MuK1GmIAnAmd5TrMZad8FTQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1338,14 +1086,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.26.0.tgz", + "integrity": "sha512-OPnYj0zpYW0tHusMefyaMvNYQX5pNQuSsHFTHUBNp3vVXupwqpxofcjVsUx11CQhGVkGeXjC3WLjh91hgBG2xw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1355,14 +1102,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.26.0.tgz", + "integrity": "sha512-jix2fa6GQeZhO1sCKNaNMjfj5hbOvoL2F5t+w6gEPxALumkpOV/wq7oUBMHBn2hY2dOm+mEV/K+xfZy3mrsxNQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1372,14 +1118,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.26.0.tgz", + "integrity": "sha512-tccJaH5xHJD/239LjbVvJwf6T4kSzbk6wPFerF0uwWlkw/u7HL+wnAzAH5GB2irGhYemDgiNTp8wJzhAHQ64oA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1389,14 +1134,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.26.0.tgz", + "integrity": "sha512-JY8NyU31SyRmRpuc5W8PQarAx4TvuYbyxbPIpHAZdr/0g4iBr8KwQBS4kiiamGl2f42BBecHusYCsyxi7Kn8UQ==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1406,14 +1150,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.26.0.tgz", + "integrity": "sha512-IMJYN7FSkLttYyTbsbme0Ra14cBO5z47kpamo16IwggzzATFY2lcZAwkbcNkWiAduKrTgFJP7fW5cBI7FzcuNQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1423,14 +1166,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.26.0.tgz", + "integrity": "sha512-XITaGqGVLgk8WOHw8We9Z1L0lbLFip8LyQzKYFKO4zFo1PFaaSKsbNjvkb7O8kEXytmSGRkYpE8LLVpPJpsSlw==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1440,14 +1182,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.26.0.tgz", + "integrity": "sha512-MkggfbDIczStUJwq9wU7gQ7kO33d8j9lWuOCDifN9t47+PeI+9m2QVh51EI/zZQ1spZtFMC1nzBJ+qNGCjJnsg==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1457,14 +1198,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.26.0.tgz", + "integrity": "sha512-fUYup12HZWAeccNLhQ5HwNBPr4zXCPgUWzEq2Rfw7UwqwfQrFZ0SR/JljaURR8xIh9t+o1lNUFTECUTmaP7yKA==", "cpu": [ "mips64el" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1474,14 +1214,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.26.0.tgz", + "integrity": "sha512-MzRKhM0Ip+//VYwC8tialCiwUQ4G65WfALtJEFyU0GKJzfTYoPBw5XNWf0SLbCUYQbxTKamlVwPmcw4DgZzFxg==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1491,14 +1230,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.26.0.tgz", + "integrity": "sha512-QhCc32CwI1I4Jrg1enCv292sm3YJprW8WHHlyxJhae/dVs+KRWkbvz2Nynl5HmZDW/m9ZxrXayHzjzVNvQMGQA==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1508,14 +1246,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.26.0.tgz", + "integrity": "sha512-1D6vi6lfI18aNT1aTf2HV+RIlm6fxtlAp8eOJ4mmnbYmZ4boz8zYDar86sIYNh0wmiLJEbW/EocaKAX6Yso2fw==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1525,14 +1262,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.26.0.tgz", + "integrity": "sha512-rnDcepj7LjrKFvZkx+WrBv6wECeYACcFjdNPvVPojCPJD8nHpb3pv3AuR9CXgdnjH1O23btICj0rsp0L9wAnHA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1542,14 +1278,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.26.0.tgz", + "integrity": "sha512-FSWmgGp0mDNjEXXFcsf12BmVrb+sZBBBlyh3LwB/B9ac3Kkc8x5D2WimYW9N7SUkolui8JzVnVlWh7ZmjCpnxw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1559,14 +1294,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.26.0.tgz", + "integrity": "sha512-0QfciUDFryD39QoSPUDshj4uNEjQhp73+3pbSAaxjV2qGOEDsM67P7KbJq7LzHoVl46oqhIhJ1S+skKGR7lMXA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1576,14 +1310,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.26.0.tgz", + "integrity": "sha512-vmAK+nHhIZWImwJ3RNw9hX3fU4UGN/OqbSE0imqljNbUQC3GvVJ1jpwYoTfD6mmXmQaxdJY6Hn4jQbLGJKg5Yw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1593,14 +1326,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.26.0.tgz", + "integrity": "sha512-GPXF7RMkJ7o9bTyUsnyNtrFMqgM3X+uM/LWw4CeHIjqc32fm0Ir6jKDnWHpj8xHFstgWDUYseSABK9KCkHGnpg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1609,15 +1341,30 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.26.0.tgz", + "integrity": "sha512-nUHZ5jEYqbBthbiBksbmHTlbb5eElyVfs/s1iHQ8rLBq1eWsd5maOnDpCocw1OM8kFK747d1Xms8dXJHtduxSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.26.0.tgz", + "integrity": "sha512-TMg3KCTCYYaVO+R6P5mSORhcNDDlemUVnUbb8QkboUtOhb5JWKAzd5uMIMECJQOxHZ/R+N8HHtDF5ylzLfMiLw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "sunos" @@ -1627,14 +1374,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.26.0.tgz", + "integrity": "sha512-apqYgoAUd6ZCb9Phcs8zN32q6l0ZQzQBdVXOofa6WvHDlSOhwCWgSfVQabGViThS40Y1NA4SCvQickgZMFZRlA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -1644,14 +1390,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.26.0.tgz", + "integrity": "sha512-FGJAcImbJNZzLWu7U6WB0iKHl4RuY4TsXEwxJPl9UZLS47agIZuILZEX3Pagfw7I4J3ddflomt9f0apfaJSbaw==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -1661,14 +1406,13 @@ } }, "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==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.26.0.tgz", + "integrity": "sha512-WAckBKaVnmFqbEhbymrPK7M086DQMpL1XoRbpmN0iW8k5JSXjDRQBhcZNa0VweItknLq9eAeCL34jK7/CDcw7A==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -1677,18 +1421,26 @@ "node": ">=18" } }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@inquirer/checkbox": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.9.tgz", - "integrity": "sha512-DBJBkzI5Wx4jFaYm221LHvAhpKYkhVS0k9plqHwaHhofGNxvYB7J3Bz8w+bFJ05zaMb0sZNHo4KdmENQFlNTuQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -1703,14 +1455,13 @@ } }, "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==", + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", + "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" }, "engines": { "node": ">=18" @@ -1725,20 +1476,19 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.14.tgz", - "integrity": "sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2", + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", "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" + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -1753,15 +1503,14 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.14.tgz", - "integrity": "sha512-yd2qtLl4QIIax9DTMZ1ZN2pFrrj+yL3kgIWxm34SS6uwCr0sIhsNyudUjAo5q3TqI03xx4SEBkUJqZuAInp9uA==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7", - "external-editor": "^3.1.0" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -1776,15 +1525,35 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.16.tgz", - "integrity": "sha512-oiDqafWzMtofeJyyGkb1CTPaxUkjIcSxePHHQCfif8t3HV9pHcw1Kgdw3/uGpDvaFfeTluwQtWiqzPVjAqS3zA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7", - "yoctocolors-cjs": "^2.1.2" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" }, "engines": { "node": ">=18" @@ -1799,24 +1568,22 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", - "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/input": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.0.tgz", - "integrity": "sha512-opqpHPB1NjAmDISi3uvZOTrjEEU5CWVu/HBkDby8t93+6UxYX0Z7Ps0Ltjm5sZiEbWenjubwUkivAEYQmy9xHw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -1831,14 +1598,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.16.tgz", - "integrity": "sha512-kMrXAaKGavBEoBYUCgualbwA9jWUx2TjMA46ek+pEKy38+LFpL9QHlTd8PO2kWPUgI/KB+qi02o4y2rwXbzr3Q==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -1853,15 +1619,14 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.16.tgz", - "integrity": "sha512-g8BVNBj5Zeb5/Y3cSN+hDUL7CsIFDIuVxb9EPty3lkxBaYpjL5BNRKSYOF9yOLe+JOcKFd+TSVeADQ4iSY7rbg==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -1876,22 +1641,21 @@ } }, "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==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.9.0.tgz", + "integrity": "sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==", "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" + "@inquirer/checkbox": "^4.3.0", + "@inquirer/confirm": "^5.1.19", + "@inquirer/editor": "^4.2.21", + "@inquirer/expand": "^4.0.21", + "@inquirer/input": "^4.2.5", + "@inquirer/number": "^3.0.21", + "@inquirer/password": "^4.0.21", + "@inquirer/rawlist": "^4.1.9", + "@inquirer/search": "^3.2.0", + "@inquirer/select": "^4.4.0" }, "engines": { "node": ">=18" @@ -1906,15 +1670,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.4.tgz", - "integrity": "sha512-5GGvxVpXXMmfZNtvWw4IsHpR7RzqAR624xtkPd1NxxlV5M+pShMqzL4oRddRkg8rVEOK9fKdJp1jjVML2Lr7TQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/type": "^3.0.7", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -1929,16 +1692,15 @@ } }, "node_modules/@inquirer/search": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.16.tgz", - "integrity": "sha512-POCmXo+j97kTGU6aeRjsPyuCpQQfKcMXdeTMw708ZMtWrj5aykZvlUxH4Qgz3+Y1L/cAVZsSpA+UgZCu2GMOMg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -1953,17 +1715,16 @@ } }, "node_modules/@inquirer/select": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.4.tgz", - "integrity": "sha512-unTppUcTjmnbl/q+h8XeQDhAqIOmwWYWNyiiP2e3orXrg6tOaa5DHXja9PChCSbChOsktyKgOieRZFnajzxoBg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.14", - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -1978,11 +1739,10 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", - "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -1995,78 +1755,25 @@ } } }, - "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==", + "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": "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": "20 || >=22" } }, - "node_modules/@isaacs/cliui/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==", + "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": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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": "20 || >=22" } }, "node_modules/@isaacs/fs-minipass": { @@ -2074,7 +1781,6 @@ "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" }, @@ -2092,197 +1798,157 @@ } }, "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", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@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, "engines": { "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "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", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "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==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.5.tgz", + "integrity": "sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==", "dev": true, - "license": "MIT", "dependencies": { - "@inquirer/type": "^1.5.5" + "@inquirer/type": "^3.0.8" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.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" + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.5" } }, "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==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.3.tgz", + "integrity": "sha512-zR6Y45VNtW5s+A+4AyhrJk0VJKhXdkLhrySCpCu7PSdnakebsOzNxf58p5Xoq66vOSuueGAxlqDAF49HwdrSTQ==", "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==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.3.tgz", + "integrity": "sha512-nfGm5pQksBGfaj9uMbjC0YyQreny/Pl7mIDtHtw6g7WQuCgeLullr9FNRsYyKplaEJBPrCVpEjpAznxTBIrXBw==", "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==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.3.tgz", + "integrity": "sha512-Kjqomp7i0rgSbYSUmv9JnXpS55zYT/YcW3Bdf9oqOTjcH0/8tFAP8MLhu/i9V2pMKIURDZk63Ww49DTK0T3c/Q==", "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==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.3.tgz", + "integrity": "sha512-uX9eaPqWb740wg5D3TCvU/js23lSRSKT7lJrrQ8IuEG/VLgpPlxO3lHDywU44yFYdGS7pElBn6ioKFKhvALZlw==", "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==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.3.tgz", + "integrity": "sha512-7/8l20D55CfwdMupkc3fNxNJdn4bHsti2X0cp6PwiXlLeSFvAfWs5kCCx+2Cyje4l4GtN//LtKWjTru/9hDJQg==", "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==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.3.tgz", + "integrity": "sha512-yWVR0e5Gl35EGJBsAuqPOdjtUYuN8CcTLKrqpQFoM+KsMadViVCulhKNhkcjSGJB88Am5bRPjMro4MBB9FS23Q==", "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==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.3.tgz", + "integrity": "sha512-1JdBkcO0Vrua4LUgr4jAe4FUyluwCeq/pDkBrlaVjX3/BBWP1TzVjCL+TibWNQtPAL1BITXPAhlK5Ru4FBd/hg==", "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==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.20.1.tgz", + "integrity": "sha512-j/P+yuxXfgxb+mW7OEoRCM3G47zCTDqUPivJo/VzpjbG8I9csTXtOprCf5FfOfHK4whOJny0aHuBEON+kS7CCA==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", @@ -2306,7 +1972,6 @@ "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" @@ -2320,7 +1985,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", @@ -2333,37 +1997,40 @@ } }, "node_modules/@modelcontextprotocol/sdk/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==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", - "debug": "^4.4.0", + "debug": "^4.4.3", "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", + "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@modelcontextprotocol/sdk/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==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { @@ -2371,7 +2038,6 @@ "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" } @@ -2381,7 +2047,6 @@ "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", @@ -2424,7 +2089,6 @@ "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", @@ -2442,37 +2106,21 @@ "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/@modelcontextprotocol/sdk/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/@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" + "dev": true }, "node_modules/@modelcontextprotocol/sdk/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" } @@ -2482,7 +2130,6 @@ "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" }, @@ -2495,22 +2142,24 @@ "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/@modelcontextprotocol/sdk/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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { @@ -2518,7 +2167,6 @@ "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" } @@ -2528,7 +2176,6 @@ "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" }, @@ -2539,28 +2186,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@modelcontextprotocol/sdk/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/@modelcontextprotocol/sdk/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", @@ -2583,7 +2213,6 @@ "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", @@ -2599,7 +2228,6 @@ "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", @@ -2617,7 +2245,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2631,7 +2258,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2645,7 +2271,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2659,7 +2284,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2673,7 +2297,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2687,18 +2310,16 @@ "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">= 10" @@ -2708,33 +2329,33 @@ "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" + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -2744,14 +2365,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -2761,14 +2381,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2778,14 +2397,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2795,14 +2413,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2812,14 +2429,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2829,14 +2445,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2846,14 +2461,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2863,14 +2477,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2880,14 +2493,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2897,14 +2509,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2914,14 +2525,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2931,14 +2541,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2947,15 +2556,30 @@ "node": ">= 10" } }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2965,14 +2589,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2982,14 +2605,13 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2998,61 +2620,92 @@ "node": ">= 10" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, "node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", + "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", "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", + "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, - "license": "ISC" + "engines": { + "node": "20 || >=22" + } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", "dev": true, - "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/git": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", - "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.1.tgz", + "integrity": "sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==", "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", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/git/node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", + "dev": true, + "dependencies": { + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/git/node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/git/node_modules/isexe": { @@ -3060,24 +2713,33 @@ "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==", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, - "license": "ISC" + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@npmcli/git/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -3085,7 +2747,7 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/installed-package-contents": { @@ -3093,7 +2755,6 @@ "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" @@ -3106,87 +2767,78 @@ } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", + "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", "dev": true, - "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.4.tgz", + "integrity": "sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==", "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", + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.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": "^20.17.0 || >=22.9.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==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "20 || >=22" }, "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==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@npmcli/package-json/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "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==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", + "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", "dev": true, - "license": "ISC", "dependencies": { "which": "^5.0.0" }, @@ -3199,7 +2851,6 @@ "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" } @@ -3209,7 +2860,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -3221,49 +2871,66 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", - "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", "dev": true, - "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.3.tgz", + "integrity": "sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==", "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" + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0", + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "node_modules/@npmcli/run-script/node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", + "dev": true, + "dependencies": { + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.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/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -3271,7 +2938,16 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.96.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.96.0.tgz", + "integrity": "sha512-r/xkmoXA0xEpU6UGtn18CNVjXH6erU3KCpCDbpLmbVxBFor1U9MqN5Z2uMmCHJuXjJzlnDR+hWY+yPoLo8oHDw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, "node_modules/@parcel/watcher": { @@ -3590,306 +3266,530 @@ "dev": true, "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==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.47.tgz", + "integrity": "sha512-vPP9/MZzESh9QtmvQYojXP/midjgkkc1E4AdnPPAzQXo668ncHJcVLKjJKzoBdsQmaIvNjrMdsCwES8vTQHRQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.47.tgz", + "integrity": "sha512-Lc3nrkxeaDVCVl8qR3qoxh6ltDZfkQ98j5vwIr5ALPkgjZtDK4BGCrrBoLpGVMg+csWcaqUbwbKwH5yvVa0oOw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=14" + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.47.tgz", + "integrity": "sha512-eBYxQDwP0O33plqNVqOtUHqRiSYVneAknviM5XMawke3mwMuVlAsohtOqEjbCEl/Loi/FWdVeks5WkqAkzkYWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.47.tgz", + "integrity": "sha512-Ns+kgp2+1Iq/44bY/Z30DETUSiHY7ZuqaOgD5bHVW++8vme9rdiWsN4yG4rRPXkdgzjvQ9TDHmZZKfY4/G11AA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.47.tgz", + "integrity": "sha512-4PecgWCJhTA2EFOlptYJiNyVP2MrVP4cWdndpOu3WmXqWqZUmSubhb4YUAIxAxnXATlGjC1WjxNPhV7ZllNgdA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.47.tgz", + "integrity": "sha512-CyIunZ6D9U9Xg94roQI1INt/bLkOpPsZjZZkiaAZ0r6uccQdICmC99M9RUPlMLw/qg4yEWLlQhG73W/mG437NA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.47.tgz", + "integrity": "sha512-doozc/Goe7qRCSnzfJbFINTHsMktqmZQmweull6hsZZ9sjNWQ6BWQnbvOlfZJe4xE5NxM1NhPnY5Giqnl3ZrYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.47.tgz", + "integrity": "sha512-fodvSMf6Aqwa0wEUSTPewmmZOD44rc5Tpr5p9NkwQ6W1SSpUKzD3SwpJIgANDOhwiYhDuiIaYPGB7Ujkx1q0UQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.47.tgz", + "integrity": "sha512-Rxm5hYc0mGjwLh5sjlGmMygxAaV2gnsx7CNm2lsb47oyt5UQyPDZf3GP/ct8BEcwuikdqzsrrlIp8+kCSvMFNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.47.tgz", + "integrity": "sha512-YakuVe+Gc87jjxazBL34hbr8RJpRuFBhun7NEqoChVDlH5FLhLXjAPHqZd990TVGVNkemourf817Z8u2fONS8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.47.tgz", + "integrity": "sha512-ak2GvTFQz3UAOw8cuQq8pWE+TNygQB6O47rMhvevvTzETh7VkHRFtRUwJynX5hwzFvQMP6G0az5JrBGuwaMwYQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.0.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.47.tgz", + "integrity": "sha512-o5BpmBnXU+Cj+9+ndMcdKjhZlPb79dVPBZnWwMnI4RlNSSq5yOvFZqvfPYbyacvnW03Na4n5XXQAPhu3RydZ0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-ia32-msvc": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.47.tgz", + "integrity": "sha512-FVOmfyYehNE92IfC9Kgs913UerDog2M1m+FADJypKz0gmRg3UyTt4o1cZMCAl7MiR89JpM9jegNO1nXuP1w1vw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.47.tgz", + "integrity": "sha512-by/70F13IUE101Bat0oeH8miwWX5mhMFPk1yjCdxoTNHTyTdLgb0THNaebRM6AP7Kz+O3O2qx87sruYuF5UxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz", + "integrity": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==", + "dev": true + }, "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", "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==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", "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==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@schematics/angular": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.1.1.tgz", - "integrity": "sha512-eOEKBRcxt68xzZmqlgMJ5m9FOClzZumyltQhiBeAQfCrMAjxJZaB+pbyYreI+2DL91d/VkldJ9D/UcHZrhfLnQ==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.0.1.tgz", + "integrity": "sha512-m7Z/gykPxOyC5Gs9nkFkGwYTc5xLNLcVkjjZPcYszycwsWBohDREjQLZzRG86AauWFYy8mBUrTF9CD63ZqYHeQ==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.1", - "@angular-devkit/schematics": "20.1.1", + "@angular-devkit/core": "21.0.1", + "@angular-devkit/schematics": "21.0.1", "jsonc-parser": "3.3.1" }, "engines": { @@ -3899,83 +3799,77 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0" + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.0.0.tgz", + "integrity": "sha512-NgbJ+aW9gQl/25+GIEGYcCyi8M+ng2/5X04BMuIgoDfgvp18vDcoNHOQjQsG9418HGNYRxG3vfEXaR1ayD37gg==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", + "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", "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==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.0.1.tgz", + "integrity": "sha512-KFNGy01gx9Y3IBPG/CergxR9RZpN43N+lt3EozEfeoyqm8vEiLxwRl3ZO5sPx3Obv1ix/p7FWOlPc2Jgwfp9PA==", "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", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.0.tgz", + "integrity": "sha512-0QFuWDHOQmz7t66gfpfNO6aEjoFrdhkJaej/AOqb4kqWZVbPWFZifXZzkxyQBB1OwTbkhdT3LNpMFxwkTvf+2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.4.1", - "tuf-js": "^3.0.1" + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.0.0.tgz", + "integrity": "sha512-moXtHH33AobOhTZF8xcX1MpOFqdvfCk7v6+teJL8zymBiDXwEsQH6XG9HGx2VIxnJZNm4cNSzflTLDnQLmIdmw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.1" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@socket.io/component-emitter": { @@ -3984,50 +3878,60 @@ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "peer": true + }, "node_modules/@tailwindcss/node": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.1.tgz", - "integrity": "sha512-xvlh4pvfG/bkv0fEtJDABAm1tjtSmSyi2QmS4zyj1EKNI1UiOYiUq1IphSwDsNJ5vJ9cWEGs4rJXpUdCN2kujQ==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", + "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", "dependencies": { - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.29.2", - "tailwindcss": "4.1.1" + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.17" } }, - "node_modules/@tailwindcss/node/node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "bin": { - "jiti": "lib/jiti-cli.mjs" + "node_modules/@tailwindcss/node/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.1.tgz", - "integrity": "sha512-7+YBgnPQ4+jv6B6WVOerJ6WOzDzNJXrRKDts674v6TKAqFqYRr9+EBtSziO7nNcwQ8JtoZNMeqA+WJDjtCM/7w==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", + "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.1", - "@tailwindcss/oxide-darwin-arm64": "4.1.1", - "@tailwindcss/oxide-darwin-x64": "4.1.1", - "@tailwindcss/oxide-freebsd-x64": "4.1.1", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.1", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.1", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.1", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.1", - "@tailwindcss/oxide-linux-x64-musl": "4.1.1", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.1", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.1" + "@tailwindcss/oxide-android-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-x64": "4.1.17", + "@tailwindcss/oxide-freebsd-x64": "4.1.17", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-x64-musl": "4.1.17", + "@tailwindcss/oxide-wasm32-wasi": "4.1.17", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.1.tgz", - "integrity": "sha512-gTyRzfdParpoCU1yyUC/iN6XK6T0Ra4bDlF8Aeul5NP9cLzKEZDogdNVNGv5WZmCDkVol7qlex7TMmcfytMmmw==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", + "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", "cpu": [ "arm64" ], @@ -4040,9 +3944,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.1.tgz", - "integrity": "sha512-dI0QbdMWBvLB3MtaTKetzUKG9CUUQow8JSP4Nm+OxVokeZ+N+f1OmZW/hW1LzMxpx9RQCBgSRL+IIvKRat5Wdg==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", + "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", "cpu": [ "arm64" ], @@ -4055,9 +3959,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.1.tgz", - "integrity": "sha512-2Y+NPQOTRBCItshPgY/CWg4bKi7E9evMg4bgdb6h9iZObCZLOe3doPcuSxGS3DB0dKyMFKE8pTdWtFUbxZBMSA==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", + "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", "cpu": [ "x64" ], @@ -4070,9 +3974,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.1.tgz", - "integrity": "sha512-N97NGMsB/7CHShbc5ube4dcsW/bYENkBrg8yWi8ieN9boYVRdw3cZviVryV/Nfu9bKbBV9kUvduFF2qBI7rEqg==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", + "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", "cpu": [ "x64" ], @@ -4085,9 +3989,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.1.tgz", - "integrity": "sha512-33Lk6KbHnUZbXqza6RWNFo9wqPQ4+H5BAn1CkUUfC1RZ1vYbyDN6+iJPj53wmnWJ3mhRI8jWt3Jt1fO02IVdUQ==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", + "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", "cpu": [ "arm" ], @@ -4100,9 +4004,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.1.tgz", - "integrity": "sha512-LyW35RzSUy+80WYScv03HKasAUmMFDaSbNpWfk1gG5gEE9kuRGnDzSrqMoLAmY/kzMCYP/1kqmUiAx8EFLkI2A==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", + "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", "cpu": [ "arm64" ], @@ -4115,9 +4019,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.1.tgz", - "integrity": "sha512-1KPnDMlHdqjPTUSFjx55pafvs8RZXRgxfeRgUrukwDKkuj7gFk28vW3Mx65YdiugAc9NWs3VgueZWaM1Po6uGw==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", + "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", "cpu": [ "arm64" ], @@ -4130,9 +4034,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.1.tgz", - "integrity": "sha512-4WdzA+MRlsinEEE6yxNMLJxpw0kE9XVipbAKdTL8BeUpyC2TdA3TL46lBulXzKp3BIxh3nqyR/UCqzl5o+3waQ==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", + "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", "cpu": [ "x64" ], @@ -4145,9 +4049,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.1.tgz", - "integrity": "sha512-q7Ugbw3ARcjCW2VMUYrcMbJ6aMQuWPArBBE2EqC/swPZTdGADvMQSlvR0VKusUM4HoSsO7ZbvcZ53YwR57+AKw==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", + "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", "cpu": [ "x64" ], @@ -4159,10 +4063,38 @@ "node": ">= 10" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", + "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/core": "^1.6.0", + "@emnapi/runtime": "^1.6.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.1.tgz", - "integrity": "sha512-0KpqsovgHcIzm7eAGzzEZsEs0/nPYXnRBv+aPq/GehpNQuE/NAQu+YgZXIIof+VflDFuyXOEnaFr7T5MZ1INhA==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", + "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", "cpu": [ "arm64" ], @@ -4175,9 +4107,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.1.tgz", - "integrity": "sha512-B1mjeXNS26kBOHv5sXARf6Wd0PWHV9x1TDlW0ummrBUOUAxAy5wcy4Nii1wzNvCdvC448hgiL06ylhwAbNthmg==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", + "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", "cpu": [ "x64" ], @@ -4190,67 +4122,49 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.1.tgz", - "integrity": "sha512-GX9AEM+msH0i2Yh1b6CuDRaZRo3kmbvIrLbSfvJ53C3uaAgsQ//fTQAh9HMQ6t1a9zvoUptlYqG//plWsBQTCw==", + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz", + "integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.1", - "@tailwindcss/oxide": "4.1.1", + "@tailwindcss/node": "4.1.17", + "@tailwindcss/oxide": "4.1.17", "postcss": "^8.4.41", - "tailwindcss": "4.1.1" + "tailwindcss": "4.1.17" } }, "node_modules/@tailwindcss/typography": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", - "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", "dev": true, "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, - "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.0.0.tgz", + "integrity": "sha512-h5x5ga/hh82COe+GoD4+gKUeV4T3iaYOxqLt41GRKApinPI7DMidhCmNVTjKfhCWFJIGXaFJee07XczdT4jdZQ==", "dev": true, - "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@tufjs/models/node_modules/brace-expansion": { @@ -4258,7 +4172,6 @@ "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" } @@ -4268,7 +4181,6 @@ "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" }, @@ -4279,10 +4191,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "dependencies": { "@types/connect": "*", @@ -4299,9 +4220,9 @@ } }, "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "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, "dependencies": { "@types/node": "*" @@ -4311,25 +4232,23 @@ "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" + "dev": true }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.5.tgz", + "integrity": "sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==", "dev": true, "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", "dev": true, "dependencies": { "@types/node": "*", @@ -4339,15 +4258,15 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true }, "node_modules/@types/jasmine": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.7.tgz", - "integrity": "sha512-DVOfk9FaClQfNFpSfaML15jjB5cjffDMvjtph525sroR5BEAW2uKnTOYUTqTFuZFjNvH0T5XMIydvIctnUKufw==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.13.tgz", + "integrity": "sha512-MYCcDkruFc92LeYZux5BC0dmqo2jk+M5UIZ4/oFnAPCXN9mCcQhLyj7F3/Za7rocVyt5YRr1MmqJqFlvQ9LVcg==", "dev": true }, "node_modules/@types/mime": { @@ -4357,18 +4276,18 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.19.86", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.86.tgz", - "integrity": "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ==", + "version": "22.19.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", + "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true }, "node_modules/@types/range-parser": { @@ -4378,24 +4297,45 @@ "dev": true }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "dependencies": { "@types/http-errors": "*", "@types/node": "*", - "@types/send": "*" + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "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, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -4405,13 +4345,12 @@ "dev": true }, "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "dev": true, - "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/accepts": { @@ -4426,26 +4365,11 @@ "node": ">= 0.6" } }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "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" } @@ -4471,7 +4395,6 @@ "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" }, @@ -4485,52 +4408,50 @@ } }, "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" + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.40.1.tgz", + "integrity": "sha512-iUNxcXUNg9085TJx0HJLjqtDE0r1RZ0GOGrt8KNQqQT5ugu8lZsHuMUYW/e0lHhq6xBvmktU9Bw4CXP9VQeKrg==", + "dev": true, + "dependencies": { + "@algolia/abtesting": "1.6.1", + "@algolia/client-abtesting": "5.40.1", + "@algolia/client-analytics": "5.40.1", + "@algolia/client-common": "5.40.1", + "@algolia/client-insights": "5.40.1", + "@algolia/client-personalization": "5.40.1", + "@algolia/client-query-suggestions": "5.40.1", + "@algolia/client-search": "5.40.1", + "@algolia/ingestion": "1.40.1", + "@algolia/monitoring": "1.40.1", + "@algolia/recommend": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" }, "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, - "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "environment": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "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==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -4539,15 +4460,12 @@ } }, "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==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -4598,15 +4516,23 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.32.tgz", + "integrity": "sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/beasties": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.4.tgz", - "integrity": "sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.5.tgz", + "integrity": "sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "css-select": "^5.1.0", - "css-what": "^6.1.0", + "css-select": "^6.0.0", + "css-what": "^7.0.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "htmlparser2": "^10.0.0", @@ -4661,22 +4587,46 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/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==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/body-parser/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==", + "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/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" + "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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, "dependencies": { "balanced-match": "^1.0.0", @@ -4696,9 +4646,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", "dev": true, "funding": [ { @@ -4714,12 +4664,12 @@ "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" + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -4743,135 +4693,78 @@ } }, "node_modules/cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", + "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", "dev": true, - "license": "ISC", "dependencies": { - "@npmcli/fs": "^4.0.0", + "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", "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" + "ssri": "^13.0.0", + "unique-filename": "^5.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": "^20.17.0 || >=22.9.0" } }, "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==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "20 || >=22" }, "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==", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "20 || >=22" } }, - "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==", + "node_modules/cacache/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "20 || >=22" }, "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==", + "node_modules/cacache/node_modules/ssri": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz", + "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==", "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" + "minipass": "^7.0.3" }, "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": "^20.17.0 || >=22.9.0" } }, "node_modules/call-bind-apply-helpers": { @@ -4902,9 +4795,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "version": "1.0.30001757", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", + "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", "dev": true, "funding": [ { @@ -4919,15 +4812,13 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -4936,11 +4827,10 @@ } }, "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" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true }, "node_modules/chokidar": { "version": "4.0.3", @@ -4958,13 +4848,12 @@ } }, "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "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": "ISC", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/cli-cursor": { @@ -4972,7 +4861,6 @@ "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" }, @@ -4984,30 +4872,28 @@ } }, "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==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.3.0.tgz", + "integrity": "sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18.20" }, "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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, - "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5018,7 +4904,6 @@ "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" } @@ -5028,7 +4913,6 @@ "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", @@ -5038,25 +4922,28 @@ "node": ">=20" } }, - "node_modules/cliui/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==", + "node_modules/cliui/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": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "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==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -5091,16 +4978,7 @@ "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/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", @@ -5224,21 +5102,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -5257,7 +5120,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", @@ -5267,45 +5129,27 @@ "node": ">= 8" } }, - "node_modules/cross-spawn/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/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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", "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" + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.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==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -5341,11 +5185,10 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -5376,9 +5219,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "engines": { "node": ">=8" } @@ -5406,7 +5249,6 @@ "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", @@ -5426,15 +5268,13 @@ "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" }, @@ -5450,7 +5290,6 @@ "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", @@ -5473,31 +5312,22 @@ "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==" }, "node_modules/electron-to-chromium": { - "version": "1.5.187", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.187.tgz", - "integrity": "sha512-cl5Jc9I0KGUoOoSbxvTywTa40uspGJt/BDBoDLoxJRSBpWh4FFXBsjNRHfQrONsV/OoEjDfHUmZQa2d6Ze4YgA==", - "dev": true, - "license": "ISC" + "version": "1.5.262", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz", + "integrity": "sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==", + "dev": true }, "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" + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true }, "node_modules/encodeurl": { "version": "2.0.0", @@ -5512,7 +5342,6 @@ "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" @@ -5523,7 +5352,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -5588,9 +5416,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5640,7 +5468,6 @@ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -5652,23 +5479,7 @@ "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/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } + "dev": true }, "node_modules/es-define-property": { "version": "1.0.1", @@ -5698,12 +5509,11 @@ } }, "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.26.0.tgz", + "integrity": "sha512-3Hq7jri+tRrVWha+ZeIVhl4qJRha/XjRNSopvTsOaCvfPHrflTYTcUFcEjMKdxofsXXsdc4zjg5NOTnL4Gl57Q==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -5711,31 +5521,32 @@ "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" + "@esbuild/aix-ppc64": "0.26.0", + "@esbuild/android-arm": "0.26.0", + "@esbuild/android-arm64": "0.26.0", + "@esbuild/android-x64": "0.26.0", + "@esbuild/darwin-arm64": "0.26.0", + "@esbuild/darwin-x64": "0.26.0", + "@esbuild/freebsd-arm64": "0.26.0", + "@esbuild/freebsd-x64": "0.26.0", + "@esbuild/linux-arm": "0.26.0", + "@esbuild/linux-arm64": "0.26.0", + "@esbuild/linux-ia32": "0.26.0", + "@esbuild/linux-loong64": "0.26.0", + "@esbuild/linux-mips64el": "0.26.0", + "@esbuild/linux-ppc64": "0.26.0", + "@esbuild/linux-riscv64": "0.26.0", + "@esbuild/linux-s390x": "0.26.0", + "@esbuild/linux-x64": "0.26.0", + "@esbuild/netbsd-arm64": "0.26.0", + "@esbuild/netbsd-x64": "0.26.0", + "@esbuild/openbsd-arm64": "0.26.0", + "@esbuild/openbsd-x64": "0.26.0", + "@esbuild/openharmony-arm64": "0.26.0", + "@esbuild/sunos-x64": "0.26.0", + "@esbuild/win32-arm64": "0.26.0", + "@esbuild/win32-ia32": "0.26.0", + "@esbuild/win32-x64": "0.26.0" } }, "node_modules/escalade": { @@ -5771,7 +5582,6 @@ "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" }, @@ -5780,21 +5590,19 @@ } }, "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==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "dev": true, - "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=18.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" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true }, "node_modules/express": { "version": "4.21.2", @@ -5846,7 +5654,6 @@ "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" }, @@ -5876,21 +5683,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "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/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5901,13 +5693,12 @@ "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" + "dev": true }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -5921,11 +5712,13 @@ ] }, "node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -5984,9 +5777,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "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": [ { @@ -6003,23 +5796,6 @@ } } }, - "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/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6055,7 +5831,6 @@ "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" }, @@ -6110,11 +5885,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==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -6178,6 +5952,18 @@ "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, + "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", @@ -6247,24 +6033,25 @@ } }, "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==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "dev": true, - "license": "ISC", "dependencies": { - "lru-cache": "^10.0.1" + "lru-cache": "^11.1.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, - "license": "ISC" + "engines": { + "node": "20 || >=22" + } }, "node_modules/html-escaper": { "version": "2.0.2", @@ -6284,7 +6071,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -6297,7 +6083,6 @@ "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" }, @@ -6309,8 +6094,7 @@ "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" + "dev": true }, "node_modules/http-errors": { "version": "2.0.0", @@ -6346,7 +6130,6 @@ "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" @@ -6360,7 +6143,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" @@ -6370,74 +6152,52 @@ } }, "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==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ignore-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", - "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "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": "^9.0.0" + "minimatch": "^10.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/ignore-walk/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": "^20.17.0 || >=22.9.0" } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/immutable": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", - "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", "dev": true }, "node_modules/imurmurhash": { @@ -6445,7 +6205,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -6471,21 +6230,15 @@ "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==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { "node": ">= 12" } @@ -6535,13 +6288,15 @@ } }, "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==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, - "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6564,7 +6319,6 @@ "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" }, @@ -6585,8 +6339,7 @@ "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" + "dev": true }, "node_modules/is-regex": { "version": "1.2.1", @@ -6611,7 +6364,6 @@ "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" }, @@ -6619,15 +6371,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", @@ -6660,7 +6403,6 @@ "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", @@ -6710,9 +6452,9 @@ } }, "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==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -6722,22 +6464,6 @@ "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.5.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.5.0.tgz", @@ -6745,14 +6471,11 @@ "dev": true }, "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "optional": true, - "peer": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "bin": { - "jiti": "bin/jiti.js" + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/js-tokens": { @@ -6761,13 +6484,6 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "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", @@ -6781,13 +6497,12 @@ } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", + "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", "dev": true, - "license": "MIT", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/json-schema-traverse": { @@ -6830,8 +6545,7 @@ "dev": true, "engines": [ "node >= 0.2.0" - ], - "license": "MIT" + ] }, "node_modules/karma": { "version": "6.4.4", @@ -6880,6 +6594,18 @@ "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, + "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", @@ -6963,6 +6689,21 @@ "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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/karma/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -7004,18 +6745,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/karma/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, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "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", @@ -7084,15 +6813,6 @@ "node": ">=8" } }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "engines": { - "node": ">=14.14" - } - }, "node_modules/karma/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -7137,94 +6857,10 @@ "node": ">=10" } }, - "node_modules/less": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.3.0.tgz", - "integrity": "sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/less/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", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lightningcss": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", - "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", "dependencies": { "detect-libc": "^2.0.3" }, @@ -7236,22 +6872,42 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.2", - "lightningcss-darwin-x64": "1.29.2", - "lightningcss-freebsd-x64": "1.29.2", - "lightningcss-linux-arm-gnueabihf": "1.29.2", - "lightningcss-linux-arm64-gnu": "1.29.2", - "lightningcss-linux-arm64-musl": "1.29.2", - "lightningcss-linux-x64-gnu": "1.29.2", - "lightningcss-linux-x64-musl": "1.29.2", - "lightningcss-win32-arm64-msvc": "1.29.2", - "lightningcss-win32-x64-msvc": "1.29.2" + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", - "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", "cpu": [ "arm64" ], @@ -7268,9 +6924,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", - "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", "cpu": [ "x64" ], @@ -7287,9 +6943,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", - "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", "cpu": [ "x64" ], @@ -7306,9 +6962,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", - "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", "cpu": [ "arm" ], @@ -7325,9 +6981,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", - "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", "cpu": [ "arm64" ], @@ -7344,9 +7000,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", - "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", "cpu": [ "arm64" ], @@ -7363,9 +7019,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", "cpu": [ "x64" ], @@ -7382,9 +7038,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", "cpu": [ "x64" ], @@ -7401,9 +7057,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", "cpu": [ "arm64" ], @@ -7420,9 +7076,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", - "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", "cpu": [ "x64" ], @@ -7439,13 +7095,12 @@ } }, "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, - "license": "MIT", "dependencies": { - "cli-truncate": "^4.0.0", + "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", @@ -7453,35 +7108,37 @@ "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/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": ">=20.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 + }, + "node_modules/listr2/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/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==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -7495,12 +7152,11 @@ } }, "node_modules/lmdb": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.1.tgz", - "integrity": "sha512-hoG9RIv42kdGJiieyElgWcKCTaw5S6Jqwyd1gLSVdsJ3+8MVm8e4yLronThiRJI9DazFAAs9xfB9nWeMQ2DWKA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.3.tgz", + "integrity": "sha512-GWV1kVi6uhrXWqe+3NXWO73OYe8fto6q8JMo0HOpk1vf8nEyFWgo4CSNJpIFzsOxOrysVUlcO48qRbQfmKd1gA==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "msgpackr": "^1.11.2", @@ -7513,13 +7169,13 @@ "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" + "@lmdb/lmdb-darwin-arm64": "3.4.3", + "@lmdb/lmdb-darwin-x64": "3.4.3", + "@lmdb/lmdb-linux-arm": "3.4.3", + "@lmdb/lmdb-linux-arm64": "3.4.3", + "@lmdb/lmdb-linux-x64": "3.4.3", + "@lmdb/lmdb-win32-arm64": "3.4.3", + "@lmdb/lmdb-win32-x64": "3.4.3" } }, "node_modules/lodash": { @@ -7528,33 +7184,14 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, "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==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" }, "engines": { "node": ">=18" @@ -7563,25 +7200,11 @@ "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", @@ -7596,43 +7219,15 @@ "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/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/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==", + "node_modules/log-update/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": { - "get-east-asian-width": "^1.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { "node": ">=18" @@ -7641,29 +7236,11 @@ "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==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -7697,19 +7274,17 @@ "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==", + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-dir": { @@ -7728,26 +7303,25 @@ } }, "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==", + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.3.tgz", + "integrity": "sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==", "dev": true, - "license": "ISC", "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", + "@npmcli/agent": "^4.0.0", + "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "ssri": "^12.0.0" + "ssri": "^13.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/make-fetch-happen/node_modules/negotiator": { @@ -7755,11 +7329,31 @@ "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/make-fetch-happen/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz", + "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -7855,7 +7449,6 @@ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -7889,7 +7482,6 @@ "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" } @@ -7899,7 +7491,6 @@ "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" }, @@ -7908,18 +7499,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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.0.tgz", + "integrity": "sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==", "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" + "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -7930,7 +7520,6 @@ "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" }, @@ -7943,7 +7532,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" }, @@ -7955,15 +7543,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" + "dev": true }, "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" }, @@ -7976,7 +7562,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" }, @@ -7988,15 +7573,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" + "dev": true }, "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" }, @@ -8009,7 +7592,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" }, @@ -8021,15 +7603,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, @@ -8054,7 +7634,6 @@ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -8069,7 +7648,6 @@ "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" @@ -8081,7 +7659,6 @@ "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "node-gyp-build-optional-packages": "5.2.2" @@ -8103,7 +7680,6 @@ "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" } @@ -8125,40 +7701,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/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", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -8172,32 +7714,30 @@ "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.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", - "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.1.0.tgz", + "integrity": "sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==", "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", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^7.4.3", + "tar": "^7.5.2", "tinyglobby": "^0.2.12", - "which": "^5.0.0" + "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/node-gyp-build-optional-packages": { @@ -8205,7 +7745,6 @@ "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" @@ -8216,66 +7755,29 @@ "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==", + "node_modules/node-gyp/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "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": "^20.17.0 || >=22.9.0" } }, "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -8283,39 +7785,28 @@ "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": "^20.17.0 || >=22.9.0" } }, "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==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, "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==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "dev": true, - "license": "ISC", "dependencies": { - "abbrev": "^3.0.0" + "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/normalize-path": { @@ -8332,7 +7823,6 @@ "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" }, @@ -8341,16 +7831,15 @@ } }, "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==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", + "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-normalize-package-bin": { @@ -8358,74 +7847,97 @@ "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==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.1.tgz", + "integrity": "sha512-6zqls5xFvJbgFjB1B2U6yITtyGBjDBORB7suI4zA4T/sZ1OmkMFlaQSNB/4K0LtXNA1t4OprAFxPisadK5O2ag==", "dev": true, - "license": "ISC", "dependencies": { - "hosted-git-info": "^8.0.0", + "hosted-git-info": "^9.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": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-packlist": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.0.tgz", - "integrity": "sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.3.tgz", + "integrity": "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==", "dev": true, - "license": "ISC", "dependencies": { - "ignore-walk": "^7.0.0" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/npm-packlist/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "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==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", + "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", "dev": true, - "license": "ISC", "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", + "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.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==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", + "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", "dev": true, - "license": "ISC", "dependencies": { - "@npmcli/redact": "^3.0.0", + "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", + "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/nth-check": { @@ -8433,7 +7945,6 @@ "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" }, @@ -8486,7 +7997,6 @@ "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" }, @@ -8498,24 +8008,23 @@ } }, "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^5.3.0", + "chalk": "^5.6.2", "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", + "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8526,25 +8035,13 @@ "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==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -8552,37 +8049,29 @@ "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==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.3.tgz", + "integrity": "sha512-itdFlanxO0nmQv4ORsvA9K1wv40IPfB9OmWqfaJWvoJ30VKyHsqNgDVeG+TVhI7Gk7XW8slUy7cA9r6dF5qohw==", "dev": true, - "license": "ISC", "dependencies": { - "@npmcli/git": "^6.0.0", + "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/package-json": "^6.0.0", + "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^8.0.0", - "@npmcli/run-script": "^9.0.0", - "cacache": "^19.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.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", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "sigstore": "^3.0.0", + "sigstore": "^4.0.0", "ssri": "^12.0.0", - "tar": "^6.1.11" + "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" @@ -8591,40 +8080,26 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", "dependencies": { - "entities": "^4.5.0" + "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==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", + "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", "dev": true, - "license": "MIT", "dependencies": { "entities": "^6.0.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -8635,7 +8110,6 @@ "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" }, @@ -8644,18 +8118,28 @@ } }, "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==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", "dev": true, - "license": "MIT", "dependencies": { - "parse5": "^7.0.0" + "parse5": "^8.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==", + "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", @@ -8678,7 +8162,6 @@ "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" } @@ -8690,28 +8173,29 @@ "dev": true }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "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==", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, - "license": "ISC" + "engines": { + "node": "20 || >=22" + } }, "node_modules/path-to-regexp": { "version": "0.1.12", @@ -8724,9 +8208,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "engines": { "node": ">=12" @@ -8735,37 +8219,23 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "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==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", + "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", "dev": true, - "license": "MIT", "engines": { "node": ">=20.x" }, "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" + "@napi-rs/nice": "^1.0.4" } }, "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==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=16.20.0" } @@ -8788,7 +8258,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -8802,15 +8271,26 @@ "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 + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, - "license": "MIT" + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } }, "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" } @@ -8820,7 +8300,6 @@ "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" @@ -8841,15 +8320,6 @@ "node": ">= 0.10" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -8888,15 +8358,45 @@ } }, "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -8918,8 +8418,7 @@ "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" + "dev": true }, "node_modules/require-directory": { "version": "2.1.1", @@ -8946,12 +8445,12 @@ "dev": true }, "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==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -8970,7 +8469,6 @@ "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" @@ -8987,7 +8485,6 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -9014,12 +8511,43 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rolldown": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.47.tgz", + "integrity": "sha512-Mid74GckX1OeFAOYz9KuXeWYhq3xkXbMziYIC+ULVdUzPTG9y70OBSBQDQn9hQP8u/AfhuYw1R0BSg15nBI4Dg==", + "dev": true, + "dependencies": { + "@oxc-project/types": "=0.96.0", + "@rolldown/pluginutils": "1.0.0-beta.47" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-beta.47", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.47", + "@rolldown/binding-darwin-x64": "1.0.0-beta.47", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.47", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.47", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.47", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.47", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.47", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.47", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.47", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.47", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.47", + "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.47", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.47" + } + }, "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==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.8" }, @@ -9031,26 +8559,28 @@ "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", + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", "fsevents": "~2.3.2" } }, @@ -9059,7 +8589,6 @@ "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", @@ -9072,13 +8601,13 @@ } }, "node_modules/router/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==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/rxjs": { @@ -9131,11 +8660,10 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", + "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -9151,19 +8679,10 @@ "@parcel/watcher": "^2.4.1" } }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true - }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9251,7 +8770,6 @@ "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" }, @@ -9264,7 +8782,6 @@ "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" } @@ -9342,7 +8859,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC", "engines": { "node": ">=14" }, @@ -9351,59 +8867,43 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.0.0.tgz", + "integrity": "sha512-Gw/FgHtrLM9WP8P5lLcSGh9OQcrTruWCELAiS48ik1QbL0cH+dfjomiRTUE9zzz+D1N6rOLkwXUvVmXZAsNE0Q==", "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" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.0.0", + "@sigstore/tuf": "^4.0.0", + "@sigstore/verify": "^3.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/slice-ansi/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/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" @@ -9502,13 +9002,12 @@ } }, "node_modules/socks": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", - "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "dev": true, - "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -9521,7 +9020,6 @@ "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", @@ -9532,13 +9030,12 @@ } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, - "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/source-map-js": { @@ -9573,7 +9070,6 @@ "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" @@ -9583,40 +9079,29 @@ "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" + "dev": true }, "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" + "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 }, "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" }, @@ -9637,7 +9122,6 @@ "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" }, @@ -9660,85 +9144,26 @@ } }, "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==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, - "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", + "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "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==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -9749,30 +9174,6 @@ "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", @@ -9798,149 +9199,55 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.1.tgz", - "integrity": "sha512-QNbdmeS979Efzim2g/bEvfuh+fTcIdp1y7gA+sb6OYSW74rt7Cr7M78AKdf6HqWT3d5AiTb7SwTT3sLQxr4/qw==" + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", + "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "engines": { "node": ">=6" - } - }, - "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" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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==", + "node_modules/tar": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "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" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "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/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "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": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, - "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -9950,16 +9257,12 @@ } }, "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, "engines": { - "node": ">=0.6.0" + "node": ">=14.14" } }, "node_modules/to-regex-range": { @@ -9988,31 +9291,17 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.0.0.tgz", + "integrity": "sha512-Lq7ieeGvXDXwpoSmOSgLWVdsGGV9J4a77oDTAPe/Ltrqnnm/ETaRlBAQTH5JatEh8KXuE6sddf9qAv1Q2282Hg==", "dev": true, - "license": "MIT", "dependencies": { - "@tufjs/models": "3.0.1", + "@tufjs/models": "4.0.0", "debug": "^4.4.1", - "make-fetch-happen": "^14.0.3" + "make-fetch-happen": "^15.0.0" }, "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": "^20.17.0 || >=22.9.0" } }, "node_modules/type-is": { @@ -10028,11 +9317,10 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10042,9 +9330,9 @@ } }, "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==", + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", "dev": true, "funding": [ { @@ -10067,36 +9355,43 @@ "node": "*" } }, + "node_modules/undici": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "dev": true, + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", + "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", "dev": true, - "license": "ISC", "dependencies": { - "unique-slug": "^5.0.0" + "unique-slug": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz", + "integrity": "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/universalify": { @@ -10117,9 +9412,9 @@ } }, "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==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, "funding": [ { @@ -10151,7 +9446,6 @@ "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" } @@ -10161,7 +9455,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10185,18 +9478,16 @@ "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.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", - "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", + "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" } @@ -10209,6 +9500,537 @@ "node": ">= 0.8" } }, + "node_modules/vite": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", + "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "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/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -10223,7 +10045,6 @@ "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" @@ -10237,19 +10058,21 @@ "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": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/wrap-ansi": { @@ -10257,7 +10080,6 @@ "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", @@ -10267,103 +10089,41 @@ "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": { + "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-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==", + "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": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "color-convert": "^2.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" + "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" + "dev": true }, "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" } @@ -10373,7 +10133,6 @@ "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", @@ -10388,7 +10147,6 @@ "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" }, @@ -10427,7 +10185,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -10445,15 +10202,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "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", @@ -10471,17 +10226,44 @@ "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": { + "node_modules/yargs/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, + "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/yoctocolors": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -10490,29 +10272,27 @@ } }, "node_modules/zod": { - "version": "3.25.75", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.75.tgz", - "integrity": "sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "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==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", + "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", "dev": true, - "license": "ISC", "peerDependencies": { - "zod": "^3.24.1" + "zod": "^3.25 || ^4" } }, "node_modules/zone.js": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", - "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==" + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==" } } } diff --git a/frontend/package.json b/frontend/package.json index f2e72eb..ae26f8b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "contact-portal", - "version": "0.0.0", + "version": "1.0.0", "scripts": { "ng": "ng", "start": "ng serve", @@ -13,34 +13,34 @@ }, "private": true, "dependencies": { - "@angular/animations": "^20.1.2", - "@angular/cdk": "^20.1.2", - "@angular/common": "^20.1.2", - "@angular/compiler": "^20.1.2", - "@angular/core": "^20.1.2", - "@angular/forms": "^20.1.2", - "@angular/material": "^20.1.2", - "@angular/platform-browser": "^20.1.2", - "@angular/platform-browser-dynamic": "^20.1.2", - "@angular/platform-server": "^20.1.2", - "@angular/router": "^20.1.2", - "@angular/ssr": "^20.1.1", + "@angular/animations": "^21.0.1", + "@angular/cdk": "^21.0.1", + "@angular/common": "^21.0.1", + "@angular/compiler": "^21.0.1", + "@angular/core": "^21.0.1", + "@angular/forms": "^21.0.1", + "@angular/material": "^21.0.1", + "@angular/platform-browser": "^21.0.1", + "@angular/platform-browser-dynamic": "^21.0.1", + "@angular/platform-server": "^21.0.1", + "@angular/router": "^21.0.1", + "@angular/ssr": "^21.0.1", "@tailwindcss/postcss": "^4.1.1", - "express": "^4.18.2", + "express": "^4.21.0", "postcss": "^8.5.3", - "rxjs": "~7.8.0", + "rxjs": "~7.8.1", "tailwindcss": "^4.1.1", - "tslib": "^2.3.0", + "tslib": "^2.8.0", "zone.js": "~0.15.0" }, "devDependencies": { - "@angular/build": "^20.1.1", - "@angular/cli": "^20.1.1", - "@angular/compiler-cli": "^20.1.2", + "@angular/build": "^21.0.1", + "@angular/cli": "^21.0.1", + "@angular/compiler-cli": "^21.0.1", "@tailwindcss/typography": "^0.5.16", - "@types/express": "^4.17.17", + "@types/express": "^5.0.0", "@types/jasmine": "~5.1.0", - "@types/node": "^18.18.0", + "@types/node": "^22.0.0", "jasmine-core": "~5.5.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", @@ -48,6 +48,6 @@ "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", "postcss": "^8.5.3", - "typescript": "~5.8.3" + "typescript": "~5.9.0" } } \ No newline at end of file diff --git a/frontend/src/app/@core/layout/header/header.component.ts b/frontend/src/app/@core/layout/header/header.component.ts index ff4e2b9..28f9ce8 100644 --- a/frontend/src/app/@core/layout/header/header.component.ts +++ b/frontend/src/app/@core/layout/header/header.component.ts @@ -39,7 +39,7 @@ export class HeaderComponent implements OnInit { isDarkMode = this.themeService.isDarkMode; isMobile = signal(false); - @HostListener('window:resize', ['$event']) + @HostListener('window:resize') onResize() { this.checkScreenSize(); } diff --git a/frontend/src/app/@core/layout/layout.component.ts b/frontend/src/app/@core/layout/layout.component.ts index f231b77..9c671ec 100644 --- a/frontend/src/app/@core/layout/layout.component.ts +++ b/frontend/src/app/@core/layout/layout.component.ts @@ -51,7 +51,7 @@ export default class LayoutComponent { return this.collapsed() ? '65px' : '250px'; }); - @HostListener('window:resize', ['$event']) + @HostListener('window:resize') onResize() { if (isPlatformBrowser(this.platformId)) { // Add debounce to avoid multiple rapid calls diff --git a/frontend/src/app/styles/tailwind.css b/frontend/src/app/styles/tailwind.css index ce1722c..98c749f 100644 --- a/frontend/src/app/styles/tailwind.css +++ b/frontend/src/app/styles/tailwind.css @@ -6,6 +6,66 @@ @custom-variant dark (&:is(.dark *)); @theme { + /* ============================================ + Fluent 2 Design System Tokens + ============================================ */ + + /* Fluent 2 Neutral Color Ramp */ + --color-neutral-2: #050505; + --color-neutral-4: #0a0a0a; + --color-neutral-6: #0f0f0f; + --color-neutral-8: #141414; + --color-neutral-10: #1a1a1a; + --color-neutral-12: #1f1f1f; + --color-neutral-14: #242424; + --color-neutral-16: #292929; + --color-neutral-20: #333333; + --color-neutral-24: #3d3d3d; + --color-neutral-28: #474747; + --color-neutral-30: #525252; + --color-neutral-36: #5c5c5c; + --color-neutral-40: #666666; + --color-neutral-44: #707070; + --color-neutral-48: #7a7a7a; + --color-neutral-52: #858585; + --color-neutral-56: #8f8f8f; + --color-neutral-60: #999999; + --color-neutral-64: #a3a3a3; + --color-neutral-68: #adadad; + --color-neutral-72: #b8b8b8; + --color-neutral-76: #c2c2c2; + --color-neutral-80: #cccccc; + --color-neutral-84: #d6d6d6; + --color-neutral-88: #e0e0e0; + --color-neutral-92: #ebebeb; + --color-neutral-94: #f0f0f0; + --color-neutral-96: #f5f5f5; + --color-neutral-98: #fafafa; + + /* Fluent 2 Brand Colors (Azure Blue theme) */ + --color-brand-10: #061724; + --color-brand-20: #0a2e4a; + --color-brand-30: #0f4578; + --color-brand-40: #115ea3; + --color-brand-50: #0f6cbd; + --color-brand-60: #2886de; + --color-brand-70: #479ef5; + --color-brand-80: #62abf5; + --color-brand-90: #96c6fa; + --color-brand-100: #c7e0f9; + --color-brand-110: #e8f3fc; + --color-brand-120: #f3f9fd; + + /* Fluent 2 Status Colors */ + --color-success-primary: #0e7a0d; + --color-success-background: #f1faf1; + --color-warning-primary: #c4730c; + --color-warning-background: #fff9f5; + --color-danger-primary: #b10e1c; + --color-danger-background: #fdf3f4; + --color-info-primary: #0078d4; + --color-info-background: #f0f9ff; + /* Map Tailwind variables to Angular Material theme variables */ --color-primary: var(--mat-sys-primary); --color-on-primary: var(--mat-sys-on-primary); @@ -62,6 +122,75 @@ --color-blue-800: #1e40af; --color-blue-900: #1e3a8a; --color-blue-950: #172554; + + /* Fluent 2 Elevation Shadows */ + --shadow-2: 0 1px 2px rgba(0, 0, 0, 0.14), 0 0 2px rgba(0, 0, 0, 0.12); + --shadow-4: 0 2px 4px rgba(0, 0, 0, 0.14), 0 0 2px rgba(0, 0, 0, 0.12); + --shadow-8: 0 4px 8px rgba(0, 0, 0, 0.14), 0 0 2px rgba(0, 0, 0, 0.12); + --shadow-16: 0 8px 16px rgba(0, 0, 0, 0.14), 0 0 2px rgba(0, 0, 0, 0.12); + --shadow-28: 0 14px 28px rgba(0, 0, 0, 0.24), 0 0 8px rgba(0, 0, 0, 0.12); + --shadow-64: 0 32px 64px rgba(0, 0, 0, 0.24), 0 0 8px rgba(0, 0, 0, 0.12); + + /* Fluent 2 Border Radius */ + --radius-none: 0; + --radius-sm: 2px; + --radius-md: 4px; + --radius-lg: 8px; + --radius-xl: 12px; + --radius-circular: 9999px; + + /* Fluent 2 Typography */ + --font-family-base: "Segoe UI Variable", "Segoe UI", system-ui, -apple-system, sans-serif; + --font-family-mono: "Cascadia Code", "Consolas", monospace; + + --font-size-caption-2: 10px; + --font-size-caption-1: 12px; + --font-size-body-1: 14px; + --font-size-body-2: 16px; + --font-size-subtitle-2: 16px; + --font-size-subtitle-1: 20px; + --font-size-title-3: 20px; + --font-size-title-2: 24px; + --font-size-title-1: 28px; + --font-size-large-title: 40px; + --font-size-display: 68px; + + --font-weight-regular: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + + --line-height-caption: 1.33; + --line-height-body: 1.43; + --line-height-subtitle: 1.5; + --line-height-title: 1.25; + --line-height-display: 1.1; + + /* Fluent 2 Motion/Animation */ + --duration-ultra-fast: 50ms; + --duration-faster: 100ms; + --duration-fast: 150ms; + --duration-normal: 200ms; + --duration-slow: 300ms; + --duration-slower: 400ms; + --duration-ultra-slow: 500ms; + + --easing-accelerate: cubic-bezier(0.9, 0.1, 1, 0.2); + --easing-decelerate: cubic-bezier(0.1, 0.9, 0.2, 1); + --easing-linear: cubic-bezier(0, 0, 1, 1); + --easing-ease-in-out: cubic-bezier(0.33, 0, 0.67, 1); + + /* Fluent 2 Spacing Scale */ + --spacing-xxs: 2px; + --spacing-xs: 4px; + --spacing-s-nudge: 6px; + --spacing-s: 8px; + --spacing-m-nudge: 10px; + --spacing-m: 12px; + --spacing-l: 16px; + --spacing-xl: 20px; + --spacing-xxl: 24px; + --spacing-xxxl: 32px; } /* @@ -77,6 +206,169 @@ ::file-selector-button { border-color: var(--color-gray-200, currentColor); } + + /* Fluent Typography Base */ + html { + font-family: var(--font-family-base); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } +} + +/* Fluent 2 Elevation Utility Classes */ +@layer utilities { + .shadow-fluent-2 { + box-shadow: var(--shadow-2); + } + .shadow-fluent-4 { + box-shadow: var(--shadow-4); + } + .shadow-fluent-8 { + box-shadow: var(--shadow-8); + } + .shadow-fluent-16 { + box-shadow: var(--shadow-16); + } + .shadow-fluent-28 { + box-shadow: var(--shadow-28); + } + .shadow-fluent-64 { + box-shadow: var(--shadow-64); + } + + /* Fluent Motion Transitions */ + .transition-fluent-fast { + transition-duration: var(--duration-fast); + transition-timing-function: var(--easing-ease-in-out); + } + .transition-fluent-normal { + transition-duration: var(--duration-normal); + transition-timing-function: var(--easing-ease-in-out); + } + .transition-fluent-slow { + transition-duration: var(--duration-slow); + transition-timing-function: var(--easing-ease-in-out); + } + + /* Fluent Typography Classes */ + .text-caption-2 { + font-size: var(--font-size-caption-2); + line-height: var(--line-height-caption); + } + .text-caption-1 { + font-size: var(--font-size-caption-1); + line-height: var(--line-height-caption); + } + .text-body-1 { + font-size: var(--font-size-body-1); + line-height: var(--line-height-body); + } + .text-body-2 { + font-size: var(--font-size-body-2); + line-height: var(--line-height-body); + } + .text-subtitle-2 { + font-size: var(--font-size-subtitle-2); + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-subtitle); + } + .text-subtitle-1 { + font-size: var(--font-size-subtitle-1); + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-subtitle); + } + .text-title-3 { + font-size: var(--font-size-title-3); + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-title); + } + .text-title-2 { + font-size: var(--font-size-title-2); + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-title); + } + .text-title-1 { + font-size: var(--font-size-title-1); + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-title); + } + .text-large-title { + font-size: var(--font-size-large-title); + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-title); + } + .text-display { + font-size: var(--font-size-display); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-display); + } + + /* Fluent Card Styles */ + .fluent-card { + background-color: var(--color-white); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-4); + transition: box-shadow var(--duration-fast) var(--easing-ease-in-out); + } + .fluent-card:hover { + box-shadow: var(--shadow-8); + } + .dark .fluent-card { + background-color: var(--color-neutral-12); + } + + /* Fluent Surface Styles */ + .fluent-surface { + background-color: var(--color-neutral-96); + } + .dark .fluent-surface { + background-color: var(--color-neutral-8); + } + + /* Fluent Focus Ring */ + .fluent-focus:focus-visible { + outline: 2px solid var(--color-brand-70); + outline-offset: 2px; + } + + /* Fluent Button Base */ + .fluent-button { + border-radius: var(--radius-md); + font-weight: var(--font-weight-semibold); + font-size: var(--font-size-body-1); + padding: var(--spacing-s) var(--spacing-m); + transition: all var(--duration-fast) var(--easing-ease-in-out); + } + .fluent-button-primary { + background-color: var(--color-brand-80); + color: var(--color-white); + } + .fluent-button-primary:hover { + background-color: var(--color-brand-70); + } + .fluent-button-outline { + background-color: transparent; + border: 1px solid var(--color-neutral-72); + color: var(--color-neutral-14); + } + .fluent-button-outline:hover { + background-color: var(--color-neutral-94); + } + .dark .fluent-button-outline { + border-color: var(--color-neutral-48); + color: var(--color-neutral-88); + } + .dark .fluent-button-outline:hover { + background-color: var(--color-neutral-20); + } + + /* Fluent Divider */ + .fluent-divider { + border-color: var(--color-neutral-88); + } + .dark .fluent-divider { + border-color: var(--color-neutral-28); + } } /* Material Tailwind Fixes */ From 27852a47953f7f75f12d5f9020c608ccb5a3bf06 Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Sun, 30 Nov 2025 21:26:13 -0500 Subject: [PATCH 04/10] refactor: update DateOfBirth type to DateOnly across contact person models and validators; update frontend technology descriptions --- backend/Contact.Api/Program.cs | 1 - .../ContactPerson/ContactPersonResponse.cs | 2 +- .../ContactPerson/CreateContactPerson.cs | 2 +- .../CreateContactPersonValidator.cs | 3 ++- .../ContactPerson/UpdateContactPerson.cs | 2 +- .../Contact.Domain/Entities/ContactPerson.cs | 2 +- .../app/feature/user/home/home.component.ts | 22 +++++++++---------- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/backend/Contact.Api/Program.cs b/backend/Contact.Api/Program.cs index 66f7f9c..e9d61cb 100644 --- a/backend/Contact.Api/Program.cs +++ b/backend/Contact.Api/Program.cs @@ -8,7 +8,6 @@ using Scalar.AspNetCore; using System.Text; - var builder = WebApplication.CreateBuilder(args); builder.AddServiceDefaults(); diff --git a/backend/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs b/backend/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs index 1183e94..5911ee6 100644 --- a/backend/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs +++ b/backend/Contact.Application/UseCases/ContactPerson/ContactPersonResponse.cs @@ -6,7 +6,7 @@ public class ContactPersonResponse public required string FirstName { get; set; } public required string LastName { get; set; } - public DateTime DateOfBirth { get; set; } + public DateOnly DateOfBirth { get; set; } public required string Mobile { get; set; } public required string Email { get; set; } public required string City { get; set; } diff --git a/backend/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs b/backend/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs index f54fa21..70da66b 100644 --- a/backend/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs +++ b/backend/Contact.Application/UseCases/ContactPerson/CreateContactPerson.cs @@ -4,7 +4,7 @@ public class CreateContactPerson { public required string FirstName { get; set; } public required string LastName { get; set; } - public required DateTime DateOfBirth { get; set; } + public required DateOnly DateOfBirth { get; set; } public required string Mobile { get; set; } public required string Email { get; set; } public required string City { get; set; } diff --git a/backend/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs b/backend/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs index 65d5b2d..de64d69 100644 --- a/backend/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs +++ b/backend/Contact.Application/UseCases/ContactPerson/CreateContactPersonValidator.cs @@ -32,6 +32,7 @@ public CreateContactPersonValidator() .MaximumLength(10).WithMessage("Postal code cannot exceed 10 characters"); RuleFor(x => x.DateOfBirth) - .LessThanOrEqualTo(DateTime.UtcNow).WithMessage("Date of birth cannot be in the future"); + .Must(date => date <= DateOnly.FromDateTime(DateTime.UtcNow)) + .WithMessage("Date of birth cannot be in the future"); } } diff --git a/backend/Contact.Application/UseCases/ContactPerson/UpdateContactPerson.cs b/backend/Contact.Application/UseCases/ContactPerson/UpdateContactPerson.cs index 4e523c0..817249b 100644 --- a/backend/Contact.Application/UseCases/ContactPerson/UpdateContactPerson.cs +++ b/backend/Contact.Application/UseCases/ContactPerson/UpdateContactPerson.cs @@ -5,7 +5,7 @@ public class UpdateContactPerson public Guid Id { get; set; } public required string FirstName { get; set; } public required string LastName { get; set; } - public DateTime DateOfBirth { get; set; } + public DateOnly DateOfBirth { get; set; } public required string Mobile { get; set; } public required string Email { get; set; } public required string City { get; set; } diff --git a/backend/Contact.Domain/Entities/ContactPerson.cs b/backend/Contact.Domain/Entities/ContactPerson.cs index bf21afb..42cf20a 100644 --- a/backend/Contact.Domain/Entities/ContactPerson.cs +++ b/backend/Contact.Domain/Entities/ContactPerson.cs @@ -4,7 +4,7 @@ public class ContactPerson : BaseEntity { public required string FirstName { get; set; } public required string LastName { get; set; } - public required DateTime DateOfBirth { get; set; } + public required DateOnly DateOfBirth { get; set; } public required string Mobile { get; set; } public required string Email { get; set; } public required string City { get; set; } diff --git a/frontend/src/app/feature/user/home/home.component.ts b/frontend/src/app/feature/user/home/home.component.ts index 24569c9..41fdf0b 100644 --- a/frontend/src/app/feature/user/home/home.component.ts +++ b/frontend/src/app/feature/user/home/home.component.ts @@ -47,32 +47,32 @@ export class HomeComponent implements OnInit { { icon: 'code', iconType: 'material', - title: '.NET 9', - description: 'Authentication and all REST services are developed using .NET 9 with Clean Architecture.' + title: '.NET 10', + description: 'Authentication and all REST services are developed using .NET 10 with Clean Architecture.' }, { icon: 'web', iconType: 'material', - title: 'Angular 20', - description: 'Front end interfaces built with Angular 20 using signals and functional components.' + title: 'Angular 21', + description: 'Front end interfaces built with Angular 21 using signals and functional components.' + }, + { + icon: 'hub', + iconType: 'material', + title: '.NET Aspire', + description: 'Cloud-ready orchestration with service discovery, health monitoring, and integrated dashboard.' }, { icon: 'palette', iconType: 'material', title: 'Material Design', - description: 'UI components from Angular Material with custom theming for consistent look and feel.' + description: 'Material Design System with TailwindCSS v4 for modern, consistent UI.' }, { icon: 'integration_instructions', iconType: 'material', title: 'Docker', description: 'Containerized application for consistent development, testing, and production environments.' - }, - { - icon: 'published_with_changes', - iconType: 'material', - title: 'CI/CD', - description: 'Automated testing, building, and deployment of the application using GitHub Actions.' } ]); From 6473d357cb8c983a3b20a3a5f29885420691a4e6 Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Mon, 1 Dec 2025 11:54:23 -0500 Subject: [PATCH 05/10] chore: add .vs and .playwright-mcp to .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index be31254..e14a6ba 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,8 @@ *.user *.userosscache *.sln.docstates - +.vs +.playwright-mcp # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs .env From 8a31c499db95dba41bf2690471ca73fb1f931944 Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Mon, 1 Dec 2025 14:47:39 -0500 Subject: [PATCH 06/10] feat: enhance admin management UI and functionality - Refactor role-permission mapping component to use ChangeDetectionStrategy.OnPush for better performance. - Update roles component to include loading indicators and improved error handling. - Revamp user roles management UI with a new layout and enhanced user experience. - Implement confirmation dialogs for user and role deletions to prevent accidental actions. - Improve user management interface with better form validation and user feedback. - Add skeleton loading states for better UX during data fetching. --- frontend/.github/copilot-design-checklist.md | 39 + frontend/.github/copilot-instructions.md | 1025 ++++++++++++++++- .../confirm-dialog.component.ts | 138 +++ .../@core/components/confirm-dialog/index.ts | 1 + .../empty-state/empty-state.component.ts | 87 ++ .../app/@core/components/empty-state/index.ts | 1 + frontend/src/app/@core/components/index.ts | 4 + .../app/@core/components/page-header/index.ts | 1 + .../page-header/page-header.component.ts | 100 ++ .../app/@core/components/skeleton/index.ts | 1 + .../components/skeleton/skeleton.component.ts | 172 +++ .../activity-log/activity-log.component.html | 235 ++-- .../activity-log/activity-log.component.ts | 20 +- .../operations/operations.component.html | 158 ++- .../admin/operations/operations.component.ts | 12 +- .../feature/admin/pages/pages.component.html | 164 ++- .../feature/admin/pages/pages.component.ts | 12 +- .../role-permission-mapping.component.html | 210 ++-- .../role-permission-mapping.component.ts | 16 +- .../feature/admin/roles/roles.component.html | 165 ++- .../feature/admin/roles/roles.component.ts | 60 +- .../user-roles/user-roles.component.html | 209 ++-- .../admin/user-roles/user-roles.component.ts | 11 +- .../feature/admin/users/users.component.html | 283 +++-- .../feature/admin/users/users.component.ts | 59 +- 25 files changed, 2569 insertions(+), 614 deletions(-) create mode 100644 frontend/.github/copilot-design-checklist.md create mode 100644 frontend/src/app/@core/components/confirm-dialog/confirm-dialog.component.ts create mode 100644 frontend/src/app/@core/components/confirm-dialog/index.ts create mode 100644 frontend/src/app/@core/components/empty-state/empty-state.component.ts create mode 100644 frontend/src/app/@core/components/empty-state/index.ts create mode 100644 frontend/src/app/@core/components/index.ts create mode 100644 frontend/src/app/@core/components/page-header/index.ts create mode 100644 frontend/src/app/@core/components/page-header/page-header.component.ts create mode 100644 frontend/src/app/@core/components/skeleton/index.ts create mode 100644 frontend/src/app/@core/components/skeleton/skeleton.component.ts diff --git a/frontend/.github/copilot-design-checklist.md b/frontend/.github/copilot-design-checklist.md new file mode 100644 index 0000000..abfa0ec --- /dev/null +++ b/frontend/.github/copilot-design-checklist.md @@ -0,0 +1,39 @@ +# Design Quality Checklist + +Use this checklist before committing any UI component: + +## Visual Consistency +- [ ] Spacing uses 8px grid (4, 8, 16, 24, 32, 48, 64) +- [ ] Colors from theme palette (no hardcoded hex) +- [ ] Typography follows Material scale +- [ ] Consistent elevation (0, 1, 2, 4, 8) +- [ ] Border radius consistent (sm/md/lg) + +## Responsiveness +- [ ] Works on mobile (< 600px) +- [ ] Works on tablet (600-960px) +- [ ] Works on desktop (> 960px) +- [ ] Touch targets minimum 44x44px +- [ ] Text readable at all sizes + +## Theme Support +- [ ] Light theme perfect +- [ ] Dark theme perfect +- [ ] No hardcoded colors +- [ ] Proper contrast (WCAG AA) +- [ ] Icons/borders adapt + +## Code Quality +- [ ] Standalone component +- [ ] OnPush change detection +- [ ] Signals for state +- [ ] New control flow syntax +- [ ] Proper TypeScript types +- [ ] No any types +- [ ] ARIA labels present + +## Performance +- [ ] Lazy loading where appropriate +- [ ] Track by in loops +- [ ] No unnecessary re-renders +- [ ] Optimized imports \ No newline at end of file diff --git a/frontend/.github/copilot-instructions.md b/frontend/.github/copilot-instructions.md index 5d39e9d..9395a37 100644 --- a/frontend/.github/copilot-instructions.md +++ b/frontend/.github/copilot-instructions.md @@ -1,24 +1,1023 @@ -# Use modern dependency injection syntax +# GitHub Copilot Custom Instructions: Angular 21 + Material 3 + Tailwind 4 Enterprise Admin Dashboard -- Whenever you have to inject a dependency using Angular DI system, use the `inject` function instead of constructor based injection. - - this will apply to injecting services, tokens and parent components e.g. in directives as well +## Project Overview +This is an enterprise-grade admin dashboard built with Angular 21, Angular Material 3, and Tailwind CSS 4. The application follows modern Angular best practices with standalone components, signals-based state management, and a comprehensive design system that supports responsive layouts and light/dark theming. +--- +## CRITICAL RULES - READ FIRST -# For all state in components and directives, use a signal instead of a class property -- For example: +### 1. Technology Stack (Non-Negotiable) +- **Angular 21**: Use latest features (signals, new control flow, standalone components) +- **Angular Material 19+**: Material Design 3 components only +- **Tailwind CSS 4**: CSS-first configuration (@theme syntax, NO tailwind.config.js) +- **TypeScript 5.5+**: Strict mode enabled -` counter = signal(0); ` +### 2. Framework Hierarchy +``` +ALWAYS FOLLOW THIS ORDER: +1. Angular Material → Structure, behavior, accessibility +2. Tailwind 4 → Layout, spacing, responsive utilities +3. Custom CSS → ONLY when absolutely necessary -- For derived state from an existing signal, use computeds as follows. +NEVER override Material component internals with custom CSS. +NEVER duplicate Material functionality with Tailwind. +``` -` doubleCounter = computed(() => this.counter() * 2); ` +--- +## ANGULAR 21 REQUIREMENTS -- Use function style for guard, interceptors +### Component Architecture -- for the service call if using subscribe use next: +#### ALWAYS Use Standalone Components +```typescript +// ✅ CORRECT +@Component({ + selector: 'app-dashboard', + standalone: true, + imports: [CommonModule, MatCardModule, ...], + template: `...` +}) +export class DashboardComponent {} -# For styling use Angular Material 19 with theming and tailwind v4 - - TailwindCSS for utility-first styling - - make sure everything supporting the theme +// ❌ WRONG - No NgModule components +@NgModule({ ... }) +``` + +#### ALWAYS Use Signals for State Management +```typescript +// ✅ CORRECT - Use signals +export class MyComponent { + count = signal(0); + doubleCount = computed(() => this.count() * 2); + items = signal([]); + + increment() { + this.count.update(n => n + 1); + } +} + +// ❌ WRONG - Don't use traditional properties +export class MyComponent { + count = 0; // AVOID + items: Item[] = []; // AVOID +} +``` + +#### ALWAYS Use New Control Flow Syntax +```typescript +// ✅ CORRECT - New @syntax +@Component({ + template: ` + @if (isLoggedIn()) { + + } @else { + + } + + @for (item of items(); track item.id) { + + } + + @switch (status()) { + @case ('loading') { } + @case ('success') { } + @case ('error') { } + } + ` +}) + +// ❌ WRONG - Old *ng syntax +template: ` +
    ...
    // NEVER USE +
    ...
    // NEVER USE +
    ...
    // NEVER USE +` +``` + +#### ALWAYS Use Input Signals (Angular 17.2+) +```typescript +// ✅ CORRECT - Input signals +export class UserCard { + userId = input.required(); + userName = input('Guest'); + isActive = input(false); + + // Computed from inputs + displayName = computed(() => + `${this.userName()} (${this.isActive() ? 'Active' : 'Inactive'})` + ); +} + +// ❌ WRONG - Old @Input decorator +export class UserCard { + @Input() userId!: string; // AVOID + @Input() userName = 'Guest'; // AVOID +} +``` + +#### ALWAYS Use toSignal for Observable Conversion +```typescript +// ✅ CORRECT - Convert observables to signals +export class MyComponent { + private breakpointObserver = inject(BreakpointObserver); + + isMobile = toSignal( + this.breakpointObserver.observe([Breakpoints.Handset]), + { initialValue: false } + ); +} + +// ❌ WRONG - Subscribe in component +ngOnInit() { + this.breakpointObserver.observe(...).subscribe(...); // AVOID +} +``` + +#### ALWAYS Use OnPush Change Detection +```typescript +// ✅ CORRECT +@Component({ + selector: 'app-my-component', + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, // ALWAYS ADD + template: `...` +}) +``` + +#### ALWAYS Use inject() Function (Angular 14+) +```typescript +// ✅ CORRECT - inject() in class body +export class MyComponent { + private router = inject(Router); + private fb = inject(FormBuilder); + private myService = inject(MyService); +} + +// ❌ WRONG - Constructor injection (legacy style) +constructor( + private router: Router, + private fb: FormBuilder +) {} // AVOID unless necessary +``` + +--- + +## TAILWIND 4 CONFIGURATION + +### CRITICAL: Tailwind 4 Uses CSS-First Configuration + +#### File Structure +``` +src/ +├── styles/ +│ ├── tailwind.css ← Main Tailwind file with @theme +│ ├── _material-theme.scss ← Material theming +│ └── _utilities.css ← Custom utilities +└── styles.scss ← Global styles +``` + +#### ALWAYS Use @theme in tailwind.css +```css +/* src/styles/tailwind.css */ +@import "tailwindcss"; + +@theme { + /* CRITICAL: Prefix prevents Material conflicts */ + --prefix: tw; + + /* Spacing: 8px grid system */ + --spacing-0: 0; + --spacing-xs: 0.25rem; /* 4px */ + --spacing-sm: 0.5rem; /* 8px - Material base */ + --spacing-md: 1rem; /* 16px */ + --spacing-lg: 1.5rem; /* 24px */ + --spacing-xl: 2rem; /* 32px */ + --spacing-2xl: 3rem; /* 48px */ + --spacing-3xl: 4rem; /* 64px */ + + /* Colors: Sync with Material palette */ + --color-primary-50: #e8eaf6; + --color-primary-500: #3f51b5; + --color-primary-900: #1a237e; + + --color-accent-500: #e91e63; + --color-warn-500: #f44336; + + --color-neutral-50: #fafafa; + --color-neutral-100: #f5f5f5; + --color-neutral-900: #212121; + + /* Breakpoints: Match Angular CDK */ + --breakpoint-xs: 0; + --breakpoint-sm: 600px; + --breakpoint-md: 960px; + --breakpoint-lg: 1280px; + --breakpoint-xl: 1920px; + + /* Shadows: Material elevation */ + --shadow-sm: 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12); + --shadow-md: 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); + --shadow-lg: 0 2px 4px -1px rgba(0,0,0,.2), 0 4px 5px 0 rgba(0,0,0,.14), 0 1px 10px 0 rgba(0,0,0,.12); +} + +/* Dark theme overrides */ +.dark { + --color-neutral-50: #212121; + --color-neutral-900: #fafafa; +} + +/* Custom utilities */ +@utility elevation-1 { + box-shadow: var(--shadow-sm); +} +@utility elevation-2 { + box-shadow: var(--shadow-md); +} +@utility elevation-4 { + box-shadow: var(--shadow-lg); +} +``` + +#### NEVER Create tailwind.config.js +```javascript +// ❌ WRONG - Don't create this file in Tailwind 4 +// Tailwind 4 doesn't use tailwind.config.js +module.exports = { ... } // NEVER DO THIS +``` + +### Tailwind Utility Usage Rules + +#### ALWAYS Use tw- Prefix +```html + +
    + + +
    +``` + +#### Spacing: ALWAYS Use 8px Grid +```html + +
    +
    +
    +
    +
    +
    + + +
    +
    +``` + +#### Layout: Use Tailwind for Structure +```html + +
    +
    +
    + + +
    +``` + +--- + +## ANGULAR MATERIAL 3 GUIDELINES + +### Component Selection + +#### ALWAYS Use Material for UI Components +```html + + + + + + + + + + + + +
    + + + + + + + + + +``` + +### Theming + +#### Material Theme Configuration +```scss +// src/styles/_material-theme.scss +@use '@angular/material' as mat; + +@include mat.core(); + +// Define theme using Material 3 API +$light-theme: mat.define-theme(( + color: ( + theme-type: light, + primary: mat.$violet-palette, + tertiary: mat.$pink-palette, + ), + typography: ( + brand-family: 'Roboto, sans-serif', + plain-family: 'Roboto, sans-serif', + ), + density: ( + scale: 0 + ) +)); + +$dark-theme: mat.define-theme(( + color: ( + theme-type: dark, + primary: mat.$violet-palette, + tertiary: mat.$pink-palette, + ) +)); + +html { + @include mat.all-component-themes($light-theme); +} + +html.dark { + @include mat.all-component-colors($dark-theme); +} +``` + +--- + +## RESPONSIVE DESIGN RULES + +### Mobile-First Approach + +#### ALWAYS Design Mobile-First +```html + +
    +
    +
    +
    +
    + + +
    +``` + +### Breakpoint Usage + +#### Standard Breakpoints (Match Angular CDK) +``` +xs: 0px - Extra small (mobile portrait) +sm: 600px - Small (mobile landscape) +md: 960px - Medium (tablet) +lg: 1280px - Large (desktop) +xl: 1920px - Extra large (large desktop) +``` + +#### Responsive Patterns +```html + +
    + + +
    + + +
    + + +

    + + +
    Desktop Only
    +
    Mobile Only
    +``` + +#### Responsive Layout Component +```typescript +// ✅ CORRECT - Use CDK BreakpointObserver +import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; + +export class LayoutComponent { + private breakpointObserver = inject(BreakpointObserver); + + isMobile = toSignal( + this.breakpointObserver.observe([Breakpoints.Handset]), + { initialValue: false } + ); + + isTablet = toSignal( + this.breakpointObserver.observe([Breakpoints.Tablet]), + { initialValue: false } + ); + + isDesktop = toSignal( + this.breakpointObserver.observe([Breakpoints.Web]), + { initialValue: false } + ); +} +``` + +### Touch Targets + +#### ALWAYS Ensure Minimum 44x44px Touch Targets +```html + + + + + + ` +}) +export class LayoutComponent { + isDark = signal(false); + + constructor() { + // Load saved theme preference + const savedTheme = localStorage.getItem('theme'); + if (savedTheme === 'dark') { + this.isDark.set(true); + document.documentElement.classList.add('dark'); + } + } + + toggleTheme() { + this.isDark.update(dark => !dark); + document.documentElement.classList.toggle('dark'); + localStorage.setItem('theme', this.isDark() ? 'dark' : 'light'); + } +} +``` + +### Dark Mode Class Usage + +#### ALWAYS Use dark: Variants +```html + +
    +
    +
    +
    + + +
    +``` + +#### Material Components Auto-Adapt +```html + + + + + } + {{ pageTitle() }} + + + + +
    + +
    + + +
    +

    + © 2024 Your Company +

    +
    + + + ` +}) +``` + +### Card Layout Pattern +```html + + + + Title + Subtitle + + + + Content goes here + + + + + + + +``` + +### Grid/Table Pattern +```typescript +@Component({ + template: ` + + +
    + Data Grid + +
    +
    + +
    + + + + + + + + + +
    Name{{ row.name }}
    +
    + + +
    + ` +}) +``` + +### Form Pattern +```typescript +@Component({ + template: ` + + + Form Title + + + +
    + + Field Label + + This field is required + + + +
    +
    + + + + + +
    + ` +}) +``` + +--- + +## ACCESSIBILITY REQUIREMENTS + +### ARIA Labels +```html + + + + + Email + + + + + +``` + +### Keyboard Navigation +```typescript +// ✅ CORRECT - Keyboard event handlers +@Component({ + template: ` +
    + Clickable div +
    + ` +}) +``` + +### Focus Management +```typescript +// ✅ CORRECT - Manage focus properly +export class DialogComponent implements AfterViewInit { + @ViewChild('closeButton') closeButton!: ElementRef; + + ngAfterViewInit() { + // Focus first interactive element + this.closeButton.nativeElement.focus(); + } +} +``` + +--- + +## PERFORMANCE BEST PRACTICES + +### Change Detection +```typescript +// ✅ ALWAYS use OnPush +@Component({ + selector: 'app-my-component', + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + template: `...` +}) +``` + +### Lazy Loading +```typescript +// ✅ CORRECT - Lazy load routes +const routes: Routes = [ + { + path: 'admin', + loadComponent: () => import('./admin/admin.component').then(m => m.AdminComponent) + }, + { + path: 'dashboard', + loadChildren: () => import('./dashboard/routes').then(m => m.DASHBOARD_ROUTES) + } +]; +``` + +### Track By Functions +```html + +@for (item of items(); track item.id) { + +} + + +@for (item of items(); track $index) { + +} +``` + +--- + +## CODE QUALITY STANDARDS + +### TypeScript Strict Mode +```json +// tsconfig.json - ALWAYS enable strict +{ + "compilerOptions": { + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true + } +} +``` + +### Type Safety +```typescript +// ✅ CORRECT - Proper typing +interface User { + id: string; + name: string; + email: string; + role: 'admin' | 'user' | 'guest'; +} + +export class UserComponent { + users = signal([]); + selectedUser = signal(null); +} + +// ❌ WRONG - Any types +users = signal([]); // NEVER use any +selectedUser = signal(null); // NEVER use any +``` + +### Naming Conventions +```typescript +// Components: PascalCase + Component suffix +export class UserDashboardComponent {} + +// Services: PascalCase + Service suffix +export class AuthService {} + +// Interfaces: PascalCase (no I prefix) +export interface User {} // ✅ CORRECT +export interface IUser {} // ❌ WRONG + +// Signals: camelCase +const userName = signal(''); +const isLoading = signal(false); + +// Constants: UPPER_SNAKE_CASE +const MAX_RETRIES = 3; +const API_BASE_URL = 'https://api.example.com'; +``` + +--- + +## FILE ORGANIZATION + +### Project Structure +``` +src/ +├── app/ +│ ├── core/ # Singleton services +│ │ ├── auth/ +│ │ ├── interceptors/ +│ │ └── guards/ +│ ├── shared/ # Shared components +│ │ ├── components/ +│ │ │ ├── data-grid/ +│ │ │ ├── form-card/ +│ │ │ └── page-header/ +│ │ ├── directives/ +│ │ ├── pipes/ +│ │ └── models/ +│ ├── features/ # Feature modules +│ │ ├── dashboard/ +│ │ ├── users/ +│ │ └── settings/ +│ └── layout/ # Layout components +│ ├── header/ +│ ├── sidebar/ +│ └── footer/ +├── styles/ +│ ├── tailwind.css # Tailwind 4 @theme +│ ├── _material-theme.scss # Material theming +│ └── _utilities.css # Custom utilities +└── assets/ +``` + +--- + +## ERROR HANDLING + +### HTTP Error Handling +```typescript +// ✅ CORRECT - Proper error handling +export class DataService { + private http = inject(HttpClient); + + getData() { + return this.http.get('/api/data').pipe( + catchError(error => { + console.error('Error fetching data:', error); + return of([]); // Return empty array as fallback + }) + ); + } +} +``` + +### Form Validation +```typescript +// ✅ CORRECT - Comprehensive validation +export class FormComponent { + private fb = inject(FormBuilder); + + form = this.fb.group({ + email: ['', [Validators.required, Validators.email]], + password: ['', [Validators.required, Validators.minLength(8)]], + confirmPassword: ['', Validators.required] + }, { + validators: this.passwordMatchValidator + }); + + passwordMatchValidator(group: AbstractControl): ValidationErrors | null { + const password = group.get('password')?.value; + const confirmPassword = group.get('confirmPassword')?.value; + return password === confirmPassword ? null : { passwordMismatch: true }; + } +} +``` + +--- + +## TESTING GUIDELINES + +### Component Testing +```typescript +// ✅ CORRECT - Test with signals +describe('UserComponent', () => { + it('should update user count', () => { + const component = new UserComponent(); + component.users.set([{ id: '1', name: 'John' }]); + expect(component.userCount()).toBe(1); + }); +}); +``` + +--- + +## COMMON ANTI-PATTERNS TO AVOID + +### ❌ DON'T: Override Material Styles +```css +/* WRONG - Never do this */ +.mat-button { + background: red !important; /* Don't override Material */ +} +``` + +### ❌ DON'T: Use Inline Styles +```html + +
    +``` + +### ❌ DON'T: Hardcode Colors +```html + +
    + + +
    +``` + +### ❌ DON'T: Use Traditional RxJS Subscriptions +```typescript +// WRONG +ngOnInit() { + this.dataService.getData().subscribe(data => { + this.data = data; // Manual subscription management + }); +} + +// CORRECT - Use toSignal +data = toSignal(this.dataService.getData(), { initialValue: [] }); +``` + +### ❌ DON'T: Use ViewChild for Data Access +```typescript +// WRONG +@ViewChild('table') table: MatTable; +ngAfterViewInit() { + const data = this.table.dataSource; // Avoid ViewChild for data +} + +// CORRECT - Use signals +tableData = signal([]); +``` + +--- + +## FINAL CHECKLIST FOR EVERY COMPONENT + +- [ ] Standalone component with imports +- [ ] OnPush change detection +- [ ] Signals for all state +- [ ] New control flow syntax (@if, @for) +- [ ] Input signals for @Input +- [ ] inject() for dependency injection +- [ ] Tailwind classes use tw- prefix +- [ ] Spacing follows 8px grid (tw-p-sm/md/lg) +- [ ] Material components for UI +- [ ] Dark mode variants (dark:tw-*) +- [ ] Responsive breakpoints (sm:, md:, lg:) +- [ ] ARIA labels on interactive elements +- [ ] Proper TypeScript typing (no any) +- [ ] Track by in @for loops + +--- + +## SUMMARY: KEY PRINCIPLES + +1. **Angular 21 First**: Use latest features (signals, new control flow, standalone) +2. **Material for Components**: Never recreate what Material provides +3. **Tailwind for Layout**: Use tw- prefix, follow 8px grid +4. **Mobile-First**: Design for mobile, enhance for desktop +5. **Dark Theme Always**: Every component must work in light AND dark +6. **Accessibility Built-In**: ARIA labels, keyboard nav, focus management +7. **Type Safety**: Strict TypeScript, no any types +8. **Performance**: OnPush, lazy loading, proper change detection + +--- + +## WHEN IN DOUBT + +1. Check if Material has the component → Use Material +2. Need layout/spacing → Use Tailwind with tw- prefix +3. Need state → Use signals +4. Need control flow → Use @if/@for/@switch +5. Need responsive → Mobile-first with sm:/md:/lg: +6. Need theming → Use theme colors + dark: variants + +**Remember**: Material handles the component, Tailwind handles the layout, Angular handles the logic. + +--- + +*This file is the source of truth for all code generation. Follow these rules strictly for consistency and maintainability.* \ No newline at end of file diff --git a/frontend/src/app/@core/components/confirm-dialog/confirm-dialog.component.ts b/frontend/src/app/@core/components/confirm-dialog/confirm-dialog.component.ts new file mode 100644 index 0000000..3aac770 --- /dev/null +++ b/frontend/src/app/@core/components/confirm-dialog/confirm-dialog.component.ts @@ -0,0 +1,138 @@ +import { + Component, + ChangeDetectionStrategy, + inject, +} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatDialogModule, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; + +/** + * Data interface for the confirm dialog + */ +export interface ConfirmDialogData { + /** Dialog title */ + title: string; + /** Dialog message */ + message: string; + /** Confirm button text (default: 'Confirm') */ + confirmText?: string; + /** Cancel button text (default: 'Cancel') */ + cancelText?: string; + /** Confirm button color (default: 'primary') */ + confirmColor?: 'primary' | 'accent' | 'warn'; + /** Optional icon for the dialog */ + icon?: string; + /** Icon color class */ + iconColor?: string; +} + +/** + * Confirmation dialog component to replace browser confirm(). + * + * Usage: + * ```typescript + * const dialogRef = this.dialog.open(ConfirmDialogComponent, { + * data: { + * title: 'Delete Contact', + * message: 'Are you sure you want to delete this contact?', + * confirmText: 'Delete', + * confirmColor: 'warn', + * icon: 'delete' + * } + * }); + * + * dialogRef.afterClosed().subscribe(result => { + * if (result) { + * // User confirmed + * } + * }); + * ``` + */ +@Component({ + selector: 'app-confirm-dialog', + standalone: true, + imports: [ + CommonModule, + MatDialogModule, + MatButtonModule, + MatIconModule, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` +
    + +
    + @if (data.icon) { +
    + {{ data.icon }} +
    + } +
    +

    + {{ data.title }} +

    +

    + {{ data.message }} +

    +
    +
    + + + + + + +
    + `, + styles: [` + :host { + display: block; + } + + ::ng-deep .mat-mdc-dialog-surface { + border-radius: 16px !important; + } + `] +}) +export class ConfirmDialogComponent { + data = inject(MAT_DIALOG_DATA); + dialogRef = inject(MatDialogRef); + + getIconBackgroundClass(): string { + switch (this.data.confirmColor) { + case 'warn': + return 'bg-error-container'; + case 'accent': + return 'bg-secondary-container'; + default: + return 'bg-primary-container'; + } + } + + getIconColorClass(): string { + switch (this.data.confirmColor) { + case 'warn': + return 'text-error'; + case 'accent': + return 'text-secondary'; + default: + return 'text-primary'; + } + } +} diff --git a/frontend/src/app/@core/components/confirm-dialog/index.ts b/frontend/src/app/@core/components/confirm-dialog/index.ts new file mode 100644 index 0000000..f645b8d --- /dev/null +++ b/frontend/src/app/@core/components/confirm-dialog/index.ts @@ -0,0 +1 @@ +export * from './confirm-dialog.component'; diff --git a/frontend/src/app/@core/components/empty-state/empty-state.component.ts b/frontend/src/app/@core/components/empty-state/empty-state.component.ts new file mode 100644 index 0000000..79575a4 --- /dev/null +++ b/frontend/src/app/@core/components/empty-state/empty-state.component.ts @@ -0,0 +1,87 @@ +import { + Component, + ChangeDetectionStrategy, + input, +} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; + +/** + * Empty state component for displaying when no data is available. + * + * Usage: + * ```html + * + * + * ``` + */ +@Component({ + selector: 'app-empty-state', + standalone: true, + imports: [ + CommonModule, + RouterModule, + MatIconModule, + MatButtonModule, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` +
    +
    + {{ icon() }} +
    + +

    {{ title() }}

    + + @if (description()) { +

    {{ description() }}

    + } + + @if (actionText() && actionRoute()) { + + } +
    + `, + styles: [` + :host { + display: block; + } + `] +}) +export class EmptyStateComponent { + /** Material icon name to display */ + icon = input('inbox'); + + /** Main title for the empty state */ + title = input.required(); + + /** Optional description text */ + description = input(); + + /** Optional action button text */ + actionText = input(); + + /** Optional route for the action button */ + actionRoute = input(); + + /** Optional icon for the action button */ + actionIcon = input('add'); +} diff --git a/frontend/src/app/@core/components/empty-state/index.ts b/frontend/src/app/@core/components/empty-state/index.ts new file mode 100644 index 0000000..45c7975 --- /dev/null +++ b/frontend/src/app/@core/components/empty-state/index.ts @@ -0,0 +1 @@ +export * from './empty-state.component'; diff --git a/frontend/src/app/@core/components/index.ts b/frontend/src/app/@core/components/index.ts new file mode 100644 index 0000000..fe24e7f --- /dev/null +++ b/frontend/src/app/@core/components/index.ts @@ -0,0 +1,4 @@ +export * from './page-header'; +export * from './empty-state'; +export * from './skeleton'; +export * from './confirm-dialog'; diff --git a/frontend/src/app/@core/components/page-header/index.ts b/frontend/src/app/@core/components/page-header/index.ts new file mode 100644 index 0000000..73920e2 --- /dev/null +++ b/frontend/src/app/@core/components/page-header/index.ts @@ -0,0 +1 @@ +export * from './page-header.component'; diff --git a/frontend/src/app/@core/components/page-header/page-header.component.ts b/frontend/src/app/@core/components/page-header/page-header.component.ts new file mode 100644 index 0000000..97b5c30 --- /dev/null +++ b/frontend/src/app/@core/components/page-header/page-header.component.ts @@ -0,0 +1,100 @@ +import { + Component, + ChangeDetectionStrategy, + input, + output, +} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +/** + * Standardized page header component for consistent UI across all pages. + * + * Usage: + * ```html + * + * + * + * + * + * ``` + */ +@Component({ + selector: 'app-page-header', + standalone: true, + imports: [ + CommonModule, + RouterModule, + MatIconModule, + MatButtonModule, + MatTooltipModule, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` +
    +
    +
    + +
    + @if (backRoute()) { + + } + + @if (icon()) { + + } + +
    +

    {{ title() }}

    + @if (subtitle()) { +

    {{ subtitle() }}

    + } +
    +
    + + +
    + +
    +
    +
    +
    + `, + styles: [` + :host { + display: block; + } + `] +}) +export class PageHeaderComponent { + /** Main title displayed in the header */ + title = input.required(); + + /** Optional subtitle displayed below the title */ + subtitle = input(); + + /** Optional Material icon name displayed before the title */ + icon = input(); + + /** Optional route for back navigation button */ + backRoute = input(); + + /** Optional label for accessibility (aria-label for back button) */ + backRouteLabel = input(); +} diff --git a/frontend/src/app/@core/components/skeleton/index.ts b/frontend/src/app/@core/components/skeleton/index.ts new file mode 100644 index 0000000..990ee44 --- /dev/null +++ b/frontend/src/app/@core/components/skeleton/index.ts @@ -0,0 +1 @@ +export * from './skeleton.component'; diff --git a/frontend/src/app/@core/components/skeleton/skeleton.component.ts b/frontend/src/app/@core/components/skeleton/skeleton.component.ts new file mode 100644 index 0000000..b302efc --- /dev/null +++ b/frontend/src/app/@core/components/skeleton/skeleton.component.ts @@ -0,0 +1,172 @@ +import { + Component, + ChangeDetectionStrategy, + input, + computed, +} from '@angular/core'; +import { CommonModule } from '@angular/common'; + +/** + * Skeleton loader component for displaying loading states. + * + * Usage: + * ```html + * + * + * + * + * ``` + */ +@Component({ + selector: 'app-skeleton', + standalone: true, + imports: [CommonModule], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` +
    + @switch (type()) { + @case ('table') { + +
    + @for (col of columnsArray(); track $index) { +
    + } +
    + + @for (row of rowsArray(); track $index) { +
    + @for (col of columnsArray(); track $index) { +
    +
    + } +
    + } + } + + @case ('card') { +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + } + + @case ('details') { +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + @for (item of rowsArray(); track $index) { +
    +
    +
    +
    + } +
    +
    + } + + @case ('form') { +
    +
    + @for (field of rowsArray(); track $index) { +
    +
    +
    +
    + } +
    + +
    +
    +
    +
    +
    + } + + @case ('list') { + @for (row of rowsArray(); track $index) { +
    +
    +
    +
    +
    +
    +
    +
    + } + } + + @default { + +
    + @for (row of rowsArray(); track $index) { +
    + } +
    + } + } + Loading... +
    + `, + styles: [` + :host { + display: block; + } + + .animate-pulse { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + } + + @keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + } + `] +}) +export class SkeletonComponent { + /** Type of skeleton to display */ + type = input<'table' | 'card' | 'details' | 'form' | 'list' | 'block'>('table'); + + /** Number of rows to display (for table, list, form, block types) */ + rows = input(5); + + /** Number of columns to display (for table type) */ + columns = input(4); + + /** Create array from rows count for iteration */ + rowsArray = computed(() => Array(this.rows()).fill(0)); + + /** Create array from columns count for iteration */ + columnsArray = computed(() => Array(this.columns()).fill(0)); + + /** Get random width for variety in skeleton appearance */ + getRandomWidth(): string { + const widths = ['60%', '70%', '80%', '90%', '100%']; + return widths[Math.floor(Math.random() * widths.length)]; + } +} diff --git a/frontend/src/app/feature/admin/activity-log/activity-log.component.html b/frontend/src/app/feature/admin/activity-log/activity-log.component.html index aef6fa9..0c4aae6 100644 --- a/frontend/src/app/feature/admin/activity-log/activity-log.component.html +++ b/frontend/src/app/feature/admin/activity-log/activity-log.component.html @@ -1,91 +1,174 @@
    -
    -
    -

    Activity Logs

    -
    -
    +
    + + + -
    -
    -
    -
    -
    - - -
    -
    - - -
    + + +
    +

    + filter_list + Filter Logs +

    +
    + + +
    + +
    + + Username + + person + + + + Email + + email + +
    + +
    + + +
    +
    -
    - + + + + + @if (loading()) { + + + + + + } + + + @if (!loading() && dataSource().data.length > 0) { + +
    +

    + list + Log Entries +

    - -
    -
    + + +
    + + Quick Search + + search + Search across all columns + +
    -
    -
    -
    - - Filter - - Search across all columns - -
    +
    + + + + + + + + + + + + -
    -
    Username{{ log.username }}Email{{ log.email }}
    - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + - - - - - + + + + +
    Username{{log.username}}Activity + + {{ log.activity }} + + Email{{log.email}}Endpoint + {{ log.endpoint }} + Activity{{log.activity}}Timestamp{{ log.timestamp | date: 'medium' }}Endpoint{{log.endpoint}}
    Timestamp{{log.timestamp | date: 'short'}}
    + No data matching the filter "{{ input.value }}" +
    +
    - - + + + + + } - - - No data matching the filter "{{input.value}}" - - + + @if (!loading() && dataSource().data.length === 0) { + + + + + + + } - -
    -
    + + @if (error()) { + + +
    + error +
    +

    Error Loading Logs

    +

    {{ error() }}

    +
    + +
    +
    +
    + }
    diff --git a/frontend/src/app/feature/admin/activity-log/activity-log.component.ts b/frontend/src/app/feature/admin/activity-log/activity-log.component.ts index cee64d4..a7354c6 100644 --- a/frontend/src/app/feature/admin/activity-log/activity-log.component.ts +++ b/frontend/src/app/feature/admin/activity-log/activity-log.component.ts @@ -1,13 +1,16 @@ -import { Component, ViewChild, AfterViewInit, signal, computed, effect, inject, OnInit } from '@angular/core'; +import { Component, ViewChild, AfterViewInit, signal, computed, effect, inject, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { MatTableDataSource } from '@angular/material/table'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { MatPaginator, MatPaginatorModule, PageEvent } from '@angular/material/paginator'; import { MatSort, MatSortModule } from '@angular/material/sort'; import { UserService } from "@core/services/user.service"; -import { MatTableModule } from '@angular/material/table'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; -import { DatePipe, NgFor, NgIf } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatCardModule } from '@angular/material/card'; +import { DatePipe, NgFor, NgIf, CommonModule } from '@angular/common'; +import { PageHeaderComponent, EmptyStateComponent, SkeletonComponent } from '@core/components'; // Define the ActivityLog interface interface ActivityLog { @@ -22,15 +25,22 @@ interface ActivityLog { selector: 'app-activity-log', templateUrl: './activity-log.component.html', standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ + CommonModule, ReactiveFormsModule, MatTableModule, MatPaginatorModule, MatSortModule, MatFormFieldModule, MatInputModule, + MatButtonModule, + MatIconModule, + MatCardModule, DatePipe, - NgIf + PageHeaderComponent, + EmptyStateComponent, + SkeletonComponent ] }) export class ActivityLogComponent implements AfterViewInit, OnInit { diff --git a/frontend/src/app/feature/admin/operations/operations.component.html b/frontend/src/app/feature/admin/operations/operations.component.html index c365588..3a6c7ec 100644 --- a/frontend/src/app/feature/admin/operations/operations.component.html +++ b/frontend/src/app/feature/admin/operations/operations.component.html @@ -1,68 +1,104 @@ -
    -

    Operations Management

    +
    +
    + + + -
    -
    -

    {{ selectedOperation() ? 'Edit Operation' : 'Add New Operation' }}

    - -
    - - Name - - Name is required - +
    + + +
    +

    + {{ selectedOperation() ? 'edit' : 'add_circle' }} + {{ selectedOperation() ? 'Edit Operation' : 'Add New Operation' }} +

    +
    - - Description - - + +
    + + + Name + + @if (operationForm.get('name')?.hasError('required') && operationForm.get('name')?.touched) { + Name is required + } + + + + Description + + -
    - - - -
    - -
    - -
    -

    Operations List

    +
    + @if (selectedOperation()) { + + } + +
    + +
    +
    +
    - @if (operations().length === 0) { -

    No operations available

    - } @else { - - - - - - - - - - - - - - - - - - -
    Name{{ operation.name }}Description{{ operation.description }}Actions - - - -
    - } + + +
    +

    + list + Operations List +

    +
    + + + @if (operations().length === 0) { + + + } @else { +
    + + + + + + + + + + + + + + + + + + +
    Name{{ operation.name }}Description{{ operation.description }}Actions + + +
    +
    + } +
    +
    diff --git a/frontend/src/app/feature/admin/operations/operations.component.ts b/frontend/src/app/feature/admin/operations/operations.component.ts index 1c50eb4..0030698 100644 --- a/frontend/src/app/feature/admin/operations/operations.component.ts +++ b/frontend/src/app/feature/admin/operations/operations.component.ts @@ -1,4 +1,4 @@ -import { Component, inject, OnInit, signal } from '@angular/core'; +import { Component, inject, OnInit, signal, ChangeDetectionStrategy } from '@angular/core'; import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -8,14 +8,18 @@ import { MatInputModule } from '@angular/material/input'; import { MatButtonModule } from '@angular/material/button'; import { MatTableModule } from '@angular/material/table'; import { MatIconModule } from '@angular/material/icon'; +import { MatCardModule } from '@angular/material/card'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { CommonModule } from '@angular/common'; import { Operation } from "@core/models/operation.interface"; +import { PageHeaderComponent, EmptyStateComponent } from '@core/components'; @Component({ selector: 'app-operations', templateUrl: './operations.component.html', styleUrls: ['./operations.component.scss'], standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ CommonModule, ReactiveFormsModule, @@ -23,7 +27,11 @@ import { Operation } from "@core/models/operation.interface"; MatInputModule, MatButtonModule, MatTableModule, - MatIconModule + MatIconModule, + MatCardModule, + MatTooltipModule, + PageHeaderComponent, + EmptyStateComponent ] }) export class OperationsComponent implements OnInit { diff --git a/frontend/src/app/feature/admin/pages/pages.component.html b/frontend/src/app/feature/admin/pages/pages.component.html index 4fcbd14..298e994 100644 --- a/frontend/src/app/feature/admin/pages/pages.component.html +++ b/frontend/src/app/feature/admin/pages/pages.component.html @@ -1,69 +1,109 @@ -
    -

    Pages Management

    +
    +
    + + + -
    -
    -

    {{ selectedPage() ? 'Edit Page' : 'Add New Page' }}

    - -
    - - Name - - Name is required - +
    + + +
    +

    + {{ selectedPage() ? 'edit' : 'add_circle' }} + {{ selectedPage() ? 'Edit Page' : 'Add New Page' }} +

    +
    - - URL - - URL is required - + +
    + + + Name + + @if (pageForm.get('name')?.hasError('required') && pageForm.get('name')?.touched) { + Name is required + } + + + + URL + + @if (pageForm.get('url')?.hasError('required') && pageForm.get('url')?.touched) { + URL is required + } + -
    - - - -
    - -
    - -
    -

    Pages List

    +
    + @if (selectedPage()) { + + } + +
    + +
    +
    +
    - @if (pages().length === 0) { -

    No pages available

    - } @else { - - - - - - - - - - - - - - - - - - -
    Name{{ page.name }}URL{{ page.url }}Actions - - - -
    - } + + +
    +

    + list + Pages List +

    +
    + + + @if (pages().length === 0) { + + + } @else { +
    + + + + + + + + + + + + + + + + + + +
    Name{{ page.name }}URL + {{ page.url }} + Actions + + +
    +
    + } +
    +
    diff --git a/frontend/src/app/feature/admin/pages/pages.component.ts b/frontend/src/app/feature/admin/pages/pages.component.ts index c706686..91c7e54 100644 --- a/frontend/src/app/feature/admin/pages/pages.component.ts +++ b/frontend/src/app/feature/admin/pages/pages.component.ts @@ -1,4 +1,4 @@ -import { Component, inject, OnInit, signal } from '@angular/core'; +import { Component, inject, OnInit, signal, ChangeDetectionStrategy } from '@angular/core'; import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -9,13 +9,17 @@ import { MatInputModule } from '@angular/material/input'; import { MatButtonModule } from '@angular/material/button'; import { MatTableModule } from '@angular/material/table'; import { MatIconModule } from '@angular/material/icon'; +import { MatCardModule } from '@angular/material/card'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { CommonModule } from '@angular/common'; +import { PageHeaderComponent, EmptyStateComponent } from '@core/components'; @Component({ selector: 'app-pages', templateUrl: './pages.component.html', styleUrls: ['./pages.component.scss'], standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ CommonModule, ReactiveFormsModule, @@ -23,7 +27,11 @@ import { CommonModule } from '@angular/common'; MatInputModule, MatButtonModule, MatTableModule, - MatIconModule + MatIconModule, + MatCardModule, + MatTooltipModule, + PageHeaderComponent, + EmptyStateComponent ] }) export class PagesComponent implements OnInit { diff --git a/frontend/src/app/feature/admin/role-permission-mapping/role-permission-mapping.component.html b/frontend/src/app/feature/admin/role-permission-mapping/role-permission-mapping.component.html index 7a57926..5c9f564 100644 --- a/frontend/src/app/feature/admin/role-permission-mapping/role-permission-mapping.component.html +++ b/frontend/src/app/feature/admin/role-permission-mapping/role-permission-mapping.component.html @@ -1,90 +1,105 @@
    - -
    -
    -

    Role Permission Mapping

    -
    -
    +
    + + + + + + - -
    -
    -

    Select Role

    + + +
    +

    + group + Select Role +

    +
    -
    - - Role - - - -
    - - -
    -
    -
    +
    + + - - @if (loading()) { -
    - -

    Loading role permissions...

    -
    - } + + @if (loading()) { + + + + + + } - - @if (mapping() && !loading()) { -
    -

    Configure Permissions for {{ mapping()?.roleName }}

    + + @if (mapping() && !loading()) { + + +
    +

    + info + Instructions +

    +
    + +

    Select the operations each page should have access to. Click on a page row to expand and view all available operations.

    +
      +
    • Use the checkboxes to grant or revoke specific permissions
    • +
    • Click the page name to toggle all operations for that page
    • +
    • Click "Save Permissions" when you're done making changes
    • +
    +
    +
    -
    -
    - - - Instructions - - -

    Select the operations each page should have access to. Click on a page row to expand and view all available operations.

    -
      -
    • Use the checkboxes to grant or revoke specific permissions
    • -
    • Click the page name to toggle all operations for that page
    • -
    • Click "Save Permissions" when you're done making changes
    • -
    -
    -
    - + + +
    +

    + lock + Permissions for {{ mapping()?.roleName }} +

    +
    + + - - + + @for (page of mapping()?.pages; track page.pageId) { - - + -
    PagePermissionsPagePermissions
    +
    -
    - {{ isPanelExpanded(page.pageId) ? 'expand_less' : 'expand_more' }} +
    + {{ isPanelExpanded(page.pageId) ? 'expand_less' : 'expand_more' }} {{ page.pageName }}
    +
    Configure Permissions for {{ mapping()?.rol @if (isPanelExpanded(page.pageId)) { -
    +
    @for (operation of page.operations; track operation.operationId) { Configure Permissions for {{ mapping()?.rol }
    -
    -
    + +
    -
    -
    - } + } - - @if (!mapping() && !loading()) { -
    - find_in_page -

    No roles available or permission data could not be loaded.

    - -
    - } + + @if (!mapping() && !loading() && selectedRoleId()) { + + + + + + + } + + @if (!selectedRoleId() && !loading()) { + + + + + + + } +
    \ No newline at end of file diff --git a/frontend/src/app/feature/admin/role-permission-mapping/role-permission-mapping.component.ts b/frontend/src/app/feature/admin/role-permission-mapping/role-permission-mapping.component.ts index 3417fdc..c0762b5 100644 --- a/frontend/src/app/feature/admin/role-permission-mapping/role-permission-mapping.component.ts +++ b/frontend/src/app/feature/admin/role-permission-mapping/role-permission-mapping.component.ts @@ -1,10 +1,10 @@ -import { Component, OnInit, inject, signal } from '@angular/core'; +import { Component, OnInit, inject, signal, ChangeDetectionStrategy } from '@angular/core'; import { CommonModule } from '@angular/common'; import { ReactiveFormsModule, FormsModule } from '@angular/forms'; import { MatCardModule } from '@angular/material/card'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; +import { MatSelectModule, MatSelectChange } from '@angular/material/select'; import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatIconModule } from '@angular/material/icon'; @@ -23,12 +23,14 @@ import { RolePermissionMappingRequest, PageOperationRequest } from '@core/models/role-permission-mapping.model'; +import { PageHeaderComponent, EmptyStateComponent, SkeletonComponent } from '@core/components'; @Component({ selector: 'app-role-permission-mapping', templateUrl: './role-permission-mapping.component.html', styleUrls: ['./role-permission-mapping.component.scss'], standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ CommonModule, FormsModule, @@ -44,7 +46,10 @@ import { MatTableModule, MatExpansionModule, MatDividerModule, - MatListModule + MatListModule, + PageHeaderComponent, + EmptyStateComponent, + SkeletonComponent ] }) export class RolePermissionMappingComponent implements OnInit { @@ -221,9 +226,8 @@ export class RolePermissionMappingComponent implements OnInit { /** * Handle role selection change */ - onRoleChange(event: Event): void { - const select = event.target as HTMLSelectElement; - const roleId = select.value; + onRoleChange(event: MatSelectChange): void { + const roleId = event.value; if (roleId) { this.selectedRoleId.set(roleId); this.loadRolePermissions(roleId); diff --git a/frontend/src/app/feature/admin/roles/roles.component.html b/frontend/src/app/feature/admin/roles/roles.component.html index d923581..e398265 100644 --- a/frontend/src/app/feature/admin/roles/roles.component.html +++ b/frontend/src/app/feature/admin/roles/roles.component.html @@ -1,68 +1,111 @@ -
    -

    Role Management

    +
    +
    + + + -
    -
    -

    {{ selectedRole() ? 'Edit Role' : 'Add New Role' }}

    - -
    - - Name - - Name is required - +
    + + +
    +

    + {{ selectedRole() ? 'edit' : 'add_circle' }} + {{ selectedRole() ? 'Edit Role' : 'Add New Role' }} +

    +
    - - Description - - + +
    + + + Name + + @if (roleForm.get('name')?.hasError('required') && roleForm.get('name')?.touched) { + Name is required + } + + + + Description + + -
    - - - -
    - -
    - -
    -

    Roles List

    +
    + @if (selectedRole()) { + + } + +
    + +
    +
    +
    - @if (roles().length === 0) { -

    No roles available

    - } @else { - - - - - - - - - - - - - - - - - - -
    Name{{ role.name }}Description{{ role.description }}Actions - - - -
    - } + + +
    +

    + list + Roles List +

    +
    + + + @if (loading() && roles().length === 0) { +
    + +
    + } @else if (roles().length === 0) { + + + } @else { +
    + + + + + + + + + + + + + + + + + + +
    Name{{ role.name }}Description{{ role.description }}Actions + + +
    +
    + } +
    +
    \ No newline at end of file diff --git a/frontend/src/app/feature/admin/roles/roles.component.ts b/frontend/src/app/feature/admin/roles/roles.component.ts index bbefa6f..93580ee 100644 --- a/frontend/src/app/feature/admin/roles/roles.component.ts +++ b/frontend/src/app/feature/admin/roles/roles.component.ts @@ -1,4 +1,4 @@ -import { Component, inject, OnInit, signal } from '@angular/core'; +import { Component, ChangeDetectionStrategy, inject, OnInit, signal } from '@angular/core'; import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -9,13 +9,21 @@ import { MatInputModule } from '@angular/material/input'; import { MatButtonModule } from '@angular/material/button'; import { MatTableModule } from '@angular/material/table'; import { MatIconModule } from '@angular/material/icon'; +import { MatCardModule } from '@angular/material/card'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { CommonModule } from '@angular/common'; +import { PageHeaderComponent } from '@core/components/page-header'; +import { EmptyStateComponent } from '@core/components/empty-state'; +import { SkeletonComponent } from '@core/components/skeleton'; +import { ConfirmDialogComponent, ConfirmDialogData } from '@core/components/confirm-dialog'; @Component({ selector: 'app-roles', templateUrl: './roles.component.html', styleUrls: ['./roles.component.scss'], standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ CommonModule, ReactiveFormsModule, @@ -23,7 +31,13 @@ import { CommonModule } from '@angular/common'; MatInputModule, MatButtonModule, MatTableModule, - MatIconModule + MatIconModule, + MatCardModule, + MatTooltipModule, + MatProgressSpinnerModule, + PageHeaderComponent, + EmptyStateComponent, + SkeletonComponent ] }) export class RolesComponent implements OnInit { @@ -34,6 +48,7 @@ export class RolesComponent implements OnInit { roles = signal([]); selectedRole = signal(null); + loading = signal(false); roleForm = this.fb.group({ name: ['', Validators.required], description: [''] @@ -46,9 +61,16 @@ export class RolesComponent implements OnInit { } loadRoles(): void { + this.loading.set(true); this.roleService.getRoles().subscribe({ - next: (roles) => this.roles.set(roles), - error: (err) => this.snackBar.open('Failed to load roles', 'Close', { duration: 3000 }) + next: (roles) => { + this.roles.set(roles); + this.loading.set(false); + }, + error: (err) => { + this.snackBar.open('Failed to load roles', 'Close', { duration: 3000 }); + this.loading.set(false); + } }); } @@ -85,12 +107,30 @@ export class RolesComponent implements OnInit { } deleteRole(role: Role): void { - this.roleService.deleteRole(role.id).subscribe({ - next: () => { - this.snackBar.open('Role deleted successfully', 'Close', { duration: 3000 }); - this.loadRoles(); - }, - error: (err) => this.snackBar.open('Failed to delete role', 'Close', { duration: 3000 }) + const dialogRef = this.dialog.open(ConfirmDialogComponent, { + data: { + title: 'Delete Role', + message: `Are you sure you want to delete the role "${role.name}"?`, + confirmText: 'Delete', + confirmColor: 'warn', + icon: 'delete' + } as ConfirmDialogData + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.loading.set(true); + this.roleService.deleteRole(role.id).subscribe({ + next: () => { + this.snackBar.open('Role deleted successfully', 'Close', { duration: 3000 }); + this.loadRoles(); + }, + error: (err) => { + this.snackBar.open('Failed to delete role', 'Close', { duration: 3000 }); + this.loading.set(false); + } + }); + } }); } diff --git a/frontend/src/app/feature/admin/user-roles/user-roles.component.html b/frontend/src/app/feature/admin/user-roles/user-roles.component.html index f95ae59..7feb503 100644 --- a/frontend/src/app/feature/admin/user-roles/user-roles.component.html +++ b/frontend/src/app/feature/admin/user-roles/user-roles.component.html @@ -1,94 +1,131 @@ -
    -

    User Roles Management

    - -
    -
    -
    - - Select User - - @if (loading()) { - Loading users... - } @else if (users().length === 0) { - No users available - } @else { - @for (user of users(); track user.id) { - - {{ user.firstName }} {{ user.lastName }} ({{ user.email }}) - - } - } - - User is required - - - - Assign Roles - - @if (loadingRoles()) { - Loading roles... - } @else if (roles().length === 0) { - No roles available - } @else { - @for (role of roles(); track role.id) { - {{ role.name }} - } - } - - At least one role is required - -
    - -
    - -
    -
    -
    - -
    -

    User Details

    +
    +
    + + + - @if (loading() || loadingRoles()) { -
    - + + +
    +

    + assignment_ind + Assign Roles to User +

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

    Name

    -

    {{ selectedUser()?.firstName }} {{ selectedUser()?.lastName }}

    -
    -
    -

    Email

    -

    {{ selectedUser()?.email }}

    -
    -
    -

    Username

    -

    {{ selectedUser()?.userName }}

    + + +
    +
    +
    + + Select User + + @if (loading()) { + Loading users... + } @else if (users().length === 0) { + No users available + } @else { + @for (user of users(); track user.id) { + + {{ user.firstName }} {{ user.lastName }} ({{ user.email }}) + + } + } + + @if (userRoleForm.get('userId')?.hasError('required') && userRoleForm.get('userId')?.touched) { + User is required + } + + + + Assign Roles + + @if (loadingRoles()) { + Loading roles... + } @else if (roles().length === 0) { + No roles available + } @else { + @for (role of roles(); track role.id) { + {{ role.name }} + } + } + + @if (userRoleForm.get('roleIds')?.hasError('required') && userRoleForm.get('roleIds')?.touched) { + At least one role is required + } + +
    + +
    + +
    +
    +
    + + + + +
    +

    + person + User Details +

    -

    Current Roles

    - - @if (selectedRoles().length > 0) { -
    - @for (roleId of selectedRoles(); track roleId) { -
    - {{ getRoleName(roleId) }} + + @if (loading() || loadingRoles()) { + + } @else if (selectedUser()) { +
    +
    +

    Name

    +

    {{ selectedUser()?.firstName }} {{ selectedUser()?.lastName }}

    - } -
    - } @else { -

    No roles assigned

    - } - } @else { -

    Please select a user to view details

    - } +
    +

    Email

    +

    {{ selectedUser()?.email }}

    +
    +
    +

    Username

    +

    {{ selectedUser()?.userName }}

    +
    +
    + +
    +

    + badge + Current Roles +

    + + @if (selectedRoles().length > 0) { +
    + @for (roleId of selectedRoles(); track roleId) { + + {{ getRoleName(roleId) }} + + } +
    + } @else { +

    No roles assigned

    + } +
    + } @else { + + + } + +
    diff --git a/frontend/src/app/feature/admin/user-roles/user-roles.component.ts b/frontend/src/app/feature/admin/user-roles/user-roles.component.ts index dabb0b0..5e28ada 100644 --- a/frontend/src/app/feature/admin/user-roles/user-roles.component.ts +++ b/frontend/src/app/feature/admin/user-roles/user-roles.component.ts @@ -1,4 +1,4 @@ -import { Component, inject, OnInit, signal } from '@angular/core'; +import { Component, inject, OnInit, signal, ChangeDetectionStrategy } from '@angular/core'; import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; import { UserService } from '@core/services/user.service'; @@ -12,15 +12,18 @@ import { MatButtonModule } from '@angular/material/button'; import { MatTableModule } from '@angular/material/table'; import { MatIconModule } from '@angular/material/icon'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatCardModule } from '@angular/material/card'; import { CommonModule } from '@angular/common'; import { Role } from "@core/models/role.interface"; import { computed } from '@angular/core'; +import { PageHeaderComponent, EmptyStateComponent, SkeletonComponent } from '@core/components'; @Component({ selector: 'app-user-roles', templateUrl: './user-roles.component.html', styleUrls: ['./user-roles.component.scss'], standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ CommonModule, ReactiveFormsModule, @@ -30,7 +33,11 @@ import { computed } from '@angular/core'; MatButtonModule, MatTableModule, MatIconModule, - MatProgressSpinnerModule + MatProgressSpinnerModule, + MatCardModule, + PageHeaderComponent, + EmptyStateComponent, + SkeletonComponent ] }) export class UserRolesComponent implements OnInit { diff --git a/frontend/src/app/feature/admin/users/users.component.html b/frontend/src/app/feature/admin/users/users.component.html index 1894c51..6723c9d 100644 --- a/frontend/src/app/feature/admin/users/users.component.html +++ b/frontend/src/app/feature/admin/users/users.component.html @@ -1,133 +1,178 @@
    -
    - -
    -
    -
    - account_circle -
    -
    -

    User Management

    -

    Manage users in the system

    -
    -
    -
    +
    + + + -
    -
    -
    - - - First Name - - First name is required - + + +
    +

    + {{ selectedUser() ? 'edit' : 'person_add' }} + {{ selectedUser() ? 'Edit User' : 'Add New User' }} +

    +
    + + +
    + +
    + + + First Name + + @if (userForm.get('firstName')?.invalid && userForm.get('firstName')?.touched) { + First name is required + } + - - - Last Name - - Last name is required - + + + Last Name + + @if (userForm.get('lastName')?.invalid && userForm.get('lastName')?.touched) { + Last name is required + } + - - - Username - - Username is required - + + + Username + + @if (userForm.get('userName')?.invalid && userForm.get('userName')?.touched) { + Username is required + } + - - - Email - - Please enter a valid email - + + + Email + + @if (userForm.get('email')?.invalid && userForm.get('email')?.touched) { + Please enter a valid email + } + - - - Mobile - - Mobile number is required - -
    + + + Mobile + + @if (userForm.get('mobile')?.invalid && userForm.get('mobile')?.touched) { + Mobile number is required + } + +
    -
    - - +
    + + +
    +
    - +
    +
    -
    -

    User List

    - - @if (loading()) { -
    - + + +
    +

    + list + User List +

    +
    + + + @if (loading() && users().length === 0) { +
    +
    + } @else if (users().length === 0) { + + } @else { - @if (users().length === 0) { -
    -

    No users found.

    -
    - } @else { -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    First Name {{user.firstName}} Last Name {{user.lastName}} Username {{user.userName}} Email {{user.email}} Mobile {{user.mobile}} Actions - - -
    -
    - } +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    First Name{{ user.firstName }}Last Name{{ user.lastName }}Username{{ user.userName }}Email{{ user.email }}Mobile{{ user.mobile }}Actions + + +
    +
    } -
    -
    + +
    diff --git a/frontend/src/app/feature/admin/users/users.component.ts b/frontend/src/app/feature/admin/users/users.component.ts index f8bea76..5acb002 100644 --- a/frontend/src/app/feature/admin/users/users.component.ts +++ b/frontend/src/app/feature/admin/users/users.component.ts @@ -1,6 +1,7 @@ -import { Component, inject, OnInit, signal } from '@angular/core'; +import { Component, ChangeDetectionStrategy, inject, OnInit, signal } from '@angular/core'; import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatDialog } from '@angular/material/dialog'; import { UserService } from '@core/services/user.service'; import { User } from '@core/models/user.interface'; import { CommonModule } from "@angular/common"; @@ -11,12 +12,19 @@ import { MatButtonModule } from "@angular/material/button"; import { MatTableModule } from "@angular/material/table"; import { MatIconModule } from "@angular/material/icon"; import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { MatTooltipModule } from "@angular/material/tooltip"; +import { MatCardModule } from "@angular/material/card"; +import { PageHeaderComponent } from '@core/components/page-header'; +import { EmptyStateComponent } from '@core/components/empty-state'; +import { SkeletonComponent } from '@core/components/skeleton'; +import { ConfirmDialogComponent, ConfirmDialogData } from '@core/components/confirm-dialog'; @Component({ selector: 'app-users', templateUrl: './users.component.html', styleUrls: ['./users.component.scss'], standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ CommonModule, ReactiveFormsModule, @@ -26,13 +34,19 @@ import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; MatButtonModule, MatTableModule, MatIconModule, - MatProgressSpinnerModule + MatProgressSpinnerModule, + MatTooltipModule, + MatCardModule, + PageHeaderComponent, + EmptyStateComponent, + SkeletonComponent ] }) export class UsersComponent implements OnInit { private fb = inject(FormBuilder); private userService = inject(UserService); private snackBar = inject(MatSnackBar); + private dialog = inject(MatDialog); displayedColumns = signal(['firstName', 'lastName', 'userName', 'email', 'mobile', 'actions']); users = signal([]); @@ -56,7 +70,6 @@ export class UsersComponent implements OnInit { this.loading.set(true); this.userService.getAll().subscribe({ next: (users) => { - console.log('Users loaded:', users); this.users.set(users); this.loading.set(false); }, @@ -120,20 +133,32 @@ export class UsersComponent implements OnInit { } deleteUser(user: User): void { - if (confirm(`Are you sure you want to delete ${user.firstName} ${user.lastName}?`)) { - this.loading.set(true); - this.userService.delete(user.id).subscribe({ - next: () => { - this.snackBar.open('User deleted successfully', 'Close', { duration: 3000 }); - this.loadUsers(); - }, - error: (err) => { - console.error('Failed to delete user:', err); - this.snackBar.open('Failed to delete user', 'Close', { duration: 3000 }); - this.loading.set(false); - } - }); - } + const dialogRef = this.dialog.open(ConfirmDialogComponent, { + data: { + title: 'Delete User', + message: `Are you sure you want to delete ${user.firstName} ${user.lastName}?`, + confirmText: 'Delete', + confirmColor: 'warn', + icon: 'delete' + } as ConfirmDialogData + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.loading.set(true); + this.userService.delete(user.id).subscribe({ + next: () => { + this.snackBar.open('User deleted successfully', 'Close', { duration: 3000 }); + this.loadUsers(); + }, + error: (err) => { + console.error('Failed to delete user:', err); + this.snackBar.open('Failed to delete user', 'Close', { duration: 3000 }); + this.loading.set(false); + } + }); + } + }); } resetForm(): void { From e1b0e86088e65f4509e28d8274a4b11a21318748 Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Mon, 1 Dec 2025 14:57:13 -0500 Subject: [PATCH 07/10] refactor: remove emojis from section headers in README.md for consistency --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index ac5a322..1548c0c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 🚀 Clean Architecture Full-Stack Starter: .NET, Angular, and PostgreSQL +# Clean Architecture Full-Stack Starter: .NET, Angular, and PostgreSQL

    @@ -101,7 +101,7 @@ cp .env.example .env docker-compose up ``` -🔗 Then access: +Then access: - Frontend: http://localhost - API: http://localhost/api - Scalar API Docs: http://localhost/scalar/v1 @@ -114,12 +114,12 @@ docker-compose up | editor@gmail.com | P@ssword#321 | Editor | | reader@gmail.com | P@ssword#321 | Reader | -## 🔥 Key Features +## Key Features
    -

    📱 Modern Frontend

    +

    Modern Frontend

    • Angular 21 with standalone components
    • Signal-based state management
    • @@ -131,7 +131,7 @@ docker-compose up
    -

    🔒 Secure Backend

    +

    Secure Backend

    • Clean Architecture implementation
    • Generic Repository pattern
    • @@ -144,7 +144,7 @@ docker-compose up
    -

    🚢 DevOps Ready

    +

    DevOps Ready

    • .NET Aspire orchestration
    • Docker containerization
    • @@ -158,7 +158,7 @@ docker-compose up
    -## 📁 Project Structure +## Project Structure ``` clean-architecture-docker-dotnet-angular/ @@ -187,7 +187,7 @@ clean-architecture-docker-dotnet-angular/ └── Dockerfile.api # API Dockerfile ``` -## 🧩 Architecture +## Architecture

    Container Architecture @@ -195,9 +195,9 @@ clean-architecture-docker-dotnet-angular/ Container Architecture Overview

    -## 📚 Documentation +## Documentation -📖 Comprehensive documentation is available: +Comprehensive documentation is available: - [Aspire Guide](./docs/aspire-guide.md) - Running with .NET Aspire - [Development Guide](./docs/development-guide.md) - Get started with development @@ -208,7 +208,7 @@ clean-architecture-docker-dotnet-angular/ - [Clean Architecture Series](./docs/architecture-series.md) - In-depth articles - [Roadmap](./docs/roadmap.md) - Upcoming features -## 🛠️ Technology Stack +## Technology Stack | Layer | Technology | Version | |-------|------------|---------| @@ -226,14 +226,14 @@ clean-architecture-docker-dotnet-angular/ We welcome contributions! See our [contributing guide](./CONTRIBUTING.md) for details on how to get involved. -## 📄 License +## License This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. -## 📧 Contact +## Contact For questions or support, please contact Nitin Singh at nitin27may@gmail.com. -## 🌟 Star the Repository +## Star the Repository If you find this project useful, please consider giving it a star on GitHub to show your support! From 54a077e991718878227d9723df5f39a74eaaea76 Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Mon, 1 Dec 2025 14:58:27 -0500 Subject: [PATCH 08/10] refactor: remove emojis from section headers in README.md for consistency --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1548c0c..b8e18ee 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Contact Management Application with Role-Based Access Control

    -## ✨ What is this? +## What is this? A production-ready **full-stack starter kit** built with modern technologies and best practices: @@ -35,7 +35,7 @@ A production-ready **full-stack starter kit** built with modern technologies and Perfect for developers who want to **focus on business logic** instead of configuring infrastructure. -## 🏗️ Why Clean Architecture? +## Why Clean Architecture?

    Clean Architecture Diagram @@ -50,7 +50,7 @@ Clean Architecture provides **significant benefits** for your application: [Clean Architecture Series](./docs/architecture-series.md) - Read more about it! -## 🚀 Quick Start +## Quick Start ### Option 1: Using .NET Aspire (Recommended for Development) @@ -58,7 +58,7 @@ Clean Architecture provides **significant benefits** for your application: #### Prerequisites -> ⚠️ **Important**: Make sure you have the correct versions installed before proceeding. +> **Important**: Make sure you have the correct versions installed before proceeding. - [.NET SDK 10.0](https://dotnet.microsoft.com/download/dotnet/10.0) or later - [Node.js 22 LTS](https://nodejs.org/) (**not** Node 23 - use LTS version only) From 057ec044979635fd54b59e6451aab2e56e6454c8 Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Mon, 1 Dec 2025 15:27:59 -0500 Subject: [PATCH 09/10] fix: update API and Scalar API Docs URLs for Aspire configuration --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b8e18ee..b92f08e 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,8 @@ dotnet run --project aspire/AppHost 🔗 Then access: - **Aspire Dashboard**: https://localhost:17178 (see all services, logs, traces) - **Frontend**: http://localhost:4200 -- **API**: http://localhost:5217 -- **Scalar API Docs**: http://localhost:5217/scalar/v1 +- **API**: https://localhost:7224 +- **Scalar API Docs**: https://localhost:7224/scalar/v1 - **pgAdmin**: Check Aspire dashboard for the assigned port ### Option 2: Using Docker Compose (Production-like) From 088f9b51905dfe1ded0defe551320510b81d9232 Mon Sep 17 00:00:00 2001 From: Nitin Singh Date: Tue, 2 Dec 2025 13:01:37 -0500 Subject: [PATCH 10/10] fix: update API build paths and README for Aspire configuration --- .github/workflows/api-build.yml | 6 +++--- README.md | 8 ++++---- frontend/angular.json | 4 +--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/api-build.yml b/.github/workflows/api-build.yml index 1b2acc1..db53822 100644 --- a/.github/workflows/api-build.yml +++ b/.github/workflows/api-build.yml @@ -3,7 +3,7 @@ on: push: branches: main paths: - - 'backend/src/**' + - 'backend/**' jobs: main: @@ -24,5 +24,5 @@ jobs: id: docker_build uses: docker/build-push-action@v2 with: - context: backend/src/. - file: backend/src/Dockerfile + context: backend/. + file: Dockerfile.api diff --git a/README.md b/README.md index b92f08e..b438c41 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Clean Architecture Full-Stack Starter: .NET, Angular, and PostgreSQL - +> Clean Architecture with RBAC implementation for API (.Net) and UI (Angular)

    Angular Build @@ -10,7 +10,7 @@ MIT License - Angular 21 + Angular 21 .NET 10 PostgreSQL 17 .NET Aspire 9.5 @@ -83,8 +83,8 @@ dotnet run --project aspire/AppHost 🔗 Then access: - **Aspire Dashboard**: https://localhost:17178 (see all services, logs, traces) - **Frontend**: http://localhost:4200 -- **API**: https://localhost:7224 -- **Scalar API Docs**: https://localhost:7224/scalar/v1 +- **API**: Check Aspire dashboard for the assigned port +- **Scalar API Docs**: `{API_URL}/scalar/v1` - **pgAdmin**: Check Aspire dashboard for the assigned port ### Option 2: Using Docker Compose (Production-like) diff --git a/frontend/angular.json b/frontend/angular.json index 9238348..59b59e0 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -38,9 +38,7 @@ "scripts": [], "server": "src/main.server.ts", "prerender": false, - "ssr": { - "entry": "src/server.ts" - } + "ssr": false }, "configurations": { "production": {