From d97e55a83f7ee346e24b9bc6199a2ce7d304f789 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Sun, 15 Jun 2025 18:29:25 +0200 Subject: [PATCH] prueba tecnica --- .dockerignore | 9 + ...xima Energía_Prueba tecnica full stack .pdf | Bin 0 -> 126057 bytes README.md | 108 +- .../Controllers/ContractsController.cs | 58 + .../Controllers/RatesController.cs | 17 + .../Middleware/ExceptionHandlingMiddleware.cs | 69 + .../ProximaContracts.API/Program.cs | 51 + .../Properties/launchSettings.json | 31 + .../ProximaContracts.API.csproj | 19 + .../ProximaContracts.API.http | 2 + .../appsettings.Development.json | 8 + .../ProximaContracts.API/appsettings.json | 17 + .../Contracts/Services/ContractService.cs | 56 + .../Contracts/Services/IContractService.cs | 14 + .../IoCConfiguration.cs | 37 + .../ProximaContracts.Application.csproj | 19 + .../Rates/Services/IRateService.cs | 10 + .../Rates/Services/RateService.cs | 29 + .../DTOs/Request/ContractByIdRequestDto.cs | 7 + .../DTOs/Request/CreateContractRequestDto.cs | 20 + .../DTOs/Request/UpdateContractRequestDto.cs | 16 + .../DTOs/Response/ContractByIdResponseDto.cs | 14 + .../Response/CreateContractResponseDto.cs | 9 + .../DTOs/Response/GetContractsResponseDto.cs | 11 + .../Response/UpdateContractResponseDto.cs | 9 + .../Contracts/Entities/ContractByIdEntity.cs | 14 + .../Contracts/Entities/GetContractsEntity.cs | 11 + .../Contracts/Mappings/ContractProfile.cs | 40 + .../ProximaContracts.Domain.csproj | 18 + .../Rates/DTOs/Responses/GetAllRatesDto.cs | 11 + .../Rates/Entities/RateEntity.cs | 11 + .../Rates/Mappings/ContractProfile.cs | 23 + .../ProximaContracts.Infrastructure.csproj | 19 + .../Contracts/ContractFunctionsStatements.cs | 12 + .../Contracts/ContractRepository.cs | 137 + .../Contracts/IContractRepository.cs | 13 + .../Rpositories/Rates/IRateRepository.cs | 10 + .../Rates/RateFunctionStatements.cs | 5 + .../Rpositories/Rates/RateRepository.cs | 75 + .../Contract/CreateContractException.cs | 7 + .../CreateContractRateNotFoundException.cs | 7 + .../Contract/GetContractByIdException.cs | 7 + .../Contract/GetContractsException.cs | 8 + .../Contract/UpdateContractException.cs | 7 + .../Rates/CheckIfRateIdExistsException.cs | 7 + .../Rates/GetAllRates404Exception.cs | 7 + .../Rates/GetAllRatesException.cs | 7 + .../ProximaContracts.Shared.csproj | 9 + backend/ProximaContracts/ProximaContracts.sln | 49 + db/01_CreateDataBaseAndTables.sql | 60 + db/02_CreateContract.sql | 48 + db/03_GetAllContracts.sql | 23 + db/04_GetContractById.sql | 25 + db/05_UpdateContract.sql | 48 + db/06_CheckRateExists.sql | 15 + db/07_GetAllRates.sql | 19 + deploy.sh | 21 + docker-compose.yml | 39 + docker/Caddyfile | 12 + docker/backend.Dockerfile | 13 + docker/frontend.Dockerfile | 13 + front/contracts-frontend/.env | 1 + front/contracts-frontend/.env.production | 1 + front/contracts-frontend/.gitignore | 24 + front/contracts-frontend/README.md | 54 + front/contracts-frontend/eslint.config.js | 28 + front/contracts-frontend/index.html | 13 + front/contracts-frontend/package-lock.json | 3786 +++++++++++++++++ front/contracts-frontend/package.json | 33 + .../public/proximaenergia.com.ico | Bin 0 -> 889 bytes .../src/components/forms/FormField.tsx | 59 + front/contracts-frontend/src/env.d.ts | 7 + .../features/contracts/api/ContractsApi.ts | 26 + .../components/ContractCreateForm.tsx | 100 + .../components/ContractDetailComponent.tsx | 28 + .../components/ContractUpdateComponent.tsx | 133 + .../components/ContractsTableComponent.tsx | 42 + .../contracts/hooks/useContractDetail.ts | 28 + .../contracts/hooks/useContractsAll.ts | 29 + .../contracts/hooks/useCreateContracts.ts | 26 + .../contracts/pages/ContractCreate.tsx | 31 + .../contracts/pages/ContractDetail.tsx | 63 + .../contracts/pages/ContractsList.tsx | 20 + .../contracts/types/ContractDetail.ts | 7 + .../contracts/types/ContractSummary.ts | 7 + .../contracts/types/CreateContractDto.ts | 6 + .../contracts/types/UpdateContractDto.ts | 8 + .../src/features/rates/api/RatesApi.ts | 4 + .../src/features/rates/hooks/useRates.ts | 24 + .../src/features/rates/types/RateDetails.ts | 5 + front/contracts-frontend/src/main.tsx | 14 + front/contracts-frontend/src/routes/Index.tsx | 14 + .../src/styles/brand-proxima.css | 58 + .../src/utils/http/ErrorHelper.ts | 17 + .../contracts-frontend/src/utils/http/Http.ts | 87 + .../src/utils/http/HttpError.ts | 19 + .../src/utils/http/ProblemDetails.ts | 7 + .../utils/validations/MaxLengthNonEmpty.ts | 11 + .../src/utils/validations/ValidateNifNie.ts | 27 + .../src/utils/validations/dateValidators.ts | 49 + front/contracts-frontend/src/vite-env.d.ts | 1 + front/contracts-frontend/tsconfig.app.json | 32 + front/contracts-frontend/tsconfig.json | 7 + front/contracts-frontend/tsconfig.node.json | 29 + front/contracts-frontend/vite.config.ts | 16 + images/ErrorFromBackendExample.png | Bin 0 -> 8612 bytes images/ErrorFromBackendExampleExtended.png | Bin 0 -> 110221 bytes images/NotFoundExample.png | Bin 0 -> 65783 bytes images/Responsive1.png | Bin 0 -> 32726 bytes images/Responsive2.png | Bin 0 -> 26841 bytes images/Responsive3.png | Bin 0 -> 24640 bytes images/Responsive4.png | Bin 0 -> 15926 bytes images/Responsive5.png | Bin 0 -> 27936 bytes images/Responsive6.png | Bin 0 -> 19528 bytes images/Responsive7.png | Bin 0 -> 28472 bytes images/Responsive8.png | Bin 0 -> 19108 bytes images/SelectTarifaEnCreate.png | Bin 0 -> 14091 bytes images/ValidationExample3.png | Bin 0 -> 18460 bytes images/ValidationExample4.png | Bin 0 -> 4870 bytes images/ValidationExampleDNI1.png | Bin 0 -> 4612 bytes images/ValidationExampleDNI2.png | Bin 0 -> 2356 bytes images/ValidationExampleDNI3.png | Bin 0 -> 4412 bytes images/ValidationExampleNIF1.png | Bin 0 -> 4744 bytes images/ValidationExampleNIF2.png | Bin 0 -> 2610 bytes images/validationExample.png | Bin 0 -> 20664 bytes images/validationExample2.png | Bin 0 -> 39780 bytes levantarDBSola/docker-compose.yml | 18 + 127 files changed, 6488 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 Próxima Energía_Prueba tecnica full stack .pdf create mode 100644 backend/ProximaContracts/ProximaContracts.API/Controllers/ContractsController.cs create mode 100644 backend/ProximaContracts/ProximaContracts.API/Controllers/RatesController.cs create mode 100644 backend/ProximaContracts/ProximaContracts.API/Middleware/ExceptionHandlingMiddleware.cs create mode 100644 backend/ProximaContracts/ProximaContracts.API/Program.cs create mode 100644 backend/ProximaContracts/ProximaContracts.API/Properties/launchSettings.json create mode 100644 backend/ProximaContracts/ProximaContracts.API/ProximaContracts.API.csproj create mode 100644 backend/ProximaContracts/ProximaContracts.API/ProximaContracts.API.http create mode 100644 backend/ProximaContracts/ProximaContracts.API/appsettings.Development.json create mode 100644 backend/ProximaContracts/ProximaContracts.API/appsettings.json create mode 100644 backend/ProximaContracts/ProximaContracts.Application/Contracts/Services/ContractService.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Application/Contracts/Services/IContractService.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Application/IoCConfiguration.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Application/ProximaContracts.Application.csproj create mode 100644 backend/ProximaContracts/ProximaContracts.Application/Rates/Services/IRateService.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Application/Rates/Services/RateService.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/ContractByIdRequestDto.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/CreateContractRequestDto.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/UpdateContractRequestDto.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/ContractByIdResponseDto.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/CreateContractResponseDto.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/GetContractsResponseDto.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/UpdateContractResponseDto.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/Entities/ContractByIdEntity.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/Entities/GetContractsEntity.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Contracts/Mappings/ContractProfile.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/ProximaContracts.Domain.csproj create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Rates/DTOs/Responses/GetAllRatesDto.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Rates/Entities/RateEntity.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Domain/Rates/Mappings/ContractProfile.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Infrastructure/ProximaContracts.Infrastructure.csproj create mode 100644 backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/ContractFunctionsStatements.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/ContractRepository.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/IContractRepository.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/IRateRepository.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/RateFunctionStatements.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/RateRepository.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/CreateContractException.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/CreateContractRateNotFoundException.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/GetContractByIdException.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/GetContractsException.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/UpdateContractException.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/CheckIfRateIdExistsException.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/GetAllRates404Exception.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/GetAllRatesException.cs create mode 100644 backend/ProximaContracts/ProximaContracts.Shared/ProximaContracts.Shared.csproj create mode 100644 backend/ProximaContracts/ProximaContracts.sln create mode 100644 db/01_CreateDataBaseAndTables.sql create mode 100644 db/02_CreateContract.sql create mode 100644 db/03_GetAllContracts.sql create mode 100644 db/04_GetContractById.sql create mode 100644 db/05_UpdateContract.sql create mode 100644 db/06_CheckRateExists.sql create mode 100644 db/07_GetAllRates.sql create mode 100644 deploy.sh create mode 100644 docker-compose.yml create mode 100644 docker/Caddyfile create mode 100644 docker/backend.Dockerfile create mode 100644 docker/frontend.Dockerfile create mode 100644 front/contracts-frontend/.env create mode 100644 front/contracts-frontend/.env.production create mode 100644 front/contracts-frontend/.gitignore create mode 100644 front/contracts-frontend/README.md create mode 100644 front/contracts-frontend/eslint.config.js create mode 100644 front/contracts-frontend/index.html create mode 100644 front/contracts-frontend/package-lock.json create mode 100644 front/contracts-frontend/package.json create mode 100644 front/contracts-frontend/public/proximaenergia.com.ico create mode 100644 front/contracts-frontend/src/components/forms/FormField.tsx create mode 100644 front/contracts-frontend/src/env.d.ts create mode 100644 front/contracts-frontend/src/features/contracts/api/ContractsApi.ts create mode 100644 front/contracts-frontend/src/features/contracts/components/ContractCreateForm.tsx create mode 100644 front/contracts-frontend/src/features/contracts/components/ContractDetailComponent.tsx create mode 100644 front/contracts-frontend/src/features/contracts/components/ContractUpdateComponent.tsx create mode 100644 front/contracts-frontend/src/features/contracts/components/ContractsTableComponent.tsx create mode 100644 front/contracts-frontend/src/features/contracts/hooks/useContractDetail.ts create mode 100644 front/contracts-frontend/src/features/contracts/hooks/useContractsAll.ts create mode 100644 front/contracts-frontend/src/features/contracts/hooks/useCreateContracts.ts create mode 100644 front/contracts-frontend/src/features/contracts/pages/ContractCreate.tsx create mode 100644 front/contracts-frontend/src/features/contracts/pages/ContractDetail.tsx create mode 100644 front/contracts-frontend/src/features/contracts/pages/ContractsList.tsx create mode 100644 front/contracts-frontend/src/features/contracts/types/ContractDetail.ts create mode 100644 front/contracts-frontend/src/features/contracts/types/ContractSummary.ts create mode 100644 front/contracts-frontend/src/features/contracts/types/CreateContractDto.ts create mode 100644 front/contracts-frontend/src/features/contracts/types/UpdateContractDto.ts create mode 100644 front/contracts-frontend/src/features/rates/api/RatesApi.ts create mode 100644 front/contracts-frontend/src/features/rates/hooks/useRates.ts create mode 100644 front/contracts-frontend/src/features/rates/types/RateDetails.ts create mode 100644 front/contracts-frontend/src/main.tsx create mode 100644 front/contracts-frontend/src/routes/Index.tsx create mode 100644 front/contracts-frontend/src/styles/brand-proxima.css create mode 100644 front/contracts-frontend/src/utils/http/ErrorHelper.ts create mode 100644 front/contracts-frontend/src/utils/http/Http.ts create mode 100644 front/contracts-frontend/src/utils/http/HttpError.ts create mode 100644 front/contracts-frontend/src/utils/http/ProblemDetails.ts create mode 100644 front/contracts-frontend/src/utils/validations/MaxLengthNonEmpty.ts create mode 100644 front/contracts-frontend/src/utils/validations/ValidateNifNie.ts create mode 100644 front/contracts-frontend/src/utils/validations/dateValidators.ts create mode 100644 front/contracts-frontend/src/vite-env.d.ts create mode 100644 front/contracts-frontend/tsconfig.app.json create mode 100644 front/contracts-frontend/tsconfig.json create mode 100644 front/contracts-frontend/tsconfig.node.json create mode 100644 front/contracts-frontend/vite.config.ts create mode 100644 images/ErrorFromBackendExample.png create mode 100644 images/ErrorFromBackendExampleExtended.png create mode 100644 images/NotFoundExample.png create mode 100644 images/Responsive1.png create mode 100644 images/Responsive2.png create mode 100644 images/Responsive3.png create mode 100644 images/Responsive4.png create mode 100644 images/Responsive5.png create mode 100644 images/Responsive6.png create mode 100644 images/Responsive7.png create mode 100644 images/Responsive8.png create mode 100644 images/SelectTarifaEnCreate.png create mode 100644 images/ValidationExample3.png create mode 100644 images/ValidationExample4.png create mode 100644 images/ValidationExampleDNI1.png create mode 100644 images/ValidationExampleDNI2.png create mode 100644 images/ValidationExampleDNI3.png create mode 100644 images/ValidationExampleNIF1.png create mode 100644 images/ValidationExampleNIF2.png create mode 100644 images/validationExample.png create mode 100644 images/validationExample2.png create mode 100644 levantarDBSola/docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..51023a9 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +**/node_modules +**/bin +**/obj +.vscode +.idea +.git +*.log +Dockerfile +docker-compose.yml diff --git a/Próxima Energía_Prueba tecnica full stack .pdf b/Próxima Energía_Prueba tecnica full stack .pdf new file mode 100644 index 0000000000000000000000000000000000000000..14a9d407fc02c026c85520b27567edbfdb934d60 GIT binary patch literal 126057 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 9562c7b..fda59fe 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,108 @@ -# prueba_tecnica_proxima +# 🚀 Guía rápida para poner el proyecto en marcha +## 🔧 Stack requerido + +Docker Opcional. https://www.docker.com/ + +(Este proyecto ha sido desarrollado con Docker para la base de datos en local +por lo que es muy recomendable usarlo) + +Node.js & npm Cualquier versión LTS reciente (18 +) +https://nodejs.org/es + +.NET 8 SDK Necesario para el backend +https://dotnet.microsoft.com/es-es/download + +Si no consigues levantar el proyecto, puedes verlo funcionando en https://quediaempiezo.asarmientotest.es/ + +# Levantar proyecto en local + +## 1. Clona el repo: + + git clone https://gitea.alexdev.es/alex/prueba_tecnica_proxima.git + cd prueba_tecnica_proxima + +## 1. Arrancar la base de datos 📦 + +### desde la raíz del repo + + cd levantarDBSola + + docker compose up -d + +La imagen de Postgres 16 se inicializa y ejecuta automáticamente los scripts de ../../db +(creación de tablas, datos y funciones). + +Cuando el contenedor esté listo puedes cerrar esta terminal. + +### OJO!!! Si no vas a usar docker: +Crea la base de datos ejecutando en orden todos los scripts de la carpeta + +## 2. Levantar el backend ⚙️ + +### desde la raíz del repo + cd backend/ProximaContracts/ProximaContracts.API + + dotnet run # puerto 5009 por defecto + +### Si prefieres un IDE: + + abre la solución backend/ProximaContracts/ProximaContracts.sln en Visual Studio o Rider y ejecuta la API. + + +Swagger: http://localhost:5009/swagger/index.html + +si ejecutas con Visual Studio irás directo al swagger + +## 3. Iniciar el frontend 🎨 + + + cd front/contracts-frontend + + npm install + + npm run dev # puerto 5173 + +Visita: http://localhost:5173/ y ¡listo! + + +## 🌐 Despliegue en producción +Clona el repo: + + git clone https://gitea.alexdev.es/alex/prueba_tecnica_proxima.git + cd prueba_tecnica_proxima + +### Configura CORS +Edita backend/ProximaContracts/ProximaContracts.API/appsettings.json +y pon la URL de tu dominio. + +### Convigura .env.production +Edita prueba_tecnica_proxima/front/contracts-frontend/.env.production +usando la misma url acabada en /api + +Compila y arranca: + + chmod +x deploy.sh # (solo la primera vez) + ./deploy.sh + +### DNS + HTTPS + +Asegúrate de que el dominio apunta al servidor. + +Caddy gestionará automáticamente los certificados Let’s Encrypt. + +Ejemplo desplegado: https://quediaempiezo.asarmientotest.es/ + +## 🎨 Imágenes + +### Todas las imágenes se encuentran en la carpeta images en la raíz del proyecto + +| ![](images/Responsive2.png) | ![](images/Responsive7.png) | ![](images/Responsive4.png) | +|:--:|:--:|:--:| +| ![](images/validationExample.png) | ![](images/ValidationExampleDNI1.png) | ![](images/SelectTarifaEnCreate.png) | + + + +# 🤝 Contacto +¿Dudas o sugerencias? +📧 contact@asarmiento.es  |  📞 Llámame cuando quieras. diff --git a/backend/ProximaContracts/ProximaContracts.API/Controllers/ContractsController.cs b/backend/ProximaContracts/ProximaContracts.API/Controllers/ContractsController.cs new file mode 100644 index 0000000..e583150 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.API/Controllers/ContractsController.cs @@ -0,0 +1,58 @@ +using Microsoft.AspNetCore.Mvc; +using ProximaContracts.Application.Contracts.Services; +using ProximaContracts.Domain.Contracts.DTOs.Request; + +namespace ProximaContracts.API.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class ContractsController(IContractService service) : ControllerBase + { + private readonly IContractService _service = service; + + + [HttpGet("GetAll")] + public async Task GetContracts() + { + var response = await _service.GetContracts(); + return response.Any() ? Ok(response) : NotFound(); + } + + + [HttpGet("GetById")] + public async Task GetContractsById([FromQuery] ContractByIdRequestDto dto) + { + var response = await _service.GetContractById(dto); + return response != null ? Ok(response) : NotFound(); + } + + [HttpPost("CreateContract")] + public async Task CreateContract([FromBody] CreateContractRequestDto dto) + { + var result = await _service.CreateContract(dto); + if(result.IsCreated) + { + return Ok(result); + } + else + { + return BadRequest(result); + } + } + + [HttpPut("UpdateContract")] + public async Task UpdateContract([FromBody] UpdateContractRequestDto dto) + { + var result = await _service.UpdateContract(dto); + + if (result.IsUpdated) + { + return Ok(result); + } + else + { + return BadRequest(result); + } + } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.API/Controllers/RatesController.cs b/backend/ProximaContracts/ProximaContracts.API/Controllers/RatesController.cs new file mode 100644 index 0000000..a59cc1a --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.API/Controllers/RatesController.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc; +using ProximaContracts.Application.Rates.Services; + +namespace ProximaContracts.API.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class RatesController(IRateService service) : ControllerBase + { + private readonly IRateService _service = service; + [HttpGet("GetAllRates")] + public async Task GetAllRates() + { + return Ok(await _service.GetRates()); + } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.API/Middleware/ExceptionHandlingMiddleware.cs b/backend/ProximaContracts/ProximaContracts.API/Middleware/ExceptionHandlingMiddleware.cs new file mode 100644 index 0000000..be37ab5 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.API/Middleware/ExceptionHandlingMiddleware.cs @@ -0,0 +1,69 @@ +using ProximaContracts.Shared.Exceptions.Repositories.Contract; +using ProximaContracts.Shared.Exceptions.Repositories.Rates; +using System.Diagnostics.Contracts; +using System.Net; +using System.Text.Json; +using static System.Runtime.InteropServices.JavaScript.JSType; + +namespace ProximaContracts.API.Middleware +{ + public sealed class ExceptionHandlingMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + + public ExceptionHandlingMiddleware( + RequestDelegate next, + ILogger logger) + { + _next = next; + _logger = logger; + } + + public async Task InvokeAsync(HttpContext context) + { + try + { + await _next(context); + } + catch (Exception ex) + { + + _logger.LogError(ex, "Unhandled exception"); + await HandleExceptionAsync(context, ex); + } + } + + private static Task HandleExceptionAsync(HttpContext ctx, Exception ex) + { + + (HttpStatusCode code, string title) mapping = ex switch + { + GetContractByIdException => (HttpStatusCode.InternalServerError, "Error getting contract by Id."), + GetContractsException => (HttpStatusCode.InternalServerError, "Error getting all contracts."), + CreateContractException => (HttpStatusCode.InternalServerError, "Error creating contract."), + CreateContractRateNotFoundException => (HttpStatusCode.BadRequest, "Error creating contract =>Rate not found."), + UpdateContractException => (HttpStatusCode.InternalServerError, "Error updating contract."), + CheckIfRateIdExistsException =>(HttpStatusCode.InternalServerError, "Error checking rates."), + GetAllRatesException => (HttpStatusCode.InternalServerError, "Error getting all rates."), + GetAllRates404Exception =>(HttpStatusCode.NotFound, "No Rates found."), + _ => (HttpStatusCode.InternalServerError, $"Internal server error.") + }; + + var problem = new + { + type = $"https://httpstatuses.com/{(int)mapping.code}", + title = mapping.title, + status = (int)mapping.code, + detail = ex.Message, + instance = ctx.Request.Path + }; + + string json = JsonSerializer.Serialize(problem); + ctx.Response.ContentType = "application/problem+json"; + ctx.Response.StatusCode = (int)mapping.code; + return ctx.Response.WriteAsync(json); + } + } + +} diff --git a/backend/ProximaContracts/ProximaContracts.API/Program.cs b/backend/ProximaContracts/ProximaContracts.API/Program.cs new file mode 100644 index 0000000..7359f7c --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.API/Program.cs @@ -0,0 +1,51 @@ +using ProximaContracts.API.Middleware; +using ProximaContracts.Application; + +var builder = WebApplication.CreateBuilder(args); + + +builder.Services.AddCors(options => +{ + options.AddPolicy("Loopback", p => + p.SetIsOriginAllowed(o => new Uri(o).IsLoopback) + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials()); + +options.AddPolicy("ProdDomains", p => + p.WithOrigins(builder.Configuration + .GetSection("Cors:AllowedOrigins").Get() ?? Array.Empty()) + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials()); +}); + +builder.Services.AddApplicationDependencies(); + +// Add services to the container. + +builder.Services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + + + +var app = builder.Build(); + +app.UseMiddleware(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseCors(app.Environment.IsDevelopment() ? "Loopback" : "ProdDomains"); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); diff --git a/backend/ProximaContracts/ProximaContracts.API/Properties/launchSettings.json b/backend/ProximaContracts/ProximaContracts.API/Properties/launchSettings.json new file mode 100644 index 0000000..a94c535 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.API/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:27614", + "sslPort": 0 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5009", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.API/ProximaContracts.API.csproj b/backend/ProximaContracts/ProximaContracts.API/ProximaContracts.API.csproj new file mode 100644 index 0000000..553325f --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.API/ProximaContracts.API.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + diff --git a/backend/ProximaContracts/ProximaContracts.API/ProximaContracts.API.http b/backend/ProximaContracts/ProximaContracts.API/ProximaContracts.API.http new file mode 100644 index 0000000..1f709c2 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.API/ProximaContracts.API.http @@ -0,0 +1,2 @@ +@ProximaContracts.API_HostAddress = http://localhost:5009 + diff --git a/backend/ProximaContracts/ProximaContracts.API/appsettings.Development.json b/backend/ProximaContracts/ProximaContracts.API/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.API/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.API/appsettings.json b/backend/ProximaContracts/ProximaContracts.API/appsettings.json new file mode 100644 index 0000000..2e0cb2a --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.API/appsettings.json @@ -0,0 +1,17 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "ConnectionStrings": { + "PostgreSQL": "Host=localhost;Port=5432;Database=db.ProximaContracts;Username=proxima_user;Password=Proxima_Password" + }, + "Cors": { + "AllowedOrigins": [ + "https://quediaempiezo.asarmientotest.es" + ] + }, + "AllowedHosts": "*" +} diff --git a/backend/ProximaContracts/ProximaContracts.Application/Contracts/Services/ContractService.cs b/backend/ProximaContracts/ProximaContracts.Application/Contracts/Services/ContractService.cs new file mode 100644 index 0000000..e458479 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Application/Contracts/Services/ContractService.cs @@ -0,0 +1,56 @@ +using AutoMapper; +using ProximaContracts.Application.Rates.Services; +using ProximaContracts.Domain.Contracts.DTOs.Request; +using ProximaContracts.Domain.Contracts.DTOs.Response; +using ProximaContracts.Infrastructure.Rpositories.Contracts; +using ProximaContracts.Shared.Exceptions.Repositories.Contract; + +namespace ProximaContracts.Application.Contracts.Services +{ + public class ContractService(IContractRepository repository, IMapper mapper, IRateService rateService) : IContractService + { + private readonly IContractRepository _repository = repository; + private readonly IMapper _mapper = mapper; + private readonly IRateService _rateService = rateService; + public async Task GetContractById(ContractByIdRequestDto dto) + { + var result = await _repository.GetContractById(dto); + return _mapper.Map< ContractByIdResponseDto>(result); + } + + public async Task> GetContracts() + { + var result = await _repository.GetContracts(); + return _mapper.Map>(result); + } + + public async Task CreateContract(CreateContractRequestDto dto) + { + var rateExists = await _rateService.CheckIfExists(dto.RateId); + if (!rateExists) + { + throw new CreateContractRateNotFoundException($"No rate found with id: {dto.RateId}, Contract can't be created."); + } + var result = await _repository.CreateContract(dto); + + return new CreateContractResponseDto() + { + IsCreated = result.HasValue ? true : false, + Message = result.HasValue ? "Created" : "Error creating contract", + NewContractId = result.HasValue ? result.Value : 0 + }; + + } + + public async Task UpdateContract(UpdateContractRequestDto dto) + { + var result = await _repository.UpdateContract(dto); + return new UpdateContractResponseDto() + { + IsUpdated = result.HasValue ? true : false, + Message = result.HasValue ? "Updated" : "Error updating contract", + ContractId = result.HasValue ? result.Value : 0 + }; + } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Application/Contracts/Services/IContractService.cs b/backend/ProximaContracts/ProximaContracts.Application/Contracts/Services/IContractService.cs new file mode 100644 index 0000000..0e1b79f --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Application/Contracts/Services/IContractService.cs @@ -0,0 +1,14 @@ +using ProximaContracts.Domain.Contracts.DTOs.Request; +using ProximaContracts.Domain.Contracts.DTOs.Response; + +namespace ProximaContracts.Application.Contracts.Services +{ + public interface IContractService + { + + Task GetContractById(ContractByIdRequestDto dto); + Task> GetContracts(); + Task CreateContract(CreateContractRequestDto dto); + Task UpdateContract(UpdateContractRequestDto dto); + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Application/IoCConfiguration.cs b/backend/ProximaContracts/ProximaContracts.Application/IoCConfiguration.cs new file mode 100644 index 0000000..b846156 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Application/IoCConfiguration.cs @@ -0,0 +1,37 @@ +using Microsoft.Extensions.DependencyInjection; +using ProximaContracts.Application.Contracts.Services; +using ProximaContracts.Application.Rates.Services; +using ProximaContracts.Domain.Contracts.Mappings; +using ProximaContracts.Infrastructure.Rpositories.Contracts; +using ProximaContracts.Infrastructure.Rpositories.Rates; + +namespace ProximaContracts.Application +{ + public static class IoCConfiguration + { + public static IServiceCollection AddApplicationDependencies(this IServiceCollection services) + { + AddServices(services); + AddRepositories(services); + AddAutommaperProfiles(services); + + return services; + } + + private static void AddServices(IServiceCollection services) + { + services.AddScoped(); + services.AddScoped(); + } + private static void AddRepositories(IServiceCollection services) + { + services.AddScoped(); + services.AddScoped(); + } + private static void AddAutommaperProfiles(IServiceCollection services) + { + services.AddAutoMapper(typeof(ContractProfile).Assembly); + services.AddAutoMapper(typeof(RateProfile).Assembly); + } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Application/ProximaContracts.Application.csproj b/backend/ProximaContracts/ProximaContracts.Application/ProximaContracts.Application.csproj new file mode 100644 index 0000000..936e81b --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Application/ProximaContracts.Application.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + diff --git a/backend/ProximaContracts/ProximaContracts.Application/Rates/Services/IRateService.cs b/backend/ProximaContracts/ProximaContracts.Application/Rates/Services/IRateService.cs new file mode 100644 index 0000000..08a42f5 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Application/Rates/Services/IRateService.cs @@ -0,0 +1,10 @@ +using ProximaContracts.Domain.Rates.DTOs.Responses; + +namespace ProximaContracts.Application.Rates.Services +{ + public interface IRateService + { + Task CheckIfExists(int id); + Task> GetRates(); + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Application/Rates/Services/RateService.cs b/backend/ProximaContracts/ProximaContracts.Application/Rates/Services/RateService.cs new file mode 100644 index 0000000..a404549 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Application/Rates/Services/RateService.cs @@ -0,0 +1,29 @@ +using AutoMapper; +using ProximaContracts.Domain.Rates.DTOs.Responses; +using ProximaContracts.Infrastructure.Rpositories.Rates; +using ProximaContracts.Shared.Exceptions.Repositories.Rates; + +namespace ProximaContracts.Application.Rates.Services +{ + public class RateService(IRateRepository repository, IMapper mapper) : IRateService + { + private readonly IRateRepository _repository = repository; + private readonly IMapper _mapper = mapper; + + public async Task CheckIfExists(int id) + { + return await _repository.CheckIfExists(id); + } + + public async Task> GetRates() + { + var response = await _repository.GetRates(); + if (!response.Any()) + { + throw new GetAllRates404Exception("No Rates found"); + } + return _mapper.Map>(response); + } + + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/ContractByIdRequestDto.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/ContractByIdRequestDto.cs new file mode 100644 index 0000000..73e9448 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/ContractByIdRequestDto.cs @@ -0,0 +1,7 @@ +namespace ProximaContracts.Domain.Contracts.DTOs.Request +{ + public class ContractByIdRequestDto + { + public int Id { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/CreateContractRequestDto.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/CreateContractRequestDto.cs new file mode 100644 index 0000000..33cc7b2 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/CreateContractRequestDto.cs @@ -0,0 +1,20 @@ +using System.ComponentModel.DataAnnotations; + +namespace ProximaContracts.Domain.Contracts.DTOs.Request +{ + public class CreateContractRequestDto + { + [Required] + [MaxLength(20)] + public string ContractorIdNumber { get; set; } = null!; + [Required] + [MaxLength(50)] + public string ContractorName { get; set; } = null!; + [Required] + [MaxLength(100)] + public string ContractorSurname { get; set; } = null!; + [Required] + [Range(1, int.MaxValue, ErrorMessage = "RateId must be greater than 0.")] + public int RateId { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/UpdateContractRequestDto.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/UpdateContractRequestDto.cs new file mode 100644 index 0000000..1bc56cf --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Request/UpdateContractRequestDto.cs @@ -0,0 +1,16 @@ +using System.ComponentModel.DataAnnotations; + +namespace ProximaContracts.Domain.Contracts.DTOs.Request +{ + public class UpdateContractRequestDto + { + [Required] + public int ContractId { get; set; } + [Required] + public int RateId { get; set; } + public string? ContractorIdNumber { get; set; } + public string? ContractorName { get; set; } + public string? ContractorSurname { get; set; } + public DateTime? ContractInitDate { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/ContractByIdResponseDto.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/ContractByIdResponseDto.cs new file mode 100644 index 0000000..bed532e --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/ContractByIdResponseDto.cs @@ -0,0 +1,14 @@ +namespace ProximaContracts.Domain.Contracts.DTOs.Response +{ + public class ContractByIdResponseDto + { + public int Id { get; set; } + public string ContractorIdNumber { get; set; } + public string ContractorName { get; set; } + public string ContractorSurname { get; set; } + public DateTime ContractInitDate { get; set; } + public int RateId { get; set; } + public string RateName { get; set; } + public decimal RatePrice { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/CreateContractResponseDto.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/CreateContractResponseDto.cs new file mode 100644 index 0000000..594ba8d --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/CreateContractResponseDto.cs @@ -0,0 +1,9 @@ +namespace ProximaContracts.Domain.Contracts.DTOs.Response +{ + public class CreateContractResponseDto + { + public bool IsCreated { get; set; } + public int NewContractId { get; set; } + public string Message { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/GetContractsResponseDto.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/GetContractsResponseDto.cs new file mode 100644 index 0000000..6be4d8c --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/GetContractsResponseDto.cs @@ -0,0 +1,11 @@ +namespace ProximaContracts.Domain.Contracts.DTOs.Response +{ + public class GetContractsResponseDto + { + public int Id { get; set; } + public string ContractorName { get; set; } + public string ContractorSurname { get; set; } + public DateTime ContractInitDate { get; set; } + public string RateName { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/UpdateContractResponseDto.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/UpdateContractResponseDto.cs new file mode 100644 index 0000000..832d099 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/DTOs/Response/UpdateContractResponseDto.cs @@ -0,0 +1,9 @@ +namespace ProximaContracts.Domain.Contracts.DTOs.Response +{ + public class UpdateContractResponseDto + { + public bool IsUpdated { get; set; } + public int ContractId { get; set; } + public string Message { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/Entities/ContractByIdEntity.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/Entities/ContractByIdEntity.cs new file mode 100644 index 0000000..443484c --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/Entities/ContractByIdEntity.cs @@ -0,0 +1,14 @@ +namespace ProximaContracts.Domain.Contracts.Entities +{ + public class ContractByIdEntity + { + public int Id { get; set; } + public string ContractorIdNumber { get; set; } + public string ContractorName { get; set; } + public string ContractorSurname { get; set; } + public DateTime ContractInitDate { get; set; } + public int RateId { get; set; } + public string RateName { get; set; } + public decimal RatePrice { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/Entities/GetContractsEntity.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/Entities/GetContractsEntity.cs new file mode 100644 index 0000000..50d8190 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/Entities/GetContractsEntity.cs @@ -0,0 +1,11 @@ +namespace ProximaContracts.Domain.Contracts.Entities +{ + public class GetContractsEntity + { + public int Id { get; set; } + public string ContractorName { get; set; } + public string ContractorSurname { get; set; } + public DateTime ContractInitDate { get; set; } + public string RateName { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Contracts/Mappings/ContractProfile.cs b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/Mappings/ContractProfile.cs new file mode 100644 index 0000000..402a553 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Contracts/Mappings/ContractProfile.cs @@ -0,0 +1,40 @@ +using AutoMapper; +using Npgsql; +using ProximaContracts.Domain.Contracts.DTOs.Response; +using ProximaContracts.Domain.Contracts.Entities; + +namespace ProximaContracts.Domain.Contracts.Mappings +{ + public class ContractProfile : Profile + { + public ContractProfile() + { + #region Contract By ID + CreateMap() + .ForMember(d => d.Id, o => o.MapFrom(s => s.GetInt32(s.GetOrdinal("Id")))) + .ForMember(d => d.ContractorIdNumber, o => o.MapFrom(s => s.GetString(s.GetOrdinal("ContractorIdNumber")))) + .ForMember(d => d.ContractorName, o => o.MapFrom(s => s.GetString(s.GetOrdinal("ContractorName")))) + .ForMember(d => d.ContractorSurname, o => o.MapFrom(s => s.GetString(s.GetOrdinal("ContractorSurname")))) + .ForMember(d => d.ContractInitDate, o => o.MapFrom(s => s.GetDateTime(s.GetOrdinal("ContractInitDate")))) + .ForMember(d => d.RateId, o => o.MapFrom(s => s.GetInt32(s.GetOrdinal("RateId")))) + .ForMember(d => d.RateName, o => o.MapFrom(s => s.GetString(s.GetOrdinal("RateName")))) + .ForMember(d => d.RatePrice, o => o.MapFrom(s => s.GetFieldValue(s.GetOrdinal("RatePrice")))) + ; + + CreateMap(); + #endregion ContractByID + + #region Contracts All + CreateMap() + .ForMember(d => d.Id, o => o.MapFrom(s => s.GetInt32(s.GetOrdinal("Id")))) + .ForMember(d => d.ContractorName, o => o.MapFrom(s => s.GetString(s.GetOrdinal("ContractorName")))) + .ForMember(d => d.ContractorSurname, o => o.MapFrom(s => s.GetString(s.GetOrdinal("ContractorSurname")))) + .ForMember(d => d.ContractInitDate, o => o.MapFrom(s => s.GetDateTime(s.GetOrdinal("ContractInitDate")))) + .ForMember(d => d.RateName, o => o.MapFrom(s => s.GetString(s.GetOrdinal("RateName")))) + ; + + CreateMap(); + #endregion Contracts All + } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/ProximaContracts.Domain.csproj b/backend/ProximaContracts/ProximaContracts.Domain/ProximaContracts.Domain.csproj new file mode 100644 index 0000000..7c001e7 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/ProximaContracts.Domain.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Rates/DTOs/Responses/GetAllRatesDto.cs b/backend/ProximaContracts/ProximaContracts.Domain/Rates/DTOs/Responses/GetAllRatesDto.cs new file mode 100644 index 0000000..8fcea91 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Rates/DTOs/Responses/GetAllRatesDto.cs @@ -0,0 +1,11 @@ +using System.Data.SqlTypes; + +namespace ProximaContracts.Domain.Rates.DTOs.Responses +{ + public class GetAllRatesDto + { + public int Id { get; set; } + public string Name { get; set; } + public decimal Price { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Rates/Entities/RateEntity.cs b/backend/ProximaContracts/ProximaContracts.Domain/Rates/Entities/RateEntity.cs new file mode 100644 index 0000000..d8e63aa --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Rates/Entities/RateEntity.cs @@ -0,0 +1,11 @@ +using System.Data.SqlTypes; + +namespace ProximaContracts.Domain.Rates.Entities +{ + public class RateEntity + { + public int Id { get; set; } + public string Name { get; set; } + public decimal Price { get; set; } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Domain/Rates/Mappings/ContractProfile.cs b/backend/ProximaContracts/ProximaContracts.Domain/Rates/Mappings/ContractProfile.cs new file mode 100644 index 0000000..b2ba81e --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Domain/Rates/Mappings/ContractProfile.cs @@ -0,0 +1,23 @@ +using AutoMapper; +using Npgsql; +using ProximaContracts.Domain.Rates.DTOs.Responses; +using ProximaContracts.Domain.Rates.Entities; + +namespace ProximaContracts.Domain.Contracts.Mappings +{ + public class RateProfile : Profile + { + public RateProfile() + { + #region Rates All + CreateMap() + .ForMember(d => d.Id, o => o.MapFrom(s => s.GetInt32(s.GetOrdinal("Id")))) + .ForMember(d => d.Name, o => o.MapFrom(s => s.GetString(s.GetOrdinal("Name")))) + .ForMember(d => d.Price, o => o.MapFrom(r => r.GetDecimal(r.GetOrdinal("Price")))) + ; + + CreateMap(); + #endregion Rates All + } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Infrastructure/ProximaContracts.Infrastructure.csproj b/backend/ProximaContracts/ProximaContracts.Infrastructure/ProximaContracts.Infrastructure.csproj new file mode 100644 index 0000000..820083b --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Infrastructure/ProximaContracts.Infrastructure.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + diff --git a/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/ContractFunctionsStatements.cs b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/ContractFunctionsStatements.cs new file mode 100644 index 0000000..1ba42d9 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/ContractFunctionsStatements.cs @@ -0,0 +1,12 @@ +public static class ContractFS +{ + public static string GetContractById = "SELECT * FROM public.get_contract_by_id(@p_contract_id);"; + public static string GetContracts = "SELECT * FROM public.get_contracts();"; + public static string CreateContract = "SELECT * FROM public.create_contract(@p_contractor_id_number, @p_contractor_name, @p_contractor_surname, @p_contract_init_date, @p_rate_id);"; + public static string UpdateContract = """ + SELECT * FROM public.update_contract(@p_contract_id, @p_rate_id, @p_contractor_id_number, + @p_contractor_name, @p_contractor_surname, @p_contract_init_date) + """; + + +} \ No newline at end of file diff --git a/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/ContractRepository.cs b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/ContractRepository.cs new file mode 100644 index 0000000..3453cd4 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/ContractRepository.cs @@ -0,0 +1,137 @@ +using AutoMapper; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Npgsql; +using NpgsqlTypes; +using ProximaContracts.Domain.Contracts.DTOs.Request; +using ProximaContracts.Domain.Contracts.Entities; +using ProximaContracts.Shared.Exceptions.Repositories.Contract; + +namespace ProximaContracts.Infrastructure.Rpositories.Contracts +{ + public class ContractRepository(IConfiguration config, ILogger logger, IMapper mapper) : IContractRepository + { + private readonly string _connStr = config.GetConnectionString("PostgreSQL")!; + private readonly ILogger _log = logger; + private readonly IMapper _mapper = mapper; + + public async Task GetContractById(ContractByIdRequestDto dto) + { + await using var conn = new NpgsqlConnection(_connStr); + await conn.OpenAsync(); + try + { + await using var cmd = new NpgsqlCommand(ContractFS.GetContractById, conn); + cmd.Parameters.AddWithValue("p_contract_id", NpgsqlDbType.Integer, dto.Id); + + await using NpgsqlDataReader reader = await cmd.ExecuteReaderAsync(); + if (!await reader.ReadAsync()) return null; + + return _mapper.Map(reader); + } + catch (Exception ex) + { + _log.LogError(ex.Message); + throw new GetContractByIdException(ex.Message); + } + finally + { + await conn.CloseAsync(); + } + } + + public async Task> GetContracts() + { + await using var conn = new NpgsqlConnection(_connStr); + await conn.OpenAsync(); + try + { + await using var cmd = new NpgsqlCommand(ContractFS.GetContracts, conn); + + await using NpgsqlDataReader reader = await cmd.ExecuteReaderAsync(); + var results = new List(); + + while (await reader.ReadAsync()) + { + results.Add(_mapper.Map(reader)); + } + + return results; + } + catch (Exception ex) + { + _log.LogError(ex.Message); + throw new GetContractsException(ex.Message); + } + finally + { + await conn.CloseAsync(); + } + } + + public async Task CreateContract(CreateContractRequestDto dto) + { + await using var conn = new NpgsqlConnection(_connStr); + await conn.OpenAsync(); + + try + { + await using var cmd = new NpgsqlCommand(ContractFS.CreateContract, conn); + cmd.Parameters.AddWithValue("p_contractor_id_number", NpgsqlDbType.Varchar, dto.ContractorIdNumber); + cmd.Parameters.AddWithValue("p_contractor_name", NpgsqlDbType.Varchar, dto.ContractorName); + cmd.Parameters.AddWithValue("p_contractor_surname", NpgsqlDbType.Varchar, dto.ContractorSurname); + cmd.Parameters.AddWithValue("p_contract_init_date", NpgsqlDbType.Timestamp, DateTime.Now); + cmd.Parameters.AddWithValue("p_rate_id", NpgsqlDbType.Integer, dto.RateId); + + await using NpgsqlDataReader reader = await cmd.ExecuteReaderAsync(); + if (!await reader.ReadAsync()) return null; + + var result = reader.GetInt32(reader.GetOrdinal("create_contract")); + return result; + } + catch (Exception ex) + { + _log.LogError(ex.Message); + throw new CreateContractException(ex.Message); + } + finally + { + await conn.CloseAsync(); + } + } + + public async Task UpdateContract(UpdateContractRequestDto dto) + { + await using var conn = new NpgsqlConnection(_connStr); + await conn.OpenAsync(); + try + { + await using var cmd = new NpgsqlCommand(ContractFS.UpdateContract, conn); + cmd.Parameters.AddWithValue("p_contract_id", NpgsqlDbType.Integer, dto.ContractId); + cmd.Parameters.AddWithValue("p_rate_id", NpgsqlDbType.Integer, dto.RateId); + + cmd.Parameters.AddWithValue("p_contractor_id_number", NpgsqlDbType.Varchar, dto.ContractorIdNumber != null ? dto.ContractorIdNumber : DBNull.Value); + + cmd.Parameters.AddWithValue("p_contractor_name", NpgsqlDbType.Varchar, dto.ContractorName != null ? dto.ContractorName : DBNull.Value); + cmd.Parameters.AddWithValue("p_contractor_surname", NpgsqlDbType.Varchar, dto.ContractorSurname != null ? dto.ContractorSurname : DBNull.Value); + cmd.Parameters.AddWithValue("p_contract_init_date", NpgsqlDbType.Timestamp, dto.ContractInitDate != null ? dto.ContractInitDate : DBNull.Value); + + await using NpgsqlDataReader reader = await cmd.ExecuteReaderAsync(); + if (!await reader.ReadAsync()) return null; + + var result = reader.GetInt32(reader.GetOrdinal("update_contract")); + return result; + } + catch(Exception ex) + { + _log.LogError(ex.Message); + throw new UpdateContractException(ex.Message); + } + finally + { + await conn.CloseAsync(); + } + } + + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/IContractRepository.cs b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/IContractRepository.cs new file mode 100644 index 0000000..2349508 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Contracts/IContractRepository.cs @@ -0,0 +1,13 @@ +using ProximaContracts.Domain.Contracts.DTOs.Request; +using ProximaContracts.Domain.Contracts.Entities; + +namespace ProximaContracts.Infrastructure.Rpositories.Contracts +{ + public interface IContractRepository + { + Task GetContractById(ContractByIdRequestDto dto); + Task> GetContracts(); + Task CreateContract(CreateContractRequestDto dto); + Task UpdateContract(UpdateContractRequestDto dto); + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/IRateRepository.cs b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/IRateRepository.cs new file mode 100644 index 0000000..40e66b6 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/IRateRepository.cs @@ -0,0 +1,10 @@ +using ProximaContracts.Domain.Rates.Entities; + +namespace ProximaContracts.Infrastructure.Rpositories.Rates +{ + public interface IRateRepository + { + Task CheckIfExists(int Id); + Task> GetRates(); + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/RateFunctionStatements.cs b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/RateFunctionStatements.cs new file mode 100644 index 0000000..44cab79 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/RateFunctionStatements.cs @@ -0,0 +1,5 @@ +public static class RateFS +{ + public static string CheckIfExists = "SELECT public.check_rate_exists(@p_id);"; + public static string GetRates = "SELECT * FROM public.get_rates();"; +} \ No newline at end of file diff --git a/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/RateRepository.cs b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/RateRepository.cs new file mode 100644 index 0000000..fffc2b9 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Infrastructure/Rpositories/Rates/RateRepository.cs @@ -0,0 +1,75 @@ +using AutoMapper; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Npgsql; +using NpgsqlTypes; +using ProximaContracts.Domain.Rates.Entities; +using ProximaContracts.Shared.Exceptions.Repositories.Rates; + +namespace ProximaContracts.Infrastructure.Rpositories.Rates +{ + public class RateRepository(IConfiguration config, ILogger logger, IMapper mapper) : IRateRepository + { + private readonly string _connStr = config.GetConnectionString("PostgreSQL")!; + private readonly ILogger _log = logger; + private readonly IMapper _mapper = mapper; + + + + public async Task CheckIfExists(int Id) + { + await using var conn = new NpgsqlConnection(_connStr); + await conn.OpenAsync(); + try + { + await using var cmd = new NpgsqlCommand(RateFS.CheckIfExists, conn); + cmd.Parameters.AddWithValue("p_id", NpgsqlDbType.Integer, Id); + + var result = await cmd.ExecuteScalarAsync(); + + return Convert.ToInt32(result) == 1; + } + catch (Exception ex) + { + _log.LogError(ex.Message); + throw new CheckIfRateIdExistsException(ex.Message); + } + finally + { + await conn.CloseAsync(); + } + } + + + public async Task> GetRates() + { + await using var conn = new NpgsqlConnection(_connStr); + await conn.OpenAsync(); + + try + { + await using var cmd = new NpgsqlCommand(RateFS.GetRates, conn); + + await using NpgsqlDataReader reader = await cmd.ExecuteReaderAsync(); + var results = new List(); + + while (await reader.ReadAsync()) + { + results.Add(_mapper.Map(reader)); + } + await conn.CloseAsync(); + return results; + } + catch (Exception ex) + { + _log.LogError(ex.Message); + throw new GetAllRatesException(ex.Message); + } + finally + { + await conn.CloseAsync(); + } + } + + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/CreateContractException.cs b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/CreateContractException.cs new file mode 100644 index 0000000..2eaeb88 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/CreateContractException.cs @@ -0,0 +1,7 @@ +namespace ProximaContracts.Shared.Exceptions.Repositories.Contract +{ + public sealed class CreateContractException : Exception + { + public CreateContractException(string message) : base(message) { } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/CreateContractRateNotFoundException.cs b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/CreateContractRateNotFoundException.cs new file mode 100644 index 0000000..815d036 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/CreateContractRateNotFoundException.cs @@ -0,0 +1,7 @@ +namespace ProximaContracts.Shared.Exceptions.Repositories.Contract +{ + public sealed class CreateContractRateNotFoundException : Exception + { + public CreateContractRateNotFoundException(string message) : base(message) { } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/GetContractByIdException.cs b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/GetContractByIdException.cs new file mode 100644 index 0000000..d71bf37 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/GetContractByIdException.cs @@ -0,0 +1,7 @@ +namespace ProximaContracts.Shared.Exceptions.Repositories.Contract +{ + public sealed class GetContractByIdException : Exception + { + public GetContractByIdException(string message) : base(message) { } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/GetContractsException.cs b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/GetContractsException.cs new file mode 100644 index 0000000..bd7eff2 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/GetContractsException.cs @@ -0,0 +1,8 @@ +namespace ProximaContracts.Shared.Exceptions.Repositories.Contract +{ + public sealed class GetContractsException : Exception + { + public GetContractsException(string message) : base(message) { } + } +} + diff --git a/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/UpdateContractException.cs b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/UpdateContractException.cs new file mode 100644 index 0000000..c7bbc76 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Contract/UpdateContractException.cs @@ -0,0 +1,7 @@ +namespace ProximaContracts.Shared.Exceptions.Repositories.Contract +{ + public sealed class UpdateContractException : Exception + { + public UpdateContractException(string message) : base(message) { } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/CheckIfRateIdExistsException.cs b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/CheckIfRateIdExistsException.cs new file mode 100644 index 0000000..ec1e741 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/CheckIfRateIdExistsException.cs @@ -0,0 +1,7 @@ +namespace ProximaContracts.Shared.Exceptions.Repositories.Rates +{ + public sealed class CheckIfRateIdExistsException : Exception + { + public CheckIfRateIdExistsException(string message) : base(message) { } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/GetAllRates404Exception.cs b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/GetAllRates404Exception.cs new file mode 100644 index 0000000..f436ba8 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/GetAllRates404Exception.cs @@ -0,0 +1,7 @@ +namespace ProximaContracts.Shared.Exceptions.Repositories.Rates +{ + public sealed class GetAllRates404Exception : Exception + { + public GetAllRates404Exception(string message) : base(message) { } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/GetAllRatesException.cs b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/GetAllRatesException.cs new file mode 100644 index 0000000..785eaf0 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Shared/Exceptions/Repositories/Rates/GetAllRatesException.cs @@ -0,0 +1,7 @@ +namespace ProximaContracts.Shared.Exceptions.Repositories.Rates +{ + public sealed class GetAllRatesException : Exception + { + public GetAllRatesException(string message) : base(message) { } + } +} diff --git a/backend/ProximaContracts/ProximaContracts.Shared/ProximaContracts.Shared.csproj b/backend/ProximaContracts/ProximaContracts.Shared/ProximaContracts.Shared.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.Shared/ProximaContracts.Shared.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/backend/ProximaContracts/ProximaContracts.sln b/backend/ProximaContracts/ProximaContracts.sln new file mode 100644 index 0000000..5721bd6 --- /dev/null +++ b/backend/ProximaContracts/ProximaContracts.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36127.28 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProximaContracts.API", "ProximaContracts.API\ProximaContracts.API.csproj", "{2FCFBFDD-95E3-4D27-8DB5-37B59321EF11}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProximaContracts.Application", "ProximaContracts.Application\ProximaContracts.Application.csproj", "{0B573051-EAD0-48D4-ABDF-A4E0A6247EFF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProximaContracts.Domain", "ProximaContracts.Domain\ProximaContracts.Domain.csproj", "{67CA7F33-0D6F-46A0-A7C9-58929E153C2A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProximaContracts.Infrastructure", "ProximaContracts.Infrastructure\ProximaContracts.Infrastructure.csproj", "{4F8BB408-0111-4DCF-B9CD-EC1D9D7B3EE4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProximaContracts.Shared", "ProximaContracts.Shared\ProximaContracts.Shared.csproj", "{726F71DA-CADE-2203-4F7D-F88480F80337}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2FCFBFDD-95E3-4D27-8DB5-37B59321EF11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2FCFBFDD-95E3-4D27-8DB5-37B59321EF11}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2FCFBFDD-95E3-4D27-8DB5-37B59321EF11}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2FCFBFDD-95E3-4D27-8DB5-37B59321EF11}.Release|Any CPU.Build.0 = Release|Any CPU + {0B573051-EAD0-48D4-ABDF-A4E0A6247EFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B573051-EAD0-48D4-ABDF-A4E0A6247EFF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B573051-EAD0-48D4-ABDF-A4E0A6247EFF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B573051-EAD0-48D4-ABDF-A4E0A6247EFF}.Release|Any CPU.Build.0 = Release|Any CPU + {67CA7F33-0D6F-46A0-A7C9-58929E153C2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67CA7F33-0D6F-46A0-A7C9-58929E153C2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67CA7F33-0D6F-46A0-A7C9-58929E153C2A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67CA7F33-0D6F-46A0-A7C9-58929E153C2A}.Release|Any CPU.Build.0 = Release|Any CPU + {4F8BB408-0111-4DCF-B9CD-EC1D9D7B3EE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F8BB408-0111-4DCF-B9CD-EC1D9D7B3EE4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F8BB408-0111-4DCF-B9CD-EC1D9D7B3EE4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F8BB408-0111-4DCF-B9CD-EC1D9D7B3EE4}.Release|Any CPU.Build.0 = Release|Any CPU + {726F71DA-CADE-2203-4F7D-F88480F80337}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {726F71DA-CADE-2203-4F7D-F88480F80337}.Debug|Any CPU.Build.0 = Debug|Any CPU + {726F71DA-CADE-2203-4F7D-F88480F80337}.Release|Any CPU.ActiveCfg = Release|Any CPU + {726F71DA-CADE-2203-4F7D-F88480F80337}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F9B629D6-70F9-456E-802E-0A7C534C00A8} + EndGlobalSection +EndGlobal diff --git a/db/01_CreateDataBaseAndTables.sql b/db/01_CreateDataBaseAndTables.sql new file mode 100644 index 0000000..5752ed1 --- /dev/null +++ b/db/01_CreateDataBaseAndTables.sql @@ -0,0 +1,60 @@ +DO +$$ +BEGIN + IF NOT EXISTS (SELECT FROM pg_database WHERE datname = 'db.ProximaContracts') THEN + CREATE DATABASE "db.ProximaContracts"; + END IF; +END +$$; + +\c "db.ProximaContracts"; + +CREATE TABLE IF NOT EXISTS public.Rates ( + Id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + Name VARCHAR(100) NOT NULL, + Price MONEY NOT NULL +); + +CREATE TABLE IF NOT EXISTS public.Contracts ( + Id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + ContractorIdNumber VARCHAR(20) NOT NULL, + ContractorName VARCHAR(50) NOT NULL, + ContractorSurname VARCHAR(100) NOT NULL, + ContractInitDate TIMESTAMP NOT NULL, + RateId INTEGER NOT NULL, + CONSTRAINT fk_contracts_rates + FOREIGN KEY (RateId) + REFERENCES public.Rates (Id) + ON UPDATE CASCADE + ON DELETE RESTRICT +); + + + +CREATE INDEX IF NOT EXISTS idx_contracts_rateid + ON public.Contracts (RateId); + + +INSERT INTO public.Rates + (Name, Price) +VALUES + ('Basic', 0.10), + ('Economy', 0.12), + ('Standard', 0.15), + ('Premium', 0.20), + ('Ultra', 0.25); + + + +INSERT INTO public.Contracts + (ContractorIdNumber, + ContractorName, + ContractorSurname, + ContractInitDate, + RateId) +VALUES + ('A12345678', 'John', 'Smith', '2025-01-15 10:00:00', 1), + ('B23456789', 'Emily', 'Johnson', '2025-02-20 11:30:00', 2), + ('C34567890', 'Carlos', 'García', '2025-03-05 09:00:00', 3), + ('D45678901', 'Sofía', 'Martínez', '2025-04-12 14:45:00', 4), + ('E56789012', 'Liam', 'Brown', '2025-05-01 08:20:00', 5); \ No newline at end of file diff --git a/db/02_CreateContract.sql b/db/02_CreateContract.sql new file mode 100644 index 0000000..e7d949b --- /dev/null +++ b/db/02_CreateContract.sql @@ -0,0 +1,48 @@ +DROP FUNCTION IF EXISTS public.create_contract ( + VARCHAR(20), -- p_contractor_id_number + VARCHAR(50), -- p_contractor_name + VARCHAR(100), -- p_contractor_surname + TIMESTAMP, -- p_contract_init_date + INTEGER -- p_rate_id +); + + +CREATE OR REPLACE FUNCTION public.create_contract ( + p_contractor_id_number VARCHAR(20), + p_contractor_name VARCHAR(50), + p_contractor_surname VARCHAR(100), + p_contract_init_date TIMESTAMP, + p_rate_id INTEGER +) +RETURNS INTEGER +AS $$ +DECLARE + v_new_id INTEGER; +BEGIN + PERFORM 1 + FROM public.rates + WHERE id = p_rate_id; + IF NOT FOUND THEN + RAISE EXCEPTION + 'No reate found with id %', p_rate_id; + END IF; + + INSERT INTO public.contracts ( + contractoridnumber, + contractorname, + contractorsurname, + contractinitdate, + rateid + ) + VALUES ( + p_contractor_id_number, + p_contractor_name, + p_contractor_surname, + p_contract_init_date, + p_rate_id + ) + RETURNING id INTO v_new_id; + + RETURN v_new_id; +END; +$$ LANGUAGE plpgsql VOLATILE; diff --git a/db/03_GetAllContracts.sql b/db/03_GetAllContracts.sql new file mode 100644 index 0000000..61d784d --- /dev/null +++ b/db/03_GetAllContracts.sql @@ -0,0 +1,23 @@ + +DROP FUNCTION IF EXISTS public.get_contracts(); + +CREATE OR REPLACE FUNCTION public.get_contracts() +RETURNS TABLE ( + Id INTEGER, + ContractorName VARCHAR, + ContractorSurname VARCHAR, + ContractInitDate TIMESTAMP, + RateName VARCHAR +) +AS $$ + SELECT + c.id, + c.contractorname, + c.contractorsurname, + c.contractinitdate, + r.name AS RateName + FROM public.contracts AS c + JOIN public.rates AS r + ON r.id = c.rateid + ORDER BY c.id; +$$ LANGUAGE SQL STABLE; \ No newline at end of file diff --git a/db/04_GetContractById.sql b/db/04_GetContractById.sql new file mode 100644 index 0000000..1c95483 --- /dev/null +++ b/db/04_GetContractById.sql @@ -0,0 +1,25 @@ +DROP FUNCTION IF EXISTS public.get_contract_by_id(integer); + +CREATE OR REPLACE FUNCTION public.get_contract_by_id(p_contract_id INTEGER) +RETURNS TABLE ( + Id INTEGER, + ContractorIdNumber VARCHAR(20), + ContractorName VARCHAR(50), + ContractorSurname VARCHAR(100), + ContractInitDate TIMESTAMP, + RateId INTEGER, + RateName VARCHAR(100), + RatePrice MONEY +) AS $$ + SELECT c.Id, + c.ContractorIdNumber, + c.ContractorName, + c.ContractorSurname, + c.ContractInitDate, + c.RateId, + r.Name AS RateName, + r.Price AS RatePrice + FROM public.Contracts c + JOIN public.Rates r ON r.Id = c.RateId + WHERE c.Id = p_contract_id; +$$ LANGUAGE SQL STABLE; \ No newline at end of file diff --git a/db/05_UpdateContract.sql b/db/05_UpdateContract.sql new file mode 100644 index 0000000..7e0f746 --- /dev/null +++ b/db/05_UpdateContract.sql @@ -0,0 +1,48 @@ +DROP FUNCTION IF EXISTS public.update_contract ( + INTEGER, + INTEGER, + VARCHAR(20), + VARCHAR(50), + VARCHAR(100), + TIMESTAMP +); + +CREATE OR REPLACE FUNCTION public.update_contract ( + p_contract_id INTEGER, + p_rate_id INTEGER, + p_contractor_id_number VARCHAR(20) DEFAULT NULL, + p_contractor_name VARCHAR(50) DEFAULT NULL, + p_contractor_surname VARCHAR(100) DEFAULT NULL, + p_contract_init_date TIMESTAMP DEFAULT NULL +) +RETURNS INTEGER +AS $$ +BEGIN + PERFORM 1 + FROM public.contracts + WHERE id = p_contract_id; + IF NOT FOUND THEN + RAISE EXCEPTION + 'No existe ningún contrato con id %', p_contract_id; + END IF; + + PERFORM 1 + FROM public.rates + WHERE id = p_rate_id; + IF NOT FOUND THEN + RAISE EXCEPTION + 'No existe ninguna tarifa con id %', p_rate_id; + END IF; + + UPDATE public.contracts + SET + contractoridnumber = COALESCE(p_contractor_id_number, contractoridnumber), + contractorname = COALESCE(p_contractor_name, contractorname), + contractorsurname = COALESCE(p_contractor_surname, contractorsurname), + contractinitdate = COALESCE(p_contract_init_date, contractinitdate), + rateid = p_rate_id + WHERE id = p_contract_id; + + RETURN p_contract_id; +END; +$$ LANGUAGE plpgsql VOLATILE; \ No newline at end of file diff --git a/db/06_CheckRateExists.sql b/db/06_CheckRateExists.sql new file mode 100644 index 0000000..fd15a29 --- /dev/null +++ b/db/06_CheckRateExists.sql @@ -0,0 +1,15 @@ +DROP FUNCTION IF EXISTS public.check_rate_exists(INTEGER); + +CREATE OR REPLACE FUNCTION public.check_rate_exists(p_id INTEGER) +RETURNS INTEGER +AS $$ + SELECT CASE + WHEN EXISTS ( + SELECT 1 + FROM public.rates + WHERE id = p_id + ) + THEN 1 + ELSE 0 + END; +$$ LANGUAGE SQL STABLE; diff --git a/db/07_GetAllRates.sql b/db/07_GetAllRates.sql new file mode 100644 index 0000000..a326fa9 --- /dev/null +++ b/db/07_GetAllRates.sql @@ -0,0 +1,19 @@ + +DROP FUNCTION IF EXISTS public.get_rates(); + +CREATE OR REPLACE FUNCTION public.get_rates() +RETURNS TABLE ( + Id INTEGER, + Name VARCHAR, + Price MONEY +) +AS $$ + SELECT + c.id, + c.name, + c.price + FROM public.rates AS c + ORDER BY c.id; +$$ LANGUAGE SQL STABLE; + + diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..506c51f --- /dev/null +++ b/deploy.sh @@ -0,0 +1,21 @@ + +set -euo pipefail +IFS=$'\n\t' + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd "$SCRIPT_DIR" + +echo "Deteniendo contenedores" +docker compose down -v || true + +echo "Descargando últimos cambios del repo" +git pull --ff-only + +echo "Construyendo imágenes sin usar caché" +export COMPOSE_BAKE=true +docker compose build --no-cache + +echo "Levantando stack en segundo plano" +docker compose up -d + +echo "Despliegue completado con éxito" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1b4746c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,39 @@ +services: + db: + image: postgres:16 + environment: + POSTGRES_USER: proxima_user + POSTGRES_PASSWORD: Proxima_Password + POSTGRES_DB: db.ProximaContracts + volumes: + - ./db:/docker-entrypoint-initdb.d + networks: + - internal + + backend: + build: + context: . + dockerfile: docker/backend.Dockerfile + depends_on: + - db + environment: + ConnectionStrings__PostgreSQL: > + Host=db;Port=5432;Database=db.ProximaContracts; + Username=proxima_user;Password=Proxima_Password + networks: + - internal + + front: + build: + context: . + dockerfile: docker/frontend.Dockerfile + depends_on: + - backend + ports: + - "5173:80" + networks: + - internal + +networks: + internal: + driver: bridge diff --git a/docker/Caddyfile b/docker/Caddyfile new file mode 100644 index 0000000..8efa4ea --- /dev/null +++ b/docker/Caddyfile @@ -0,0 +1,12 @@ +:80 + +root * /usr/share/caddy +file_server + +handle /api/* { + reverse_proxy backend:8080 +} + +handle { + try_files {path} /index.html +} diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile new file mode 100644 index 0000000..8d7d1a6 --- /dev/null +++ b/docker/backend.Dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /src +COPY backend/ProximaContracts/ ./ +RUN dotnet restore +WORKDIR /src/ProximaContracts.API +RUN dotnet publish -c Release -o /app/publish + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final +ENV ASPNETCORE_URLS=http://+:8080 +WORKDIR /app +COPY --from=build /app/publish . +EXPOSE 8080 +ENTRYPOINT ["dotnet","ProximaContracts.API.dll"] diff --git a/docker/frontend.Dockerfile b/docker/frontend.Dockerfile new file mode 100644 index 0000000..4996ab8 --- /dev/null +++ b/docker/frontend.Dockerfile @@ -0,0 +1,13 @@ +# ---------- build ---------- +FROM node:20-alpine AS build +WORKDIR /app +COPY front/contracts-frontend/package*.json ./ +RUN npm ci +COPY front/contracts-frontend . +RUN npm run build + +# ---------- runtime ---------- +FROM caddy:2-alpine +COPY --from=build /app/dist /usr/share/caddy +COPY docker/Caddyfile /etc/caddy/Caddyfile +EXPOSE 80 diff --git a/front/contracts-frontend/.env b/front/contracts-frontend/.env new file mode 100644 index 0000000..43f2b0a --- /dev/null +++ b/front/contracts-frontend/.env @@ -0,0 +1 @@ +VITE_API_BASE_URL=http://localhost:5009/api diff --git a/front/contracts-frontend/.env.production b/front/contracts-frontend/.env.production new file mode 100644 index 0000000..835d6bf --- /dev/null +++ b/front/contracts-frontend/.env.production @@ -0,0 +1 @@ +VITE_API_BASE_URL=https://quediaempiezo.asarmientotest.es/api \ No newline at end of file diff --git a/front/contracts-frontend/.gitignore b/front/contracts-frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/front/contracts-frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/front/contracts-frontend/README.md b/front/contracts-frontend/README.md new file mode 100644 index 0000000..da98444 --- /dev/null +++ b/front/contracts-frontend/README.md @@ -0,0 +1,54 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + 'react-x': reactX, + 'react-dom': reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs['recommended-typescript'].rules, + ...reactDom.configs.recommended.rules, + }, +}) +``` diff --git a/front/contracts-frontend/eslint.config.js b/front/contracts-frontend/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/front/contracts-frontend/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/front/contracts-frontend/index.html b/front/contracts-frontend/index.html new file mode 100644 index 0000000..6b5c2dd --- /dev/null +++ b/front/contracts-frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Prueba técnica proxima contracts + + +
+ + + diff --git a/front/contracts-frontend/package-lock.json b/front/contracts-frontend/package-lock.json new file mode 100644 index 0000000..d2dfd71 --- /dev/null +++ b/front/contracts-frontend/package-lock.json @@ -0,0 +1,3786 @@ +{ + "name": "contracts-frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "contracts-frontend", + "version": "0.0.0", + "dependencies": { + "bootstrap": "^5.3.6", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-hook-form": "^7.57.0", + "react-router-dom": "^7.6.2" + }, + "devDependencies": { + "@eslint/js": "^9.25.0", + "@types/node": "^24.0.1", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.30.1", + "vite": "^6.3.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "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", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.14.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", + "integrity": "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.42.0.tgz", + "integrity": "sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.42.0.tgz", + "integrity": "sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.42.0.tgz", + "integrity": "sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.42.0.tgz", + "integrity": "sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.42.0.tgz", + "integrity": "sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.42.0.tgz", + "integrity": "sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.42.0.tgz", + "integrity": "sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.42.0.tgz", + "integrity": "sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.42.0.tgz", + "integrity": "sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.42.0.tgz", + "integrity": "sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.42.0.tgz", + "integrity": "sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.42.0.tgz", + "integrity": "sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.42.0.tgz", + "integrity": "sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.42.0.tgz", + "integrity": "sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.42.0.tgz", + "integrity": "sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.42.0.tgz", + "integrity": "sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.42.0.tgz", + "integrity": "sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.42.0.tgz", + "integrity": "sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.42.0.tgz", + "integrity": "sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.42.0.tgz", + "integrity": "sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz", + "integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.7.tgz", + "integrity": "sha512-BnsPLV43ddr05N71gaGzyZ5hzkCmGwhMvYc8zmvI8Ci1bRkkDSzDDVfAXfN2tk748OwI7ediiPX6PfT9p0QGVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", + "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz", + "integrity": "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/type-utils": "8.34.0", + "@typescript-eslint/utils": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.34.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.0.tgz", + "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.0.tgz", + "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.34.0", + "@typescript-eslint/types": "^8.34.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.0.tgz", + "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.0.tgz", + "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.0.tgz", + "integrity": "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.34.0", + "@typescript-eslint/utils": "8.34.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.0.tgz", + "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.0.tgz", + "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.34.0", + "@typescript-eslint/tsconfig-utils": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/visitor-keys": "8.34.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.0.tgz", + "integrity": "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.34.0", + "@typescript-eslint/types": "8.34.0", + "@typescript-eslint/typescript-estree": "8.34.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.0.tgz", + "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.2.tgz", + "integrity": "sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.11", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bootstrap": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz", + "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001721", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", + "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.166", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.166.tgz", + "integrity": "sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.28.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/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, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.57.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.57.0.tgz", + "integrity": "sha512-RbEks3+cbvTP84l/VXGUZ+JMrKOS8ykQCRYdm5aYsxnDquL0vspsyNhGRO7pcH6hsZqWlPOjLye7rJqdtdAmlg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.2.tgz", + "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.2.tgz", + "integrity": "sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA==", + "license": "MIT", + "dependencies": { + "react-router": "7.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.42.0.tgz", + "integrity": "sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.42.0", + "@rollup/rollup-android-arm64": "4.42.0", + "@rollup/rollup-darwin-arm64": "4.42.0", + "@rollup/rollup-darwin-x64": "4.42.0", + "@rollup/rollup-freebsd-arm64": "4.42.0", + "@rollup/rollup-freebsd-x64": "4.42.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.42.0", + "@rollup/rollup-linux-arm-musleabihf": "4.42.0", + "@rollup/rollup-linux-arm64-gnu": "4.42.0", + "@rollup/rollup-linux-arm64-musl": "4.42.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.42.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.42.0", + "@rollup/rollup-linux-riscv64-gnu": "4.42.0", + "@rollup/rollup-linux-riscv64-musl": "4.42.0", + "@rollup/rollup-linux-s390x-gnu": "4.42.0", + "@rollup/rollup-linux-x64-gnu": "4.42.0", + "@rollup/rollup-linux-x64-musl": "4.42.0", + "@rollup/rollup-win32-arm64-msvc": "4.42.0", + "@rollup/rollup-win32-ia32-msvc": "4.42.0", + "@rollup/rollup-win32-x64-msvc": "4.42.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "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/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.34.0.tgz", + "integrity": "sha512-MRpfN7uYjTrTGigFCt8sRyNqJFhjN0WwZecldaqhWm+wy0gaRt8Edb/3cuUy0zdq2opJWT6iXINKAtewnDOltQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.34.0", + "@typescript-eslint/parser": "8.34.0", + "@typescript-eslint/utils": "8.34.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "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" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "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/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/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/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/front/contracts-frontend/package.json b/front/contracts-frontend/package.json new file mode 100644 index 0000000..e748429 --- /dev/null +++ b/front/contracts-frontend/package.json @@ -0,0 +1,33 @@ +{ + "name": "contracts-frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "bootstrap": "^5.3.6", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-hook-form": "^7.57.0", + "react-router-dom": "^7.6.2" + }, + "devDependencies": { + "@eslint/js": "^9.25.0", + "@types/node": "^24.0.1", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.30.1", + "vite": "^6.3.5" + } +} diff --git a/front/contracts-frontend/public/proximaenergia.com.ico b/front/contracts-frontend/public/proximaenergia.com.ico new file mode 100644 index 0000000000000000000000000000000000000000..54b6185e34edd61fe9ceea38e283c938f5b27050 GIT binary patch literal 889 zcmV-<1BU#GP)9FW4b(A=3sQN_0L;Q%yn(OLf%#~n7XQD?)gkP`aj9%hH-MA)0Xw8}FKAXI z9hiqDScyl_kgKn-TPjDUX9SR|Cvc~1lcW}%fKl0qq9j)xxEIgF+4~s0IG)z|gSZFB z@SRlF+u=YT?!uzzNJdwT;4J>a9~i{$;Kjpu7F+Qx3OtXy@jaHI2mP|WigHo_Z{i@1 zVrk6!NSxP#6L&;)w_%6u3&|p^!zS52$*r;>MR`H4QjBda2Jj1R$1PYGg*I>~$<<=1 zJStc4B>J#HDu>2EZJjT~D*<*hR$!T&KUS=9nfw)4kHt6@g`SRX4r3_E)q1=wm8ayY zz*Be>{n#&+dEA4$@EksrokmiOQ$|bLYw!?GU>6RcK3+vhuGR+AH%Mhevr3ZQxMVN3 zOWM?Ivt<3UVT)qzb@aY6E$klATfNt44igL6)0MOh< z%JTw9Z!q-?wn*h+xvJqcoREDqVebEc=)hapER}=pIAJS_rv+0#(X2j`bfG&u0Pe>E zy!)@0Ls5=sR!4*RQvfjbA$lc%W z%cz}Liu1DiB$bo&;8hIBd3bsNq$H%cPchDv#uBeD%x9Zy=LBcGY5>iFT6AE`Wvq5C zR)=$rU?UDqW;|Cjf(5v-o?det52ok zsR1Z1iliQ%P)8?zmF=3;588~$Wtg*AQqM;hI%8ou5c{H;0B|Pu#%6S3HJ1OEwojD< ztAcDBqx#q5{XSy=z6{2{92UD>c5wPWOxnq4R&!#XtK-zQ{7|_bGai2fy9*mB6#GwO P00000NkvXXu0mjf@UX1@ literal 0 HcmV?d00001 diff --git a/front/contracts-frontend/src/components/forms/FormField.tsx b/front/contracts-frontend/src/components/forms/FormField.tsx new file mode 100644 index 0000000..5eba5f6 --- /dev/null +++ b/front/contracts-frontend/src/components/forms/FormField.tsx @@ -0,0 +1,59 @@ +import type { + FieldError, + FieldValues, + Path, + RegisterOptions, + UseFormRegister, +} from 'react-hook-form'; + +type FormFieldProps = { + label: string; + name: Path; + register: UseFormRegister; + error?: FieldError; + rules?: RegisterOptions; + type?: string; + className?: string; +}; + +export default function FormField({ + label, + name, + register, + error, + rules, + type = 'text', + className = '', +}: FormFieldProps) { + const buildValidationRules = (): RegisterOptions> => { + const base: RegisterOptions> = { required: 'Obligatorio' }; + + if (type === 'number') { + (base as any).valueAsNumber = true; + } + if (rules) Object.assign(base, rules); + + return base; + }; + + const validationRules = buildValidationRules(); + + return ( +
+ + + + + {error && ( + {error.message ?? 'Obligatorio'} + )} +
+ ); +} diff --git a/front/contracts-frontend/src/env.d.ts b/front/contracts-frontend/src/env.d.ts new file mode 100644 index 0000000..901034c --- /dev/null +++ b/front/contracts-frontend/src/env.d.ts @@ -0,0 +1,7 @@ +interface ImportMetaEnv { + readonly VITE_API_BASE_URL?: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} \ No newline at end of file diff --git a/front/contracts-frontend/src/features/contracts/api/ContractsApi.ts b/front/contracts-frontend/src/features/contracts/api/ContractsApi.ts new file mode 100644 index 0000000..2c95908 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/api/ContractsApi.ts @@ -0,0 +1,26 @@ + +import { get, post, put } from '../../../utils/http/Http'; + +import type { ContractSummary } from '../types/ContractSummary'; +import type { ContractDetail } from '../types/ContractDetail'; +import type { UpdateContractDto } from '../types/UpdateContractDto'; +import type { CreateContractDto } from '../types/CreateContractDto'; + + +export const getAllContracts = () => + get('/Contracts/GetAll'); + + +export const getContractById = (id: number) => + get('/Contracts/GetById', { params: { id } }); + + +export const updateContract = (dto: UpdateContractDto) => + put('/Contracts/UpdateContract', dto); + + +export const createContract = (dto: CreateContractDto) => + post<{ newContractId: number }, CreateContractDto>( + '/Contracts/CreateContract', + dto + ); \ No newline at end of file diff --git a/front/contracts-frontend/src/features/contracts/components/ContractCreateForm.tsx b/front/contracts-frontend/src/features/contracts/components/ContractCreateForm.tsx new file mode 100644 index 0000000..9eb7092 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/components/ContractCreateForm.tsx @@ -0,0 +1,100 @@ +import { useForm } from 'react-hook-form'; +import { useNavigate } from 'react-router-dom'; + +import type { CreateContractDto } from '@/features/contracts/types/CreateContractDto'; +import FormField from '@/components/forms/FormField'; +import { useRates } from '@/features/rates/hooks/useRates'; +import { useCreateContract } from '@/features/contracts/hooks/useCreateContracts'; +import { validateNifNie } from '@/utils/validations/ValidateNifNie'; +import { maxLengthNonEmpty } from '@/utils/validations/MaxLengthNonEmpty'; + + +export default function ContractCreateForm() { + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + const navigate = useNavigate(); + + const { rates, loading: loadingRates, error: rateError } = useRates(); + + const { create, loading: creating, error: submitError } = useCreateContract(); + + return ( +
+ + + label="Nombre" + name="contractorName" + register={register} + error={errors.contractorName} + rules={{validate: maxLengthNonEmpty(50)}} + /> + + + label="Apellidos" + name="contractorSurname" + register={register} + error={errors.contractorSurname} + rules={{validate: maxLengthNonEmpty(100)}} + /> + + + label="DNI / NIE" + name="contractorIdNumber" + register={register} + error={errors.contractorIdNumber} + rules={{ + validate: { + nifNie : validateNifNie, + maxLengthNonEmpty: maxLengthNonEmpty(9) + } + }} + /> + +
+ + + {errors.rateId && Obligatorio} + {rateError && {rateError}} +
+ + {submitError && ( +
+ {submitError} +
+ )} + +
+ + +
+ + ); +} diff --git a/front/contracts-frontend/src/features/contracts/components/ContractDetailComponent.tsx b/front/contracts-frontend/src/features/contracts/components/ContractDetailComponent.tsx new file mode 100644 index 0000000..6060e8c --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/components/ContractDetailComponent.tsx @@ -0,0 +1,28 @@ +import type { ContractDetail } from '@/features/contracts/types/ContractDetail'; + + +export default function ContractDetailComponent({ + contract, + onEdit, +}: { + contract: ContractDetail; + onEdit: () => void; +}) { + return ( +
+
+

Contrato #{contract.id}

+

Nif/Nie: {contract.contractorIdNumber}

+

Nombre: {contract.contractorName}

+

Apellidos: {contract.contractorSurname}

+

Inicio: {new Date(contract.contractInitDate).toLocaleDateString()}

+

Tarifa: {contract.rateId}, {contract.rateName}

+ + + +
+
+ ); +} diff --git a/front/contracts-frontend/src/features/contracts/components/ContractUpdateComponent.tsx b/front/contracts-frontend/src/features/contracts/components/ContractUpdateComponent.tsx new file mode 100644 index 0000000..35b27bb --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/components/ContractUpdateComponent.tsx @@ -0,0 +1,133 @@ +import { useEffect } from 'react'; +import { useForm } from 'react-hook-form'; +import type { ContractDetail } from '@/features/contracts/types/ContractDetail'; +import type { UpdateContractDto } from '@/features/contracts/types/UpdateContractDto'; +import { updateContract } from '@/features/contracts/api/ContractsApi'; +import { getProblemMessage } from '@/utils/http/ErrorHelper'; + +import FormField from '@/components/forms/FormField'; +import { maxLengthNonEmpty } from '@/utils/validations/MaxLengthNonEmpty'; +import { maxDate, minDate } from '@/utils/validations/dateValidators'; + +interface Props { + contract: ContractDetail; + onSaved: (updated: ContractDetail) => void; + onCancel: () => void; +} + +interface FormData { + contractorName: string; + contractorSurname: string; + contractInitDate: string; + rateId: number; +} + +export default function ContractUpdateComponent({ + contract, + onSaved, + onCancel, +}: Props) { + const { + register, + handleSubmit, + formState: { errors, isSubmitting }, + reset, + } = useForm(); + + + useEffect(() => { + reset({ + contractorName: contract.contractorName, + contractorSurname: contract.contractorSurname, + contractInitDate: contract.contractInitDate.slice(0, 10), + rateId: contract.rateId, + }); + }, [contract, reset]); + + + const onSubmit = async (data: FormData) => { + const dto: UpdateContractDto = { contractId: contract.id, ...data }; + try { + await updateContract(dto); + onSaved({ ...contract, ...data }); + } catch (err) { + alert(getProblemMessage(err, 'Error al actualizar.')); + } + }; + + const todayIso = new Date().toISOString().slice(0, 10); + + return ( +
+

Editar contrato #{contract.id}

+ +
+ + label="Nombre" + name="contractorName" + register={register} + error={errors.contractorName} + rules={{ + validate: maxLengthNonEmpty(50), + }} + className="col-12" + /> + + + label="Apellidos" + name="contractorSurname" + register={register} + error={errors.contractorSurname} + rules={{ + validate: maxLengthNonEmpty(100), + }} + className="col-12" + /> + + + label="Inicio" + name="contractInitDate" + type="date" + register={register} + error={errors.contractInitDate} + rules={{ + required: 'Obligatorio', + validate: { + minDate: minDate("01/01/1999"), + maxDate: maxDate(todayIso) + } + }} + className="col-12 col-md-6" + /> + + + label="Rate ID" + name="rateId" + type="number" + register={register} + error={errors.rateId} + rules={{ + required: 'Obligatorio', + valueAsNumber: true, + min: { value: 1, message: 'Debe ser ≥ 1' }, + }} + className="col-12 col-md-6" + /> +
+ +
+ + + +
+
+ ); +} diff --git a/front/contracts-frontend/src/features/contracts/components/ContractsTableComponent.tsx b/front/contracts-frontend/src/features/contracts/components/ContractsTableComponent.tsx new file mode 100644 index 0000000..0c1e843 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/components/ContractsTableComponent.tsx @@ -0,0 +1,42 @@ + +import { Link } from 'react-router-dom'; +import { useContractsAll } from '../hooks/useContractsAll'; + +export default function ContractsTableComponent() { + const { contracts, loading, error } = useContractsAll(); + + if (loading) return

Cargando…

; + if (error) return

{error}

; + + return ( + + + + + + + + + + + + + + {contracts.map(c => ( + + + + + + + + + ))} + +
IDNombreApellidosInicioTarifaAcciones
{c.id}{c.contractorName}{c.contractorSurname}{new Date(c.contractInitDate).toLocaleDateString()}{c.rateName} + + Detalle + +
+ ); +} diff --git a/front/contracts-frontend/src/features/contracts/hooks/useContractDetail.ts b/front/contracts-frontend/src/features/contracts/hooks/useContractDetail.ts new file mode 100644 index 0000000..aadeeaf --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/hooks/useContractDetail.ts @@ -0,0 +1,28 @@ +import { useState, useEffect, useCallback } from 'react'; +import { getContractById } from '../api/ContractsApi'; +import type { ContractDetail } from '../types/ContractDetail'; + +export function useContractDetail(contractId: number) { + const [contract, setContract] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const fetchContract = useCallback(async () => { + setLoading(true); + try { + const data = await getContractById(contractId); + setContract(data); + setError(null); + } catch { + setError('Contrato no encontrado'); + } finally { + setLoading(false); + } + }, [contractId]); + + useEffect(() => { + fetchContract(); + }, [fetchContract]); + + return { contract, loading, error, refresh: fetchContract }; +} diff --git a/front/contracts-frontend/src/features/contracts/hooks/useContractsAll.ts b/front/contracts-frontend/src/features/contracts/hooks/useContractsAll.ts new file mode 100644 index 0000000..1e44973 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/hooks/useContractsAll.ts @@ -0,0 +1,29 @@ +import { useEffect, useState } from 'react'; +import { getAllContracts } from '@/features/contracts/api/ContractsApi'; +import type { ContractSummary } from '@/features/contracts/types/ContractSummary'; +import { getProblemMessage } from '@/utils/http/ErrorHelper'; +import { HttpError } from '@/utils/http/HttpError'; + +export function useContractsAll() { + const [contracts, setContractsAll] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + (async () => { + try { + setContractsAll(await getAllContracts()); + } catch (err) { + setError( + err instanceof HttpError && err.status === 404 + ? 'No se encontraron contratos.' + : getProblemMessage(err, 'Error al cargar los contratos.') + ); + } finally { + setLoading(false); + } + })(); + }, []); + + return { contracts, loading, error }; +} diff --git a/front/contracts-frontend/src/features/contracts/hooks/useCreateContracts.ts b/front/contracts-frontend/src/features/contracts/hooks/useCreateContracts.ts new file mode 100644 index 0000000..dc162a1 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/hooks/useCreateContracts.ts @@ -0,0 +1,26 @@ +import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { createContract as apiCreate } from '../api/ContractsApi'; +import type { CreateContractDto } from '../types/CreateContractDto'; +import { getProblemMessage } from '@/utils/http/ErrorHelper'; + +export function useCreateContract() { + const navigate = useNavigate(); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const create = async (dto: CreateContractDto) => { + setLoading(true); + setError(null); + try { + const { newContractId } = await apiCreate(dto); + navigate(`/contracts/${newContractId}`); + } catch (err) { + setError(getProblemMessage(err, 'No se pudo crear el contrato')); + } finally { + setLoading(false); + } + }; + + return { create, loading, error }; +} diff --git a/front/contracts-frontend/src/features/contracts/pages/ContractCreate.tsx b/front/contracts-frontend/src/features/contracts/pages/ContractCreate.tsx new file mode 100644 index 0000000..39d9812 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/pages/ContractCreate.tsx @@ -0,0 +1,31 @@ +import ContractCreateForm from '@/features/contracts/components/ContractCreateForm'; +import { useNavigate } from 'react-router-dom'; + + +export default function ContractCreate() { + const navigate = useNavigate(); + + return ( +
+
+
+ + {/* Cabecera */} +
+ +

Crear nuevo contrato

+
+ + {/* Formulario */} + +
+
+
+ ); +} diff --git a/front/contracts-frontend/src/features/contracts/pages/ContractDetail.tsx b/front/contracts-frontend/src/features/contracts/pages/ContractDetail.tsx new file mode 100644 index 0000000..697f183 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/pages/ContractDetail.tsx @@ -0,0 +1,63 @@ +// src/features/contracts/components/ContractDetail.tsx +import { useState } from 'react'; +import { useParams, useNavigate } from 'react-router-dom'; + +import { useContractDetail } from '@/features/contracts/hooks/useContractDetail'; +import ContractDetailComponent from '@/features/contracts/components/ContractDetailComponent'; +import ContractUpdateComponent from '@/features/contracts/components/ContractUpdateComponent'; + +export default function ContractDetail() { + const { id } = useParams<{ id: string }>(); + const numericId = Number(id); + const navigate = useNavigate(); + + const { contract, loading, error, refresh } = useContractDetail(numericId); + const [editing, setEditing] = useState(false); + + if (loading) return

Cargando…

; + if (error || !contract) return

{error}

; + + return ( +
+ {editing ? ( +
+
+
+
+

Modificar contrato

+
+ { + setEditing(false); + await refresh(); + }} + onCancel={() => setEditing(false)} + /> +
+
+
+ ) : ( +
+
+
+
+ +

Detalle de contrato

+
+ setEditing(true)} + /> +
+
+
+ )} +
+ ); +} diff --git a/front/contracts-frontend/src/features/contracts/pages/ContractsList.tsx b/front/contracts-frontend/src/features/contracts/pages/ContractsList.tsx new file mode 100644 index 0000000..9054cc4 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/pages/ContractsList.tsx @@ -0,0 +1,20 @@ +import ContractsTableComponent from '@/features/contracts/components/ContractsTableComponent'; +import { Link } from 'react-router-dom'; + + +export default function ContractsList() { + return ( +
+
+
+

Listado de contratos

+ + + Nuevo contrato + + + +
+
+
+ ); +} diff --git a/front/contracts-frontend/src/features/contracts/types/ContractDetail.ts b/front/contracts-frontend/src/features/contracts/types/ContractDetail.ts new file mode 100644 index 0000000..bcb506e --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/types/ContractDetail.ts @@ -0,0 +1,7 @@ +import type { ContractSummary } from "./ContractSummary"; + +export interface ContractDetail extends ContractSummary { + contractorIdNumber: string; + rateId: number; + ratePrice: number; +} \ No newline at end of file diff --git a/front/contracts-frontend/src/features/contracts/types/ContractSummary.ts b/front/contracts-frontend/src/features/contracts/types/ContractSummary.ts new file mode 100644 index 0000000..faa0324 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/types/ContractSummary.ts @@ -0,0 +1,7 @@ +export interface ContractSummary { + id: number; + contractorName: string; + contractorSurname: string; + contractInitDate: string; + rateName: string; +} \ No newline at end of file diff --git a/front/contracts-frontend/src/features/contracts/types/CreateContractDto.ts b/front/contracts-frontend/src/features/contracts/types/CreateContractDto.ts new file mode 100644 index 0000000..e668aac --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/types/CreateContractDto.ts @@ -0,0 +1,6 @@ +export interface CreateContractDto { + contractorIdNumber: string; + contractorName: string; + contractorSurname: string; + rateId: number; +} \ No newline at end of file diff --git a/front/contracts-frontend/src/features/contracts/types/UpdateContractDto.ts b/front/contracts-frontend/src/features/contracts/types/UpdateContractDto.ts new file mode 100644 index 0000000..ab5f8c6 --- /dev/null +++ b/front/contracts-frontend/src/features/contracts/types/UpdateContractDto.ts @@ -0,0 +1,8 @@ +export interface UpdateContractDto { + contractId: number; + rateId: number; + contractorIdNumber?: string; + contractorName?: string; + contractorSurname?: string; + contractInitDate?: string; +} \ No newline at end of file diff --git a/front/contracts-frontend/src/features/rates/api/RatesApi.ts b/front/contracts-frontend/src/features/rates/api/RatesApi.ts new file mode 100644 index 0000000..a73db52 --- /dev/null +++ b/front/contracts-frontend/src/features/rates/api/RatesApi.ts @@ -0,0 +1,4 @@ +import {get} from '@/utils/http/Http' +import type { RateDetails } from '../types/RateDetails' + +export const getAllRates = () => get('/Rates/GetAllRates'); \ No newline at end of file diff --git a/front/contracts-frontend/src/features/rates/hooks/useRates.ts b/front/contracts-frontend/src/features/rates/hooks/useRates.ts new file mode 100644 index 0000000..f6510cd --- /dev/null +++ b/front/contracts-frontend/src/features/rates/hooks/useRates.ts @@ -0,0 +1,24 @@ +import { useEffect, useState } from 'react'; +import { getAllRates } from '../api/RatesApi'; +import type { RateDetails } from '../types/RateDetails'; +import { getProblemMessage } from '@/utils/http/ErrorHelper'; + +export function useRates() { + const [rates, setRates] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + (async () => { + try { + setRates(await getAllRates()); + } catch (err) { + setError(getProblemMessage(err, 'No se pudieron cargar las tarifas')); + } finally { + setLoading(false); + } + })(); + }, []); + + return { rates, loading, error }; +} diff --git a/front/contracts-frontend/src/features/rates/types/RateDetails.ts b/front/contracts-frontend/src/features/rates/types/RateDetails.ts new file mode 100644 index 0000000..f8be9dd --- /dev/null +++ b/front/contracts-frontend/src/features/rates/types/RateDetails.ts @@ -0,0 +1,5 @@ +export interface RateDetails { + id: number; + name: string; + price: number; +} \ No newline at end of file diff --git a/front/contracts-frontend/src/main.tsx b/front/contracts-frontend/src/main.tsx new file mode 100644 index 0000000..199867e --- /dev/null +++ b/front/contracts-frontend/src/main.tsx @@ -0,0 +1,14 @@ +import 'bootstrap/dist/css/bootstrap.min.css'; +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import '@/styles/brand-proxima.css'; +import { BrowserRouter } from 'react-router-dom' +import AppRoutes from './routes/Index.tsx' + +createRoot(document.getElementById('root')!).render( + + + + + , +) diff --git a/front/contracts-frontend/src/routes/Index.tsx b/front/contracts-frontend/src/routes/Index.tsx new file mode 100644 index 0000000..d0b3cf0 --- /dev/null +++ b/front/contracts-frontend/src/routes/Index.tsx @@ -0,0 +1,14 @@ +import { Routes, Route } from 'react-router-dom'; +import ContractsList from '@/features/contracts/pages/ContractsList'; +import ContractDetail from '@/features/contracts/pages/ContractDetail'; +import ContractCreate from '@/features/contracts/pages/ContractCreate'; + +export default function AppRoutes() { + return ( + + } /> + } /> + } /> + + ); +} diff --git a/front/contracts-frontend/src/styles/brand-proxima.css b/front/contracts-frontend/src/styles/brand-proxima.css new file mode 100644 index 0000000..8db73db --- /dev/null +++ b/front/contracts-frontend/src/styles/brand-proxima.css @@ -0,0 +1,58 @@ +:root { + --brand-bg: #051622; + --brand-bg-alt: #0f2432; + --brand-bg-hover: #2d6588; + --brand-border: #113345; + + --brand-text: #e5f2f7; + --brand-heading: #ffffff; + + + --brand-primary: #00d68f; + --brand-primary-hover: #00b67a; +} + +:root { + --bs-body-bg: var(--brand-bg); + --bs-body-color: var(--brand-text); + --bs-border-color: var(--brand-border); + --bs-heading-color: var(--brand-heading); + + --bs-primary: var(--brand-primary); + --bs-primary-rgb: 0,214,143; + --bs-link-color: var(--brand-primary); + --bs-link-hover-color: var(--brand-primary-hover); +} + + +.table-contracts { + --bs-table-color: var(--brand-text); + --bs-table-bg: transparent; + --bs-table-border-color: var(--brand-border); +} + +.table-contracts > thead > tr { + background-color: #0b1e2c; + color: var(--brand-heading); +} + +.table-contracts > tbody > tr:nth-of-type(odd) { background-color: var(--brand-bg-alt); } +.table-contracts > tbody > tr:nth-of-type(even) { background-color: var(--brand-bg); } + +.table-contracts > tbody > tr:hover { + background-color: var(--brand-bg-hover); + outline: 1px solid var(--brand-primary-hover); + outline-offset: -1px; +} + + +.btn-primary { + background-color: var(--brand-primary); + border-color: var(--brand-primary); + color:#051622 +} +.btn-primary:hover, +.btn-primary:focus { + background-color: var(--brand-primary-hover); + border-color: var(--brand-primary-hover); +} \ No newline at end of file diff --git a/front/contracts-frontend/src/utils/http/ErrorHelper.ts b/front/contracts-frontend/src/utils/http/ErrorHelper.ts new file mode 100644 index 0000000..8343f1c --- /dev/null +++ b/front/contracts-frontend/src/utils/http/ErrorHelper.ts @@ -0,0 +1,17 @@ +import { HttpError } from '@/utils/http/HttpError'; + +export function getProblemMessage(err: unknown, fallback = 'Error inesperado') { + console.log("Hemos entrado aqui") + if (err instanceof HttpError) { + console.log( + err + ) + console.log( + err.body + ) + return err.body?.detail + ?? err.body?.title + ?? err.message; + } + return fallback; +} diff --git a/front/contracts-frontend/src/utils/http/Http.ts b/front/contracts-frontend/src/utils/http/Http.ts new file mode 100644 index 0000000..295f6dd --- /dev/null +++ b/front/contracts-frontend/src/utils/http/Http.ts @@ -0,0 +1,87 @@ +import { HttpError } from "./HttpError"; +import type { ProblemDetails } from './ProblemDetails' + + + +type Params = Record; + +function buildQuery(params?: Params): string { + if (!params) return ''; + + const usp = new URLSearchParams(); + for (const [key, value] of Object.entries(params)) { + if (value !== undefined) usp.append(key, String(value)); + } + const qs = usp.toString(); + return qs ? `?${qs}` : ''; +} + +interface RequestOptions { + params?: Params; + body?: T; + headers?: HeadersInit; + timeout?: number; +} + +const BASE_URL = import.meta.env.VITE_API_BASE_URL ?? '/api'; + + + +async function request( + method: 'GET' | 'POST' | 'PUT', + url: string, + { params, body, headers, timeout = 15_000 }: RequestOptions = {} +): Promise { + const controller = new AbortController(); + const id = + timeout >= 0 ? setTimeout(() => controller.abort(), timeout) : null; + + try { + const q = buildQuery(params); + + const res = await fetch(`${BASE_URL}${url}${q}`, { + method, + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + ...headers, + }, + body: body ? JSON.stringify(body) : undefined, + signal: controller.signal, + credentials: 'include', + }); + + const contentType = res.headers.get('Content-Type') ?? ''; + const isJson = /application\/(json|problem\+json)/i.test(contentType); + + const raw = await res.text(); + + if (!res.ok) { + const problem: ProblemDetails | null = + isJson && raw ? JSON.parse(raw) : null; + throw new HttpError(res.status, res.statusText, problem); + } + + const data: R = + isJson && raw ? (JSON.parse(raw) as R) : (undefined as unknown as R); + + return data; + } finally { + if (id) clearTimeout(id); + } +} + +export const get = (url: string, options?: RequestOptions) => + request('GET', url, options); + +export const post = ( + url: string, + body: B, + options?: Omit, 'body'> +) => request('POST', url, { ...options, body }); + +export const put = ( + url: string, + body: B, + options?: Omit, 'body'> +) => request('PUT', url, { ...options, body }); diff --git a/front/contracts-frontend/src/utils/http/HttpError.ts b/front/contracts-frontend/src/utils/http/HttpError.ts new file mode 100644 index 0000000..cfe0732 --- /dev/null +++ b/front/contracts-frontend/src/utils/http/HttpError.ts @@ -0,0 +1,19 @@ +import type { ProblemDetails } from './ProblemDetails'; + +export class HttpError extends Error { + public readonly status: number; + public readonly statusText: string; + public readonly body: ProblemDetails | null; + + constructor( + status: number, + statusText: string, + body: ProblemDetails | null + ) { + super(`${status} ${statusText}`); + this.name = 'HttpError'; + this.status = status; + this.statusText = statusText; + this.body = body; + } +} \ No newline at end of file diff --git a/front/contracts-frontend/src/utils/http/ProblemDetails.ts b/front/contracts-frontend/src/utils/http/ProblemDetails.ts new file mode 100644 index 0000000..997b98f --- /dev/null +++ b/front/contracts-frontend/src/utils/http/ProblemDetails.ts @@ -0,0 +1,7 @@ +export interface ProblemDetails { + type?: string; + title?: string; + status?: number; + detail?: string; + instance?: string; +} \ No newline at end of file diff --git a/front/contracts-frontend/src/utils/validations/MaxLengthNonEmpty.ts b/front/contracts-frontend/src/utils/validations/MaxLengthNonEmpty.ts new file mode 100644 index 0000000..c366b2b --- /dev/null +++ b/front/contracts-frontend/src/utils/validations/MaxLengthNonEmpty.ts @@ -0,0 +1,11 @@ +export const maxLengthNonEmpty = + (max: number) => + (value: unknown): true | string => { + const str = (value ?? '').toString().trim(); + + if (!str) return 'Campo obligatorio'; + if (str.length > max) + return `Debe tener como máximo ${max} caracteres`; + + return true; + }; \ No newline at end of file diff --git a/front/contracts-frontend/src/utils/validations/ValidateNifNie.ts b/front/contracts-frontend/src/utils/validations/ValidateNifNie.ts new file mode 100644 index 0000000..818511e --- /dev/null +++ b/front/contracts-frontend/src/utils/validations/ValidateNifNie.ts @@ -0,0 +1,27 @@ +export const validateNifNie = (value: unknown): true | string => { + if (typeof value !== 'string') return 'Formato no válido'; + + const sanitized = value.toUpperCase().replace(/[\s-]/g, ''); + const nifReg = /^[0-9]{8}[A-Z]$/; + const nieReg = /^[XYZ][0-9]{7}[A-Z]$/; + const letters = 'TRWAGMYFPDXBNJZSQVHLCKE'; + + let number: number; + let control: string; + + if (nifReg.test(sanitized)) { + number = parseInt(sanitized.slice(0, 8), 10); + control = sanitized[8]; + } else if (nieReg.test(sanitized)) { + const prefix = { X: '0', Y: '1', Z: '2' }[sanitized[0] as 'X' | 'Y' | 'Z']; + number = parseInt(prefix + sanitized.slice(1, 8), 10); + control = sanitized[8]; + } else { + return 'Formato de NIF/NIE inválido'; + } + + const expected = letters[number % 23]; + return expected === control + ? true + : 'Dígito de control incorrecto'; +}; \ No newline at end of file diff --git a/front/contracts-frontend/src/utils/validations/dateValidators.ts b/front/contracts-frontend/src/utils/validations/dateValidators.ts new file mode 100644 index 0000000..896cfba --- /dev/null +++ b/front/contracts-frontend/src/utils/validations/dateValidators.ts @@ -0,0 +1,49 @@ + +const parseToDate = (raw: string): Date | null => { + const trimmed = raw.trim(); + let day: number, month: number, year: number; + + const slashMatch = /^(\d{2})\/(\d{2})\/(\d{4})$/.exec(trimmed); + if (slashMatch) { + [, day, month, year] = slashMatch.map(Number); + } else { + const dashMatch = /^(\d{4})-(\d{2})-(\d{2})$/.exec(trimmed); + if (!dashMatch) return null; + [, year, month, day] = dashMatch.map(Number); + } + + const date = new Date(year, month - 1, day); + return date.getFullYear() === year && + date.getMonth() === month - 1 && + date.getDate() === day + ? date + : null; +}; + +export const minDate = + (min: string) => + (value: unknown): true | string => { + const reference = parseToDate(min); + const dateVal = typeof value === 'string' ? parseToDate(value) : null; + + if (!reference) throw new Error('minDate: formato de fecha incorrecto'); + if (!dateVal) return 'Fecha inválida'; + + return dateVal >= reference + ? true + : `Debe ser igual o posterior a ${min}`; + }; + +export const maxDate = + (max: string) => + (value: unknown): true | string => { + const reference = parseToDate(max); + const dateVal = typeof value === 'string' ? parseToDate(value) : null; + + if (!reference) throw new Error('maxDate: formato de fecha incorrecto'); + if (!dateVal) return 'Fecha inválida'; + + return dateVal <= reference + ? true + : `Debe ser igual o anterior a ${max}`; + }; diff --git a/front/contracts-frontend/src/vite-env.d.ts b/front/contracts-frontend/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/front/contracts-frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/front/contracts-frontend/tsconfig.app.json b/front/contracts-frontend/tsconfig.app.json new file mode 100644 index 0000000..69f65ce --- /dev/null +++ b/front/contracts-frontend/tsconfig.app.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "types": ["node"], + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/front/contracts-frontend/tsconfig.json b/front/contracts-frontend/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/front/contracts-frontend/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/front/contracts-frontend/tsconfig.node.json b/front/contracts-frontend/tsconfig.node.json new file mode 100644 index 0000000..ef86ed2 --- /dev/null +++ b/front/contracts-frontend/tsconfig.node.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/front/contracts-frontend/vite.config.ts b/front/contracts-frontend/vite.config.ts new file mode 100644 index 0000000..bf8d447 --- /dev/null +++ b/front/contracts-frontend/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + + +const root = dirname(fileURLToPath(import.meta.url)); + +export default defineConfig({ + plugins: [react(),], + resolve: { + alias: { + '@': resolve(root, 'src'), + }, + }, +}); \ No newline at end of file diff --git a/images/ErrorFromBackendExample.png b/images/ErrorFromBackendExample.png new file mode 100644 index 0000000000000000000000000000000000000000..b8fda97e3ad8bec6a06cf2054155ce275f371491 GIT binary patch literal 8612 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 z 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%0DR(=sr3Dk@?Z)#LDqN|{{* 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

H6wfWeogfD-ZF+|8**-RxUQL{c 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 literal 0 HcmV?d00001 diff --git a/images/NotFoundExample.png b/images/NotFoundExample.png new file mode 100644 index 0000000000000000000000000000000000000000..f60e272b5f31aecda343ccd16c2fc7be394f5a43 GIT binary patch literal 65783 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,RXX3L*|Uw z|9HpcZrI|L)9w(xrY`WiC`i@X)lNje2I2ZqC|=pykD-Y{VZldG+CWet)h zX4wCMv2j!8&pc$KKm1!Ye2O|%6c>bbt2?laW$?@dd4;)&@4Zo#UH(VshyOtI1|YF8 zeP(7lgZDWq+XJZjk4+RKF$O^esoU38e+{B%5Vch#>1f_y-@?|Zpu9?}N1lTTpN4tg ztne-QM;bRZ(4lh5|Ddi}Bjjwn;5bq@(fox9{@)%R-X(n^nsX#tk-Ahkh-|J7paBUf zB-fwSTm8be`jd*4?;gSW|RJ25*F65p8=CZ1^Q?`BA>by6tnWGcZ;SJ7EJ*8;YNkZ zCtj%g(X?{OkP&a=E4UpRAgd^3ym#({_${&^t_SQIqf-e%g_f?fhs^iKLIHchK60cC z@^`87PgsOq@-bJ3DaGC?p$zxszePIUJY-%?xW{}SN=__Aot^QbJ*@PD=T>YPl65F} zkI&e!yPG8x1jPnr%-N7XT!3vklcl*G>&C}109QGEg@5Ro@+Tu%aVP`7FD&ypmVb7D z@9X>9KtbWMkIYuMS25S+BYf8da5d!)n3xjeUapRwqMjlP=CsVJS z^Us^Mwcd$>U~&%3v0qQfA3$V~tQ{W zuCO7~Yc6P5&%h7f?)iGxSTp{xO8Jlw&_xJ@oSb}le}C?&{loJqYoS$wxR-X&#pesy z?n~qS1N}mCg~O5a#^;D}zc0lBj+>hucEXV^9&?^!wPmO^0At1QZ+tzX^*2SPbs*SP zH`viJj~f4l05x&;nCZ-Do~+14E$C-_VnP;3JGIL8^y|?^@XOImMsr^#_xOA~{4!yq z7||a1>C-(D4C<)o0?RrV)jWJe5Ppl3_s4XYn3ze@=3l0te=ye22<+3!FHG-Kn+ff( z7Gf3?d%MR6{-jbxc7HPO?gni-9n6c-adMN-z2&AXFb`Vu97>ab{f-jx!&49+llv>G z_w_+a0I%-#47c6YFU-e}DfjevrchLx`etn=lg<*66_sR=UeC=Zp19D+TO!hP2t0rA z3m+|w(D`DrNI(m9VPh5O8*C_TEdJMUpPadQPChrMI1RS+9WmtS;$q+0-oCps@6~bF z)p21_5y_LIo)|_Y6%~9Y`kuMDT9!wm)DRQl6h)s6&cNh<)(R>rUs;p9goJfY>+