From d4de0184f011742a6ceaca921bc1423a626f847e Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 07:08:15 +0200 Subject: [PATCH 01/21] Modify the `WorkspaceCodingService` to process test persons in batches --- .../services/workspace-coding.service.ts | 88 +++++++++++++++---- 1 file changed, 69 insertions(+), 19 deletions(-) diff --git a/apps/backend/src/app/database/services/workspace-coding.service.ts b/apps/backend/src/app/database/services/workspace-coding.service.ts index 59941a0ee..4fc70ec48 100644 --- a/apps/backend/src/app/database/services/workspace-coding.service.ts +++ b/apps/backend/src/app/database/services/workspace-coding.service.ts @@ -276,29 +276,79 @@ export class WorkspaceCodingService { job.progress = 0; await this.jobRepository.save(job); - // Clone the implementation of codeTestPersons but with progress tracking - const result = await this.processTestPersonsBatch(workspace_id, personIds, async progress => { - // Update job progress - try { - // Get the latest job status - const currentJob = await this.jobRepository.findOne({ where: { id: jobId } }); - if (!currentJob) { - this.logger.error(`Job with ID ${jobId} not found when updating progress`); - return; + // Process test persons in smaller batches to avoid memory issues + const BATCH_SIZE = 500; + const totalPersons = personIds.length; + let processedPersons = 0; + const combinedResult: CodingStatistics = { totalResponses: 0, statusCounts: {} }; + + this.logger.log(`Processing ${totalPersons} test persons in batches of ${BATCH_SIZE}`); + + // Process each batch sequentially + for (let i = 0; i < personIds.length; i += BATCH_SIZE) { + const currentJobStatus = await this.jobRepository.findOne({ where: { id: jobId } }); + if (!currentJobStatus || currentJobStatus.status === 'cancelled' || currentJobStatus.status === 'paused') { + this.logger.log(`Job ${jobId} was ${currentJobStatus ? currentJobStatus.status : 'cancelled'} before processing batch ${(i / BATCH_SIZE) + 1}`); + return; + } + + const batchPersonIds = personIds.slice(i, i + BATCH_SIZE); + const batchNumber = (i / BATCH_SIZE) + 1; + const totalBatches = Math.ceil(totalPersons / BATCH_SIZE); + this.logger.log(`Processing batch ${batchNumber} of ${totalBatches} (${batchPersonIds.length} persons)`); + + // Capture the current processed count for this batch's progress calculation + const currentProcessedCount = processedPersons; + + const batchResult = await this.processTestPersonsBatch(workspace_id, batchPersonIds, async progress => { + // Calculate overall progress based on completed batches and current batch progress + const overallProgress = Math.min( + Math.floor(((currentProcessedCount + (batchPersonIds.length * (progress / 100))) / totalPersons) * 100), + 99 // Cap at 99% until fully complete + ); + + // Update job progress + try { + const currentJob = await this.jobRepository.findOne({ where: { id: jobId } }); + if (!currentJob) { + this.logger.error(`Job with ID ${jobId} not found when updating progress`); + return; + } + + if (currentJob.status === 'cancelled' || currentJob.status === 'paused') { + return; + } + + // Update progress + currentJob.progress = overallProgress; + await this.jobRepository.save(currentJob); + } catch (error) { + this.logger.error(`Error updating job progress: ${error.message}`, error.stack); } + }, jobId.toString()); - // Don't update if job has been cancelled or paused - if (currentJob.status === 'cancelled' || currentJob.status === 'paused') { - return; + // Merge batch results into combined results + combinedResult.totalResponses += batchResult.totalResponses; + + // Merge status counts + Object.entries(batchResult.statusCounts).forEach(([status, count]) => { + if (!combinedResult.statusCounts[status]) { + combinedResult.statusCounts[status] = 0; } + combinedResult.statusCounts[status] += count; + }); - // Update progress - currentJob.progress = progress; - await this.jobRepository.save(currentJob); - } catch (error) { - this.logger.error(`Error updating job progress: ${error.message}`, error.stack); + // Update processed count + processedPersons += batchPersonIds.length; + + // Force garbage collection between batches if available + if (global.gc) { + this.logger.log('Forcing garbage collection between batches'); + global.gc(); } - }, jobId.toString()); + } + + // Use the combined result from all batches // Check if job was cancelled during processing const currentJob = await this.jobRepository.findOne({ where: { id: jobId } }); @@ -315,7 +365,7 @@ export class WorkspaceCodingService { // Update job status to completed with result currentJob.status = 'completed'; currentJob.progress = 100; - currentJob.result = JSON.stringify(result); + currentJob.result = JSON.stringify(combinedResult); // Calculate and store job duration if it's a TestPersonCodingJob if (currentJob.type === 'test-person-coding' && currentJob.created_at) { From e698f0330cb1361c1c3d619404cfa7d8c3d4d7ad Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:21:36 +0200 Subject: [PATCH 02/21] Run validation tasks in background --- apps/backend/src/app/admin/admin.module.ts | 4 +- .../workspace/dto/validation-task.dto.ts | 32 + .../workspace/validation-task.controller.ts | 81 + .../src/app/database/database.module.ts | 13 +- .../entities/validation-task.entity.ts | 33 + .../services/validation-task.service.ts | 182 ++ .../src/app/models/validation-task.dto.ts | 12 + .../src/app/services/backend.service.ts | 41 + .../services/validation-task-state.service.ts | 51 + .../src/app/services/validation.service.ts | 189 +- .../test-results/test-results.component.html | 8 +- .../test-results/test-results.component.scss | 15 + .../test-results/test-results.component.ts | 127 +- .../validation-dialog.component.html | 114 + .../validation-dialog.component.ts | 2230 ++++++++++++++++- .../changelog/coding-box.changelog-0.9.2.sql | 18 + .../changelog/coding-box.changelog-root.xml | 1 + 17 files changed, 3045 insertions(+), 106 deletions(-) create mode 100644 apps/backend/src/app/admin/workspace/dto/validation-task.dto.ts create mode 100644 apps/backend/src/app/admin/workspace/validation-task.controller.ts create mode 100644 apps/backend/src/app/database/entities/validation-task.entity.ts create mode 100644 apps/backend/src/app/database/services/validation-task.service.ts create mode 100644 apps/frontend/src/app/models/validation-task.dto.ts create mode 100644 apps/frontend/src/app/services/validation-task-state.service.ts create mode 100644 database/changelog/coding-box.changelog-0.9.2.sql diff --git a/apps/backend/src/app/admin/admin.module.ts b/apps/backend/src/app/admin/admin.module.ts index 6b5aa060d..96d427f94 100755 --- a/apps/backend/src/app/admin/admin.module.ts +++ b/apps/backend/src/app/admin/admin.module.ts @@ -17,6 +17,7 @@ import { ResourcePackageController } from './resource-packages/resource-package. import { JournalController } from './workspace/journal.controller'; import { VariableAnalysisController } from './variable-analysis/variable-analysis.controller'; import { JobsController } from './jobs/jobs.controller'; +import { ValidationTaskController } from './workspace/validation-task.controller'; @Module({ imports: [ @@ -39,7 +40,8 @@ import { JobsController } from './jobs/jobs.controller'; ResourcePackageController, JournalController, VariableAnalysisController, - JobsController + JobsController, + ValidationTaskController ], providers: [] }) diff --git a/apps/backend/src/app/admin/workspace/dto/validation-task.dto.ts b/apps/backend/src/app/admin/workspace/dto/validation-task.dto.ts new file mode 100644 index 000000000..853b4b5d7 --- /dev/null +++ b/apps/backend/src/app/admin/workspace/dto/validation-task.dto.ts @@ -0,0 +1,32 @@ +import { ValidationTask } from '../../../database/entities/validation-task.entity'; + +export class ValidationTaskDto { + id: number; + workspace_id: number; + validation_type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses'; + status: 'pending' | 'processing' | 'completed' | 'failed'; + progress?: number; + error?: string; + page?: number; + limit?: number; + created_at: Date; + updated_at: Date; + + /** + * Convert a ValidationTask entity to a ValidationTaskDto + */ + static fromEntity(entity: ValidationTask): ValidationTaskDto { + const dto = new ValidationTaskDto(); + dto.id = entity.id; + dto.workspace_id = entity.workspace_id; + dto.validation_type = entity.validation_type; + dto.status = entity.status as 'pending' | 'processing' | 'completed' | 'failed'; + dto.progress = entity.progress; + dto.error = entity.error; + dto.page = entity.page; + dto.limit = entity.limit; + dto.created_at = entity.created_at; + dto.updated_at = entity.updated_at; + return dto; + } +} diff --git a/apps/backend/src/app/admin/workspace/validation-task.controller.ts b/apps/backend/src/app/admin/workspace/validation-task.controller.ts new file mode 100644 index 000000000..01bfa266a --- /dev/null +++ b/apps/backend/src/app/admin/workspace/validation-task.controller.ts @@ -0,0 +1,81 @@ +import { + Controller, + Post, + Get, + Param, + Query, + ParseIntPipe, + Logger +} from '@nestjs/common'; +import { + ApiTags, + ApiOperation, + ApiParam, + ApiQuery +} from '@nestjs/swagger'; +import { ValidationTaskService } from '../../database/services/validation-task.service'; +import { ValidationTaskDto } from './dto/validation-task.dto'; +import { WorkspaceId } from './workspace.decorator'; + +@ApiTags('Validation Tasks') +@Controller('admin/workspace/:workspace_id/validation-tasks') +export class ValidationTaskController { + private readonly logger = new Logger(ValidationTaskController.name); + + constructor(private readonly validationTaskService: ValidationTaskService) {} + + @Post() + @ApiOperation({ summary: 'Create a new validation task' }) + @ApiParam({ name: 'workspace_id', description: 'Workspace ID' }) + @ApiQuery({ name: 'type', description: 'Validation type', required: true }) + @ApiQuery({ name: 'page', description: 'Page number', required: false }) + @ApiQuery({ name: 'limit', description: 'Page size', required: false }) + async createValidationTask( + @WorkspaceId() workspaceId: number, + @Query('type') type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses', + @Query('page') page?: number, + @Query('limit') limit?: number + ): Promise { + this.logger.log(`Creating validation task of type ${type} for workspace ${workspaceId}`); + const task = await this.validationTaskService.createValidationTask( + workspaceId, + type, + page, + limit + ); + return ValidationTaskDto.fromEntity(task); + } + + @Get() + @ApiOperation({ summary: 'Get all validation tasks for a workspace' }) + @ApiParam({ name: 'workspace_id', description: 'Workspace ID' }) + async getValidationTasks( + @WorkspaceId() workspaceId: number + ): Promise { + const tasks = await this.validationTaskService.getValidationTasks(workspaceId); + return tasks.map(task => ValidationTaskDto.fromEntity(task)); + } + + @Get(':id') + @ApiOperation({ summary: 'Get a validation task by ID' }) + @ApiParam({ name: 'workspace_id', description: 'Workspace ID' }) + @ApiParam({ name: 'id', description: 'Task ID' }) + async getValidationTask( + @WorkspaceId() workspaceId: number, + @Param('id', ParseIntPipe) taskId: number + ): Promise { + const task = await this.validationTaskService.getValidationTask(taskId, workspaceId); + return ValidationTaskDto.fromEntity(task); + } + + @Get(':id/results') + @ApiOperation({ summary: 'Get the results of a validation task' }) + @ApiParam({ name: 'workspace_id', description: 'Workspace ID' }) + @ApiParam({ name: 'id', description: 'Task ID' }) + async getValidationResults( + @WorkspaceId() workspaceId: number, + @Param('id', ParseIntPipe) taskId: number + ): Promise { + return this.validationTaskService.getValidationResults(taskId, workspaceId); + } +} diff --git a/apps/backend/src/app/database/database.module.ts b/apps/backend/src/app/database/database.module.ts index 4559abf54..62c5a3af2 100755 --- a/apps/backend/src/app/database/database.module.ts +++ b/apps/backend/src/app/database/database.module.ts @@ -40,9 +40,11 @@ import { JournalEntry } from './entities/journal-entry.entity'; import { JournalService } from './services/journal.service'; import { VariableAnalysisService } from './services/variable-analysis.service'; import { JobService } from './services/job.service'; +import { ValidationTaskService } from './services/validation-task.service'; import { Job } from './entities/job.entity'; import { VariableAnalysisJob } from './entities/variable-analysis-job.entity'; import { TestPersonCodingJob } from './entities/test-person-coding-job.entity'; +import { ValidationTask } from './entities/validation-task.entity'; @Module({ imports: [ @@ -72,7 +74,7 @@ import { TestPersonCodingJob } from './entities/test-person-coding-job.entity'; password: configService.get('POSTGRES_PASSWORD'), database: configService.get('POSTGRES_DB'), entities: [BookletInfo, Booklet, Session, BookletLog, Unit, UnitLog, UnitLastState, ResponseEntity, - User, Workspace, WorkspaceAdmin, FileUpload, WorkspaceUser, ResourcePackage, Logs, Persons, ChunkEntity, BookletLog, Session, UnitLog, UnitTag, UnitNote, JournalEntry, Job, VariableAnalysisJob, TestPersonCodingJob + User, Workspace, WorkspaceAdmin, FileUpload, WorkspaceUser, ResourcePackage, Logs, Persons, ChunkEntity, BookletLog, Session, UnitLog, UnitTag, UnitNote, JournalEntry, Job, VariableAnalysisJob, TestPersonCodingJob, ValidationTask ], synchronize: false }), @@ -101,7 +103,8 @@ import { TestPersonCodingJob } from './entities/test-person-coding-job.entity'; JournalEntry, Job, VariableAnalysisJob, - TestPersonCodingJob + TestPersonCodingJob, + ValidationTask ]) ], providers: [ @@ -122,7 +125,8 @@ import { TestPersonCodingJob } from './entities/test-person-coding-job.entity'; ResourcePackageService, JournalService, VariableAnalysisService, - JobService + JobService, + ValidationTaskService ], exports: [ User, @@ -149,7 +153,8 @@ import { TestPersonCodingJob } from './entities/test-person-coding-job.entity'; UnitNoteService, JournalService, VariableAnalysisService, - JobService + JobService, + ValidationTaskService ] }) export class DatabaseModule {} diff --git a/apps/backend/src/app/database/entities/validation-task.entity.ts b/apps/backend/src/app/database/entities/validation-task.entity.ts new file mode 100644 index 000000000..9a84950e2 --- /dev/null +++ b/apps/backend/src/app/database/entities/validation-task.entity.ts @@ -0,0 +1,33 @@ +import { + Column, + ChildEntity +} from 'typeorm'; +import { Job } from './job.entity'; + +/** + * Entity for validation tasks + */ +@ChildEntity('validation-task') +export class ValidationTask extends Job { + /** + * Type of validation to perform + * - 'variables': Validate if variables are defined in the Unit.xml + * - 'variableTypes': Validate if variable values match their defined types + * - 'responseStatus': Validate if response status is valid + * - 'testTakers': Validate if test takers exist in TestTakers XML files + * - 'groupResponses': Validate if responses exist for all test person groups + * - 'deleteResponses': Delete specific invalid responses + * - 'deleteAllResponses': Delete all invalid responses of a specific type + */ + @Column() + validation_type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses'; + + /** + * Pagination parameters for paginated results + */ + @Column({ nullable: true }) + page?: number; + + @Column({ nullable: true }) + limit?: number; +} diff --git a/apps/backend/src/app/database/services/validation-task.service.ts b/apps/backend/src/app/database/services/validation-task.service.ts new file mode 100644 index 000000000..8df1f7266 --- /dev/null +++ b/apps/backend/src/app/database/services/validation-task.service.ts @@ -0,0 +1,182 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { ValidationTask } from '../entities/validation-task.entity'; +import { WorkspaceFilesService } from './workspace-files.service'; + +@Injectable() +export class ValidationTaskService { + private readonly logger = new Logger(ValidationTaskService.name); + + constructor( + @InjectRepository(ValidationTask) + private taskRepository: Repository, + private validationService: WorkspaceFilesService + ) {} + + async createValidationTask( + workspaceId: number, + validationType: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses', + page?: number, + limit?: number, + additionalData?: Record + ): Promise { + const task = this.taskRepository.create({ + workspace_id: workspaceId, + validation_type: validationType, + page: page, + limit: limit, + status: 'pending', + result: additionalData ? JSON.stringify(additionalData) : undefined + }); + + const savedTask = await this.taskRepository.save(task); + this.logger.log(`Created validation task with ID ${savedTask.id}`); + + this.processValidationTask(savedTask.id).catch(error => { + this.logger.error(`Error processing task ${savedTask.id}: ${error.message}`, error.stack); + }); + + return savedTask; + } + + async getValidationTask(taskId: number, workspaceId?: number): Promise { + const whereClause: { id: number; workspace_id?: number } = { id: taskId }; + + if (workspaceId !== undefined) { + whereClause.workspace_id = workspaceId; + } + + const task = await this.taskRepository.findOne({ where: whereClause }); + if (!task) { + if (workspaceId !== undefined) { + throw new Error(`Task with ID ${taskId} not found in workspace ${workspaceId}`); + } else { + throw new Error(`Task with ID ${taskId} not found`); + } + } + return task; + } + + async getValidationTasks(workspaceId: number): Promise { + return this.taskRepository.find({ + where: { workspace_id: workspaceId }, + order: { created_at: 'DESC' } + }); + } + + async getValidationResults(taskId: number, workspaceId?: number): Promise { + const task = await this.getValidationTask(taskId, workspaceId); + + if (task.status !== 'completed') { + throw new Error(`Task with ID ${taskId} is not completed (status: ${task.status})`); + } + + if (!task.result) { + throw new Error(`Task with ID ${taskId} has no results`); + } + + try { + return JSON.parse(task.result); + } catch (error) { + this.logger.error(`Error parsing results for task ${taskId}: ${error.message}`, error.stack); + throw new Error(`Error parsing results for task ${taskId}`); + } + } + + private async processValidationTask(taskId: number): Promise { + try { + const task = await this.getValidationTask(taskId); + + task.status = 'processing'; + await this.taskRepository.save(task); + + let result: unknown; + let taskData: Record | null = null; + + if (task.result) { + try { + taskData = JSON.parse(task.result); + } catch (error) { + this.logger.error(`Error parsing task data for task ${taskId}: ${error.message}`, error.stack); + } + } + + switch (task.validation_type) { + case 'variables': + result = await this.validationService.validateVariables( + task.workspace_id, + task.page || 1, + task.limit || 10 + ); + break; + case 'variableTypes': + result = await this.validationService.validateVariableTypes( + task.workspace_id, + task.page || 1, + task.limit || 10 + ); + break; + case 'responseStatus': + result = await this.validationService.validateResponseStatus( + task.workspace_id, + task.page || 1, + task.limit || 10 + ); + break; + case 'testTakers': + result = await this.validationService.validateTestTakers(task.workspace_id); + break; + case 'groupResponses': + result = await this.validationService.validateGroupResponses( + task.workspace_id, + task.page || 1, + task.limit || 10 + ); + break; + case 'deleteResponses': + if (taskData && Array.isArray(taskData.responseIds)) { + const responseIds = taskData.responseIds as number[]; + const deletedCount = await this.validationService.deleteInvalidResponses( + task.workspace_id, + responseIds + ); + result = { deletedCount }; + } else { + throw new Error('No response IDs provided for deletion'); + } + break; + case 'deleteAllResponses': + if (taskData && typeof taskData.validationType === 'string') { + const validationType = taskData.validationType as 'variables' | 'variableTypes' | 'responseStatus'; + const deletedCount = await this.validationService.deleteAllInvalidResponses( + task.workspace_id, + validationType + ); + result = { deletedCount }; + } else { + throw new Error('No validation type provided for deletion'); + } + break; + default: + throw new Error(`Unknown validation type: ${task.validation_type}`); + } + + task.result = JSON.stringify(result); + task.status = 'completed'; + await this.taskRepository.save(task); + + this.logger.log(`Completed validation task with ID ${taskId}`); + } catch (error) { + try { + const task = await this.getValidationTask(taskId); + task.error = error.message; + task.status = 'failed'; + await this.taskRepository.save(task); + } catch (innerError) { + this.logger.error(`Failed to update task ${taskId} with error: ${innerError.message}`, innerError.stack); + } + this.logger.error(`Failed to process task ${taskId}: ${error.message}`, error.stack); + } + } +} diff --git a/apps/frontend/src/app/models/validation-task.dto.ts b/apps/frontend/src/app/models/validation-task.dto.ts new file mode 100644 index 000000000..7a685ed17 --- /dev/null +++ b/apps/frontend/src/app/models/validation-task.dto.ts @@ -0,0 +1,12 @@ +export interface ValidationTaskDto { + id: number; + workspace_id: number; + validation_type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses'; + status: 'pending' | 'processing' | 'completed' | 'failed'; + progress?: number; + error?: string; + page?: number; + limit?: number; + created_at: Date; + updated_at: Date; +} diff --git a/apps/frontend/src/app/services/backend.service.ts b/apps/frontend/src/app/services/backend.service.ts index fb744fd6c..28e1257af 100755 --- a/apps/frontend/src/app/services/backend.service.ts +++ b/apps/frontend/src/app/services/backend.service.ts @@ -26,6 +26,7 @@ import { ImportService } from './import.service'; import { AuthenticationService } from './authentication.service'; import { VariableAnalysisService, VariableAnalysisResultDto } from './variable-analysis.service'; import { VariableAnalysisJobDto } from '../models/variable-analysis-job.dto'; +import { ValidationTaskDto } from '../models/validation-task.dto'; import { FilesDto } from '../../../../../api-dto/files/files.dto'; import { CreateUnitNoteDto } from '../../../../../api-dto/unit-notes/create-unit-note.dto'; import { WorkspaceFullDto } from '../../../../../api-dto/workspaces/workspace-full-dto'; @@ -580,4 +581,44 @@ export class BackendService { cancelVariableAnalysisJob(workspaceId: number, jobId: number): Observable<{ success: boolean; message: string }> { return this.variableAnalysisService.cancelJob(workspaceId, jobId); } + + createValidationTask( + workspaceId: number, + type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses', + page?: number, + limit?: number, + additionalData?: Record + ): Observable { + return this.validationService.createValidationTask(workspaceId, type, page, limit, additionalData); + } + + createDeleteResponsesTask( + workspaceId: number, + responseIds: number[] + ): Observable { + return this.validationService.createDeleteResponsesTask(workspaceId, responseIds); + } + + createDeleteAllResponsesTask( + workspaceId: number, + validationType: 'variables' | 'variableTypes' | 'responseStatus' + ): Observable { + return this.validationService.createDeleteAllResponsesTask(workspaceId, validationType); + } + + getValidationTask(workspaceId: number, taskId: number): Observable { + return this.validationService.getValidationTask(workspaceId, taskId); + } + + getValidationResults(workspaceId: number, taskId: number): Observable { + return this.validationService.getValidationResults(workspaceId, taskId); + } + + pollValidationTask( + workspaceId: number, + taskId: number, + pollInterval: number = 2000 + ): Observable { + return this.validationService.pollValidationTask(workspaceId, taskId, pollInterval); + } } diff --git a/apps/frontend/src/app/services/validation-task-state.service.ts b/apps/frontend/src/app/services/validation-task-state.service.ts new file mode 100644 index 000000000..f0878cfda --- /dev/null +++ b/apps/frontend/src/app/services/validation-task-state.service.ts @@ -0,0 +1,51 @@ +import { Injectable } from '@angular/core'; + +// Define interfaces for validation results +export interface ValidationResult { + status: 'success' | 'failed' | 'not-run'; + timestamp: number; + details?: unknown; +} + +@Injectable({ + providedIn: 'root' +}) +export class ValidationTaskStateService { + // Store task IDs by workspace ID and validation type + private activeTasks: Record> = {}; + + // Store validation results by workspace ID and validation type + private validationResults: Record> = {}; + + setTaskId(workspaceId: number, type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses', taskId: number): void { + if (!this.activeTasks[workspaceId]) { + this.activeTasks[workspaceId] = {}; + } + this.activeTasks[workspaceId][type] = taskId; + } + + removeTaskId(workspaceId: number, type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): void { + if (this.activeTasks[workspaceId]) { + delete this.activeTasks[workspaceId][type]; + } + } + + getAllTaskIds(workspaceId: number): Record { + return this.activeTasks[workspaceId] || {}; + } + + setValidationResult( + workspaceId: number, + type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses', + result: ValidationResult + ): void { + if (!this.validationResults[workspaceId]) { + this.validationResults[workspaceId] = {}; + } + this.validationResults[workspaceId][type] = result; + } + + getAllValidationResults(workspaceId: number): Record { + return this.validationResults[workspaceId] || {}; + } +} diff --git a/apps/frontend/src/app/services/validation.service.ts b/apps/frontend/src/app/services/validation.service.ts index d61ce64fb..a3e83842a 100644 --- a/apps/frontend/src/app/services/validation.service.ts +++ b/apps/frontend/src/app/services/validation.service.ts @@ -3,11 +3,17 @@ import { HttpClient, HttpParams } from '@angular/common/http'; import { catchError, Observable, - of + of, + interval, + switchMap, + takeWhile, + map, + forkJoin } from 'rxjs'; import { InvalidVariableDto } from '../../../../../api-dto/files/variable-validation.dto'; import { TestTakersValidationDto } from '../../../../../api-dto/files/testtakers-validation.dto'; import { SERVER_URL } from '../injection-tokens'; +import { ValidationTaskDto } from '../models/validation-task.dto'; interface PaginatedResponse { data: T[]; @@ -149,4 +155,185 @@ export class ValidationService { catchError(() => of(0)) ); } + + createValidationTask( + workspaceId: number, + type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses', + page?: number, + limit?: number, + additionalData?: Record + ): Observable { + let params = new HttpParams().set('type', type); + + if (page) { + params = params.set('page', page.toString()); + } + + if (limit) { + params = params.set('limit', limit.toString()); + } + + // Add additional data as query parameters if provided + if (additionalData) { + Object.entries(additionalData).forEach(([key, value]) => { + if (value !== undefined && value !== null) { + if (Array.isArray(value)) { + params = params.set(key, value.join(',')); + } else { + params = params.set(key, String(value)); + } + } + }); + } + + return this.http.post( + `${this.serverUrl}admin/workspace/${workspaceId}/validation-tasks`, + null, + { headers: this.authHeader, params } + ).pipe( + catchError(error => { + console.error(`Error creating validation task: ${error.message}`); + throw error; + }) + ); + } + + createDeleteResponsesTask( + workspaceId: number, + responseIds: number[] + ): Observable { + return this.createValidationTask( + workspaceId, + 'deleteResponses', + undefined, + undefined, + { responseIds } + ); + } + + createDeleteAllResponsesTask( + workspaceId: number, + validationType: 'variables' | 'variableTypes' | 'responseStatus' + ): Observable { + return this.createValidationTask( + workspaceId, + 'deleteAllResponses', + undefined, + undefined, + { validationType } + ); + } + + getValidationTask(workspaceId: number, taskId: number): Observable { + return this.http.get( + `${this.serverUrl}admin/workspace/${workspaceId}/validation-tasks/${taskId}`, + { headers: this.authHeader } + ).pipe( + catchError(error => { + console.error(`Error getting validation task: ${error.message}`); + throw error; + }) + ); + } + + getValidationTasks(workspaceId: number): Observable { + return this.http.get( + `${this.serverUrl}admin/workspace/${workspaceId}/validation-tasks`, + { headers: this.authHeader } + ).pipe( + catchError(error => { + console.error(`Error getting validation tasks: ${error.message}`); + throw error; + }) + ); + } + + getValidationResults(workspaceId: number, taskId: number): Observable { + return this.http.get( + `${this.serverUrl}admin/workspace/${workspaceId}/validation-tasks/${taskId}/results`, + { headers: this.authHeader } + ).pipe( + catchError(error => { + console.error(`Error getting validation results: ${error.message}`); + throw error; + }) + ); + } + + pollValidationTask( + workspaceId: number, + taskId: number, + pollInterval: number = 2000 + ): Observable { + return interval(pollInterval).pipe( + switchMap(() => this.getValidationTask(workspaceId, taskId)), + takeWhile(task => task.status === 'pending' || task.status === 'processing', true) + ); + } + + getLastValidationResults( + workspaceId: number + ): Observable> { + return this.getValidationTasks(workspaceId).pipe( + switchMap(tasks => { + // Filter completed tasks and group by validation type + const completedTasks = tasks.filter(task => task.status === 'completed'); + const tasksByType: Record = {}; + + for (const task of completedTasks) { + if (!tasksByType[task.validation_type]) { + tasksByType[task.validation_type] = []; + } + tasksByType[task.validation_type].push(task); + } + + // Get the most recent task for each type + const latestTasks: Record = {}; + for (const type in tasksByType) { + if (Object.prototype.hasOwnProperty.call(tasksByType, type)) { + // Sort by creation date in descending order + tasksByType[type].sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()); + latestTasks[type] = tasksByType[type][0]; + } + } + + const resultObservables: Array> = []; + + for (const type in latestTasks) { + if (Object.prototype.hasOwnProperty.call(latestTasks, type)) { + const task = latestTasks[type]; + resultObservables.push( + this.getValidationResults(workspaceId, task.id).pipe( + map( + result => [type, { task, result }] as [string, { task: ValidationTaskDto; result: unknown }] + ), + catchError(error => { + console.error(`Error getting results for task ${task.id}: ${error.message}`); + return of([type, { task, result: null }] as [string, { task: ValidationTaskDto; result: unknown }]); + }) + ) + ); + } + } + + if (resultObservables.length === 0) { + return of>({}); + } + + return forkJoin<[string, { task: ValidationTaskDto; result: unknown }][]>(resultObservables).pipe( + map<[string, { task: ValidationTaskDto; result: unknown }][], Record>(results => { + const resultMap: Record = {}; + for (const [type, data] of results) { + resultMap[type] = data; + } + return resultMap; + }) + ); + }), + catchError(error => { + console.error(`Error getting last validation results: ${error.message}`); + return of>({}); + }) + ); + } } diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html index dddb33c82..acc22aa70 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html @@ -25,9 +25,11 @@ search Suchen - - rule + + sync + rule Validieren + Läuft... analytics @@ -169,7 +171,7 @@

Testhefte

-

Booklets werden geladen...

+

Testhefte werden geladen...

diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.scss b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.scss index 0cc98a6ea..ad0c8b581 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.scss +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.scss @@ -409,6 +409,21 @@ box-shadow: 0 3px 8px rgba(0, 0, 0, 0.12); transition: all 0.2s ease; + .rotating-icon { + animation: rotate 2s linear infinite; + } + + .validation-status-text { + margin-left: 8px; + font-size: 12px; + opacity: 0.8; + } + + @keyframes rotate { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } + } + &:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.18); diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts index 6c8c93780..cbb2a4bfe 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts @@ -53,6 +53,7 @@ import { UnitNoteDto } from '../../../../../../../api-dto/unit-notes/unit-note.d import { ValidationDialogComponent } from '../validation-dialog/validation-dialog.component'; import { VariableValidationDto } from '../../../../../../../api-dto/files/variable-validation.dto'; import { VariableAnalysisDialogComponent } from '../variable-analysis-dialog/variable-analysis-dialog.component'; +import { ValidationTaskStateService } from '../../../services/validation-task-state.service'; interface BookletLog { id: number; @@ -179,6 +180,7 @@ export class TestResultsComponent implements OnInit, OnDestroy { private router = inject(Router); private snackBar = inject(MatSnackBar); private translateService = inject(TranslateService); + private validationTaskStateService = inject(ValidationTaskStateService); private searchSubject = new Subject(); private searchSubscription: Subscription | null = null; private readonly SEARCH_DEBOUNCE_TIME = 800; @@ -211,6 +213,11 @@ export class TestResultsComponent implements OnInit, OnDestroy { variableValidationResult: VariableValidationDto | null = null; readonly SHORT_PROCESSING_TIME_THRESHOLD_MS: number = 60000; + // Interval for checking validation status + private validationStatusInterval: number | null = null; + // Flag to track if component is initialized + private isInitialized: boolean = false; + @ViewChild(MatPaginator) paginator!: MatPaginator; @ViewChild(MatSort) sort!: MatSort; @@ -223,6 +230,10 @@ export class TestResultsComponent implements OnInit, OnDestroy { }); this.createTestResultsList(0, this.pageSize); + + // Start interval to check validation status + this.startValidationStatusCheck(); + this.isInitialized = true; } ngOnDestroy(): void { @@ -230,6 +241,112 @@ export class TestResultsComponent implements OnInit, OnDestroy { this.searchSubscription.unsubscribe(); this.searchSubscription = null; } + + // Stop interval when component is destroyed + this.stopValidationStatusCheck(); + } + + /** + * Start interval to check validation status + */ + private startValidationStatusCheck(): void { + // Check immediately + this.checkValidationStatus(); + + // Then check every 5 seconds + this.validationStatusInterval = window.setInterval(() => { + this.checkValidationStatus(); + }, 5000); + } + + /** + * Stop interval for checking validation status + */ + private stopValidationStatusCheck(): void { + if (this.validationStatusInterval !== null) { + window.clearInterval(this.validationStatusInterval); + this.validationStatusInterval = null; + } + } + + /** + * Check validation status by querying active tasks + */ + private checkValidationStatus(): void { + if (!this.isInitialized || !this.appService.selectedWorkspaceId) { + return; + } + + const taskIds = this.validationTaskStateService.getAllTaskIds(this.appService.selectedWorkspaceId); + + // If there are active tasks, check their status + if (Object.keys(taskIds).length > 0) { + for (const [type, taskId] of Object.entries(taskIds)) { + this.backendService.getValidationTask(this.appService.selectedWorkspaceId, taskId) + .subscribe({ + next: task => { + // If task is completed or failed, remove it from the service + if (task.status === 'completed' || task.status === 'failed') { + this.validationTaskStateService.removeTaskId( + this.appService.selectedWorkspaceId, + type as 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' + ); + } + }, + error: () => { + // If there's an error, remove the task from the service + this.validationTaskStateService.removeTaskId( + this.appService.selectedWorkspaceId, + type as 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' + ); + } + }); + } + } + } + + /** + * Check if any validation task is running + * @returns True if any validation task is running + */ + isAnyValidationRunning(): boolean { + if (!this.appService.selectedWorkspaceId) { + return false; + } + + const taskIds = this.validationTaskStateService.getAllTaskIds(this.appService.selectedWorkspaceId); + return Object.keys(taskIds).length > 0; + } + + /** + * Get the overall validation status + * @returns The status: 'running', 'failed', 'success', or 'not-run' + */ + getOverallValidationStatus(): 'running' | 'failed' | 'success' | 'not-run' { + if (this.isAnyValidationRunning()) { + return 'running'; + } + + if (this.appService.selectedWorkspaceId) { + const results = this.validationTaskStateService.getAllValidationResults(this.appService.selectedWorkspaceId); + + if (Object.keys(results).length > 0) { + const hasFailedValidation = Object.values(results).some(result => result.status === 'failed'); + if (hasFailedValidation) { + return 'failed'; + } + + const validationTypes = ['variables', 'variableTypes', 'responseStatus', 'testTakers', 'groupResponses']; + const hasAllValidations = validationTypes.every(type => results[type]); + if (hasAllValidations) { + return 'success'; + } + + return 'success'; + } + } + + return 'not-run'; } onRowClick(row: P): void { @@ -1160,9 +1277,13 @@ export class TestResultsComponent implements OnInit, OnDestroy { }); dialogRef.afterClosed().subscribe(result => { - if (result && result.variableValidationResult) { - this.variableValidationResult = result.variableValidationResult; - this.isVariableValidationRunning = false; + if (result) { + if (result.variableValidationResult) { + this.variableValidationResult = result.variableValidationResult; + this.isVariableValidationRunning = false; + } + this.checkValidationStatus(); + this.getOverallValidationStatus(); } }); } diff --git a/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.html b/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.html index c70e63294..8b27d883f 100644 --- a/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.html +++ b/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.html @@ -1,4 +1,118 @@

Antworten validieren

+
+ info + Validierungen laufen im Hintergrund weiter, auch wenn Sie diesen Dialog schließen. +
+ + +
+
Validierungsstatus
+ + +
+ hourglass_empty + error + check_circle + radio_button_unchecked + {{ getValidationLabel('testTakers') }} + Läuft... + + {{ testTakersValidationResult.missingPersons.length }} fehlende Testpersonen + + OK + Nicht ausgeführt +
+ + +
+ hourglass_empty + error + check_circle + radio_button_unchecked + {{ getValidationLabel('variables') }} + Läuft... + + {{ totalInvalidVariables }} ungültige Variablen + + OK + Nicht ausgeführt +
+ + +
+ hourglass_empty + error + check_circle + radio_button_unchecked + {{ getValidationLabel('variableTypes') }} + Läuft... + + {{ totalInvalidTypeVariables }} ungültige Variablentypen + + OK + Nicht ausgeführt +
+ + +
+ hourglass_empty + error + check_circle + radio_button_unchecked + {{ getValidationLabel('responseStatus') }} + Läuft... + + {{ totalInvalidStatusVariables }} ungültige Antwortstatus + + OK + Nicht ausgeführt +
+ + +
+ hourglass_empty + error + check_circle + radio_button_unchecked + {{ getValidationLabel('groupResponses') }} + Läuft... + + Nicht alle Gruppen haben Antworten + + OK + Nicht ausgeführt +
+
diff --git a/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.ts b/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.ts index 2cdda90b0..99f0ea7b5 100644 --- a/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.ts +++ b/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.ts @@ -1,5 +1,5 @@ import { - Component, Inject, inject, ViewChild, AfterViewInit, OnInit + Component, Inject, inject, ViewChild, AfterViewInit, OnInit, OnDestroy } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialog, MatDialogModule, MatDialogRef @@ -14,11 +14,15 @@ import { MatExpansionModule } from '@angular/material/expansion'; import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar'; import { MatPaginator, MatPaginatorModule, PageEvent } from '@angular/material/paginator'; import { MatIconModule } from '@angular/material/icon'; +import { Subscription } from 'rxjs'; import { BackendService } from '../../../services/backend.service'; import { AppService } from '../../../services/app.service'; +import { ValidationTaskStateService, ValidationResult } from '../../../services/validation-task-state.service'; +import { ValidationService } from '../../../services/validation.service'; import { InvalidVariableDto } from '../../../../../../../api-dto/files/variable-validation.dto'; import { TestTakersValidationDto, MissingPersonDto } from '../../../../../../../api-dto/files/testtakers-validation.dto'; import { ContentDialogComponent } from '../../../shared/dialogs/content-dialog/content-dialog.component'; +import { ValidationTaskDto } from '../../../models/validation-task.dto'; @Component({ selector: 'coding-box-validation-dialog', @@ -46,10 +50,6 @@ import { ContentDialogComponent } from '../../../shared/dialogs/content-dialog/c margin-bottom: 16px; } - .mat-expansion-panel { - margin-bottom: 16px; - } - .mat-spinner { display: inline-block; margin-right: 8px; @@ -81,12 +81,82 @@ import { ContentDialogComponent } from '../../../shared/dialogs/content-dialog/c border: 1px solid #F44336; } + .validation-running { + background-color: rgba(33, 150, 243, 0.1); + color: #2196F3; + border: 1px solid #2196F3; + } + + .validation-not-run { + background-color: rgba(158, 158, 158, 0.1); + color: #9E9E9E; + border: 1px solid #9E9E9E; + } + .validation-result mat-icon { margin-right: 8px; } + + .info-banner { + display: flex; + align-items: center; + margin: 0 0 16px 0; + padding: 8px 16px; + border-radius: 4px; + background-color: rgba(33, 150, 243, 0.1); + color: #2196F3; + border: 1px solid #2196F3; + } + + .info-banner mat-icon { + margin-right: 8px; + } + + .loading-container { + display: flex; + align-items: center; + margin: 10px 0; + } + + .loading-text { + margin-left: 8px; + } + + .validation-summary { + display: flex; + flex-direction: column; + gap: 8px; + margin-bottom: 16px; + padding: 16px; + border-radius: 4px; + background-color: #f5f5f5; + border: 1px solid #e0e0e0; + } + + .validation-summary-title { + font-size: 16px; + font-weight: 500; + margin-bottom: 8px; + } + + .validation-summary-item { + display: flex; + align-items: center; + padding: 8px; + border-radius: 4px; + font-weight: 500; + } + + .validation-summary-item mat-icon { + margin-right: 8px; + } + + .validation-summary-item-label { + flex: 1; + } `] }) -export class ValidationDialogComponent implements AfterViewInit, OnInit { +export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestroy { @ViewChild('variablePaginator') variablePaginator!: MatPaginator; @ViewChild('variableTypePaginator') variableTypePaginator!: MatPaginator; @ViewChild('statusVariablePaginator') statusVariablePaginator!: MatPaginator; @@ -95,6 +165,21 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { firstStepCompleted = true; backendService = inject(BackendService); appService = inject(AppService); + validationTaskStateService = inject(ValidationTaskStateService); + validationService = inject(ValidationService); + + // Subscriptions + private subscriptions: Subscription[] = []; + + // Flag to indicate if we're closing the dialog + private isClosing = false; + + // Validation tasks + private variableValidationTask: ValidationTaskDto | null = null; + private variableTypeValidationTask: ValidationTaskDto | null = null; + private responseStatusValidationTask: ValidationTaskDto | null = null; + private testTakersValidationTask: ValidationTaskDto | null = null; + private groupResponsesValidationTask: ValidationTaskDto | null = null; // Variable validation properties invalidVariables: InvalidVariableDto[] = []; @@ -172,6 +257,11 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { ) {} ngOnInit(): void { + // Check for existing validation tasks + this.checkForExistingTasks(); + + // Load previous validation results + this.loadPreviousValidationResults(); } ngAfterViewInit(): void { @@ -182,6 +272,414 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.paginatedGroupResponses.paginator = this.groupResponsesPaginator; } + ngOnDestroy(): void { + // If we're closing the dialog, don't cancel running tasks + if (this.isClosing) { + // Store running task IDs in the service + this.storeRunningTasks(); + + // Only unsubscribe from subscriptions, don't cancel tasks + this.subscriptions.forEach(sub => sub.unsubscribe()); + } else { + // Clean up subscriptions to prevent memory leaks + this.subscriptions.forEach(sub => sub.unsubscribe()); + } + } + + /** + * Check for existing validation tasks and load them if they exist + */ + private checkForExistingTasks(): void { + const workspaceId = this.appService.selectedWorkspaceId; + const taskIds = this.validationTaskStateService.getAllTaskIds(workspaceId); + + // Check for each type of validation task + if (taskIds.variables) { + this.loadExistingTask('variables', taskIds.variables); + } + + if (taskIds.variableTypes) { + this.loadExistingTask('variableTypes', taskIds.variableTypes); + } + + if (taskIds.responseStatus) { + this.loadExistingTask('responseStatus', taskIds.responseStatus); + } + + if (taskIds.testTakers) { + this.loadExistingTask('testTakers', taskIds.testTakers); + } + + if (taskIds.groupResponses) { + this.loadExistingTask('groupResponses', taskIds.groupResponses); + } + } + + /** + * Load an existing validation task + * @param type The type of validation task + * @param taskId The task ID + */ + private loadExistingTask( + type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses', + taskId: number + ): void { + const workspaceId = this.appService.selectedWorkspaceId; + + // Set the appropriate task object + switch (type) { + case 'variables': + this.isVariableValidationRunning = true; + break; + case 'variableTypes': + this.isVariableTypeValidationRunning = true; + break; + case 'responseStatus': + this.isResponseStatusValidationRunning = true; + break; + case 'testTakers': + this.isTestTakersValidationRunning = true; + break; + case 'groupResponses': + this.isGroupResponsesValidationRunning = true; + break; + default: + // No action needed for unknown types + break; + } + + // Get the task status + const subscription = this.backendService.getValidationTask(workspaceId, taskId) + .subscribe({ + next: task => { + switch (type) { + case 'variables': + this.variableValidationTask = task; + break; + case 'variableTypes': + this.variableTypeValidationTask = task; + break; + case 'responseStatus': + this.responseStatusValidationTask = task; + break; + case 'testTakers': + this.testTakersValidationTask = task; + break; + case 'groupResponses': + this.groupResponsesValidationTask = task; + break; + default: + break; + } + + // If the task is still running, poll for updates + if (task.status === 'pending' || task.status === 'processing') { + this.pollExistingTask(type, taskId); + } else if (task.status === 'completed') { + // If the task is completed, get the results + this.loadTaskResults(type, taskId); + } else if (task.status === 'failed') { + // If the task failed, show an error message + this.snackBar.open(`Validierung fehlgeschlagen: ${task.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.validationTaskStateService.removeTaskId(workspaceId, type); + + // Reset the running flag + switch (type) { + case 'variables': + this.isVariableValidationRunning = false; + break; + case 'variableTypes': + this.isVariableTypeValidationRunning = false; + break; + case 'responseStatus': + this.isResponseStatusValidationRunning = false; + break; + case 'testTakers': + this.isTestTakersValidationRunning = false; + break; + case 'groupResponses': + this.isGroupResponsesValidationRunning = false; + break; + default: + break; + } + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.validationTaskStateService.removeTaskId(workspaceId, type); + + // Reset the running flag + switch (type) { + case 'variables': + this.isVariableValidationRunning = false; + break; + case 'variableTypes': + this.isVariableTypeValidationRunning = false; + break; + case 'responseStatus': + this.isResponseStatusValidationRunning = false; + break; + case 'testTakers': + this.isTestTakersValidationRunning = false; + break; + case 'groupResponses': + this.isGroupResponsesValidationRunning = false; + break; + default: + break; + } + } + }); + + this.subscriptions.push(subscription); + } + + /** + * Poll for updates on an existing validation task + * @param type The type of validation task + * @param taskId The task ID + */ + private pollExistingTask( + type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses', + taskId: number + ): void { + const workspaceId = this.appService.selectedWorkspaceId; + + const pollSubscription = this.backendService.pollValidationTask( + workspaceId, + taskId + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.loadTaskResults(type, taskId); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.validationTaskStateService.removeTaskId(workspaceId, type); + + // Reset the running flag + switch (type) { + case 'variables': + this.isVariableValidationRunning = false; + break; + case 'variableTypes': + this.isVariableTypeValidationRunning = false; + break; + case 'responseStatus': + this.isResponseStatusValidationRunning = false; + break; + case 'testTakers': + this.isTestTakersValidationRunning = false; + break; + case 'groupResponses': + this.isGroupResponsesValidationRunning = false; + break; + default: + break; + } + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.validationTaskStateService.removeTaskId(workspaceId, type); + + // Reset the running flag + switch (type) { + case 'variables': + this.isVariableValidationRunning = false; + break; + case 'variableTypes': + this.isVariableTypeValidationRunning = false; + break; + case 'responseStatus': + this.isResponseStatusValidationRunning = false; + break; + case 'testTakers': + this.isTestTakersValidationRunning = false; + break; + case 'groupResponses': + this.isGroupResponsesValidationRunning = false; + break; + default: + break; + } + } + }); + + this.subscriptions.push(pollSubscription); + } + + /** + * Load the results of a validation task + * @param type The type of validation task + * @param taskId The task ID + */ + private loadTaskResults( + type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses', + taskId: number + ): void { + const workspaceId = this.appService.selectedWorkspaceId; + + const subscription = this.backendService.getValidationResults( + workspaceId, + taskId + ).subscribe({ + next: result => { + // Define result type interfaces outside of switch + interface PaginatedResult { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + } + + interface GroupResponsesResult { + testTakersFound: boolean; + groupsWithResponses: { group: string; hasResponse: boolean }[]; + allGroupsHaveResponses: boolean; + total: number; + page: number; + limit: number; + } + + // Process results based on type + switch (type) { + case 'variables': { + const typedResult = result as PaginatedResult; + this.invalidVariables = typedResult.data; + this.totalInvalidVariables = typedResult.total; + this.currentVariablePage = typedResult.page; + this.variablePageSize = typedResult.limit; + this.updatePaginatedVariables(); + this.isVariableValidationRunning = false; + this.validateVariablesWasRun = true; + + // Save validation result to the service + this.saveValidationResult(type); + break; + } + + case 'variableTypes': { + const typedResult = result as PaginatedResult; + this.invalidTypeVariables = typedResult.data; + this.totalInvalidTypeVariables = typedResult.total; + this.currentTypeVariablePage = typedResult.page; + this.typeVariablePageSize = typedResult.limit; + this.updatePaginatedTypeVariables(); + this.isVariableTypeValidationRunning = false; + this.validateVariableTypesWasRun = true; + + // Save validation result to the service + this.saveValidationResult(type); + break; + } + + case 'responseStatus': { + const typedResult = result as PaginatedResult; + this.invalidStatusVariables = typedResult.data; + this.totalInvalidStatusVariables = typedResult.total; + this.currentStatusVariablePage = typedResult.page; + this.statusVariablePageSize = typedResult.limit; + this.updatePaginatedStatusVariables(); + this.isResponseStatusValidationRunning = false; + this.validateResponseStatusWasRun = true; + + // Save validation result to the service + this.saveValidationResult(type); + break; + } + + case 'testTakers': { + this.testTakersValidationResult = result as TestTakersValidationDto; + this.updatePaginatedMissingPersons(); + this.isTestTakersValidationRunning = false; + this.testTakersValidationWasRun = true; + + // Save validation result to the service + this.saveValidationResult(type); + break; + } + + case 'groupResponses': { + const typedResult = result as GroupResponsesResult; + this.groupResponsesResult = typedResult; + this.totalGroupResponses = typedResult.total; + this.updatePaginatedGroupResponses(); + this.isGroupResponsesValidationRunning = false; + this.groupResponsesValidationWasRun = true; + + // Save validation result to the service + this.saveValidationResult(type); + break; + } + + default: + break; + } + + // Remove the task ID from the service since we've loaded the results + this.validationTaskStateService.removeTaskId(workspaceId, type); + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen der Validierungsergebnisse', 'Schließen', { duration: 5000 }); + this.validationTaskStateService.removeTaskId(workspaceId, type); + + // Reset the running flag + switch (type) { + case 'variables': + this.isVariableValidationRunning = false; + break; + case 'variableTypes': + this.isVariableTypeValidationRunning = false; + break; + case 'responseStatus': + this.isResponseStatusValidationRunning = false; + break; + case 'testTakers': + this.isTestTakersValidationRunning = false; + break; + case 'groupResponses': + this.isGroupResponsesValidationRunning = false; + break; + default: + // No action needed for unknown types + break; + } + } + }); + + this.subscriptions.push(subscription); + } + + /** + * Store running tasks in the service + */ + private storeRunningTasks(): void { + const workspaceId = this.appService.selectedWorkspaceId; + + // Store each running task + if (this.variableValidationTask && (this.variableValidationTask.status === 'pending' || this.variableValidationTask.status === 'processing')) { + this.validationTaskStateService.setTaskId(workspaceId, 'variables', this.variableValidationTask.id); + } + + if (this.variableTypeValidationTask && (this.variableTypeValidationTask.status === 'pending' || this.variableTypeValidationTask.status === 'processing')) { + this.validationTaskStateService.setTaskId(workspaceId, 'variableTypes', this.variableTypeValidationTask.id); + } + + if (this.responseStatusValidationTask && (this.responseStatusValidationTask.status === 'pending' || this.responseStatusValidationTask.status === 'processing')) { + this.validationTaskStateService.setTaskId(workspaceId, 'responseStatus', this.responseStatusValidationTask.id); + } + + if (this.testTakersValidationTask && (this.testTakersValidationTask.status === 'pending' || this.testTakersValidationTask.status === 'processing')) { + this.validationTaskStateService.setTaskId(workspaceId, 'testTakers', this.testTakersValidationTask.id); + } + + if (this.groupResponsesValidationTask && (this.groupResponsesValidationTask.status === 'pending' || this.groupResponsesValidationTask.status === 'processing')) { + this.validationTaskStateService.setTaskId(workspaceId, 'groupResponses', this.groupResponsesValidationTask.id); + } + } + updatePaginatedVariables(): void { this.paginatedVariables.data = this.invalidVariables; } @@ -203,31 +701,146 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.currentGroupResponsesPage = event.pageIndex + 1; this.groupResponsesPageSize = event.pageSize; - // Reload data from server with new pagination parameters + // Reload data from server with new pagination parameters using background task this.isGroupResponsesValidationRunning = true; - this.backendService.validateGroupResponses( + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( this.appService.selectedWorkspaceId, + 'groupResponses', this.currentGroupResponsesPage, this.groupResponsesPageSize - ).subscribe(result => { - this.groupResponsesResult = result; - this.totalGroupResponses = result.total; - this.updatePaginatedGroupResponses(); - this.isGroupResponsesValidationRunning = false; + ).subscribe(task => { + this.groupResponsesValidationTask = task; + + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result + const typedResult = result as { + testTakersFound: boolean; + groupsWithResponses: { group: string; hasResponse: boolean }[]; + allGroupsHaveResponses: boolean; + total: number; + page: number; + limit: number; + }; + + this.groupResponsesResult = typedResult; + this.totalGroupResponses = typedResult.total; + this.updatePaginatedGroupResponses(); + this.isGroupResponsesValidationRunning = false; + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isGroupResponsesValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isGroupResponsesValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); }); + + this.subscriptions.push(subscription); } validateTestTakers(): void { this.isTestTakersValidationRunning = true; this.testTakersValidationResult = null; this.testTakersValidationWasRun = false; - this.backendService.validateTestTakers(this.appService.selectedWorkspaceId) - .subscribe(result => { - this.testTakersValidationResult = result; - this.updatePaginatedMissingPersons(); - this.isTestTakersValidationRunning = false; - this.testTakersValidationWasRun = true; + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'testTakers' + ).subscribe(task => { + this.testTakersValidationTask = task; + + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // Update progress if available + if (updatedTask.progress) { + // Could show progress here if needed + } + + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result as TestTakersValidationDto + this.testTakersValidationResult = result as TestTakersValidationDto; + + // Check if the result indicates errors + const hasErrors = + !this.testTakersValidationResult.testTakersFound || + this.testTakersValidationResult.missingPersons.length > 0; + + // Create a validation result with the appropriate status + const validationResult: ValidationResult = { + status: hasErrors ? 'failed' : 'success', + timestamp: Date.now(), + details: { + testTakersFound: this.testTakersValidationResult.testTakersFound, + missingPersonsCount: this.testTakersValidationResult.missingPersons.length, + hasErrors: hasErrors + } + }; + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult( + this.appService.selectedWorkspaceId, + 'testTakers', + validationResult + ); + + this.updatePaginatedMissingPersons(); + this.isTestTakersValidationRunning = false; + this.testTakersValidationWasRun = true; + + this.saveValidationResult('testTakers'); + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isTestTakersValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isTestTakersValidationRunning = false; + } }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); } toggleMissingPersonsExpansion(): void { @@ -243,17 +856,93 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.groupResponsesResult = null; this.groupResponsesValidationWasRun = false; this.currentGroupResponsesPage = 1; - this.backendService.validateGroupResponses( + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( this.appService.selectedWorkspaceId, + 'groupResponses', this.currentGroupResponsesPage, this.groupResponsesPageSize - ).subscribe(result => { - this.groupResponsesResult = result; - this.totalGroupResponses = result.total; - this.updatePaginatedGroupResponses(); - this.isGroupResponsesValidationRunning = false; - this.groupResponsesValidationWasRun = true; + ).subscribe(task => { + this.groupResponsesValidationTask = task; + + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // Update progress if available + if (updatedTask.progress) { + // Could show progress here if needed + } + + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result + const typedResult = result as { + testTakersFound: boolean; + groupsWithResponses: { group: string; hasResponse: boolean }[]; + allGroupsHaveResponses: boolean; + total: number; + page: number; + limit: number; + }; + + // Check if the result indicates errors + const hasErrors = + !typedResult.testTakersFound || !typedResult.allGroupsHaveResponses; + + // Create a validation result with the appropriate status + const validationResult: ValidationResult = { + status: hasErrors ? 'failed' : 'success', + timestamp: Date.now(), + details: { + testTakersFound: typedResult.testTakersFound, + allGroupsHaveResponses: typedResult.allGroupsHaveResponses, + hasErrors: hasErrors + } + }; + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult( + this.appService.selectedWorkspaceId, + 'groupResponses', + validationResult + ); + + this.groupResponsesResult = typedResult; + this.totalGroupResponses = typedResult.total; + this.updatePaginatedGroupResponses(); + this.isGroupResponsesValidationRunning = false; + this.groupResponsesValidationWasRun = true; + + // Save the validation result to the service + this.saveValidationResult('groupResponses'); + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isGroupResponsesValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isGroupResponsesValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); }); + + this.subscriptions.push(subscription); } updatePaginatedTypeVariables(): void { @@ -270,25 +959,156 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.totalInvalidVariables = 0; this.validateVariablesWasRun = false; this.selectedResponses.clear(); - this.backendService.validateVariables( + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( this.appService.selectedWorkspaceId, + 'variables', this.currentVariablePage, this.variablePageSize - ).subscribe(result => { - this.invalidVariables = result.data; - this.totalInvalidVariables = result.total; - this.currentVariablePage = result.page; - this.variablePageSize = result.limit; - this.updatePaginatedVariables(); - this.isVariableValidationRunning = false; - this.validateVariablesWasRun = true; + ).subscribe(task => { + this.variableValidationTask = task; + + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // Update progress if available + if (updatedTask.progress) { + // Could show progress here if needed + } + + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result as a PaginatedResponse + const typedResult = result as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + // Check if the result indicates errors + const hasErrors = typedResult.total > 0; + + // Create a validation result with the appropriate status + const validationResult: ValidationResult = { + status: hasErrors ? 'failed' : 'success', + timestamp: Date.now(), + details: { + total: typedResult.total, + hasErrors: hasErrors + } + }; + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult( + this.appService.selectedWorkspaceId, + 'variables', + validationResult + ); + + this.invalidVariables = typedResult.data; + this.totalInvalidVariables = typedResult.total; + this.currentVariablePage = typedResult.page; + this.variablePageSize = typedResult.limit; + this.updatePaginatedVariables(); + this.isVariableValidationRunning = false; + this.validateVariablesWasRun = true; + + // Save the validation result to the service + this.saveValidationResult('variables'); + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isVariableValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isVariableValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); }); + + this.subscriptions.push(subscription); } onVariablePageChange(event: PageEvent): void { this.currentVariablePage = event.pageIndex + 1; this.variablePageSize = event.pageSize; - this.validateVariables(); + + // Reload data from server with new pagination parameters using background task + this.isVariableValidationRunning = true; + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'variables', + this.currentVariablePage, + this.variablePageSize + ).subscribe(task => { + this.variableValidationTask = task; + + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result as a PaginatedResponse + const typedResult = result as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + this.invalidVariables = typedResult.data; + this.totalInvalidVariables = typedResult.total; + this.currentVariablePage = typedResult.page; + this.variablePageSize = typedResult.limit; + this.updatePaginatedVariables(); + this.isVariableValidationRunning = false; + this.validateVariablesWasRun = true; + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isVariableValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isVariableValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); } toggleResponseSelection(responseId: number | undefined): void { @@ -326,14 +1146,103 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.isDeletingResponses = true; const responseIds = Array.from(this.selectedResponses); - this.backendService.deleteInvalidResponses(this.appService.selectedWorkspaceId, responseIds) - .subscribe(deletedCount => { - this.isDeletingResponses = false; - this.snackBar.open(`${deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; - this.validateVariables(); - this.selectedResponses.clear(); + // Create a background deletion task + const subscription = this.backendService.createDeleteResponsesTask( + this.appService.selectedWorkspaceId, + responseIds + ).subscribe(task => { + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + const typedResult = result as { deletedCount: number }; + this.isDeletingResponses = false; + this.snackBar.open(`${typedResult.deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); + + // Start background validation task to refresh the data + this.isVariableValidationRunning = true; + + // Create a background validation task + const validationSubscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'variables', + this.currentVariablePage, + this.variablePageSize + ).subscribe(validationTask => { + this.variableValidationTask = validationTask; + + // Poll for validation task completion + const validationPollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + validationTask.id + ).subscribe({ + next: updatedValidationTask => { + // If task is completed, get the results + if (updatedValidationTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedValidationTask.id + ).subscribe(validationResult => { + // Type the result as a PaginatedResponse + const typedValidationResult = validationResult as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + this.invalidVariables = typedValidationResult.data; + this.totalInvalidVariables = typedValidationResult.total; + this.currentVariablePage = typedValidationResult.page; + this.variablePageSize = typedValidationResult.limit; + this.updatePaginatedVariables(); + this.isVariableValidationRunning = false; + this.validateVariablesWasRun = true; + }); + } else if (updatedValidationTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedValidationTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isVariableValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isVariableValidationRunning = false; + } + }); + + this.subscriptions.push(validationPollSubscription); + }); + + this.subscriptions.push(validationSubscription); + }); + } else if (updatedTask.status === 'failed') { + this.isDeletingResponses = false; + this.snackBar.open(`Löschen fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + } + }, + error: () => { + this.isDeletingResponses = false; + this.snackBar.open('Fehler beim Abrufen des Löschstatus', 'Schließen', { duration: 5000 }); + } }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); + this.selectedResponses.clear(); } deleteAllResponses(): void { @@ -357,14 +1266,102 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { if (deleteFromDb) { this.isDeletingResponses = true; - this.backendService.deleteAllInvalidResponses(this.appService.selectedWorkspaceId, 'variables') - .subscribe(deletedCount => { - this.isDeletingResponses = false; - this.snackBar.open(`${deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); - - this.validateVariables(); - this.selectedResponses.clear(); + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background deletion task + const subscription = this.backendService.createDeleteAllResponsesTask( + this.appService.selectedWorkspaceId, + 'variables' + ).subscribe(task => { + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + const typedResult = result as { deletedCount: number }; + this.isDeletingResponses = false; + this.snackBar.open(`${typedResult.deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); + + // Start background validation task to refresh the data + this.isVariableValidationRunning = true; + + // Create a background validation task + const validationSubscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'variables', + this.currentVariablePage, + this.variablePageSize + ).subscribe(validationTask => { + this.variableValidationTask = validationTask; + + // Poll for validation task completion + const validationPollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + validationTask.id + ).subscribe({ + next: updatedValidationTask => { + // If task is completed, get the results + if (updatedValidationTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedValidationTask.id + ).subscribe(validationResult => { + // Type the result as a PaginatedResponse + const typedValidationResult = validationResult as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + this.invalidVariables = typedValidationResult.data; + this.totalInvalidVariables = typedValidationResult.total; + this.currentVariablePage = typedValidationResult.page; + this.variablePageSize = typedValidationResult.limit; + this.updatePaginatedVariables(); + this.isVariableValidationRunning = false; + this.validateVariablesWasRun = true; + }); + } else if (updatedValidationTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedValidationTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isVariableValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isVariableValidationRunning = false; + } + }); + + this.subscriptions.push(validationPollSubscription); + }); + + this.subscriptions.push(validationSubscription); + }); + } else if (updatedTask.status === 'failed') { + this.isDeletingResponses = false; + this.snackBar.open(`Löschen fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + } + }, + error: () => { + this.isDeletingResponses = false; + this.snackBar.open('Fehler beim Abrufen des Löschstatus', 'Schließen', { duration: 5000 }); + } }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); } }); } @@ -379,19 +1376,91 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.totalInvalidTypeVariables = 0; this.validateVariableTypesWasRun = false; this.selectedTypeResponses.clear(); - this.backendService.validateVariableTypes( + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( this.appService.selectedWorkspaceId, + 'variableTypes', this.currentTypeVariablePage, this.typeVariablePageSize - ).subscribe(result => { - this.invalidTypeVariables = result.data; - this.totalInvalidTypeVariables = result.total; - this.currentTypeVariablePage = result.page; - this.typeVariablePageSize = result.limit; - this.updatePaginatedTypeVariables(); - this.isVariableTypeValidationRunning = false; - this.validateVariableTypesWasRun = true; + ).subscribe(task => { + this.variableTypeValidationTask = task; + + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // Update progress if available + if (updatedTask.progress) { + // Could show progress here if needed + } + + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result as a PaginatedResponse + const typedResult = result as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + // Check if the result indicates errors + const hasErrors = typedResult.total > 0; + + // Create a validation result with the appropriate status + const validationResult: ValidationResult = { + status: hasErrors ? 'failed' : 'success', + timestamp: Date.now(), + details: { + total: typedResult.total, + hasErrors: hasErrors + } + }; + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult( + this.appService.selectedWorkspaceId, + 'variableTypes', + validationResult + ); + + this.invalidTypeVariables = typedResult.data; + this.totalInvalidTypeVariables = typedResult.total; + this.currentTypeVariablePage = typedResult.page; + this.typeVariablePageSize = typedResult.limit; + this.updatePaginatedTypeVariables(); + this.isVariableTypeValidationRunning = false; + this.validateVariableTypesWasRun = true; + + // Save the validation result to the service + this.saveValidationResult('variableTypes'); + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isVariableTypeValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isVariableTypeValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); }); + + this.subscriptions.push(subscription); } validateResponseStatus(): void { @@ -400,31 +1469,221 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.totalInvalidStatusVariables = 0; this.validateResponseStatusWasRun = false; this.selectedStatusResponses.clear(); - this.backendService.validateResponseStatus( + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( this.appService.selectedWorkspaceId, + 'responseStatus', this.currentStatusVariablePage, this.statusVariablePageSize - ).subscribe(result => { - this.invalidStatusVariables = result.data; - this.totalInvalidStatusVariables = result.total; - this.currentStatusVariablePage = result.page; - this.statusVariablePageSize = result.limit; - this.updatePaginatedStatusVariables(); - this.isResponseStatusValidationRunning = false; - this.validateResponseStatusWasRun = true; + ).subscribe(task => { + this.responseStatusValidationTask = task; + + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // Update progress if available + if (updatedTask.progress) { + // Could show progress here if needed + } + + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result as a PaginatedResponse + const typedResult = result as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + // Check if the result indicates errors + const hasErrors = typedResult.total > 0; + + // Create a validation result with the appropriate status + const validationResult: ValidationResult = { + status: hasErrors ? 'failed' : 'success', + timestamp: Date.now(), + details: { + total: typedResult.total, + hasErrors: hasErrors + } + }; + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult( + this.appService.selectedWorkspaceId, + 'responseStatus', + validationResult + ); + + this.invalidStatusVariables = typedResult.data; + this.totalInvalidStatusVariables = typedResult.total; + this.currentStatusVariablePage = typedResult.page; + this.statusVariablePageSize = typedResult.limit; + this.updatePaginatedStatusVariables(); + this.isResponseStatusValidationRunning = false; + this.validateResponseStatusWasRun = true; + + // Save the validation result to the service + this.saveValidationResult('responseStatus'); + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isResponseStatusValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isResponseStatusValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); }); + + this.subscriptions.push(subscription); } onTypeVariablePageChange(event: PageEvent): void { this.currentTypeVariablePage = event.pageIndex + 1; this.typeVariablePageSize = event.pageSize; - this.validateVariableTypes(); + + // Reload data from server with new pagination parameters using background task + this.isVariableTypeValidationRunning = true; + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'variableTypes', + this.currentTypeVariablePage, + this.typeVariablePageSize + ).subscribe(task => { + this.variableTypeValidationTask = task; + + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result as a PaginatedResponse + const typedResult = result as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + this.invalidTypeVariables = typedResult.data; + this.totalInvalidTypeVariables = typedResult.total; + this.currentTypeVariablePage = typedResult.page; + this.typeVariablePageSize = typedResult.limit; + this.updatePaginatedTypeVariables(); + this.isVariableTypeValidationRunning = false; + this.validateVariableTypesWasRun = true; + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isVariableTypeValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isVariableTypeValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); } onStatusVariablePageChange(event: PageEvent): void { this.currentStatusVariablePage = event.pageIndex + 1; this.statusVariablePageSize = event.pageSize; - this.validateResponseStatus(); + + // Reload data from server with new pagination parameters using background task + this.isResponseStatusValidationRunning = true; + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'responseStatus', + this.currentStatusVariablePage, + this.statusVariablePageSize + ).subscribe(task => { + this.responseStatusValidationTask = task; + + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result as a PaginatedResponse + const typedResult = result as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + this.invalidStatusVariables = typedResult.data; + this.totalInvalidStatusVariables = typedResult.total; + this.currentStatusVariablePage = typedResult.page; + this.statusVariablePageSize = typedResult.limit; + this.updatePaginatedStatusVariables(); + this.isResponseStatusValidationRunning = false; + this.validateResponseStatusWasRun = true; + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isResponseStatusValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isResponseStatusValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); } toggleTypeResponseSelection(responseId: number | undefined): void { @@ -462,14 +1721,103 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.isDeletingResponses = true; const responseIds = Array.from(this.selectedTypeResponses); - this.backendService.deleteInvalidResponses(this.appService.selectedWorkspaceId, responseIds) - .subscribe(deletedCount => { - this.isDeletingResponses = false; - this.snackBar.open(`${deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; - this.validateVariableTypes(); - this.selectedTypeResponses.clear(); + // Create a background deletion task + const subscription = this.backendService.createDeleteResponsesTask( + this.appService.selectedWorkspaceId, + responseIds + ).subscribe(task => { + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + const typedResult = result as { deletedCount: number }; + this.isDeletingResponses = false; + this.snackBar.open(`${typedResult.deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); + + // Start background validation task to refresh the data + this.isVariableTypeValidationRunning = true; + + // Create a background validation task + const validationSubscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'variableTypes', + this.currentTypeVariablePage, + this.typeVariablePageSize + ).subscribe(validationTask => { + this.variableTypeValidationTask = validationTask; + + // Poll for validation task completion + const validationPollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + validationTask.id + ).subscribe({ + next: updatedValidationTask => { + // If task is completed, get the results + if (updatedValidationTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedValidationTask.id + ).subscribe(validationResult => { + // Type the result as a PaginatedResponse + const typedValidationResult = validationResult as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + this.invalidTypeVariables = typedValidationResult.data; + this.totalInvalidTypeVariables = typedValidationResult.total; + this.currentTypeVariablePage = typedValidationResult.page; + this.typeVariablePageSize = typedValidationResult.limit; + this.updatePaginatedTypeVariables(); + this.isVariableTypeValidationRunning = false; + this.validateVariableTypesWasRun = true; + }); + } else if (updatedValidationTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedValidationTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isVariableTypeValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isVariableTypeValidationRunning = false; + } + }); + + this.subscriptions.push(validationPollSubscription); + }); + + this.subscriptions.push(validationSubscription); + }); + } else if (updatedTask.status === 'failed') { + this.isDeletingResponses = false; + this.snackBar.open(`Löschen fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + } + }, + error: () => { + this.isDeletingResponses = false; + this.snackBar.open('Fehler beim Abrufen des Löschstatus', 'Schließen', { duration: 5000 }); + } }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); + this.selectedTypeResponses.clear(); } deleteAllTypeResponses(): void { @@ -493,14 +1841,102 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { if (deleteFromDb) { this.isDeletingResponses = true; - this.backendService.deleteAllInvalidResponses(this.appService.selectedWorkspaceId, 'variableTypes') - .subscribe(deletedCount => { - this.isDeletingResponses = false; - this.snackBar.open(`${deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); - - this.validateVariableTypes(); - this.selectedTypeResponses.clear(); + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background deletion task + const subscription = this.backendService.createDeleteAllResponsesTask( + this.appService.selectedWorkspaceId, + 'variableTypes' + ).subscribe(task => { + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + const typedResult = result as { deletedCount: number }; + this.isDeletingResponses = false; + this.snackBar.open(`${typedResult.deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); + + // Start background validation task to refresh the data + this.isVariableTypeValidationRunning = true; + + // Create a background validation task + const validationSubscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'variableTypes', + this.currentTypeVariablePage, + this.typeVariablePageSize + ).subscribe(validationTask => { + this.variableTypeValidationTask = validationTask; + + // Poll for validation task completion + const validationPollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + validationTask.id + ).subscribe({ + next: updatedValidationTask => { + // If task is completed, get the results + if (updatedValidationTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedValidationTask.id + ).subscribe(validationResult => { + // Type the result as a PaginatedResponse + const typedValidationResult = validationResult as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + this.invalidTypeVariables = typedValidationResult.data; + this.totalInvalidTypeVariables = typedValidationResult.total; + this.currentTypeVariablePage = typedValidationResult.page; + this.typeVariablePageSize = typedValidationResult.limit; + this.updatePaginatedTypeVariables(); + this.isVariableTypeValidationRunning = false; + this.validateVariableTypesWasRun = true; + }); + } else if (updatedValidationTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedValidationTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isVariableTypeValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isVariableTypeValidationRunning = false; + } + }); + + this.subscriptions.push(validationPollSubscription); + }); + + this.subscriptions.push(validationSubscription); + }); + } else if (updatedTask.status === 'failed') { + this.isDeletingResponses = false; + this.snackBar.open(`Löschen fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + } + }, + error: () => { + this.isDeletingResponses = false; + this.snackBar.open('Fehler beim Abrufen des Löschstatus', 'Schließen', { duration: 5000 }); + } }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); } }); } @@ -544,14 +1980,103 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.isDeletingResponses = true; const responseIds = Array.from(this.selectedStatusResponses); - this.backendService.deleteInvalidResponses(this.appService.selectedWorkspaceId, responseIds) - .subscribe(deletedCount => { - this.isDeletingResponses = false; - this.snackBar.open(`${deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; - this.validateResponseStatus(); - this.selectedStatusResponses.clear(); + // Create a background deletion task + const subscription = this.backendService.createDeleteResponsesTask( + this.appService.selectedWorkspaceId, + responseIds + ).subscribe(task => { + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + const typedResult = result as { deletedCount: number }; + this.isDeletingResponses = false; + this.snackBar.open(`${typedResult.deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); + + // Start background validation task to refresh the data + this.isResponseStatusValidationRunning = true; + + // Create a background validation task + const validationSubscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'responseStatus', + this.currentStatusVariablePage, + this.statusVariablePageSize + ).subscribe(validationTask => { + this.responseStatusValidationTask = validationTask; + + // Poll for validation task completion + const validationPollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + validationTask.id + ).subscribe({ + next: updatedValidationTask => { + // If task is completed, get the results + if (updatedValidationTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedValidationTask.id + ).subscribe(validationResult => { + // Type the result as a PaginatedResponse + const typedValidationResult = validationResult as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + this.invalidStatusVariables = typedValidationResult.data; + this.totalInvalidStatusVariables = typedValidationResult.total; + this.currentStatusVariablePage = typedValidationResult.page; + this.statusVariablePageSize = typedValidationResult.limit; + this.updatePaginatedStatusVariables(); + this.isResponseStatusValidationRunning = false; + this.validateResponseStatusWasRun = true; + }); + } else if (updatedValidationTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedValidationTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isResponseStatusValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isResponseStatusValidationRunning = false; + } + }); + + this.subscriptions.push(validationPollSubscription); + }); + + this.subscriptions.push(validationSubscription); + }); + } else if (updatedTask.status === 'failed') { + this.isDeletingResponses = false; + this.snackBar.open(`Löschen fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + } + }, + error: () => { + this.isDeletingResponses = false; + this.snackBar.open('Fehler beim Abrufen des Löschstatus', 'Schließen', { duration: 5000 }); + } }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); + this.selectedStatusResponses.clear(); } deleteAllStatusResponses(): void { @@ -575,13 +2100,103 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { if (deleteFromDb) { this.isDeletingResponses = true; - this.backendService.deleteAllInvalidResponses(this.appService.selectedWorkspaceId, 'responseStatus') - .subscribe(deletedCount => { - this.isDeletingResponses = false; - this.snackBar.open(`${deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); - this.validateResponseStatus(); - this.selectedStatusResponses.clear(); + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background deletion task + const subscription = this.backendService.createDeleteAllResponsesTask( + this.appService.selectedWorkspaceId, + 'responseStatus' + ).subscribe(task => { + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + const typedResult = result as { deletedCount: number }; + this.isDeletingResponses = false; + this.snackBar.open(`${typedResult.deletedCount} Antworten gelöscht`, 'Schließen', { duration: 3000 }); + + // Start background validation task to refresh the data + this.isResponseStatusValidationRunning = true; + + // Create a background validation task + const validationSubscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'responseStatus', + this.currentStatusVariablePage, + this.statusVariablePageSize + ).subscribe(validationTask => { + this.responseStatusValidationTask = validationTask; + + // Poll for validation task completion + const validationPollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + validationTask.id + ).subscribe({ + next: updatedValidationTask => { + // If task is completed, get the results + if (updatedValidationTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedValidationTask.id + ).subscribe(validationResult => { + // Type the result as a PaginatedResponse + const typedValidationResult = validationResult as { + data: InvalidVariableDto[]; + total: number; + page: number; + limit: number; + }; + + this.invalidStatusVariables = typedValidationResult.data; + this.totalInvalidStatusVariables = typedValidationResult.total; + this.currentStatusVariablePage = typedValidationResult.page; + this.statusVariablePageSize = typedValidationResult.limit; + this.updatePaginatedStatusVariables(); + this.isResponseStatusValidationRunning = false; + this.validateResponseStatusWasRun = true; + }); + } else if (updatedValidationTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedValidationTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isResponseStatusValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isResponseStatusValidationRunning = false; + } + }); + + this.subscriptions.push(validationPollSubscription); + }); + + this.subscriptions.push(validationSubscription); + this.selectedStatusResponses.clear(); + }); + } else if (updatedTask.status === 'failed') { + this.isDeletingResponses = false; + this.snackBar.open(`Löschen fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + } + }, + error: () => { + this.isDeletingResponses = false; + this.snackBar.open('Fehler beim Abrufen des Löschstatus', 'Schließen', { duration: 5000 }); + } }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); } }); } @@ -590,7 +2205,434 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit { this.expandedStatusPanel = !this.expandedStatusPanel; } + isAnyValidationRunning(): boolean { + return this.isVariableValidationRunning || + this.isVariableTypeValidationRunning || + this.isResponseStatusValidationRunning || + this.isTestTakersValidationRunning || + this.isGroupResponsesValidationRunning; + } + + hasValidationFailed(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): boolean { + switch (type) { + case 'variables': + return this.validateVariablesWasRun && this.totalInvalidVariables > 0; + case 'variableTypes': + return this.validateVariableTypesWasRun && this.totalInvalidTypeVariables > 0; + case 'responseStatus': + return this.validateResponseStatusWasRun && this.totalInvalidStatusVariables > 0; + case 'testTakers': + return this.testTakersValidationWasRun && + this.testTakersValidationResult !== null && + ( + !this.testTakersValidationResult.testTakersFound || + this.testTakersValidationResult.missingPersons.length > 0 + ); + case 'groupResponses': + return this.groupResponsesValidationWasRun && + this.groupResponsesResult !== null && + ( + !this.groupResponsesResult.testTakersFound || + !this.groupResponsesResult.allGroupsHaveResponses + ); + default: + return false; + } + } + + hasValidationSucceeded(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): boolean { + switch (type) { + case 'variables': + return this.validateVariablesWasRun && this.totalInvalidVariables === 0; + case 'variableTypes': + return this.validateVariableTypesWasRun && this.totalInvalidTypeVariables === 0; + case 'responseStatus': + return this.validateResponseStatusWasRun && this.totalInvalidStatusVariables === 0; + case 'testTakers': + return this.testTakersValidationWasRun && + this.testTakersValidationResult !== null && + this.testTakersValidationResult.testTakersFound && + this.testTakersValidationResult.missingPersons.length === 0; + case 'groupResponses': + return this.groupResponsesValidationWasRun && + this.groupResponsesResult !== null && + this.groupResponsesResult.testTakersFound && + this.groupResponsesResult.allGroupsHaveResponses; + default: + return false; + } + } + + getValidationStatus(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): 'running' | 'failed' | 'success' | 'not-run' { + switch (type) { + case 'variables': + if (this.isVariableValidationRunning) return 'running'; + if (this.hasValidationFailed('variables')) return 'failed'; + if (this.hasValidationSucceeded('variables')) return 'success'; + return 'not-run'; + case 'variableTypes': + if (this.isVariableTypeValidationRunning) return 'running'; + if (this.hasValidationFailed('variableTypes')) return 'failed'; + if (this.hasValidationSucceeded('variableTypes')) return 'success'; + return 'not-run'; + case 'responseStatus': + if (this.isResponseStatusValidationRunning) return 'running'; + if (this.hasValidationFailed('responseStatus')) return 'failed'; + if (this.hasValidationSucceeded('responseStatus')) return 'success'; + return 'not-run'; + case 'testTakers': + if (this.isTestTakersValidationRunning) return 'running'; + if (this.hasValidationFailed('testTakers')) return 'failed'; + if (this.hasValidationSucceeded('testTakers')) return 'success'; + return 'not-run'; + case 'groupResponses': + if (this.isGroupResponsesValidationRunning) return 'running'; + if (this.hasValidationFailed('groupResponses')) return 'failed'; + if (this.hasValidationSucceeded('groupResponses')) return 'success'; + return 'not-run'; + default: + return 'not-run'; + } + } + + getValidationLabel(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): string { + switch (type) { + case 'variables': + return 'Variable definiert'; + case 'variableTypes': + return 'Variable ist gültig'; + case 'responseStatus': + return 'Status ist gültig'; + case 'testTakers': + return 'Testperson definiert'; + case 'groupResponses': + return 'Antworten für alle Gruppen'; + default: + return ''; + } + } + + private saveValidationResult(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): void { + const workspaceId = this.appService.selectedWorkspaceId; + const status = this.getValidationStatus(type); + + // Only save completed results (success or failed) + if (status === 'success' || status === 'failed') { + // Create validation result object + const validationResult = { + status: status as 'success' | 'failed', + timestamp: Date.now(), + details: this.getValidationDetails(type) + }; + + // Save to service + this.validationTaskStateService.setValidationResult(workspaceId, type, validationResult); + } + } + + private getValidationDetails(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): unknown { + switch (type) { + case 'variables': + return { + total: this.totalInvalidVariables, + hasErrors: this.totalInvalidVariables > 0 + }; + case 'variableTypes': + return { + total: this.totalInvalidTypeVariables, + hasErrors: this.totalInvalidTypeVariables > 0 + }; + case 'responseStatus': + return { + total: this.totalInvalidStatusVariables, + hasErrors: this.totalInvalidStatusVariables > 0 + }; + case 'testTakers': + if (!this.testTakersValidationResult) return { hasErrors: false }; + return { + testTakersFound: this.testTakersValidationResult.testTakersFound, + missingPersonsCount: this.testTakersValidationResult.missingPersons.length, + hasErrors: !this.testTakersValidationResult.testTakersFound || + this.testTakersValidationResult.missingPersons.length > 0 + }; + case 'groupResponses': + if (!this.groupResponsesResult) return { hasErrors: false }; + return { + testTakersFound: this.groupResponsesResult.testTakersFound, + allGroupsHaveResponses: this.groupResponsesResult.allGroupsHaveResponses, + hasErrors: !this.groupResponsesResult.testTakersFound || + !this.groupResponsesResult.allGroupsHaveResponses + }; + default: + return {}; + } + } + + private loadPreviousValidationResults(): void { + const workspaceId = this.appService.selectedWorkspaceId; + + // First load any in-memory results + const inMemoryResults = this.validationTaskStateService.getAllValidationResults(workspaceId); + + // Process each type of in-memory validation result + // Pass false for fromCurrentSession since these are from previous sessions + if (inMemoryResults.variables) { + this.processVariablesResult(inMemoryResults.variables, false); + } + + if (inMemoryResults.variableTypes) { + this.processVariableTypesResult(inMemoryResults.variableTypes, false); + } + + if (inMemoryResults.responseStatus) { + this.processResponseStatusResult(inMemoryResults.responseStatus, false); + } + + if (inMemoryResults.testTakers) { + this.processTestTakersResult(inMemoryResults.testTakers, false); + } + + if (inMemoryResults.groupResponses) { + this.processGroupResponsesResult(inMemoryResults.groupResponses, false); + } + + // Then fetch and process the last validation results from the backend + const subscription = this.validationService.getLastValidationResults(workspaceId) + .subscribe({ + next: results => { + // Process each type of validation result from the backend + if (results.variables) { + const { task, result } = results.variables; + let status: 'success' | 'failed' | 'not-run' = 'not-run'; + if (task.status === 'completed') { + status = task.error ? 'failed' : 'success'; + } + const validationResult: ValidationResult = { + status, + timestamp: new Date(task.created_at).getTime(), + details: result + }; + this.processVariablesResult(validationResult, false); + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult(workspaceId, 'variables', validationResult); + } + + if (results.variableTypes) { + const { task, result } = results.variableTypes; + let status: 'success' | 'failed' | 'not-run' = 'not-run'; + if (task.status === 'completed') { + status = task.error ? 'failed' : 'success'; + } + const validationResult: ValidationResult = { + status, + timestamp: new Date(task.created_at).getTime(), + details: result + }; + this.processVariableTypesResult(validationResult, false); + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult(workspaceId, 'variableTypes', validationResult); + } + + if (results.responseStatus) { + const { task, result } = results.responseStatus; + let status: 'success' | 'failed' | 'not-run' = 'not-run'; + if (task.status === 'completed') { + status = task.error ? 'failed' : 'success'; + } + const validationResult: ValidationResult = { + status, + timestamp: new Date(task.created_at).getTime(), + details: result + }; + this.processResponseStatusResult(validationResult, false); + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult(workspaceId, 'responseStatus', validationResult); + } + + if (results.testTakers) { + const { task, result } = results.testTakers; + let status: 'success' | 'failed' | 'not-run' = 'not-run'; + if (task.status === 'completed') { + status = task.error ? 'failed' : 'success'; + } + const validationResult: ValidationResult = { + status, + timestamp: new Date(task.created_at).getTime(), + details: result + }; + this.processTestTakersResult(validationResult, false); + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult(workspaceId, 'testTakers', validationResult); + } + + if (results.groupResponses) { + const { task, result } = results.groupResponses; + let status: 'success' | 'failed' | 'not-run' = 'not-run'; + if (task.status === 'completed') { + status = task.error ? 'failed' : 'success'; + } + const validationResult: ValidationResult = { + status, + timestamp: new Date(task.created_at).getTime(), + details: result + }; + this.processGroupResponsesResult(validationResult, false); + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult(workspaceId, 'groupResponses', validationResult); + } + }, + error: error => { + console.error('Error loading previous validation results:', error); + } + }); + + this.subscriptions.push(subscription); + } + + private processVariablesResult(result: ValidationResult, fromCurrentSession: boolean = false): void { + if (result.status === 'success') { + // Only set validateVariablesWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.validateVariablesWasRun = true; + } + this.totalInvalidVariables = 0; + this.invalidVariables = []; + this.updatePaginatedVariables(); + } else if (result.status === 'failed' && result.details) { + // Only set validateVariablesWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.validateVariablesWasRun = true; + } + const details = result.details as { total: number; hasErrors: boolean }; + this.totalInvalidVariables = details.total; + + // If we have details but no data, we need to fetch the data + if (details.total > 0 && this.invalidVariables.length === 0) { + this.validateVariables(); + } + } + } + + private processVariableTypesResult(result: ValidationResult, fromCurrentSession: boolean = false): void { + if (result.status === 'success') { + // Only set validateVariableTypesWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.validateVariableTypesWasRun = true; + } + this.totalInvalidTypeVariables = 0; + this.invalidTypeVariables = []; + this.updatePaginatedTypeVariables(); + } else if (result.status === 'failed' && result.details) { + // Only set validateVariableTypesWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.validateVariableTypesWasRun = true; + } + const details = result.details as { total: number; hasErrors: boolean }; + this.totalInvalidTypeVariables = details.total; + + // If we have details but no data, we need to fetch the data + if (details.total > 0 && this.invalidTypeVariables.length === 0) { + this.validateVariableTypes(); + } + } + } + + private processResponseStatusResult(result: ValidationResult, fromCurrentSession: boolean = false): void { + if (result.status === 'success') { + // Only set validateResponseStatusWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.validateResponseStatusWasRun = true; + } + this.totalInvalidStatusVariables = 0; + this.invalidStatusVariables = []; + this.updatePaginatedStatusVariables(); + } else if (result.status === 'failed' && result.details) { + // Only set validateResponseStatusWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.validateResponseStatusWasRun = true; + } + const details = result.details as { total: number; hasErrors: boolean }; + this.totalInvalidStatusVariables = details.total; + + // If we have details but no data, we need to fetch the data + if (details.total > 0 && this.invalidStatusVariables.length === 0) { + this.validateResponseStatus(); + } + } + } + + private processTestTakersResult(result: ValidationResult, fromCurrentSession: boolean = false): void { + if (result.status === 'success') { + // Only set testTakersValidationWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.testTakersValidationWasRun = true; + } + this.testTakersValidationResult = { + testTakersFound: true, + totalGroups: 0, + totalLogins: 0, + totalBookletCodes: 0, + missingPersons: [] + }; + this.updatePaginatedMissingPersons(); + } else if (result.status === 'failed' && result.details) { + // Only set testTakersValidationWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.testTakersValidationWasRun = true; + } + const details = result.details as { + testTakersFound: boolean; + missingPersonsCount: number; + hasErrors: boolean + }; + + // If we have details but no data, we need to fetch the data + if (details.hasErrors && (!this.testTakersValidationResult || this.testTakersValidationResult.missingPersons.length === 0)) { + this.validateTestTakers(); + } + } + } + + private processGroupResponsesResult(result: ValidationResult, fromCurrentSession: boolean = false): void { + if (result.status === 'success') { + // Only set groupResponsesValidationWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.groupResponsesValidationWasRun = true; + } + this.groupResponsesResult = { + testTakersFound: true, + groupsWithResponses: [], + allGroupsHaveResponses: true + }; + this.updatePaginatedGroupResponses(); + } else if (result.status === 'failed' && result.details) { + // Only set groupResponsesValidationWasRun to true if the result is from the current session + if (fromCurrentSession) { + this.groupResponsesValidationWasRun = true; + } + const details = result.details as { + testTakersFound: boolean; + allGroupsHaveResponses: boolean; + hasErrors: boolean + }; + + // If we have details but no data, we need to fetch the data + if (details.hasErrors && (!this.groupResponsesResult || this.groupResponsesResult.groupsWithResponses.length === 0)) { + this.validateGroupResponses(); + } + } + } + closeWithResults(): void { + this.isClosing = true; + + this.storeRunningTasks(); + this.dialogRef.close({ invalidVariables: this.invalidVariables, totalInvalidVariables: this.totalInvalidVariables, diff --git a/database/changelog/coding-box.changelog-0.9.2.sql b/database/changelog/coding-box.changelog-0.9.2.sql new file mode 100644 index 000000000..26eb748f8 --- /dev/null +++ b/database/changelog/coding-box.changelog-0.9.2.sql @@ -0,0 +1,18 @@ +-- liquibase formatted sql + +-- changeset jurei733:1 +ALTER TABLE "public"."job" ADD COLUMN "validation_type" VARCHAR(50); +ALTER TABLE "public"."job" ADD COLUMN "page" INTEGER; +ALTER TABLE "public"."job" ADD COLUMN "limit" INTEGER; + +CREATE INDEX "idx_job_validation_type" ON "public"."job" ("validation_type"); + +-- rollback ALTER TABLE "public"."job" DROP COLUMN "validation_type"; ALTER TABLE "public"."job" DROP COLUMN "page"; ALTER TABLE "public"."job" DROP COLUMN "limit"; DROP INDEX IF EXISTS "idx_job_validation_type"; + +-- changeset jurei733:2 +CREATE INDEX idx_responses_unitid ON response(unitid); +CREATE INDEX idx_responses_variableid ON response(variableid); +CREATE INDEX idx_responses_codedstatus ON response(codedstatus); + +-- rollback DROP INDEX IF EXISTS idx_responses_unitid; DROP INDEX IF EXISTS idx_responses_variableid; DROP INDEX IF EXISTS idx_responses_codedstatus; + diff --git a/database/changelog/coding-box.changelog-root.xml b/database/changelog/coding-box.changelog-root.xml index 94b76ef44..c71cc69ef 100644 --- a/database/changelog/coding-box.changelog-root.xml +++ b/database/changelog/coding-box.changelog-root.xml @@ -16,4 +16,5 @@ + From e867a63702dbee12f5cd32207cf32e3f91fc6ac6 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:01:15 +0200 Subject: [PATCH 03/21] Fix scrolling in files validation --- .../files-validation.component.scss | 30 ++++++++++++------- .../files-validation.component.ts | 12 -------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss index 9fecd9469..dd977096d 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss @@ -1,4 +1,3 @@ -// Dialog styles mat-dialog-title { font-size: 1.8em; font-weight: 600; @@ -13,9 +12,6 @@ mat-dialog-content { padding: 0; } - - -// Container styles .scroll-container { max-height: 600px; overflow-y: auto; @@ -47,7 +43,6 @@ mat-dialog-content { to { opacity: 1; } } -// Test taker section h4 { font-size: 20px; font-weight: 600; @@ -73,14 +68,12 @@ h4 { } } -// Validation container .validation-container { display: flex; flex-direction: column; gap: 16px; } -// Validation card styles .validation-card { background-color: white; border-radius: 12px; @@ -151,7 +144,6 @@ h4 { } } - // Complete status .status-complete { color: #2e7d32; background-color: rgba(46, 125, 50, 0.1); @@ -162,7 +154,6 @@ h4 { } } - // Incomplete status .status-incomplete { color: #d32f2f; background-color: rgba(211, 47, 47, 0.1); @@ -281,9 +272,28 @@ h4 { transition: all 0.3s ease-in-out; &.expanded { - max-height: 500px; // Large enough to accommodate most file lists + max-height: 400px; opacity: 1; padding: 16px; + overflow-y: auto; + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb { + background: #c1d5e8; + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb:hover { + background: #a3c0e0; + } } ul { diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts index 1090c7699..1b5f85531 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts @@ -31,7 +31,6 @@ type FilesValidation = { player: DataValidation; }; -// Interface to track expanded state of file lists interface ExpandedFilesLists { booklets: boolean; units: boolean; @@ -74,11 +73,6 @@ export class FilesValidationDialogComponent { } } - /** - * Toggle the expanded state of a file list - * @param testTaker The test taker identifier - * @param section The section to toggle - */ toggleFilesList(testTaker: string, section: keyof ExpandedFilesLists): void { const sections = this.expandedFilesLists.get(testTaker); if (sections) { @@ -86,12 +80,6 @@ export class FilesValidationDialogComponent { } } - /** - * Check if a file list is expanded - * @param testTaker The test taker identifier - * @param section The section to check - * @returns True if the file list is expanded, false otherwise - */ isFilesListExpanded(testTaker: string, section: keyof ExpandedFilesLists): boolean { const sections = this.expandedFilesLists.get(testTaker); return sections ? sections[section] : false; From ecfbe16ab349ec55395c8f9a83d5d5b403e670c2 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:52:24 +0200 Subject: [PATCH 04/21] Check files that each unit is used minimum once in a booklet --- .../services/workspace-files.service.ts | 47 +++++++++++++------ .../files-validation.component.html | 26 ++++++++-- .../files-validation.component.scss | 46 +++++++++++++++++- .../files-validation.component.ts | 1 + 4 files changed, 100 insertions(+), 20 deletions(-) diff --git a/apps/backend/src/app/database/services/workspace-files.service.ts b/apps/backend/src/app/database/services/workspace-files.service.ts index fffcbd0da..be02dc0ae 100644 --- a/apps/backend/src/app/database/services/workspace-files.service.ts +++ b/apps/backend/src/app/database/services/workspace-files.service.ts @@ -39,6 +39,7 @@ type FileStatus = { type DataValidation = { complete: boolean; missing: string[]; + unused?: string[]; files: FileStatus[]; }; @@ -55,6 +56,8 @@ export type ValidationResult = { allUnitsExist: boolean; missingUnits: string[]; unitFiles: FileStatus[]; + allUnitsUsedInBooklets: boolean; + unusedUnits: string[]; allCodingSchemesExist: boolean; allCodingDefinitionsExist: boolean; missingCodingSchemeRefs: string[]; @@ -224,7 +227,12 @@ export class WorkspaceFilesService { return [{ testTaker: '', booklets: { complete: false, missing: [], files: [] }, - units: { complete: false, missing: [], files: [] }, + units: { + complete: false, + missing: [], + unused: [], + files: [] + }, schemes: { complete: false, missing: [], files: [] }, definitions: { complete: false, missing: [], files: [] }, player: { complete: false, missing: [], files: [] } @@ -252,6 +260,7 @@ export class WorkspaceFilesService { allUnitsExist, missingUnits, unitFiles, + unusedUnits, missingCodingSchemeRefs, missingDefinitionRefs, schemeFiles, @@ -277,8 +286,9 @@ export class WorkspaceFilesService { files: bookletFiles }, units: { - complete: bookletComplete ? allUnitsExist : false, + complete: bookletComplete ? (allUnitsExist) : false, missing: missingUnits, + unused: unusedUnits, files: unitFiles }, schemes: { @@ -687,6 +697,18 @@ export class WorkspaceFilesService { const allUnitIdsArrays = await Promise.all(unitIdsPromises); const allUnitIds = Array.from(new Set(allUnitIdsArrays.flat())); + + const allUnitsInWorkspace = await this.fileUploadRepository.findBy({ + file_type: 'Unit', + workspace_id: existingBooklets.length > 0 ? existingBooklets[0].workspace_id : null + }); + + const unusedUnits = allUnitsInWorkspace + .filter(unit => !allUnitIds.includes(unit.file_id.toUpperCase())) + .map(unit => unit.file_id); + + const allUnitsUsedInBooklets = unusedUnits.length === 0; + const chunkSize = 50; const unitBatches = []; @@ -696,7 +718,10 @@ export class WorkspaceFilesService { } const unitBatchPromises = unitBatches.map(batch => this.fileUploadRepository.find({ - where: { file_id: In(batch) } + where: { + file_id: In(batch), + workspace_id: existingBooklets.length > 0 ? existingBooklets[0].workspace_id : null + } })); const unitBatchResults = await Promise.all(unitBatchPromises); @@ -745,9 +770,10 @@ export class WorkspaceFilesService { const allDefinitionRefs = Array.from(new Set(allRefs.flatMap(ref => ref.definitionRefs))); const allPlayerRefs = Array.from(new Set(allRefs.flatMap(ref => ref.playerRefs))); - // Get all resources in a single query + // Get all resources in the current workspace const existingResources = await this.fileUploadRepository.findBy({ - file_type: 'Resource' + file_type: 'Resource', + workspace_id: existingBooklets.length > 0 ? existingBooklets[0].workspace_id : null }); const allResourceIds = existingResources.map(resource => resource.file_id); @@ -794,6 +820,8 @@ export class WorkspaceFilesService { allUnitsExist, missingUnits: uniqueUnits, unitFiles, + allUnitsUsedInBooklets, + unusedUnits, allCodingSchemesExist, allCodingDefinitionsExist, missingCodingSchemeRefs, @@ -1770,13 +1798,11 @@ export class WorkspaceFilesService { } if (allUnits.length === 0) { - // No units found for persons in this group groupsWithResponses.push({ group, hasResponse: false }); allGroupsHaveResponses = false; continue; } - // Get all unit IDs const unitIds = allUnits.map(unit => unit.id); if (unitIds.length === 0) { @@ -1841,7 +1867,6 @@ export class WorkspaceFilesService { this.logger.log(`Deleting invalid responses for workspace ${workspaceId}: ${responseIds.join(', ')}`); - // Verify that the responses belong to units that belong to persons in the workspace const persons = await this.personsRepository.find({ where: { workspace_id: workspaceId } }); @@ -1851,10 +1876,8 @@ export class WorkspaceFilesService { return 0; } - // Get all person IDs const personIds = persons.map(person => person.id); - // Check if personIds array is empty if (personIds.length === 0) { this.logger.warn(`No person IDs found for workspace ${workspaceId}`); return 0; @@ -1894,7 +1917,6 @@ export class WorkspaceFilesService { for (let j = 0; j < unitIds.length; j += batchSize) { const unitIdsBatch = unitIds.slice(j, j + batchSize); - // Delete responses that match the given IDs and belong to the units in the workspace const deleteResult = await this.responseRepository.delete({ id: In(responseIdsBatch), unitid: In(unitIdsBatch) @@ -1921,7 +1943,6 @@ export class WorkspaceFilesService { this.logger.log(`Deleting all invalid responses for workspace ${workspaceId} of type ${validationType}`); - // Get all invalid responses based on the validation type let invalidResponses: InvalidVariableDto[] = []; if (validationType === 'variables') { @@ -1940,7 +1961,6 @@ export class WorkspaceFilesService { return 0; } - // Extract response IDs const responseIds = invalidResponses .filter(variable => variable.responseId !== undefined) .map(variable => variable.responseId as number); @@ -1950,7 +1970,6 @@ export class WorkspaceFilesService { return 0; } - // Delete the invalid responses return await this.deleteInvalidResponses(workspaceId, responseIds); } catch (error) { this.logger.error(`Error deleting all invalid responses: ${error.message}`, error.stack); diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html index 7186494d9..ee294ac22 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html @@ -68,19 +68,35 @@

}

- @if (!val.units.complete) { -
+ @if (val.units.unused && val.units.unused.length > 0) { +

- warning - Fehlende Dateien: + warning + Nicht verwendete Units:

    - @for (item of val.units.missing; track item) { + @for (item of val.units.unused; track item) {
  • {{ item }}
  • }
} + @if (!val.units.complete) { + @if (val.units.missing && val.units.missing.length > 0) { +
+

+ warning + Fehlende Dateien: +

+
    + @for (item of val.units.missing; track item) { +
  • {{ item }}
  • + } +
+
+ } + + }

list diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss index dd977096d..9c95587b0 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss @@ -215,7 +215,51 @@ h4 { } } - // Files list container and header styles + .unused-items { + background-color: #fff8e1; + border-radius: 8px; + padding: 16px; + margin-top: 12px; + border: 1px solid rgba(245, 124, 0, 0.1); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04); + transition: all 0.2s ease; + + p { + font-weight: 600; + color: #555; + margin-bottom: 12px; + display: flex; + align-items: center; + + .unused-icon { + color: #f57c00; + margin-right: 8px; + font-size: 20px; + height: 20px; + width: 20px; + } + } + + ul { + margin: 0; + padding-left: 28px; + + li { + font-size: 14px; + color: #666; + margin-bottom: 8px; + line-height: 1.5; + padding: 4px 0; + border-bottom: 1px dashed rgba(245, 124, 0, 0.1); + + &:last-child { + margin-bottom: 0; + border-bottom: none; + } + } + } + } + .files-list-container { margin-top: 12px; diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts index 1b5f85531..2456a3a47 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts @@ -19,6 +19,7 @@ type FileStatus = { type DataValidation = { complete: boolean; missing: string[]; + unused?: string[]; files: FileStatus[]; }; From 3a322ea2df52b5927c6436c623b16999dbe23792 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 16:08:57 +0200 Subject: [PATCH 05/21] Check test files that all units for each booklet are available --- api-dto/files/file-validation-result.dto.ts | 1 + .../services/workspace-files.service.ts | 24 ++++++ .../files-validation.component.html | 20 +++++ .../files-validation.component.scss | 75 +++++++++++++++++++ .../files-validation.component.ts | 1 + 5 files changed, 121 insertions(+) diff --git a/api-dto/files/file-validation-result.dto.ts b/api-dto/files/file-validation-result.dto.ts index ef262238b..bf26fc0a5 100644 --- a/api-dto/files/file-validation-result.dto.ts +++ b/api-dto/files/file-validation-result.dto.ts @@ -8,6 +8,7 @@ type FileStatus = { type DataValidation = { complete: boolean; missing: string[]; + missingUnitsPerBooklet?: { booklet: string; missingUnits: string[] }[]; files: FileStatus[]; }; diff --git a/apps/backend/src/app/database/services/workspace-files.service.ts b/apps/backend/src/app/database/services/workspace-files.service.ts index be02dc0ae..7361b6ef7 100644 --- a/apps/backend/src/app/database/services/workspace-files.service.ts +++ b/apps/backend/src/app/database/services/workspace-files.service.ts @@ -39,6 +39,7 @@ type FileStatus = { type DataValidation = { complete: boolean; missing: string[]; + missingUnitsPerBooklet?: { booklet: string; missingUnits: string[] }[]; unused?: string[]; files: FileStatus[]; }; @@ -55,6 +56,7 @@ type ValidationData = { export type ValidationResult = { allUnitsExist: boolean; missingUnits: string[]; + missingUnitsPerBooklet: { booklet: string; missingUnits: string[] }[]; unitFiles: FileStatus[]; allUnitsUsedInBooklets: boolean; unusedUnits: string[]; @@ -230,6 +232,7 @@ export class WorkspaceFilesService { units: { complete: false, missing: [], + missingUnitsPerBooklet: [], unused: [], files: [] }, @@ -259,6 +262,7 @@ export class WorkspaceFilesService { const { allUnitsExist, missingUnits, + missingUnitsPerBooklet, unitFiles, unusedUnits, missingCodingSchemeRefs, @@ -288,6 +292,7 @@ export class WorkspaceFilesService { units: { complete: bookletComplete ? (allUnitsExist) : false, missing: missingUnits, + missingUnitsPerBooklet: missingUnitsPerBooklet, unused: unusedUnits, files: unitFiles }, @@ -675,6 +680,8 @@ export class WorkspaceFilesService { file_id: In(bookletNames.map(b => b.toUpperCase())) }); + const bookletToUnitsMap = new Map(); + const unitIdsPromises = existingBooklets.map(async booklet => { try { const fileData = booklet.data; @@ -688,6 +695,8 @@ export class WorkspaceFilesService { } }); + bookletToUnitsMap.set(booklet.file_id, unitIds); + return unitIds; } catch (error) { this.logger.error(`Fehler beim Verarbeiten von Unit ${booklet.file_id}:`, error); @@ -793,6 +802,20 @@ export class WorkspaceFilesService { const missingUnits = allUnitIds.filter(unitId => !foundUnitIds.includes(unitId)); const uniqueUnits = Array.from(new Set(missingUnits)); + // Track missing units per booklet + const missingUnitsPerBooklet: { booklet: string; missingUnits: string[] }[] = []; + + // Check each booklet for missing units + for (const [booklet, units] of bookletToUnitsMap.entries()) { + const missingUnitsForBooklet = units.filter(unitId => !foundUnitIds.includes(unitId)); + if (missingUnitsForBooklet.length > 0) { + missingUnitsPerBooklet.push({ + booklet, + missingUnits: missingUnitsForBooklet + }); + } + } + const allUnitsExist = missingUnits.length === 0; // Create lists of all files with their match status @@ -819,6 +842,7 @@ export class WorkspaceFilesService { return { allUnitsExist, missingUnits: uniqueUnits, + missingUnitsPerBooklet, unitFiles, allUnitsUsedInBooklets, unusedUnits, diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html index ee294ac22..97abf1114 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html @@ -6,6 +6,26 @@

person {{val.testTaker}}

+ + @if (val.units.missingUnitsPerBooklet && val.units.missingUnitsPerBooklet.length > 0) { +
+ warning +
+

Fehlende Units in Booklets:

+
    + @for (item of val.units.missingUnitsPerBooklet; track item) { +
  • + {{ item.booklet }}: + @for (unit of item.missingUnits; track unit; let last = $last) { + {{ unit }}{{ !last ? ', ' : '' }} + } +
  • + } +
+
+
+ } + @if (data) {
diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss index 9c95587b0..2ef12c8d8 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss @@ -68,6 +68,81 @@ h4 { } } +.missing-units-warning { + background-color: #ffebee; + border-radius: 8px; + padding: 16px; + margin: 0 0 16px 0; + border: 1px solid rgba(211, 47, 47, 0.2); + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.08); + display: flex; + align-items: flex-start; + animation: fadeIn 0.3s ease-in-out; + + .warning-icon { + color: #d32f2f; + margin-right: 12px; + font-size: 24px; + height: 24px; + width: 24px; + flex-shrink: 0; + } + + .warning-content { + flex: 1; + + .warning-title { + font-weight: 600; + color: #d32f2f; + margin-bottom: 8px; + font-size: 16px; + } + + ul { + margin: 0; + padding-left: 16px; + max-height: 200px; + overflow-y: auto; + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb { + background: #c1d5e8; + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb:hover { + background: #a3c0e0; + } + + li { + font-size: 14px; + color: #555; + margin-bottom: 8px; + line-height: 1.5; + padding: 4px 0; + border-bottom: 1px dashed rgba(211, 47, 47, 0.1); + + &:last-child { + margin-bottom: 0; + border-bottom: none; + } + + strong { + color: #d32f2f; + } + } + } + } +} + .validation-container { display: flex; flex-direction: column; diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts index 2456a3a47..a0c69622e 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts @@ -19,6 +19,7 @@ type FileStatus = { type DataValidation = { complete: boolean; missing: string[]; + missingUnitsPerBooklet?: { booklet: string; missingUnits: string[] }[]; unused?: string[]; files: FileStatus[]; }; From 5dd70c5a5999540782ee93612dfc8cf065e90562 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 16:20:07 +0200 Subject: [PATCH 06/21] Check test files that each unit has a player defined --- api-dto/files/file-validation-result.dto.ts | 1 + .../services/workspace-files.service.ts | 27 +++++++++++++++---- .../files-validation.component.html | 14 ++++++++++ .../files-validation.component.ts | 1 + 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/api-dto/files/file-validation-result.dto.ts b/api-dto/files/file-validation-result.dto.ts index bf26fc0a5..4abfc735f 100644 --- a/api-dto/files/file-validation-result.dto.ts +++ b/api-dto/files/file-validation-result.dto.ts @@ -9,6 +9,7 @@ type DataValidation = { complete: boolean; missing: string[]; missingUnitsPerBooklet?: { booklet: string; missingUnits: string[] }[]; + unitsWithoutPlayer?: string[]; files: FileStatus[]; }; diff --git a/apps/backend/src/app/database/services/workspace-files.service.ts b/apps/backend/src/app/database/services/workspace-files.service.ts index 7361b6ef7..a09f6ef27 100644 --- a/apps/backend/src/app/database/services/workspace-files.service.ts +++ b/apps/backend/src/app/database/services/workspace-files.service.ts @@ -40,6 +40,7 @@ type DataValidation = { complete: boolean; missing: string[]; missingUnitsPerBooklet?: { booklet: string; missingUnits: string[] }[]; + unitsWithoutPlayer?: string[]; unused?: string[]; files: FileStatus[]; }; @@ -57,6 +58,7 @@ export type ValidationResult = { allUnitsExist: boolean; missingUnits: string[]; missingUnitsPerBooklet: { booklet: string; missingUnits: string[] }[]; + unitsWithoutPlayer: string[]; unitFiles: FileStatus[]; allUnitsUsedInBooklets: boolean; unusedUnits: string[]; @@ -233,6 +235,7 @@ export class WorkspaceFilesService { complete: false, missing: [], missingUnitsPerBooklet: [], + unitsWithoutPlayer: [], unused: [], files: [] }, @@ -273,7 +276,8 @@ export class WorkspaceFilesService { allCodingDefinitionsExist, allPlayerRefsExist, missingPlayerRefs, - playerFiles + playerFiles, + unitsWithoutPlayer } = await this.checkMissingUnits(Array.from(uniqueBooklets)); // If booklets are incomplete, all other categories should also be marked as incomplete @@ -293,6 +297,7 @@ export class WorkspaceFilesService { complete: bookletComplete ? (allUnitsExist) : false, missing: missingUnits, missingUnitsPerBooklet: missingUnitsPerBooklet, + unitsWithoutPlayer: unitsWithoutPlayer, unused: unusedUnits, files: unitFiles }, @@ -743,7 +748,9 @@ export class WorkspaceFilesService { const refs = { codingSchemeRefs: [] as string[], definitionRefs: [] as string[], - playerRefs: [] as string[] + playerRefs: [] as string[], + unitId: unit.file_id, + hasPlayer: false }; $('Unit').each((_, element) => { @@ -762,24 +769,33 @@ export class WorkspaceFilesService { if (playerRef) { refs.playerRefs.push(playerRef.toUpperCase()); + refs.hasPlayer = true; } }); return refs; } catch (error) { this.logger.error(`Fehler beim Verarbeiten von Unit ${unit.file_id}:`, error); - return { codingSchemeRefs: [], definitionRefs: [], playerRefs: [] }; + return { + codingSchemeRefs: [], + definitionRefs: [], + playerRefs: [], + unitId: unit.file_id, + hasPlayer: false + }; } }); const allRefs = await Promise.all(refsPromises); - // Combine all references using Sets to remove duplicates + const unitsWithoutPlayer = allRefs + .filter(ref => !ref.hasPlayer) + .map(ref => ref.unitId); + const allCodingSchemeRefs = Array.from(new Set(allRefs.flatMap(ref => ref.codingSchemeRefs))); const allDefinitionRefs = Array.from(new Set(allRefs.flatMap(ref => ref.definitionRefs))); const allPlayerRefs = Array.from(new Set(allRefs.flatMap(ref => ref.playerRefs))); - // Get all resources in the current workspace const existingResources = await this.fileUploadRepository.findBy({ file_type: 'Resource', workspace_id: existingBooklets.length > 0 ? existingBooklets[0].workspace_id : null @@ -843,6 +859,7 @@ export class WorkspaceFilesService { allUnitsExist, missingUnits: uniqueUnits, missingUnitsPerBooklet, + unitsWithoutPlayer, unitFiles, allUnitsUsedInBooklets, unusedUnits, diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html index 97abf1114..2033e7764 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html @@ -26,6 +26,20 @@

} + @if (val.units.unitsWithoutPlayer && val.units.unitsWithoutPlayer.length > 0) { +
+ warning +
+

Units ohne definierten Player:

+
    + @for (unit of val.units.unitsWithoutPlayer; track unit) { +
  • {{ unit }}
  • + } +
+
+
+ } + @if (data) {
diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts index a0c69622e..5d62483d1 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts @@ -20,6 +20,7 @@ type DataValidation = { complete: boolean; missing: string[]; missingUnitsPerBooklet?: { booklet: string; missingUnits: string[] }[]; + unitsWithoutPlayer?: string[]; unused?: string[]; files: FileStatus[]; }; From 73a2c289a26858edccb4fc57875b563c73e7d1bc Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:24:20 +0200 Subject: [PATCH 07/21] Provide dummy test taker file for minimum configuration --- .../workspace/workspace-files.controller.ts | 17 ++++++ .../services/workspace-files.service.ts | 46 +++++++++++++++- .../src/app/services/backend.service.ts | 4 ++ .../frontend/src/app/services/file.service.ts | 10 ++++ .../test-files/test-files.component.ts | 54 +++++++++++++++++-- 5 files changed, 124 insertions(+), 7 deletions(-) diff --git a/apps/backend/src/app/admin/workspace/workspace-files.controller.ts b/apps/backend/src/app/admin/workspace/workspace-files.controller.ts index 3383789a4..493026e82 100644 --- a/apps/backend/src/app/admin/workspace/workspace-files.controller.ts +++ b/apps/backend/src/app/admin/workspace/workspace-files.controller.ts @@ -532,4 +532,21 @@ export class WorkspaceFilesController { @Query('validationType') validationType: 'variables' | 'variableTypes' | 'responseStatus'): Promise { return this.workspaceFilesService.deleteAllInvalidResponses(workspace_id, validationType); } + + @Post(':workspace_id/files/create-dummy-testtaker') + @ApiTags('test files validation') + @UseGuards(JwtAuthGuard, WorkspaceGuard) + @ApiOperation({ summary: 'Create dummy testtaker file', description: 'Creates a dummy testtaker file that includes all booklets in the workspace' }) + @ApiParam({ name: 'workspace_id', type: Number, description: 'ID of the workspace' }) + @ApiOkResponse({ + description: 'Dummy testtaker file created successfully', + type: Boolean + }) + @ApiBadRequestResponse({ + description: 'Failed to create dummy testtaker file' + }) + async createDummyTestTakerFile( + @Param('workspace_id') workspace_id: number): Promise { + return this.workspaceFilesService.createDummyTestTakerFile(workspace_id); + } } diff --git a/apps/backend/src/app/database/services/workspace-files.service.ts b/apps/backend/src/app/database/services/workspace-files.service.ts index a09f6ef27..67a251a9c 100644 --- a/apps/backend/src/app/database/services/workspace-files.service.ts +++ b/apps/backend/src/app/database/services/workspace-files.service.ts @@ -121,7 +121,6 @@ export class WorkspaceFilesService { const validPage = Math.max(1, page); const validLimit = Math.min(Math.max(1, limit), MAX_LIMIT); - // QueryBuilder für flexible Filterung let qb = this.fileUploadRepository.createQueryBuilder('file') .where('file.workspace_id = :workspaceId', { workspaceId }); @@ -169,7 +168,6 @@ export class WorkspaceFilesService { const [files, total] = await qb.getManyAndCount(); this.logger.log(`Found ${files.length} files (page ${validPage}, limit ${validLimit}, total ${total}).`); - // Get all file types for this workspace const fileTypes = await this.findAllFileTypes(workspaceId); return [files, total, fileTypes]; @@ -245,6 +243,50 @@ export class WorkspaceFilesService { }]; } + async createDummyTestTakerFile(workspaceId: number): Promise { + try { + const booklets = await this.fileUploadRepository.find({ + where: { workspace_id: workspaceId, file_type: 'Booklet' } + }); + + if (!booklets || booklets.length === 0) { + this.logger.warn(`No booklets found in workspace with ID ${workspaceId}.`); + return false; + } + + const bookletRefs = booklets.map(booklet => ` ${booklet.file_id}`).join('\n'); + + const dummyTestTakerXml = ` + + + Auto-generated TestTakers file including all booklets + + + +${bookletRefs} + + +`; + + const newTestTakerFile = this.fileUploadRepository.create({ + workspace_id: workspaceId, + filename: 'auto-generated-testtakers.xml', + file_id: 'AUTO-GENERATED-TESTTAKERS', + file_type: 'TestTakers', + file_size: dummyTestTakerXml.length, + data: dummyTestTakerXml + }); + + await this.fileUploadRepository.save(newTestTakerFile); + + this.logger.log(`Created dummy TestTakers file for workspace ${workspaceId} with ${booklets.length} booklets.`); + return true; + } catch (error) { + this.logger.error(`Error creating dummy TestTakers file for workspace ${workspaceId}: ${error.message}`, error.stack); + return false; + } + } + private async processTestTaker(testTaker: FileUpload): Promise { const xmlDocument = cheerio.load(testTaker.data, { xml: true }); const bookletTags = xmlDocument('Booklet'); diff --git a/apps/frontend/src/app/services/backend.service.ts b/apps/frontend/src/app/services/backend.service.ts index 28e1257af..aa7ecec46 100755 --- a/apps/frontend/src/app/services/backend.service.ts +++ b/apps/frontend/src/app/services/backend.service.ts @@ -621,4 +621,8 @@ export class BackendService { ): Observable { return this.validationService.pollValidationTask(workspaceId, taskId, pollInterval); } + + createDummyTestTakerFile(workspaceId: number): Observable { + return this.fileService.createDummyTestTakerFile(workspaceId); + } } diff --git a/apps/frontend/src/app/services/file.service.ts b/apps/frontend/src/app/services/file.service.ts index 57bb99217..9ba61ca88 100644 --- a/apps/frontend/src/app/services/file.service.ts +++ b/apps/frontend/src/app/services/file.service.ts @@ -165,4 +165,14 @@ export class FileService { catchError(() => of(null)) ); } + + createDummyTestTakerFile(workspaceId: number): Observable { + return this.http.post( + `${this.serverUrl}admin/workspace/${workspaceId}/files/create-dummy-testtaker`, + {}, + { headers: this.authHeader } + ).pipe( + catchError(() => of(false)) + ); + } } diff --git a/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts b/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts index 6e4b8b9f8..4446626b7 100755 --- a/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts +++ b/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts @@ -40,6 +40,7 @@ import { FilesInListDto } from '../../../../../../../api-dto/files/files-in-list import { FileValidationResultDto } from '../../../../../../../api-dto/files/file-validation-result.dto'; import { FileDownloadDto } from '../../../../../../../api-dto/files/file-download.dto'; import { ContentDialogComponent } from '../../../shared/dialogs/content-dialog/content-dialog.component'; +import { ConfirmDialogComponent } from '../../../shared/dialogs/confirm-dialog.component'; import { getFileIcon } from '../../utils/file-utils'; @Component({ @@ -281,11 +282,54 @@ export class TestFilesComponent implements OnInit, OnDestroy { ); } else if (typeof res !== 'boolean') { if (!res.testTakersFound) { - this.snackBar.open( - 'Keine Testtaker gefunden. Validierung nicht möglich.', - this.translate.instant('error'), - { duration: 5000 } - ); + const confirmRef = this.dialog.open(ConfirmDialogComponent, { + width: '400px', + data: { + title: 'Keine Testtaker gefunden', + content: 'Es wurden keine Testtaker-Dateien gefunden. Möchten Sie eine automatisch generierte Testtaker-Datei erstellen?', + confirmButtonLabel: 'Ja', + showCancel: true + } + }); + + confirmRef.afterClosed().subscribe(result => { + if (result === true) { + this.isLoading = true; + this.backendService.createDummyTestTakerFile(this.appService.selectedWorkspaceId) + .subscribe(success => { + this.isLoading = false; + if (success) { + this.snackBar.open( + 'Testtaker-Datei wurde erfolgreich erstellt.', + 'OK', + { duration: 3000 } + ); + this.loadTestFiles(); + setTimeout(() => { + this.validateFiles(); + }, 1000); + } else { + this.snackBar.open( + 'Fehler beim Erstellen der Testtaker-Datei.', + this.translate.instant('error'), + { duration: 3000 } + ); + } + }); + } else { + // User doesn't want to create a dummy testtaker file + this.snackBar.open( + 'Keine Testtaker-Dateien vorhanden.', + 'OK', + { duration: 3000 } + ); + + this.dialog.open(FilesValidationDialogComponent, { + width: '600px', + data: res.validationResults + }); + } + }); } else { this.dialog.open(FilesValidationDialogComponent, { width: '600px', From 3ee4178c640e5b0f354732a2b5ec69f7c172e3c5 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:35:41 +0200 Subject: [PATCH 08/21] Check if booklet is used by minimum one testtaker --- api-dto/files/file-validation-result.dto.ts | 1 + .../services/workspace-files.service.ts | 57 ++++++++++++++----- .../files-validation.component.html | 16 ++++++ .../files-validation.component.scss | 27 +++++++++ .../files-validation.component.ts | 1 + 5 files changed, 89 insertions(+), 13 deletions(-) diff --git a/api-dto/files/file-validation-result.dto.ts b/api-dto/files/file-validation-result.dto.ts index 4abfc735f..b16baa13c 100644 --- a/api-dto/files/file-validation-result.dto.ts +++ b/api-dto/files/file-validation-result.dto.ts @@ -10,6 +10,7 @@ type DataValidation = { missing: string[]; missingUnitsPerBooklet?: { booklet: string; missingUnits: string[] }[]; unitsWithoutPlayer?: string[]; + unusedBooklets?: string[]; files: FileStatus[]; }; diff --git a/apps/backend/src/app/database/services/workspace-files.service.ts b/apps/backend/src/app/database/services/workspace-files.service.ts index 67a251a9c..0906f0cac 100644 --- a/apps/backend/src/app/database/services/workspace-files.service.ts +++ b/apps/backend/src/app/database/services/workspace-files.service.ts @@ -42,6 +42,7 @@ type DataValidation = { missingUnitsPerBooklet?: { booklet: string; missingUnits: string[] }[]; unitsWithoutPlayer?: string[]; unused?: string[]; + unusedBooklets?: string[]; files: FileStatus[]; }; @@ -193,31 +194,55 @@ export class WorkspaceFilesService { }; } - const validationResultsPromises = testTakers.map(testTaker => this.processTestTaker(testTaker)); - const validationResults = (await Promise.all(validationResultsPromises)).filter(Boolean); + const allBooklets = await this.fileUploadRepository.find({ + where: { workspace_id: workspaceId, file_type: 'Booklet' } + }); - if (validationResults.length > 0) { + if (!allBooklets || allBooklets.length === 0) { + this.logger.warn(`No booklets found in workspace with ID ${workspaceId}.`); return { testTakersFound: true, - validationResults + validationResults: this.createEmptyValidationData() }; } - const booklets = await this.fileUploadRepository.find({ - where: { workspace_id: workspaceId, file_type: 'Booklet' } - }); + const bookletIdsInTestTakers = new Set(); + for (const testTaker of testTakers) { + const xmlDocument = cheerio.load(testTaker.data, { xml: true }); + const bookletTags = xmlDocument('Booklet'); - if (!booklets || booklets.length === 0) { - this.logger.warn(`No booklets found in workspace with ID ${workspaceId}.`); + bookletTags.each((_, element) => { + const bookletId = xmlDocument(element).text().trim().toUpperCase(); + if (bookletId) { + bookletIdsInTestTakers.add(bookletId); + } + }); + } + + const unusedBooklets = allBooklets + .filter(booklet => !bookletIdsInTestTakers.has(booklet.file_id.toUpperCase())) + .map(booklet => booklet.file_id); + + this.logger.log(`Found ${unusedBooklets.length} booklets not included in any TestTakers file`); + + const validationResultsPromises = testTakers.map(testTaker => this.processTestTaker(testTaker, unusedBooklets)); + const validationResults = (await Promise.all(validationResultsPromises)).filter(Boolean); + + if (validationResults.length > 0) { return { testTakersFound: true, - validationResults: this.createEmptyValidationData() + validationResults }; } + const emptyValidation = this.createEmptyValidationData(); + if (emptyValidation.length > 0 && unusedBooklets.length > 0) { + emptyValidation[0].booklets.unusedBooklets = unusedBooklets; + } + return { testTakersFound: true, - validationResults: this.createEmptyValidationData() + validationResults: emptyValidation }; } catch (error) { this.logger.error(`Error during test file validation for workspace ID ${workspaceId}: ${error.message}`, error.stack); @@ -228,7 +253,12 @@ export class WorkspaceFilesService { private createEmptyValidationData(): ValidationData[] { return [{ testTaker: '', - booklets: { complete: false, missing: [], files: [] }, + booklets: { + complete: false, + missing: [], + unusedBooklets: [], + files: [] + }, units: { complete: false, missing: [], @@ -287,7 +317,7 @@ ${bookletRefs} } } - private async processTestTaker(testTaker: FileUpload): Promise { + private async processTestTaker(testTaker: FileUpload, unusedBooklets: string[] = []): Promise { const xmlDocument = cheerio.load(testTaker.data, { xml: true }); const bookletTags = xmlDocument('Booklet'); const unitTags = xmlDocument('Unit'); @@ -333,6 +363,7 @@ ${bookletRefs} booklets: { complete: bookletComplete, missing: missingBooklets, + unusedBooklets, files: bookletFiles }, units: { diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html index 2033e7764..cc4df040d 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html @@ -40,6 +40,22 @@

} + @if (val.booklets.unusedBooklets && val.booklets.unusedBooklets.length > 0) { +
+ warning +
+

Booklets nicht in Testtaker-Datei enthalten:

+
+
    + @for (booklet of val.booklets.unusedBooklets; track booklet) { +
  • {{ booklet }}
  • + } +
+
+
+
+ } + @if (data) {
diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss index 2ef12c8d8..f9b182e02 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss @@ -98,6 +98,33 @@ h4 { font-size: 16px; } + .scrollable-list { + max-height: 150px; + overflow-y: auto; + border: 1px solid rgba(211, 47, 47, 0.1); + border-radius: 4px; + padding: 8px; + background-color: rgba(255, 255, 255, 0.5); + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb { + background: #c1d5e8; + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb:hover { + background: #a3c0e0; + } + } + ul { margin: 0; padding-left: 16px; diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts index 5d62483d1..836f46775 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts @@ -22,6 +22,7 @@ type DataValidation = { missingUnitsPerBooklet?: { booklet: string; missingUnits: string[] }[]; unitsWithoutPlayer?: string[]; unused?: string[]; + unusedBooklets?: string[]; files: FileStatus[]; }; From 4da128db6c916cf849952dec69655581db7fb679 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:47:04 +0200 Subject: [PATCH 09/21] Add warning if not each booklet of testtaker is available. --- .../files-validation.component.html | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html index cc4df040d..11502631a 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html @@ -7,6 +7,20 @@

{{val.testTaker}}

+ @if (val.booklets.missing && val.booklets.missing.length > 0) { +
+ warning +
+

Fehlende Booklets:

+
    + @for (booklet of val.booklets.missing; track booklet) { +
  • {{ booklet }}
  • + } +
+
+
+ } + @if (val.units.missingUnitsPerBooklet && val.units.missingUnitsPerBooklet.length > 0) {
warning From b587f99d325c153424d18e649ab6c0fc31c91a71 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:56:41 +0200 Subject: [PATCH 10/21] Create dummy booklet additionally if only units in workspace --- .../services/workspace-files.service.ts | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/apps/backend/src/app/database/services/workspace-files.service.ts b/apps/backend/src/app/database/services/workspace-files.service.ts index 0906f0cac..6c6afffbd 100644 --- a/apps/backend/src/app/database/services/workspace-files.service.ts +++ b/apps/backend/src/app/database/services/workspace-files.service.ts @@ -280,8 +280,67 @@ export class WorkspaceFilesService { }); if (!booklets || booklets.length === 0) { - this.logger.warn(`No booklets found in workspace with ID ${workspaceId}.`); - return false; + // Check if there are units available + const units = await this.fileUploadRepository.find({ + where: { workspace_id: workspaceId, file_type: 'Unit' } + }); + + if (!units || units.length === 0) { + this.logger.warn(`No booklets or units found in workspace with ID ${workspaceId}.`); + return false; + } + + // Create a fake booklet that includes all available units + const unitRefs = units.map(unit => ` `).join('\n'); + const fakeBookletId = 'AUTO-GENERATED-BOOKLET'; + const fakeBookletXml = ` + + + ${fakeBookletId} + + Auto-generated booklet including all units + + +${unitRefs} + +`; + + const fakeBooklet = this.fileUploadRepository.create({ + workspace_id: workspaceId, + filename: 'auto-generated-booklet.xml', + file_id: fakeBookletId, + file_type: 'Booklet', + file_size: fakeBookletXml.length, + data: fakeBookletXml + }); + + await this.fileUploadRepository.save(fakeBooklet); + this.logger.log(`Created fake booklet for workspace ${workspaceId} with ${units.length} units.`); + + const dummyTestTakerXml = ` + + + Auto-generated TestTakers file with auto-generated booklet + + + + ${fakeBookletId} + + +`; + + const newTestTakerFile = this.fileUploadRepository.create({ + workspace_id: workspaceId, + filename: 'auto-generated-testtakers.xml', + file_id: 'AUTO-GENERATED-TESTTAKERS', + file_type: 'TestTakers', + file_size: dummyTestTakerXml.length, + data: dummyTestTakerXml + }); + + await this.fileUploadRepository.save(newTestTakerFile); + this.logger.log(`Created dummy TestTakers file for workspace ${workspaceId} with auto-generated booklet.`); + return true; } const bookletRefs = booklets.map(booklet => ` ${booklet.file_id}`).join('\n'); From f3307de1cbfa4f63770891f7b419b9f0daa1f9ce Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Thu, 17 Jul 2025 13:59:15 +0200 Subject: [PATCH 11/21] Check test taker groups for certain mode and filter possibility --- api-dto/files/file-validation-result.dto.ts | 9 + .../workspace/workspace-files.controller.ts | 46 ++- .../app/database/entities/persons.entity.ts | 3 + .../app/database/services/person.service.ts | 31 +- .../services/variable-analysis.service.ts | 12 +- .../services/workspace-coding.service.ts | 29 +- .../services/workspace-files.service.ts | 67 ++++- .../workspace-test-results.service.ts | 23 +- .../src/app/services/workspace.service.ts | 15 + .../files-validation.component.html | 65 ++++- .../files-validation.component.scss | 122 +++++++- .../files-validation.component.ts | 268 +++++++++++++++++- .../test-files/test-files.component.ts | 12 +- .../changelog/coding-box.changelog-0.9.3.sql | 11 + .../changelog/coding-box.changelog-root.xml | 1 + 15 files changed, 634 insertions(+), 80 deletions(-) create mode 100644 database/changelog/coding-box.changelog-0.9.3.sql diff --git a/api-dto/files/file-validation-result.dto.ts b/api-dto/files/file-validation-result.dto.ts index b16baa13c..2dbe1a9a2 100644 --- a/api-dto/files/file-validation-result.dto.ts +++ b/api-dto/files/file-validation-result.dto.ts @@ -14,10 +14,19 @@ type DataValidation = { files: FileStatus[]; }; +export type FilteredTestTaker = { + testTaker: string; + mode: string; + login: string; +}; + export class FileValidationResultDto { @ApiProperty({ type: Boolean, description: 'Indicates whether test takers were found' }) testTakersFound!: boolean; + @ApiProperty({ type: [Object], description: 'Array of filtered test takers with specific modes' }) + filteredTestTakers?: FilteredTestTaker[]; + @ApiProperty({ type: [Object], description: 'Array of validation results for each test taker' }) validationResults!: { testTaker: string; diff --git a/apps/backend/src/app/admin/workspace/workspace-files.controller.ts b/apps/backend/src/app/admin/workspace/workspace-files.controller.ts index 493026e82..adca6cc59 100644 --- a/apps/backend/src/app/admin/workspace/workspace-files.controller.ts +++ b/apps/backend/src/app/admin/workspace/workspace-files.controller.ts @@ -1,5 +1,6 @@ import { BadRequestException, + Body, Controller, Delete, Get, InternalServerErrorException, NotFoundException, Param, Post, Query, UseGuards, UseInterceptors, UploadedFiles @@ -19,12 +20,14 @@ import { FileValidationResultDto } from '../../../../../../api-dto/files/file-va import { WorkspaceFilesService } from '../../database/services/workspace-files.service'; import { InvalidVariableDto } from '../../../../../../api-dto/files/variable-validation.dto'; import { TestTakersValidationDto } from '../../../../../../api-dto/files/testtakers-validation.dto'; +import { PersonService } from '../../database/services/person.service'; @ApiTags('Admin Workspace Files') @Controller('admin/workspace') export class WorkspaceFilesController { constructor( - private workspaceFilesService: WorkspaceFilesService + private readonly workspaceFilesService: WorkspaceFilesService, + private readonly personService: PersonService ) {} @Get(':workspace_id/files') @@ -126,11 +129,52 @@ export class WorkspaceFilesController { return this.workspaceFilesService.deleteTestFiles(workspace_id, query.fileIds.split(';')); } + @Post(':workspace_id/persons/exclude') + @ApiTags('ws admin test-files') + @UseGuards(JwtAuthGuard, WorkspaceGuard) + @ApiOperation({ summary: 'Mark persons as not to be considered', description: 'Marks persons with specified logins as not to be considered in the persons database' }) + @ApiParam({ name: 'workspace_id', type: Number, description: 'ID of the workspace' }) + @ApiBody({ + schema: { + type: 'object', + properties: { + logins: { + type: 'array', + items: { + type: 'string' + }, + description: 'Array of login names to mark as not to be considered' + } + } + } + }) + @ApiOkResponse({ description: 'Persons marked as not to be considered', type: Boolean }) + async excludePersons( + @Param('workspace_id') workspaceId: number, + @Body() body: { logins: string[] } + ): Promise { + if (!workspaceId) { + throw new BadRequestException('Workspace ID is required.'); + } + + if (!body.logins || !Array.isArray(body.logins) || body.logins.length === 0) { + throw new BadRequestException('At least one login name must be provided.'); + } + + return this.personService.markPersonsAsNotConsidered(workspaceId, body.logins); + } + @Get(':workspace_id/files/validation') @ApiTags('test files validation') @UseGuards(JwtAuthGuard, WorkspaceGuard) @ApiOperation({ summary: 'Validate test files', description: 'Validates test files and returns a hierarchical view of expected files and their status' }) @ApiParam({ name: 'workspace_id', type: Number, description: 'ID of the workspace' }) + @ApiQuery({ + name: 'excludeModes', + type: String, + required: false, + description: 'Comma-separated list of modes to exclude from filtering (e.g., "run-hot-return,run-hot-restart,run-trial")' + }) @ApiOkResponse({ description: 'Files validation result', type: FileValidationResultDto diff --git a/apps/backend/src/app/database/entities/persons.entity.ts b/apps/backend/src/app/database/entities/persons.entity.ts index 840b33297..e725111c0 100755 --- a/apps/backend/src/app/database/entities/persons.entity.ts +++ b/apps/backend/src/app/database/entities/persons.entity.ts @@ -40,6 +40,9 @@ class Persons { @Column({ type: 'varchar' }) source!: string; + @Column({ type: 'boolean', default: true }) + consider!: boolean; + // Add explicit relationship to Booklet entity @OneToMany(() => Booklet, booklet => booklet.person, { // Cascade operations to booklets when person is modified diff --git a/apps/backend/src/app/database/services/person.service.ts b/apps/backend/src/app/database/services/person.service.ts index b3fd653fd..dfb491f0f 100644 --- a/apps/backend/src/app/database/services/person.service.ts +++ b/apps/backend/src/app/database/services/person.service.ts @@ -1,6 +1,6 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; +import { In, Repository } from 'typeorm'; import Persons from '../entities/persons.entity'; import { Booklet } from '../entities/booklet.entity'; import { Unit } from '../entities/unit.entity'; @@ -56,6 +56,7 @@ export class PersonService { .createQueryBuilder('person') .select('DISTINCT person.group', 'group') .where('person.workspace_id = :workspaceId', { workspaceId }) + .andWhere('person.consider = :consider', { consider: true }) .getRawMany(); return result.map(item => item.group); @@ -73,6 +74,7 @@ export class PersonService { .innerJoin('booklet.person', 'person') .where('person.workspace_id = :workspaceId', { workspaceId }) .andWhere('person.group = :groupName', { groupName }) + .andWhere('person.consider = :consider', { consider: true }) .getCount(); return count > 0; @@ -98,6 +100,29 @@ export class PersonService { } } + async markPersonsAsNotConsidered(workspaceId: number, logins: string[]): Promise { + try { + if (!workspaceId || !logins || logins.length === 0) { + this.logger.warn('Invalid parameters for markPersonsAsNotConsidered'); + return false; + } + + const result = await this.personsRepository.update( + { + workspace_id: workspaceId, + login: In(logins) + }, + { consider: false } + ); + + this.logger.log(`Marked ${result.affected} persons as not to be considered in workspace ${workspaceId}`); + return result.affected > 0; + } catch (error) { + this.logger.error(`Error marking persons as not considered: ${error.message}`, error.stack); + return false; + } + } + async getImportStatistics(workspaceId: number): Promise<{ persons: number; booklets: number; @@ -105,13 +130,14 @@ export class PersonService { }> { try { const personsCount = await this.personsRepository.count({ - where: { workspace_id: workspaceId } + where: { workspace_id: workspaceId, consider: true } }); const bookletsCount = await this.bookletRepository .createQueryBuilder('booklet') .innerJoin('booklet.person', 'person') .where('person.workspace_id = :workspaceId', { workspaceId }) + .andWhere('person.consider = :consider', { consider: true }) .getCount(); const unitsCount = await this.unitRepository @@ -119,6 +145,7 @@ export class PersonService { .innerJoin('unit.booklet', 'booklet') .innerJoin('booklet.person', 'person') .where('person.workspace_id = :workspaceId', { workspaceId }) + .andWhere('person.consider = :consider', { consider: true }) .getCount(); return { diff --git a/apps/backend/src/app/database/services/variable-analysis.service.ts b/apps/backend/src/app/database/services/variable-analysis.service.ts index fbf6225e6..0c50dec36 100644 --- a/apps/backend/src/app/database/services/variable-analysis.service.ts +++ b/apps/backend/src/app/database/services/variable-analysis.service.ts @@ -20,13 +20,6 @@ export class VariableAnalysisService { private jobRepository: Repository ) {} - /** - * Create a new variable analysis job - * @param workspaceId The ID of the workspace - * @param unitId Optional unit ID to filter by - * @param variableId Optional variable ID to filter by - * @returns The created job - */ async createAnalysisJob( workspaceId: number, unitId?: number, @@ -132,7 +125,7 @@ export class VariableAnalysisService { async getVariableFrequencies( workspaceId: number, unitId?: number, - variableId?: string, + variableId?: string ): Promise { // Build the query const query = this.responseRepository @@ -141,7 +134,8 @@ export class VariableAnalysisService { .innerJoin('unit.booklet', 'booklet') .innerJoin('booklet.person', 'person') .innerJoin('booklet.bookletinfo', 'bookletinfo') - .where('person.workspace_id = :workspaceId', { workspaceId }); + .where('person.workspace_id = :workspaceId', { workspaceId }) + .andWhere('person.consider = :consider', { consider: true }); // Add filters if (unitId) { diff --git a/apps/backend/src/app/database/services/workspace-coding.service.ts b/apps/backend/src/app/database/services/workspace-coding.service.ts index 4fc70ec48..d23443a32 100644 --- a/apps/backend/src/app/database/services/workspace-coding.service.ts +++ b/apps/backend/src/app/database/services/workspace-coding.service.ts @@ -33,22 +33,13 @@ export class WorkspaceCodingService { private jobRepository: Repository ) {} - // Cache for coding schemes with TTL private codingSchemeCache: Map = new Map(); private readonly SCHEME_CACHE_TTL_MS = 30 * 60 * 1000; // 30 minutes cache TTL - // Cache for test files with TTL private testFileCache: Map; timestamp: number }> = new Map(); private readonly TEST_FILE_CACHE_TTL_MS = 15 * 60 * 1000; // 15 minutes cache TTL - /** - * Get test files from cache or fetch them from the database - * @param workspace_id Workspace ID - * @param unitAliasesArray Array of unit aliases to fetch - * @returns Map of file ID to file - */ private async getTestFilesWithCache(workspace_id: number, unitAliasesArray: string[]): Promise> { - // Check if we have a valid cache entry const cacheEntry = this.testFileCache.get(workspace_id); const now = Date.now(); @@ -100,11 +91,6 @@ export class WorkspaceCodingService { return fileMap; } - /** - * Get coding schemes from cache or fetch them from the database - * @param codingSchemeRefs Array of coding scheme references to fetch - * @returns Map of scheme ID to parsed coding scheme - */ private async getCodingSchemesWithCache(codingSchemeRefs: string[]): Promise> { const now = Date.now(); const result = new Map(); @@ -155,9 +141,6 @@ export class WorkspaceCodingService { return result; } - /** - * Clean up expired items from caches - */ private cleanupCaches(): void { const now = Date.now(); @@ -176,7 +159,6 @@ export class WorkspaceCodingService { } } - // Job status tracking private jobStatus: Map = new Map(); async getAllJobs(workspaceId?: number): Promise<{ @@ -264,19 +246,16 @@ export class WorkspaceCodingService { private async processTestPersonsInBackground(jobId: number, workspace_id: number, personIds: string[]): Promise { try { - // Get the job from the database const job = await this.jobRepository.findOne({ where: { id: jobId } }); if (!job) { this.logger.error(`Job with ID ${jobId} not found`); return; } - // Update job status to processing job.status = 'processing'; job.progress = 0; await this.jobRepository.save(job); - // Process test persons in smaller batches to avoid memory issues const BATCH_SIZE = 500; const totalPersons = personIds.length; let processedPersons = 0; @@ -1004,7 +983,8 @@ export class WorkspaceCodingService { const persons = await this.personsRepository.find({ where: { workspace_id, - group: In(groupsOrIds) + group: In(groupsOrIds), + consider: true }, select: ['id'] }); @@ -1064,7 +1044,7 @@ export class WorkspaceCodingService { try { const persons = await this.personsRepository.find({ - where: { workspace_id: workspace_id } + where: { workspace_id: workspace_id, consider: true } }); if (!persons.length) { @@ -1337,14 +1317,12 @@ export class WorkspaceCodingService { } } - // Cache for statistics with TTL private statisticsCache: Map = new Map(); private readonly CACHE_TTL_MS = 1 * 60 * 1000; // 1 minute cache TTL async getCodingStatistics(workspace_id: number): Promise { this.logger.log(`Getting coding statistics for workspace ${workspace_id}`); - // Check if we have a valid cached result const cachedResult = this.statisticsCache.get(workspace_id); if (cachedResult && (Date.now() - cachedResult.timestamp) < this.CACHE_TTL_MS) { this.logger.log(`Returning cached statistics for workspace ${workspace_id}`); @@ -1364,6 +1342,7 @@ export class WorkspaceCodingService { .innerJoin('booklet.person', 'person') .where('response.status = :status', { status: 'VALUE_CHANGED' }) .andWhere('person.workspace_id = :workspace_id', { workspace_id }) + .andWhere('person.consider = :consider', { consider: true }) .select('COALESCE(response.codedstatus, null)', 'statusValue') .addSelect('COUNT(response.id)', 'count') .groupBy('COALESCE(response.codedstatus, null)') diff --git a/apps/backend/src/app/database/services/workspace-files.service.ts b/apps/backend/src/app/database/services/workspace-files.service.ts index 6c6afffbd..2bcd5b23e 100644 --- a/apps/backend/src/app/database/services/workspace-files.service.ts +++ b/apps/backend/src/app/database/services/workspace-files.service.ts @@ -11,7 +11,7 @@ import FileUpload from '../entities/file_upload.entity'; import { FilesDto } from '../../../../../../api-dto/files/files.dto'; import { FileIo } from '../../admin/workspace/file-io.interface'; import { FileDownloadDto } from '../../../../../../api-dto/files/file-download.dto'; -import { FileValidationResultDto } from '../../../../../../api-dto/files/file-validation-result.dto'; +import { FileValidationResultDto, FilteredTestTaker } from '../../../../../../api-dto/files/file-validation-result.dto'; import { ResponseDto } from '../../../../../../api-dto/responses/response-dto'; import { InvalidVariableDto } from '../../../../../../api-dto/files/variable-validation.dto'; import { Unit } from '../entities/unit.entity'; @@ -206,6 +206,55 @@ export class WorkspaceFilesService { }; } + const modesNotToFilter = ['run-hot-return', 'run-hot-restart', 'run-trial']; + + const shouldFilterMode = (loginMode: string) => !modesNotToFilter.includes(loginMode); + + let filteredTestTakers: FilteredTestTaker[] = []; + + for (const testTaker of testTakers) { + const xmlDocument = cheerio.load(testTaker.data, { xml: true }); + const groupElements = xmlDocument('Group'); + + for (let i = 0; i < groupElements.length; i++) { + const groupElement = groupElements[i]; + const loginElements = xmlDocument(groupElement).find('Login'); + + for (let j = 0; j < loginElements.length; j++) { + const loginElement = loginElements[j]; + const loginName = xmlDocument(loginElement).attr('name'); + const loginMode = xmlDocument(loginElement).attr('mode'); + + if (loginMode && shouldFilterMode(loginMode)) { + filteredTestTakers.push({ + testTaker: testTaker.file_id, + mode: loginMode, + login: loginName || '' + }); + } + } + } + } + + if (filteredTestTakers.length > 0) { + const loginNames = filteredTestTakers.map(item => item.login); + const personsNotConsidered = await this.personsRepository.find({ + where: { + workspace_id: workspaceId, + login: In(loginNames), + consider: false + }, + select: ['login'] + }); + + const loginsNotConsidered = personsNotConsidered.map(person => person.login); + + if (loginsNotConsidered.length > 0) { + this.logger.log(`Filtering out ${loginsNotConsidered.length} test takers where consider is false`); + filteredTestTakers = filteredTestTakers.filter(item => !loginsNotConsidered.includes(item.login)); + } + } + const bookletIdsInTestTakers = new Set(); for (const testTaker of testTakers) { const xmlDocument = cheerio.load(testTaker.data, { xml: true }); @@ -224,6 +273,7 @@ export class WorkspaceFilesService { .map(booklet => booklet.file_id); this.logger.log(`Found ${unusedBooklets.length} booklets not included in any TestTakers file`); + this.logger.log(`Found ${filteredTestTakers.length} TestTakers with modes other than 'run-hot-return', 'run-hot-restart', 'run-trial'`); const validationResultsPromises = testTakers.map(testTaker => this.processTestTaker(testTaker, unusedBooklets)); const validationResults = (await Promise.all(validationResultsPromises)).filter(Boolean); @@ -231,6 +281,7 @@ export class WorkspaceFilesService { if (validationResults.length > 0) { return { testTakersFound: true, + filteredTestTakers: filteredTestTakers.length > 0 ? filteredTestTakers : undefined, validationResults }; } @@ -242,6 +293,7 @@ export class WorkspaceFilesService { return { testTakersFound: true, + filteredTestTakers: filteredTestTakers.length > 0 ? filteredTestTakers : undefined, validationResults: emptyValidation }; } catch (error) { @@ -280,7 +332,6 @@ export class WorkspaceFilesService { }); if (!booklets || booklets.length === 0) { - // Check if there are units available const units = await this.fileUploadRepository.find({ where: { workspace_id: workspaceId, file_type: 'Unit' } }); @@ -1182,7 +1233,7 @@ ${bookletRefs} const invalidVariables: InvalidVariableDto[] = []; const persons = await this.personsRepository.find({ - where: { workspace_id: workspaceId } + where: { workspace_id: workspaceId, consider: true } }); if (persons.length === 0) { @@ -1370,7 +1421,7 @@ ${bookletRefs} const invalidVariables: InvalidVariableDto[] = []; const persons = await this.personsRepository.find({ - where: { workspace_id: workspaceId } + where: { workspace_id: workspaceId, consider: true } }); if (persons.length === 0) { @@ -1666,7 +1717,7 @@ ${bookletRefs} } const persons = await this.personsRepository.find({ - where: { workspace_id: workspaceId } + where: { workspace_id: workspaceId, consider: true } }); const missingPersons: MissingPersonDto[] = []; @@ -1711,7 +1762,7 @@ ${bookletRefs} const validStatusValues = ['VALUE_CHANGED', 'NOT_REACHED', 'DISPLAYED', 'UNSET', 'PARTLY_DISPLAYED']; const persons = await this.personsRepository.find({ - where: { workspace_id: workspaceId } + where: { workspace_id: workspaceId, consider: true } }); if (persons.length === 0) { @@ -1935,7 +1986,7 @@ ${bookletRefs} for (const group of groups) { // Find persons with this group ID const persons = await this.personsRepository.find({ - where: { workspace_id: workspaceId, group } + where: { workspace_id: workspaceId, group, consider: true } }); if (persons.length === 0) { @@ -2041,7 +2092,7 @@ ${bookletRefs} this.logger.log(`Deleting invalid responses for workspace ${workspaceId}: ${responseIds.join(', ')}`); const persons = await this.personsRepository.find({ - where: { workspace_id: workspaceId } + where: { workspace_id: workspaceId, consider: true } }); if (persons.length === 0) { diff --git a/apps/backend/src/app/database/services/workspace-test-results.service.ts b/apps/backend/src/app/database/services/workspace-test-results.service.ts index b00fa6632..44507ed17 100644 --- a/apps/backend/src/app/database/services/workspace-test-results.service.ts +++ b/apps/backend/src/app/database/services/workspace-test-results.service.ts @@ -64,7 +64,6 @@ export class WorkspaceTestResultsService { `Fetching booklets, bookletInfo data, units, and test results for personId: ${personId} and workspaceId: ${workspaceId}` ); - // Get booklets with bookletInfo in a single query using join const booklets = await this.bookletRepository .createQueryBuilder('booklet') .innerJoinAndSelect('booklet.bookletinfo', 'bookletinfo') @@ -85,7 +84,6 @@ export class WorkspaceTestResultsService { const bookletIds = booklets.map(booklet => booklet.id); - // Get units with responses in a single query using join const units = await this.unitRepository .createQueryBuilder('unit') .leftJoinAndSelect('unit.responses', 'response') @@ -109,11 +107,9 @@ export class WorkspaceTestResultsService { const unitIds = units.map(unit => unit.id); - // Create a map of unit ID to responses const unitResultMap = new Map(); units.forEach(unit => { if (unit.responses) { - // Remove duplicate responses const uniqueResponses = Array.from( new Map(unit.responses.map(response => [response.id, response])).values() ); @@ -121,14 +117,12 @@ export class WorkspaceTestResultsService { } }); - // Get booklet logs in a single query const bookletLogs = await this.bookletLogRepository .createQueryBuilder('bookletLog') .where('bookletLog.bookletid IN (:...bookletIds)', { bookletIds }) .select(['bookletLog.id', 'bookletLog.bookletid', 'bookletLog.ts', 'bookletLog.parameter', 'bookletLog.key']) .getMany(); - // Get sessions in a single query const sessions = await this.sessionRepository .createQueryBuilder('session') .innerJoin('session.booklet', 'booklet') @@ -136,7 +130,6 @@ export class WorkspaceTestResultsService { .select(['session.id', 'session.browser', 'session.os', 'session.screen', 'session.ts', 'booklet.id']) .getMany(); - // Get unit logs in a single query const unitLogs = await this.unitLogRepository .createQueryBuilder('unitLog') .where('unitLog.unitid IN (:...unitIds)', { unitIds }) @@ -158,14 +151,11 @@ export class WorkspaceTestResultsService { }); }); - // Get unit tags in a single batch query instead of multiple individual queries const unitTagsMap = new Map(); - // Only fetch tags if there are units if (unitIds.length > 0) { const allTags = await this.unitTagService.findAllByUnitIds(unitIds); - // Group tags by unit ID allTags.forEach(tag => { if (!unitTagsMap.has(tag.unitId)) { unitTagsMap.set(tag.unitId, []); @@ -174,7 +164,6 @@ export class WorkspaceTestResultsService { }); } - // Group sessions by booklet ID for faster lookup const sessionsMap = new Map(); sessions.forEach(session => { const bookletId = session.booklet?.id; @@ -192,7 +181,6 @@ export class WorkspaceTestResultsService { } }); - // Group booklet logs by booklet ID for faster lookup const bookletLogsMap = new Map(); bookletLogs.forEach(log => { if (!bookletLogsMap.has(log.bookletid)) { @@ -207,7 +195,6 @@ export class WorkspaceTestResultsService { }); }); - // Group units by booklet ID for faster lookup const unitsMap = new Map(); units.forEach(unit => { if (!unitsMap.has(unit.bookletid)) { @@ -256,6 +243,7 @@ export class WorkspaceTestResultsService { try { const queryBuilder = this.personsRepository.createQueryBuilder('person') .where('person.workspace_id = :workspace_id', { workspace_id }) + .andWhere('person.consider = :consider', { consider: true }) .select([ 'person.id', 'person.group', @@ -264,7 +252,6 @@ export class WorkspaceTestResultsService { 'person.uploaded_at' ]); - // Add search condition if searchText is provided if (searchText && searchText.trim() !== '') { queryBuilder.andWhere( '(person.code ILIKE :searchText OR person.group ILIKE :searchText OR person.login ILIKE :searchText)', @@ -278,7 +265,6 @@ export class WorkspaceTestResultsService { .take(validLimit) .orderBy('person.code', 'ASC'); - // Execute query const [results, total] = await queryBuilder.getManyAndCount(); return [results, total]; @@ -319,7 +305,7 @@ export class WorkspaceTestResultsService { const [login, code, bookletId] = connector.split('@'); const person = await this.personsRepository.findOne({ where: { - code, login, workspace_id: workspaceId + code, login, workspace_id: workspaceId, consider: true } }); if (!person) { @@ -368,10 +354,9 @@ export class WorkspaceTestResultsService { } } else if (value.startsWith('{') && value.endsWith('}')) { try { - const jsonArrayString = value.replace(/^\{/, '[').replace(/\}$/, ']'); + const jsonArrayString = value.replace(/^\{/, '[').replace(/}$/, ']'); value = JSON.parse(jsonArrayString); } catch (e) { - // If parsing fails, keep the original value this.logger.warn(`Failed to parse curly brace array: ${value}`); } } @@ -523,7 +508,7 @@ export class WorkspaceTestResultsService { for (const person of existingPersons) { try { await this.journalService.createEntry( - 'system', // userId + 'system', workspaceId, 'delete', 'test-person', diff --git a/apps/frontend/src/app/services/workspace.service.ts b/apps/frontend/src/app/services/workspace.service.ts index 2b9cdd3dc..6df5ae21c 100644 --- a/apps/frontend/src/app/services/workspace.service.ts +++ b/apps/frontend/src/app/services/workspace.service.ts @@ -23,6 +23,21 @@ export class WorkspaceService { return { Authorization: `Bearer ${localStorage.getItem('id_token')}` }; } + markTestTakersAsExcluded(workspaceId: number, logins: string[]): Observable { + if (!workspaceId || !logins.length) { + return of(false); + } + + return this.http.post( + `${this.serverUrl}admin/workspace/${workspaceId}/persons/exclude`, + { logins }, + { headers: this.authHeader } + ).pipe( + map(() => true), + catchError(() => of(false)) + ); + } + getAllWorkspacesList(): Observable { return this.http .get(`${this.serverUrl}admin/workspace`, diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html index 11502631a..987cc11dc 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html @@ -1,7 +1,70 @@ @if (data) {
- @for(val of data; track data){ + @if (filteredTestTakers && filteredTestTakers.length > 0) { +
+ warning +
+

TestTaker zum Filtern:

+ +
+
+ + Alle auswählen + + {{ selection.selected.length }} / {{ filteredTestTakers.length }} +
+ + @for (modeGroup of modeGroups; track modeGroup) { +
+ + {{ modeGroup.mode }} ({{ modeGroup.count }}) + +
+ } +
+ + +
+ + {{ item.testTaker }}: {{ item.login }} ({{ item.mode }}) + +
+
+ +
+ + + @if (isExcluding) { +
+
+
+ } +
+
+
+ } + + @for(val of data.validationResults; track data.validationResults){

person {{val.testTaker}} diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss index f9b182e02..d1bf57f73 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss @@ -94,10 +94,103 @@ h4 { .warning-title { font-weight: 600; color: #d32f2f; - margin-bottom: 8px; + margin-bottom: 16px; font-size: 16px; } + // Mode selection section + .mode-selection { + background-color: rgba(255, 255, 255, 0.6); + border-radius: 6px; + padding: 12px; + margin-bottom: 16px; + border: 1px solid rgba(211, 47, 47, 0.1); + + .select-all-row { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 8px; + padding-bottom: 8px; + border-bottom: 1px dashed rgba(211, 47, 47, 0.1); + + .count-badge { + background-color: #d32f2f; + color: white; + font-size: 12px; + font-weight: 600; + padding: 4px 8px; + border-radius: 12px; + } + } + + .mode-group { + margin-bottom: 6px; + padding: 4px 0; + + &:last-child { + margin-bottom: 0; + } + } + } + + // Test takers list with virtual scrolling + .test-takers-list { + margin: 0; + padding: 0; + height: 200px; // Fixed height required for virtual scrolling + border: 1px solid rgba(211, 47, 47, 0.1); + border-radius: 6px; + background-color: rgba(255, 255, 255, 0.6); + + // Styling for the scrollbar + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb { + background: #c1d5e8; + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb:hover { + background: #a3c0e0; + } + + // Style for each virtual item + .virtual-item { + font-size: 14px; + color: #555; + margin: 0; + line-height: 1.5; + padding: 6px 12px; + border-bottom: 1px dashed rgba(211, 47, 47, 0.1); + + &:last-child { + border-bottom: none; + } + + strong { + color: #d32f2f; + } + + mat-checkbox { + display: block; + width: 100%; + } + } + + // Fix for cdk-virtual-scroll-content-wrapper + .cdk-virtual-scroll-content-wrapper { + width: 100%; + } + } + .scrollable-list { max-height: 150px; overflow-y: auto; @@ -125,6 +218,33 @@ h4 { } } + // Exclude button container and progress bar + .exclude-button-container { + margin-top: 16px; + width: 100%; + position: relative; + + .exclude-button { + width: 100%; + margin-bottom: 4px; + } + + .progress-container { + width: 100%; + height: 4px; + background-color: rgba(211, 47, 47, 0.2); + border-radius: 2px; + overflow: hidden; + margin-top: 4px; + + .progress-bar { + height: 100%; + background-color: #d32f2f; + transition: width 0.3s ease; + } + } + } + ul { margin: 0; padding-left: 16px; diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts index 836f46775..bb188b1c0 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts @@ -8,8 +8,13 @@ import { } from '@angular/material/dialog'; import { NgClass } from '@angular/common'; import { MatButton } from '@angular/material/button'; +import { MatCheckbox } from '@angular/material/checkbox'; import { MatIcon } from '@angular/material/icon'; +import { FormsModule } from '@angular/forms'; +import { SelectionModel } from '@angular/cdk/collections'; +import { ScrollingModule } from '@angular/cdk/scrolling'; import { TranslateModule } from '@ngx-translate/core'; +import { WorkspaceService } from '../../../services/workspace.service'; type FileStatus = { filename: string; @@ -26,6 +31,12 @@ type DataValidation = { files: FileStatus[]; }; +type FilteredTestTaker = { + testTaker: string; + mode: string; + login: string; +}; + type FilesValidation = { testTaker: string, booklets: DataValidation; @@ -53,30 +64,259 @@ interface ExpandedFilesLists { MatButton, TranslateModule, MatDialogClose, - MatIcon + MatIcon, + MatCheckbox, + FormsModule, + ScrollingModule ], styleUrls: ['./files-validation.component.scss'] }) export class FilesValidationDialogComponent { dialogRef = inject>(MatDialogRef); - data = inject(MAT_DIALOG_DATA); + + data = inject<{ + validationResults: FilesValidation[]; + filteredTestTakers?: FilteredTestTaker[]; + workspaceId?: number; + }>(MAT_DIALOG_DATA); + expandedFilesLists: Map = new Map(); + filteredTestTakers: FilteredTestTaker[] = []; + + selection = new SelectionModel(true, []); + + modeGroups: { mode: string, count: number }[] = []; + + allSelected = false; + + private workspaceService = inject(WorkspaceService); + + isExcluding = false; + excludingProgress = 0; + constructor() { - const data = this.data; - if (data) { - data.forEach((val: FilesValidation) => { - this.expandedFilesLists.set(val.testTaker, { - booklets: false, - units: false, - schemes: false, - definitions: false, - player: false + if (this.data) { + if (this.data.validationResults) { + this.data.validationResults.forEach((val: FilesValidation) => { + this.expandedFilesLists.set(val.testTaker, { + booklets: false, + units: false, + schemes: false, + definitions: false, + player: false + }); + }); + } + + if (this.data.filteredTestTakers) { + this.filteredTestTakers = this.data.filteredTestTakers; + + const modeMap = new Map(); + this.filteredTestTakers.forEach(item => { + const count = modeMap.get(item.mode) || 0; + modeMap.set(item.mode, count + 1); + }); + + this.modeGroups = Array.from(modeMap.entries()).map(([mode, count]) => ({ mode, count })); + } + } + } + + toggleSelection(testTaker: FilteredTestTaker): void { + this.selection.toggle(testTaker); + this.checkIfAllSelected(); + } + + toggleAllSelection(): void { + if (this.allSelected) { + this.selection.clear(); + this.allSelected = false; + } else { + if (this.filteredTestTakers.length > 1000) { + // For very large datasets, use batch processing + const batchSize = 500; + const totalItems = this.filteredTestTakers.length; + + const processBatch = (startIndex: number) => { + const endIndex = Math.min(startIndex + batchSize, totalItems); + + for (let i = startIndex; i < endIndex; i++) { + this.selection.select(this.filteredTestTakers[i]); + } + + if (endIndex < totalItems) { + setTimeout(() => processBatch(endIndex), 0); + } + }; + + processBatch(0); + } else { + // For smaller datasets, select all at once + this.selection.select(...this.filteredTestTakers); + } + + this.allSelected = true; + } + } + + toggleModeSelection(mode: string): void { + const testTakersWithMode = this.filteredTestTakers.filter(item => item.mode === mode); + + if (testTakersWithMode.length === 0) { + return; + } + + const allModeSelected = testTakersWithMode.every(item => this.selection.isSelected(item)); + + if (testTakersWithMode.length > 500) { + const batchSize = 200; + const totalItems = testTakersWithMode.length; + + const processBatch = (startIndex: number) => { + const endIndex = Math.min(startIndex + batchSize, totalItems); + + for (let i = startIndex; i < endIndex; i++) { + if (allModeSelected) { + this.selection.deselect(testTakersWithMode[i]); + } else { + this.selection.select(testTakersWithMode[i]); + } + } + + if (endIndex < totalItems) { + setTimeout(() => processBatch(endIndex), 0); + } else { + // When all batches are processed, check if all items are selected + this.checkIfAllSelected(); + } + }; + + // Start batch processing + processBatch(0); + } else { + // For smaller datasets, process all at once + if (allModeSelected) { + // Deselect all test takers with this mode + testTakersWithMode.forEach(item => this.selection.deselect(item)); + } else { + // Select all test takers with this mode + this.selection.select(...testTakersWithMode); + } + + this.checkIfAllSelected(); + } + } + + checkIfAllSelected(): void { + this.allSelected = this.filteredTestTakers.length > 0 && + this.selection.selected.length === this.filteredTestTakers.length; + } + + isModeSelected(mode: string): boolean { + return this.filteredTestTakers + .filter(item => item.mode === mode) + .every(item => this.selection.isSelected(item)); + } + + markTestTakersAsExcluded(): void { + if (!this.data.workspaceId || this.selection.selected.length === 0 || this.isExcluding) { + return; + } + + this.isExcluding = true; + this.excludingProgress = 0; + + if (this.selection.selected.length > 500) { + // Process in batches of 500 items + const batchSize = 500; + const selectedItems = [...this.selection.selected]; + const totalItems = selectedItems.length; + + const processBatch = (startIndex: number) => { + const endIndex = Math.min(startIndex + batchSize, totalItems); + const batchItems = selectedItems.slice(startIndex, endIndex); + + const batchLogins = batchItems.map(item => item.login); + + // Call service to mark this batch as excluded + this.workspaceService.markTestTakersAsExcluded(this.data.workspaceId!, batchLogins) + .subscribe({ + next: success => { + if (success) { + // Remove the processed items from the list + this.filteredTestTakers = this.filteredTestTakers.filter( + item => !batchItems.some(selected => selected.login === item.login) + ); + + // Update progress + this.excludingProgress = Math.round((endIndex / totalItems) * 100); + + // If more batches remain, process the next batch + if (endIndex < totalItems) { + // Update progress before processing next batch + setTimeout(() => processBatch(endIndex), 100); + } else { + // All batches processed + this.selection.clear(); + this.updateModeGroups(); + this.isExcluding = false; + this.excludingProgress = 0; + } + } else { + this.isExcluding = false; + this.excludingProgress = 0; + } + }, + error: () => { + this.isExcluding = false; + this.excludingProgress = 0; + } + }); + }; + + // Start batch processing + processBatch(0); + } else { + // For smaller datasets, process all at once + const logins = this.selection.selected.map(item => item.login); + + // For smaller datasets, show 50% progress immediately and 100% when done + this.excludingProgress = 50; + + // Call service to mark these test takers as excluded + this.workspaceService.markTestTakersAsExcluded(this.data.workspaceId!, logins) + .subscribe({ + next: success => { + if (success) { + // Success - remove the selected test takers from the list + this.filteredTestTakers = this.filteredTestTakers.filter( + item => !this.selection.isSelected(item) + ); + this.selection.clear(); + this.updateModeGroups(); + } + this.isExcluding = false; + this.excludingProgress = 0; + }, + error: () => { + this.isExcluding = false; + this.excludingProgress = 0; + } }); - }); } } + private updateModeGroups(): void { + const modeMap = new Map(); + this.filteredTestTakers.forEach(item => { + const count = modeMap.get(item.mode) || 0; + modeMap.set(item.mode, count + 1); + }); + + this.modeGroups = Array.from(modeMap.entries()).map(([mode, count]) => ({ mode, count })); + } + toggleFilesList(testTaker: string, section: keyof ExpandedFilesLists): void { const sections = this.expandedFilesLists.get(testTaker); if (sections) { @@ -88,4 +328,8 @@ export class FilesValidationDialogComponent { const sections = this.expandedFilesLists.get(testTaker); return sections ? sections[section] : false; } + + trackByFn(index: number, item: FilteredTestTaker): string { + return `${item.testTaker}-${item.login}-${item.mode}`; + } } diff --git a/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts b/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts index 4446626b7..80ee0e8ff 100755 --- a/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts +++ b/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts @@ -326,14 +326,22 @@ export class TestFilesComponent implements OnInit, OnDestroy { this.dialog.open(FilesValidationDialogComponent, { width: '600px', - data: res.validationResults + data: { + validationResults: res.validationResults, + filteredTestTakers: res.filteredTestTakers, + workspaceId: this.appService.selectedWorkspaceId + } }); } }); } else { this.dialog.open(FilesValidationDialogComponent, { width: '600px', - data: res.validationResults + data: { + validationResults: res.validationResults, + filteredTestTakers: res.filteredTestTakers, + workspaceId: this.appService.selectedWorkspaceId + } }); } } diff --git a/database/changelog/coding-box.changelog-0.9.3.sql b/database/changelog/coding-box.changelog-0.9.3.sql new file mode 100644 index 000000000..2a961ff90 --- /dev/null +++ b/database/changelog/coding-box.changelog-0.9.3.sql @@ -0,0 +1,11 @@ +-- liquibase formatted sql + +-- changeset jurei733:1 +-- The consider field is used to mark test takers as excluded from consideration +-- When set to false, the test taker is excluded and not included in reports or analysis +ALTER TABLE "public"."persons" ADD COLUMN IF NOT EXISTS "consider" BOOLEAN DEFAULT TRUE; + +CREATE INDEX IF NOT EXISTS idx_persons_consider ON "public"."persons"(consider); +CREATE INDEX IF NOT EXISTS idx_persons_workspace_consider ON "public"."persons"(workspace_id, consider); + +-- rollback ALTER TABLE "public"."persons" DROP COLUMN IF EXISTS "consider"; DROP INDEX IF EXISTS idx_persons_consider; DROP INDEX IF EXISTS idx_persons_workspace_consider; diff --git a/database/changelog/coding-box.changelog-root.xml b/database/changelog/coding-box.changelog-root.xml index c71cc69ef..d7a53f5de 100644 --- a/database/changelog/coding-box.changelog-root.xml +++ b/database/changelog/coding-box.changelog-root.xml @@ -17,4 +17,5 @@ + From 1069dd1ea719800f326b64afed6721c8ed41a145 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Thu, 17 Jul 2025 19:47:31 +0200 Subject: [PATCH 12/21] Highlight the aspect section in replay where the variable anchor is found --- .../workspace/workspace-files.controller.ts | 4 +- .../services/workspace-coding.service.ts | 2 +- .../workspace-test-results.service.ts | 2 +- .../components/replay/replay.component.ts | 3 +- .../src/app/replay/utils/dom-utils.ts | 85 ++++++++++++------- 5 files changed, 58 insertions(+), 38 deletions(-) diff --git a/apps/backend/src/app/admin/workspace/workspace-files.controller.ts b/apps/backend/src/app/admin/workspace/workspace-files.controller.ts index adca6cc59..41d769260 100644 --- a/apps/backend/src/app/admin/workspace/workspace-files.controller.ts +++ b/apps/backend/src/app/admin/workspace/workspace-files.controller.ts @@ -349,9 +349,7 @@ export class WorkspaceFilesController { } try { - const codingSchemeFile = await this.workspaceFilesService.getCodingSchemeByRef(workspace_id, coding_scheme_ref); - - return codingSchemeFile; + return await this.workspaceFilesService.getCodingSchemeByRef(workspace_id, coding_scheme_ref); } catch (error) { if (error.status === 404) { throw error; diff --git a/apps/backend/src/app/database/services/workspace-coding.service.ts b/apps/backend/src/app/database/services/workspace-coding.service.ts index d23443a32..9db6f3f05 100644 --- a/apps/backend/src/app/database/services/workspace-coding.service.ts +++ b/apps/backend/src/app/database/services/workspace-coding.service.ts @@ -1318,7 +1318,7 @@ export class WorkspaceCodingService { } private statisticsCache: Map = new Map(); - private readonly CACHE_TTL_MS = 1 * 60 * 1000; // 1 minute cache TTL + private readonly CACHE_TTL_MS = 60 * 1000; // 1 minute cache TTL async getCodingStatistics(workspace_id: number): Promise { this.logger.log(`Getting coding statistics for workspace ${workspace_id}`); diff --git a/apps/backend/src/app/database/services/workspace-test-results.service.ts b/apps/backend/src/app/database/services/workspace-test-results.service.ts index 44507ed17..3b948fd91 100644 --- a/apps/backend/src/app/database/services/workspace-test-results.service.ts +++ b/apps/backend/src/app/database/services/workspace-test-results.service.ts @@ -395,7 +395,7 @@ export class WorkspaceTestResultsService { } private responsesByStatusCache: Map = new Map(); - private readonly RESPONSES_CACHE_TTL_MS = 1 * 60 * 1000; // 1 minute cache TTL + private readonly RESPONSES_CACHE_TTL_MS = 60 * 1000; // 1 minute cache TTL async getResponsesByStatus(workspace_id: number, status: string, options?: { page: number; limit: number }): Promise<[ResponseEntity[], number]> { this.logger.log(`Getting responses with status ${status} for workspace ${workspace_id}`); diff --git a/apps/frontend/src/app/replay/components/replay/replay.component.ts b/apps/frontend/src/app/replay/components/replay/replay.component.ts index a53e3c4df..49b9af9e5 100755 --- a/apps/frontend/src/app/replay/components/replay/replay.component.ts +++ b/apps/frontend/src/app/replay/components/replay/replay.component.ts @@ -24,7 +24,7 @@ import { SpinnerComponent } from '../spinner/spinner.component'; import { FilesDto } from '../../../../../../../api-dto/files/files.dto'; import { ErrorMessages } from '../../models/error-messages.model'; import { validateToken, isTestperson } from '../../utils/token-utils'; -import { scrollToElementByAlias } from '../../utils/dom-utils'; +import { scrollToElementByAlias, highlightAspectSectionWithAnchor } from '../../utils/dom-utils'; @Component({ selector: 'coding-box-replay', @@ -131,6 +131,7 @@ export class ReplayComponent implements OnInit, OnDestroy, OnChanges { setTimeout(() => { if (this.unitPlayerComponent?.hostingIframe?.nativeElement) { if (this.anchor) { + highlightAspectSectionWithAnchor(this.unitPlayerComponent.hostingIframe.nativeElement, this.anchor); scrollToElementByAlias(this.unitPlayerComponent.hostingIframe.nativeElement, this.anchor); } else { // When no anchor is provided, scroll to the top of the content diff --git a/apps/frontend/src/app/replay/utils/dom-utils.ts b/apps/frontend/src/app/replay/utils/dom-utils.ts index 8b6fcd545..a667cb3da 100644 --- a/apps/frontend/src/app/replay/utils/dom-utils.ts +++ b/apps/frontend/src/app/replay/utils/dom-utils.ts @@ -3,75 +3,96 @@ */ /** - * Searches for div elements with data-element-alias attribute in the player's HTML - * and returns an object mapping the aliases to their corresponding elements. + * Highlights the direct child div elements of aspect-section tags that contain an element with the specified anchor. + * If an anchor is provided, finds aspect-section tags that contain the element with that data-element-alias + * and highlights their direct child div elements with a blue border. * * @param iframe The iframe element containing the player's HTML - * @returns An object mapping data-element-alias values to their HTML elements + * @param anchor Optional data-element-alias to filter aspect-section tags + * @returns An array of the found aspect-section elements */ -export function findElementsByDataAlias(iframe: HTMLIFrameElement): Record { - const result: Record = {}; +export function highlightAspectSectionWithAnchor(iframe: HTMLIFrameElement, anchor?: string): HTMLElement[] { + const result: HTMLElement[] = []; try { - // Check if the iframe has loaded content if (iframe.contentDocument) { - // Query for all div elements with data-element-alias attribute - const elements = iframe.contentDocument.querySelectorAll('div[data-element-alias]'); + const allAspectSections = iframe.contentDocument.querySelectorAll('aspect-section'); + Array.from(allAspectSections).forEach(element => { + const directChildDivs = element.querySelectorAll(':scope > div'); + directChildDivs.forEach(div => { + (div as HTMLElement).style.border = ''; + }); + }); - // Create a mapping of aliases to elements - elements.forEach((element: Element) => { - const alias = element.getAttribute('data-element-alias'); - if (alias) { - result[alias] = element as HTMLElement; + let filteredElements: Element[] = Array.from(allAspectSections); + + // If anchor is provided, filter aspect-section tags that contain the element with the specified anchor + if (anchor) { + const elements = findElementsByDataAlias(iframe); + const anchorElement = elements[anchor]; + + if (anchorElement) { + // Filter aspect-section tags that contain the anchor element + filteredElements = Array.from(allAspectSections).filter(aspectSection => aspectSection.contains(anchorElement)); + + // Visually highlight the direct child div elements of filtered aspect-section tags + filteredElements.forEach(element => { + const directChildDivs = element.querySelectorAll(':scope > div'); + directChildDivs.forEach(div => { + (div as HTMLElement).style.border = '3px solid #4285f4'; // Google blue color + }); + }); } + } + + filteredElements.forEach((element: Element) => { + result.push(element as HTMLElement); }); } } catch (error) { - console.error('Error searching for elements with data-element-alias:', error); + // Silently handle errors } return result; } /** - * Returns the values of the data-element-alias attributes found in the player's HTML. + * Searches for div elements with data-element-alias attribute in the player's HTML + * and returns an object mapping the aliases to their corresponding elements. * * @param iframe The iframe element containing the player's HTML - * @returns An array of data-element-alias values + * @returns An object mapping data-element-alias values to their HTML elements */ -export function getDataElementAliases(iframe: HTMLIFrameElement): string[] { +export function findElementsByDataAlias(iframe: HTMLIFrameElement): Record { + const result: Record = {}; + try { - // Check if the iframe has loaded content if (iframe.contentDocument) { // Query for all div elements with data-element-alias attribute const elements = iframe.contentDocument.querySelectorAll('div[data-element-alias]'); - // Extract and return the alias values - return Array.from(elements) - .map(element => element.getAttribute('data-element-alias')) - .filter((alias): alias is string => alias !== null); + // Create a mapping of aliases to elements + elements.forEach((element: Element) => { + const alias = element.getAttribute('data-element-alias'); + if (alias) { + result[alias] = element as HTMLElement; + } + }); } } catch (error) { - console.error('Error getting data-element-alias values:', error); + console.error('Error searching for elements with data-element-alias:', error); } - return []; + return result; } -/** - * Scrolls to a div element with the specified data-element-alias in the player's HTML. - * - * @param iframe The iframe element containing the player's HTML - * @param alias The data-element-alias value of the element to scroll to - * @param options Optional scroll behavior options - * @returns True if the element was found and scrolled to, false otherwise - */ export function scrollToElementByAlias( iframe: HTMLIFrameElement, alias: string, options?: ScrollIntoViewOptions ): boolean { try { + console.log(iframe); const elements = findElementsByDataAlias(iframe); const element = elements[alias]; if (element) { From 6b1e1433dd3c4dfb17ba077f39bba917aef04c20 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Thu, 17 Jul 2025 20:29:20 +0200 Subject: [PATCH 13/21] Check for double test taker entries --- api-dto/files/file-validation-result.dto.ts | 11 ++++ .../services/workspace-files.service.ts | 23 +++++++- .../src/app/services/workspace.service.ts | 21 +++++++ .../files-validation.component.html | 43 ++++++++++++++ .../files-validation.component.scss | 56 +++++++++++++++++- .../files-validation.component.ts | 59 +++++++++++++++++++ .../test-files/test-files.component.ts | 7 +-- 7 files changed, 213 insertions(+), 7 deletions(-) diff --git a/api-dto/files/file-validation-result.dto.ts b/api-dto/files/file-validation-result.dto.ts index 2dbe1a9a2..5ab8f03e2 100644 --- a/api-dto/files/file-validation-result.dto.ts +++ b/api-dto/files/file-validation-result.dto.ts @@ -20,6 +20,14 @@ export type FilteredTestTaker = { login: string; }; +export type DuplicateTestTaker = { + login: string; + occurrences: { + testTaker: string; + mode: string; + }[]; +}; + export class FileValidationResultDto { @ApiProperty({ type: Boolean, description: 'Indicates whether test takers were found' }) testTakersFound!: boolean; @@ -27,6 +35,9 @@ export class FileValidationResultDto { @ApiProperty({ type: [Object], description: 'Array of filtered test takers with specific modes' }) filteredTestTakers?: FilteredTestTaker[]; + @ApiProperty({ type: [Object], description: 'Array of duplicate test takers found across files' }) + duplicateTestTakers?: DuplicateTestTaker[]; + @ApiProperty({ type: [Object], description: 'Array of validation results for each test taker' }) validationResults!: { testTaker: string; diff --git a/apps/backend/src/app/database/services/workspace-files.service.ts b/apps/backend/src/app/database/services/workspace-files.service.ts index 2bcd5b23e..5ee597681 100644 --- a/apps/backend/src/app/database/services/workspace-files.service.ts +++ b/apps/backend/src/app/database/services/workspace-files.service.ts @@ -211,6 +211,7 @@ export class WorkspaceFilesService { const shouldFilterMode = (loginMode: string) => !modesNotToFilter.includes(loginMode); let filteredTestTakers: FilteredTestTaker[] = []; + const loginOccurrences = new Map(); for (const testTaker of testTakers) { const xmlDocument = cheerio.load(testTaker.data, { xml: true }); @@ -225,17 +226,33 @@ export class WorkspaceFilesService { const loginName = xmlDocument(loginElement).attr('name'); const loginMode = xmlDocument(loginElement).attr('mode'); - if (loginMode && shouldFilterMode(loginMode)) { + if (loginMode && shouldFilterMode(loginMode) && loginName) { filteredTestTakers.push({ testTaker: testTaker.file_id, mode: loginMode, - login: loginName || '' + login: loginName }); + + const occurrences = loginOccurrences.get(loginName) || []; + occurrences.push({ + testTaker: testTaker.file_id, + mode: loginMode + }); + loginOccurrences.set(loginName, occurrences); } } } } + const duplicateTestTakers = Array.from(loginOccurrences.entries()) + .filter(([, occurrences]) => occurrences.length > 1) + .map(([login, occurrences]) => ({ + login, + occurrences + })); + + this.logger.log(`Found ${duplicateTestTakers.length} duplicate test takers across files`); + if (filteredTestTakers.length > 0) { const loginNames = filteredTestTakers.map(item => item.login); const personsNotConsidered = await this.personsRepository.find({ @@ -282,6 +299,7 @@ export class WorkspaceFilesService { return { testTakersFound: true, filteredTestTakers: filteredTestTakers.length > 0 ? filteredTestTakers : undefined, + duplicateTestTakers: duplicateTestTakers.length > 0 ? duplicateTestTakers : undefined, validationResults }; } @@ -294,6 +312,7 @@ export class WorkspaceFilesService { return { testTakersFound: true, filteredTestTakers: filteredTestTakers.length > 0 ? filteredTestTakers : undefined, + duplicateTestTakers: duplicateTestTakers.length > 0 ? duplicateTestTakers : undefined, validationResults: emptyValidation }; } catch (error) { diff --git a/apps/frontend/src/app/services/workspace.service.ts b/apps/frontend/src/app/services/workspace.service.ts index 6df5ae21c..6f2368a74 100644 --- a/apps/frontend/src/app/services/workspace.service.ts +++ b/apps/frontend/src/app/services/workspace.service.ts @@ -105,4 +105,25 @@ export class WorkspaceService { userIds, { headers: this.authHeader }); } + + /** + * Resolves duplicate test takers by keeping only the selected occurrences + * @param workspaceId The ID of the workspace + * @param resolutionMap A map of login names to selected test taker files + * @returns An Observable that emits true if the operation was successful, false otherwise + */ + resolveDuplicateTestTakers(workspaceId: number, resolutionMap: Record): Observable { + if (!workspaceId || !Object.keys(resolutionMap).length) { + return of(false); + } + + return this.http.post( + `${this.serverUrl}admin/workspace/${workspaceId}/testtakers/resolve-duplicates`, + { resolutionMap }, + { headers: this.authHeader } + ).pipe( + map(() => true), + catchError(() => of(false)) + ); + } } diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html index 987cc11dc..8a22736b2 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.html @@ -1,6 +1,49 @@ @if (data) {
+ @if (duplicateTestTakers && duplicateTestTakers.length > 0) { +
+ error +
+

Doppelte TestTaker gefunden:

+

Die folgenden Login-Namen wurden in mehreren TestTaker-Dateien gefunden. Bitte wählen Sie aus, welche Vorkommen Sie behalten möchten.

+ + @for (duplicate of duplicateTestTakers; track duplicate.login) { +
+ +
+ @for (occurrence of duplicate.occurrences; track occurrence.testTaker) { +
+ + {{ occurrence.testTaker }} ({{ occurrence.mode }}) + +
+ } +
+
+ } + +
+ +
+
+
+ } + @if (filteredTestTakers && filteredTestTakers.length > 0) {
warning diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss index d1bf57f73..103a54ad8 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.scss @@ -13,7 +13,7 @@ mat-dialog-content { } .scroll-container { - max-height: 600px; + max-height: 750px; overflow-y: auto; padding: 0; margin: 0; @@ -79,6 +79,60 @@ h4 { align-items: flex-start; animation: fadeIn 0.3s ease-in-out; + &.duplicate-testtakers-warning { + background-color: #fff3e0; + border: 1px solid rgba(255, 152, 0, 0.3); + + .warning-title { + color: #e65100; + } + + .warning-icon { + color: #e65100; + } + + .duplicate-item { + background-color: rgba(255, 255, 255, 0.6); + border-radius: 6px; + padding: 12px; + margin-bottom: 16px; + border: 1px solid rgba(255, 152, 0, 0.2); + + &:last-child { + margin-bottom: 0; + } + + .duplicate-login { + font-weight: 600; + color: #e65100; + margin-bottom: 8px; + font-size: 15px; + } + + .duplicate-occurrences { + margin-left: 16px; + + .occurrence-item { + margin-bottom: 8px; + padding: 4px 0; + + &:last-child { + margin-bottom: 0; + } + } + } + } + + .resolve-button-container { + margin-top: 16px; + width: 100%; + + .resolve-button { + width: 100%; + } + } + } + .warning-icon { color: #d32f2f; margin-right: 12px; diff --git a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts index bb188b1c0..c4692509d 100644 --- a/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts +++ b/apps/frontend/src/app/ws-admin/components/files-validation-result/files-validation.component.ts @@ -15,6 +15,7 @@ import { SelectionModel } from '@angular/cdk/collections'; import { ScrollingModule } from '@angular/cdk/scrolling'; import { TranslateModule } from '@ngx-translate/core'; import { WorkspaceService } from '../../../services/workspace.service'; +import { DuplicateTestTaker } from '../../../../../../../api-dto/files/file-validation-result.dto'; type FileStatus = { filename: string; @@ -77,18 +78,22 @@ export class FilesValidationDialogComponent { data = inject<{ validationResults: FilesValidation[]; filteredTestTakers?: FilteredTestTaker[]; + duplicateTestTakers?: DuplicateTestTaker[]; workspaceId?: number; }>(MAT_DIALOG_DATA); expandedFilesLists: Map = new Map(); filteredTestTakers: FilteredTestTaker[] = []; + duplicateTestTakers: DuplicateTestTaker[] = []; selection = new SelectionModel(true, []); + duplicateSelection = new Map(); // Maps login to selected testTaker file modeGroups: { mode: string, count: number }[] = []; allSelected = false; + isResolvingDuplicates = false; private workspaceService = inject(WorkspaceService); @@ -120,7 +125,61 @@ export class FilesValidationDialogComponent { this.modeGroups = Array.from(modeMap.entries()).map(([mode, count]) => ({ mode, count })); } + + if (this.data.duplicateTestTakers) { + this.duplicateTestTakers = this.data.duplicateTestTakers; + + // Initialize selection with the first occurrence for each duplicate + this.duplicateTestTakers.forEach(duplicate => { + if (duplicate.occurrences.length > 0) { + this.duplicateSelection.set(duplicate.login, duplicate.occurrences[0].testTaker); + } + }); + } + } + } + + // Select which occurrence of a duplicate test taker to keep + selectDuplicateOccurrence(login: string, testTaker: string): void { + this.duplicateSelection.set(login, testTaker); + } + + // Get the selected occurrence for a duplicate test taker + getSelectedOccurrence(login: string): string | undefined { + return this.duplicateSelection.get(login); + } + + // Resolve duplicate test takers by keeping only the selected occurrences + resolveDuplicateTestTakers(): void { + if (!this.data.workspaceId || this.duplicateTestTakers.length === 0 || this.isResolvingDuplicates) { + return; } + + this.isResolvingDuplicates = true; + + // Create a map of login -> selected testTaker file + const resolutionMap = new Map(); + this.duplicateTestTakers.forEach(duplicate => { + const selectedTestTaker = this.duplicateSelection.get(duplicate.login); + if (selectedTestTaker) { + resolutionMap.set(duplicate.login, selectedTestTaker); + } + }); + + // Call service to resolve duplicates + this.workspaceService.resolveDuplicateTestTakers(this.data.workspaceId, Object.fromEntries(resolutionMap)) + .subscribe({ + next: success => { + if (success) { + // Remove resolved duplicates from the list + this.duplicateTestTakers = []; + } + this.isResolvingDuplicates = false; + }, + error: () => { + this.isResolvingDuplicates = false; + } + }); } toggleSelection(testTaker: FilteredTestTaker): void { diff --git a/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts b/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts index 80ee0e8ff..04f551d1f 100755 --- a/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts +++ b/apps/frontend/src/app/ws-admin/components/test-files/test-files.component.ts @@ -206,7 +206,7 @@ export class TestFilesComponent implements OnInit, OnDestroy { private onUploadSuccess(): void { setTimeout(() => { this.loadTestFiles(); - }, 1000); // Optional timeout to simulate processing delay + }, 1000); this.isLoading = false; this.isValidating = false; } @@ -317,7 +317,6 @@ export class TestFilesComponent implements OnInit, OnDestroy { } }); } else { - // User doesn't want to create a dummy testtaker file this.snackBar.open( 'Keine Testtaker-Dateien vorhanden.', 'OK', @@ -325,7 +324,7 @@ export class TestFilesComponent implements OnInit, OnDestroy { ); this.dialog.open(FilesValidationDialogComponent, { - width: '600px', + width: '900px', data: { validationResults: res.validationResults, filteredTestTakers: res.filteredTestTakers, @@ -336,7 +335,7 @@ export class TestFilesComponent implements OnInit, OnDestroy { }); } else { this.dialog.open(FilesValidationDialogComponent, { - width: '600px', + width: '900px', data: { validationResults: res.validationResults, filteredTestTakers: res.filteredTestTakers, From 85274123cd783604e41df8d7e3901edaf105cfd0 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Fri, 18 Jul 2025 22:27:37 +0200 Subject: [PATCH 14/21] Validate for duplicate responses --- api-dto/files/duplicate-response.dto.ts | 20 + .../workspace/dto/validation-task.dto.ts | 2 +- .../workspace/validation-task.controller.ts | 20 +- .../workspace/workspace-files.controller.ts | 61 +++ .../entities/validation-task.entity.ts | 2 +- .../services/validation-task.service.ts | 11 +- .../services/workspace-files.service.ts | 210 +++++++++- .../duplicate-response-selection.dto.ts | 32 ++ .../src/app/models/validation-task.dto.ts | 2 +- .../components/replay/replay.component.ts | 14 - .../src/app/services/backend.service.ts | 6 +- .../services/validation-task-state.service.ts | 7 +- .../src/app/services/validation.service.ts | 48 ++- .../validation-dialog.component.html | 127 +++++- .../validation-dialog.component.ts | 388 +++++++++++++++++- 15 files changed, 898 insertions(+), 52 deletions(-) create mode 100644 api-dto/files/duplicate-response.dto.ts create mode 100644 apps/frontend/src/app/models/duplicate-response-selection.dto.ts diff --git a/api-dto/files/duplicate-response.dto.ts b/api-dto/files/duplicate-response.dto.ts new file mode 100644 index 000000000..adc4d1d59 --- /dev/null +++ b/api-dto/files/duplicate-response.dto.ts @@ -0,0 +1,20 @@ +export interface DuplicateResponseDto { + unitName: string; + unitId: number; + variableId: string; + bookletName: string; + testTakerLogin: string; + duplicates: { + responseId: number; + value: string; + status: string; + timestamp?: number; + }[]; +} + +export interface DuplicateResponsesResultDto { + data: DuplicateResponseDto[]; + total: number; + page: number; + limit: number; +} diff --git a/apps/backend/src/app/admin/workspace/dto/validation-task.dto.ts b/apps/backend/src/app/admin/workspace/dto/validation-task.dto.ts index 853b4b5d7..3a0b81dd9 100644 --- a/apps/backend/src/app/admin/workspace/dto/validation-task.dto.ts +++ b/apps/backend/src/app/admin/workspace/dto/validation-task.dto.ts @@ -3,7 +3,7 @@ import { ValidationTask } from '../../../database/entities/validation-task.entit export class ValidationTaskDto { id: number; workspace_id: number; - validation_type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses'; + validation_type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses' | 'duplicateResponses'; status: 'pending' | 'processing' | 'completed' | 'failed'; progress?: number; error?: string; diff --git a/apps/backend/src/app/admin/workspace/validation-task.controller.ts b/apps/backend/src/app/admin/workspace/validation-task.controller.ts index 01bfa266a..ac1192a88 100644 --- a/apps/backend/src/app/admin/workspace/validation-task.controller.ts +++ b/apps/backend/src/app/admin/workspace/validation-task.controller.ts @@ -32,16 +32,30 @@ export class ValidationTaskController { @ApiQuery({ name: 'limit', description: 'Page size', required: false }) async createValidationTask( @WorkspaceId() workspaceId: number, - @Query('type') type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses', + @Query('type') type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses' | 'duplicateResponses', @Query('page') page?: number, - @Query('limit') limit?: number + @Query('limit') limit?: number, + @Query() allQueryParams?: Record ): Promise { this.logger.log(`Creating validation task of type ${type} for workspace ${workspaceId}`); + + // Extract additional data from query parameters + const additionalData: Record = {}; + if (allQueryParams) { + // Copy all query parameters except type, page, and limit + Object.entries(allQueryParams).forEach(([key, value]) => { + if (key !== 'type' && key !== 'page' && key !== 'limit') { + additionalData[key] = value; + } + }); + } + const task = await this.validationTaskService.createValidationTask( workspaceId, type, page, - limit + limit, + Object.keys(additionalData).length > 0 ? additionalData : undefined ); return ValidationTaskDto.fromEntity(task); } diff --git a/apps/backend/src/app/admin/workspace/workspace-files.controller.ts b/apps/backend/src/app/admin/workspace/workspace-files.controller.ts index 41d769260..566b65c63 100644 --- a/apps/backend/src/app/admin/workspace/workspace-files.controller.ts +++ b/apps/backend/src/app/admin/workspace/workspace-files.controller.ts @@ -20,6 +20,7 @@ import { FileValidationResultDto } from '../../../../../../api-dto/files/file-va import { WorkspaceFilesService } from '../../database/services/workspace-files.service'; import { InvalidVariableDto } from '../../../../../../api-dto/files/variable-validation.dto'; import { TestTakersValidationDto } from '../../../../../../api-dto/files/testtakers-validation.dto'; +import { DuplicateResponsesResultDto } from '../../../../../../api-dto/files/duplicate-response.dto'; import { PersonService } from '../../database/services/person.service'; @ApiTags('Admin Workspace Files') @@ -463,6 +464,66 @@ export class WorkspaceFilesController { return this.workspaceFilesService.validateResponseStatus(workspace_id, page, limit); } + @Get(':workspace_id/files/validate-duplicate-responses') + @ApiTags('test files validation') + @UseGuards(JwtAuthGuard, WorkspaceGuard) + @ApiOperation({ summary: 'Validate duplicate responses', description: 'Identifies duplicate responses (same variable ID for the same unit, booklet, and test taker)' }) + @ApiParam({ name: 'workspace_id', type: Number, description: 'ID of the workspace' }) + @ApiQuery({ + name: 'page', + required: false, + description: 'Page number for pagination', + type: Number + }) + @ApiQuery({ + name: 'limit', + required: false, + description: 'Number of items per page', + type: Number + }) + @ApiOkResponse({ + description: 'Duplicate responses validation result', + schema: { + type: 'object', + properties: { + data: { + type: 'array', + items: { + type: 'object', + properties: { + unitName: { type: 'string' }, + unitId: { type: 'number' }, + variableId: { type: 'string' }, + bookletName: { type: 'string' }, + testTakerLogin: { type: 'string' }, + duplicates: { + type: 'array', + items: { + type: 'object', + properties: { + responseId: { type: 'number' }, + value: { type: 'string' }, + status: { type: 'string' } + } + } + } + } + } + }, + total: { type: 'number' }, + page: { type: 'number' }, + limit: { type: 'number' } + } + } + }) + async validateDuplicateResponses( + @Param('workspace_id') workspace_id: number, + @Query('page') page: number = 1, + @Query('limit') limit: number = 10 + ): Promise { + return this.workspaceFilesService.validateDuplicateResponses(workspace_id, page, limit); + } + @Get(':workspace_id/files/validate-variables') @ApiTags('test files validation') @UseGuards(JwtAuthGuard, WorkspaceGuard) diff --git a/apps/backend/src/app/database/entities/validation-task.entity.ts b/apps/backend/src/app/database/entities/validation-task.entity.ts index 9a84950e2..380703e2d 100644 --- a/apps/backend/src/app/database/entities/validation-task.entity.ts +++ b/apps/backend/src/app/database/entities/validation-task.entity.ts @@ -20,7 +20,7 @@ export class ValidationTask extends Job { * - 'deleteAllResponses': Delete all invalid responses of a specific type */ @Column() - validation_type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses'; + validation_type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses' | 'duplicateResponses'; /** * Pagination parameters for paginated results diff --git a/apps/backend/src/app/database/services/validation-task.service.ts b/apps/backend/src/app/database/services/validation-task.service.ts index 8df1f7266..6d8913914 100644 --- a/apps/backend/src/app/database/services/validation-task.service.ts +++ b/apps/backend/src/app/database/services/validation-task.service.ts @@ -16,7 +16,7 @@ export class ValidationTaskService { async createValidationTask( workspaceId: number, - validationType: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses', + validationType: 'variables' | 'variableTypes' | 'responseStatus' | 'duplicateResponses' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses', page?: number, limit?: number, additionalData?: Record @@ -124,6 +124,13 @@ export class ValidationTaskService { task.limit || 10 ); break; + case 'duplicateResponses': + result = await this.validationService.validateDuplicateResponses( + task.workspace_id, + task.page || 1, + task.limit || 10 + ); + break; case 'testTakers': result = await this.validationService.validateTestTakers(task.workspace_id); break; @@ -148,7 +155,7 @@ export class ValidationTaskService { break; case 'deleteAllResponses': if (taskData && typeof taskData.validationType === 'string') { - const validationType = taskData.validationType as 'variables' | 'variableTypes' | 'responseStatus'; + const validationType = taskData.validationType as 'variables' | 'variableTypes' | 'responseStatus' | 'duplicateResponses'; const deletedCount = await this.validationService.deleteAllInvalidResponses( task.workspace_id, validationType diff --git a/apps/backend/src/app/database/services/workspace-files.service.ts b/apps/backend/src/app/database/services/workspace-files.service.ts index 5ee597681..d2772dc20 100644 --- a/apps/backend/src/app/database/services/workspace-files.service.ts +++ b/apps/backend/src/app/database/services/workspace-files.service.ts @@ -14,8 +14,10 @@ import { FileDownloadDto } from '../../../../../../api-dto/files/file-download.d import { FileValidationResultDto, FilteredTestTaker } from '../../../../../../api-dto/files/file-validation-result.dto'; import { ResponseDto } from '../../../../../../api-dto/responses/response-dto'; import { InvalidVariableDto } from '../../../../../../api-dto/files/variable-validation.dto'; +import { DuplicateResponseDto, DuplicateResponsesResultDto } from '../../../../../../api-dto/files/duplicate-response.dto'; import { Unit } from '../entities/unit.entity'; import { ResponseEntity } from '../entities/response.entity'; +import { Booklet } from '../entities/booklet.entity'; import { MissingPersonDto, TestTakerLoginDto, @@ -88,8 +90,9 @@ export class WorkspaceFilesService { @InjectRepository(FileUpload) private filesRepository: Repository, @InjectRepository(Persons) - private personsRepository: Repository - + private personsRepository: Repository, + @InjectRepository(Booklet) + private bookletRepository: Repository ) {} async findAllFileTypes(workspaceId: number): Promise { @@ -1767,6 +1770,175 @@ ${bookletRefs} } } + async validateDuplicateResponses(workspaceId: number, page: number = 1, limit: number = 10): Promise { + if (!workspaceId) { + this.logger.error('Workspace ID is required for validateDuplicateResponses'); + return { + data: [], + total: 0, + page, + limit + }; + } + + // Get all persons in the workspace that should be considered + const persons = await this.personsRepository.find({ + where: { workspace_id: workspaceId, consider: true } + }); + + if (persons.length === 0) { + this.logger.warn(`No persons found for workspace ${workspaceId}`); + return { + data: [], + total: 0, + page, + limit + }; + } + + const personIds = persons.map(person => person.id); + const personMap = new Map(persons.map(person => [person.id, person])); + + // Get all booklets for these persons + const booklets = await this.bookletRepository.find({ + where: { personid: In(personIds) }, + relations: ['bookletinfo'] + }); + + if (booklets.length === 0) { + this.logger.warn(`No booklets found for persons in workspace ${workspaceId}`); + return { + data: [], + total: 0, + page, + limit + }; + } + + const bookletMap = new Map(booklets.map(booklet => [booklet.id, booklet])); + + // Get all units for these booklets + const batchSize = 1000; + let allUnits: Unit[] = []; + const bookletIds = booklets.map(booklet => booklet.id); + + for (let i = 0; i < bookletIds.length; i += batchSize) { + const bookletIdsBatch = bookletIds.slice(i, i + batchSize); + const unitsBatch = await this.unitRepository.find({ + where: { bookletid: In(bookletIdsBatch) } + }); + allUnits = [...allUnits, ...unitsBatch]; + } + + if (allUnits.length === 0) { + this.logger.warn(`No units found for booklets in workspace ${workspaceId}`); + return { + data: [], + total: 0, + page, + limit + }; + } + + const unitIds = allUnits.map(unit => unit.id); + const unitMap = new Map(allUnits.map(unit => [unit.id, unit])); + + // Get all responses for these units + let allResponses: ResponseEntity[] = []; + for (let i = 0; i < unitIds.length; i += batchSize) { + const unitIdsBatch = unitIds.slice(i, i + batchSize); + const responsesBatch = await this.responseRepository.find({ + where: { unitid: In(unitIdsBatch) } + }); + allResponses = [...allResponses, ...responsesBatch]; + } + + if (allResponses.length === 0) { + this.logger.warn(`No responses found for units in workspace ${workspaceId}`); + return { + data: [], + total: 0, + page, + limit + }; + } + + // Group responses by unitid and variableid + const responseGroups = new Map(); + for (const response of allResponses) { + const key = `${response.unitid}_${response.variableid}`; + if (!responseGroups.has(key)) { + responseGroups.set(key, []); + } + responseGroups.get(key)?.push(response); + } + + // Find groups with more than one response (duplicates) + const duplicateResponses: DuplicateResponseDto[] = []; + for (const [, responses] of responseGroups.entries()) { + if (responses.length > 1) { + // Get the first response to extract unit information + const firstResponse = responses[0]; + const unit = unitMap.get(firstResponse.unitid); + + if (!unit) { + this.logger.warn(`Unit not found for response ${firstResponse.id}`); + continue; + } + + const booklet = bookletMap.get(unit.bookletid); + if (!booklet) { + this.logger.warn(`Booklet not found for unit ${unit.id}`); + continue; + } + + const person = personMap.get(booklet.personid); + if (!person) { + this.logger.warn(`Person not found for booklet ${booklet.id}`); + continue; + } + + const bookletName = booklet.bookletinfo?.name || 'Unknown'; + + duplicateResponses.push({ + unitName: unit.name, + unitId: unit.id, + variableId: firstResponse.variableid, + bookletName, + testTakerLogin: person.login, + duplicates: responses.map(response => ({ + responseId: response.id, + value: response.value || '', + status: response.status + // We don't have timestamp in the response entity, but could add if needed + })) + }); + } + } + + // Sort duplicates by unitName, variableId for consistent ordering + duplicateResponses.sort((a, b) => { + if (a.unitName !== b.unitName) { + return a.unitName.localeCompare(b.unitName); + } + return a.variableId.localeCompare(b.variableId); + }); + + // Paginate results + const validPage = Math.max(1, page); + const validLimit = limit === Number.MAX_SAFE_INTEGER ? limit : Math.min(Math.max(1, limit), 1000); + const startIndex = (validPage - 1) * validLimit; + const endIndex = startIndex + validLimit; + const paginatedData = duplicateResponses.slice(startIndex, endIndex); + + return { + data: paginatedData, + total: duplicateResponses.length, + page: validPage, + limit: validLimit + }; + } + async validateResponseStatus(workspaceId: number, page: number = 1, limit: number = 10): Promise<{ data: InvalidVariableDto[]; total: number; page: number; limit: number }> { if (!workspaceId) { this.logger.error('Workspace ID is required'); @@ -2177,7 +2349,7 @@ ${bookletRefs} } } - async deleteAllInvalidResponses(workspaceId: number, validationType: 'variables' | 'variableTypes' | 'responseStatus'): Promise { + async deleteAllInvalidResponses(workspaceId: number, validationType: 'variables' | 'variableTypes' | 'responseStatus' | 'duplicateResponses'): Promise { try { if (!workspaceId) { this.logger.error('Workspace ID is required'); @@ -2186,6 +2358,38 @@ ${bookletRefs} this.logger.log(`Deleting all invalid responses for workspace ${workspaceId} of type ${validationType}`); + // Handle duplicate responses + if (validationType === 'duplicateResponses') { + const result = await this.validateDuplicateResponses(workspaceId, 1, Number.MAX_SAFE_INTEGER); + + if (result.data.length === 0) { + this.logger.warn(`No duplicate responses found for workspace ${workspaceId}`); + return 0; + } + + // Extract all response IDs from all duplicates + const responseIds: number[] = []; + for (const duplicateResponse of result.data) { + // For each duplicate response, we take all but the first response ID + // This keeps one response and deletes the duplicates + if (duplicateResponse.duplicates.length > 1) { + // Get all duplicate response IDs (skip the first one to keep it) + const duplicateIds = duplicateResponse.duplicates + .slice(1) // Skip the first one to keep it + .map(duplicate => duplicate.responseId); + responseIds.push(...duplicateIds); + } + } + + if (responseIds.length === 0) { + this.logger.warn(`No duplicate response IDs found for workspace ${workspaceId}`); + return 0; + } + + return await this.deleteInvalidResponses(workspaceId, responseIds); + } + + // Handle other validation types (variables, variableTypes, responseStatus) let invalidResponses: InvalidVariableDto[] = []; if (validationType === 'variables') { diff --git a/apps/frontend/src/app/models/duplicate-response-selection.dto.ts b/apps/frontend/src/app/models/duplicate-response-selection.dto.ts new file mode 100644 index 000000000..9e3d53fef --- /dev/null +++ b/apps/frontend/src/app/models/duplicate-response-selection.dto.ts @@ -0,0 +1,32 @@ +import { DuplicateResponseDto } from '../../../../../api-dto/files/duplicate-response.dto'; + +/** + * Extends DuplicateResponseDto to include selection state for duplicate responses + */ +export interface DuplicateResponseSelectionDto extends DuplicateResponseDto { + /** + * The ID of the selected response to keep (from the duplicates array) + */ + selectedResponseId?: number; + + /** + * A unique key for the duplicate response, format: `${unitId}_${variableId}_${testTakerLogin}` + */ + key: string; +} + +/** + * Interface for the resolution request payload + */ +export interface ResolveDuplicateResponsesRequestDto { + /** + * Map of unit+variable+testTaker identifiers to selected response IDs + * Key format: `${unitId}_${variableId}_${testTakerLogin}` + * Value: The selected response ID to keep + */ + resolutionMap: Record; +} +export interface ResolveDuplicateResponsesResponseDto { + resolvedCount: number; + success: boolean; +} diff --git a/apps/frontend/src/app/models/validation-task.dto.ts b/apps/frontend/src/app/models/validation-task.dto.ts index 7a685ed17..d7d31dac0 100644 --- a/apps/frontend/src/app/models/validation-task.dto.ts +++ b/apps/frontend/src/app/models/validation-task.dto.ts @@ -1,7 +1,7 @@ export interface ValidationTaskDto { id: number; workspace_id: number; - validation_type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses'; + validation_type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses' | 'duplicateResponses'; status: 'pending' | 'processing' | 'completed' | 'failed'; progress?: number; error?: string; diff --git a/apps/frontend/src/app/replay/components/replay/replay.component.ts b/apps/frontend/src/app/replay/components/replay/replay.component.ts index 49b9af9e5..ea943650d 100755 --- a/apps/frontend/src/app/replay/components/replay/replay.component.ts +++ b/apps/frontend/src/app/replay/components/replay/replay.component.ts @@ -389,20 +389,6 @@ export class ReplayComponent implements OnInit, OnDestroy, OnChanges { this.responses = undefined; } - private scrollToTop(): void { - try { - if (this.unitPlayerComponent?.hostingIframe?.nativeElement?.contentWindow) { - this.unitPlayerComponent.hostingIframe.nativeElement.contentWindow.scrollTo({ - top: 0, - left: 0, - behavior: 'smooth' - }); - } - } catch (error) { - console.error('Error scrolling to top:', error); - } - } - ngOnDestroy(): void { this.routerSubscription?.unsubscribe(); this.routerSubscription = null; diff --git a/apps/frontend/src/app/services/backend.service.ts b/apps/frontend/src/app/services/backend.service.ts index aa7ecec46..7bea05a89 100755 --- a/apps/frontend/src/app/services/backend.service.ts +++ b/apps/frontend/src/app/services/backend.service.ts @@ -544,7 +544,7 @@ export class BackendService { return this.validationService.deleteInvalidResponses(workspaceId, responseIds); } - deleteAllInvalidResponses(workspaceId: number, validationType: 'variables' | 'variableTypes' | 'responseStatus'): Observable { + deleteAllInvalidResponses(workspaceId: number, validationType: 'variables' | 'variableTypes' | 'responseStatus' | 'duplicateResponses'): Observable { return this.validationService.deleteAllInvalidResponses(workspaceId, validationType); } @@ -584,7 +584,7 @@ export class BackendService { createValidationTask( workspaceId: number, - type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses', + type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses' | 'duplicateResponses', page?: number, limit?: number, additionalData?: Record @@ -601,7 +601,7 @@ export class BackendService { createDeleteAllResponsesTask( workspaceId: number, - validationType: 'variables' | 'variableTypes' | 'responseStatus' + validationType: 'variables' | 'variableTypes' | 'responseStatus' | 'duplicateResponses' ): Observable { return this.validationService.createDeleteAllResponsesTask(workspaceId, validationType); } diff --git a/apps/frontend/src/app/services/validation-task-state.service.ts b/apps/frontend/src/app/services/validation-task-state.service.ts index f0878cfda..da397abf7 100644 --- a/apps/frontend/src/app/services/validation-task-state.service.ts +++ b/apps/frontend/src/app/services/validation-task-state.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; -// Define interfaces for validation results export interface ValidationResult { status: 'success' | 'failed' | 'not-run'; timestamp: number; @@ -17,14 +16,14 @@ export class ValidationTaskStateService { // Store validation results by workspace ID and validation type private validationResults: Record> = {}; - setTaskId(workspaceId: number, type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses', taskId: number): void { + setTaskId(workspaceId: number, type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'duplicateResponses', taskId: number): void { if (!this.activeTasks[workspaceId]) { this.activeTasks[workspaceId] = {}; } this.activeTasks[workspaceId][type] = taskId; } - removeTaskId(workspaceId: number, type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): void { + removeTaskId(workspaceId: number, type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'duplicateResponses'): void { if (this.activeTasks[workspaceId]) { delete this.activeTasks[workspaceId][type]; } @@ -36,7 +35,7 @@ export class ValidationTaskStateService { setValidationResult( workspaceId: number, - type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses', + type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'duplicateResponses', result: ValidationResult ): void { if (!this.validationResults[workspaceId]) { diff --git a/apps/frontend/src/app/services/validation.service.ts b/apps/frontend/src/app/services/validation.service.ts index a3e83842a..dda7905f9 100644 --- a/apps/frontend/src/app/services/validation.service.ts +++ b/apps/frontend/src/app/services/validation.service.ts @@ -12,8 +12,10 @@ import { } from 'rxjs'; import { InvalidVariableDto } from '../../../../../api-dto/files/variable-validation.dto'; import { TestTakersValidationDto } from '../../../../../api-dto/files/testtakers-validation.dto'; +import { DuplicateResponsesResultDto } from '../../../../../api-dto/files/duplicate-response.dto'; import { SERVER_URL } from '../injection-tokens'; import { ValidationTaskDto } from '../models/validation-task.dto'; +import { ResolveDuplicateResponsesRequestDto, ResolveDuplicateResponsesResponseDto } from '../models/duplicate-response-selection.dto'; interface PaginatedResponse { data: T[]; @@ -136,6 +138,40 @@ export class ValidationService { ); } + validateDuplicateResponses(workspaceId: number, page: number = 1, limit: number = 10): Observable { + const params = new HttpParams() + .set('page', page.toString()) + .set('limit', limit.toString()); + + return this.http.get( + `${this.serverUrl}admin/workspace/${workspaceId}/files/validate-duplicate-responses`, + { headers: this.authHeader, params } + ).pipe( + catchError(() => of({ + data: [], + total: 0, + page, + limit + })) + ); + } + + resolveDuplicateResponses( + workspaceId: number, + resolutionData: ResolveDuplicateResponsesRequestDto + ): Observable { + return this.http.post( + `${this.serverUrl}admin/workspace/${workspaceId}/responses/resolve-duplicates`, + resolutionData, + { headers: this.authHeader } + ).pipe( + catchError(() => of({ + resolvedCount: 0, + success: false + })) + ); + } + deleteInvalidResponses(workspaceId: number, responseIds: number[]): Observable { const params = new HttpParams().set('responseIds', responseIds.join(',')); return this.http.delete( @@ -146,7 +182,7 @@ export class ValidationService { ); } - deleteAllInvalidResponses(workspaceId: number, validationType: 'variables' | 'variableTypes' | 'responseStatus'): Observable { + deleteAllInvalidResponses(workspaceId: number, validationType: 'variables' | 'variableTypes' | 'responseStatus' | 'duplicateResponses'): Observable { const params = new HttpParams().set('validationType', validationType); return this.http.delete( `${this.serverUrl}admin/workspace/${workspaceId}/files/all-invalid-responses`, @@ -158,7 +194,7 @@ export class ValidationService { createValidationTask( workspaceId: number, - type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses', + type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'deleteResponses' | 'deleteAllResponses' | 'duplicateResponses', page?: number, limit?: number, additionalData?: Record @@ -192,7 +228,6 @@ export class ValidationService { { headers: this.authHeader, params } ).pipe( catchError(error => { - console.error(`Error creating validation task: ${error.message}`); throw error; }) ); @@ -213,7 +248,7 @@ export class ValidationService { createDeleteAllResponsesTask( workspaceId: number, - validationType: 'variables' | 'variableTypes' | 'responseStatus' + validationType: 'variables' | 'variableTypes' | 'responseStatus' | 'duplicateResponses' ): Observable { return this.createValidationTask( workspaceId, @@ -230,7 +265,6 @@ export class ValidationService { { headers: this.authHeader } ).pipe( catchError(error => { - console.error(`Error getting validation task: ${error.message}`); throw error; }) ); @@ -254,7 +288,6 @@ export class ValidationService { { headers: this.authHeader } ).pipe( catchError(error => { - console.error(`Error getting validation results: ${error.message}`); throw error; }) ); @@ -307,8 +340,7 @@ export class ValidationService { map( result => [type, { task, result }] as [string, { task: ValidationTaskDto; result: unknown }] ), - catchError(error => { - console.error(`Error getting results for task ${task.id}: ${error.message}`); + catchError(() => { return of([type, { task, result: null }] as [string, { task: ValidationTaskDto; result: unknown }]); }) ) diff --git a/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.html b/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.html index 8b27d883f..50c75af99 100644 --- a/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.html +++ b/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.html @@ -112,6 +112,27 @@

Antworten validieren

OK Nicht ausgeführt
+ + +
+ hourglass_empty + error + check_circle + radio_button_unchecked + {{ getValidationLabel('duplicateResponses') }} + Läuft... + + {{ totalDuplicateResponses }} doppelte Antworten gefunden + + OK + Nicht ausgeführt +
@@ -126,9 +147,7 @@

Antworten validieren

} @if (testTakersValidationResult) {
- @if (testTakersValidationResult.testTakersFound) { -

TestTakers gefunden: {{ testTakersValidationResult.totalGroups }} Gruppen, {{ testTakersValidationResult.totalLogins }} Logins, {{ testTakersValidationResult.totalBookletCodes }} Booklet-Codes.

- } @else { + @if (!testTakersValidationResult.testTakersFound) {
error Prüfung fehlgeschlagen: Keine TestTakers gefunden. @@ -167,7 +186,7 @@

Antworten validieren

- } @else { + } @else if (testTakersValidationWasRun) {
check_circle Prüfung bestanden: Alle Testpersonen wurden in den TestTakers XML-Dateien gefunden. @@ -446,6 +465,104 @@

Antworten validieren

+ +

Prüft, ob doppelte Antworten für die gleiche Variable, Unit und Testperson existieren.

+ + @if (isDuplicateResponsesValidationRunning) { +
+ +

Doppelte Antworten werden validiert...

+
+ } + @if (duplicateResponses.length > 0 || totalDuplicateResponses > 0) { +
+ error + Prüfung fehlgeschlagen: {{ totalDuplicateResponses }} doppelte Antworten gefunden. +
+ @if (duplicateResponses.length > 0) { +
+ + + +
+ + +
+ @for (duplicate of paginatedDuplicateResponses; track duplicate.unitId + '_' + duplicate.variableId + '_' + duplicate.testTakerLogin) { +
+
+
+ Unit: {{ duplicate.unitName }} | + Variable: {{ duplicate.variableId }} | + Testperson: {{ duplicate.testTakerLogin }} | + Booklet: {{ duplicate.bookletName }} +
+
+
+ + + + + + + + + + + @for (responseDuplicate of duplicate.duplicates; track responseDuplicate.responseId) { + + + + + + + } + +
AuswählenAntwort-IDWertStatus
+ + {{ responseDuplicate.responseId }}{{ responseDuplicate.value }}{{ responseDuplicate.status }}
+
+
+ } +
+ + +
+ } + } @else if (!isDuplicateResponsesValidationRunning && duplicateResponses.length === 0 && totalDuplicateResponses === 0 && validateDuplicateResponsesWasRun) { +
+ check_circle + Prüfung bestanden: Keine doppelten Antworten gefunden. +
+ } +
+ +
+

Prüft, ob die Antwort für die Kombination Testperson x Booklet x Unit vorgesehen ist.

@@ -518,7 +635,7 @@

Antworten validieren

aria-label="Seite auswählen"> - } @else { + } @else if (groupResponsesValidationWasRun) {
error Prüfung fehlgeschlagen: Keine gültigen Gruppen gefunden. diff --git a/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.ts b/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.ts index 99f0ea7b5..408f79d98 100644 --- a/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.ts +++ b/apps/frontend/src/app/ws-admin/components/validation-dialog/validation-dialog.component.ts @@ -21,6 +21,8 @@ import { ValidationTaskStateService, ValidationResult } from '../../../services/ import { ValidationService } from '../../../services/validation.service'; import { InvalidVariableDto } from '../../../../../../../api-dto/files/variable-validation.dto'; import { TestTakersValidationDto, MissingPersonDto } from '../../../../../../../api-dto/files/testtakers-validation.dto'; +import { DuplicateResponsesResultDto } from '../../../../../../../api-dto/files/duplicate-response.dto'; +import { DuplicateResponseSelectionDto } from '../../../models/duplicate-response-selection.dto'; import { ContentDialogComponent } from '../../../shared/dialogs/content-dialog/content-dialog.component'; import { ValidationTaskDto } from '../../../models/validation-task.dto'; @@ -230,18 +232,23 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr isVariableValidationRunning: boolean = false; isVariableTypeValidationRunning: boolean = false; isResponseStatusValidationRunning: boolean = false; + isDuplicateResponsesValidationRunning: boolean = false; // Validation was run flags validateVariablesWasRun: boolean = false; validateVariableTypesWasRun: boolean = false; validateResponseStatusWasRun: boolean = false; + validateDuplicateResponsesWasRun: boolean = false; isDeletingResponses: boolean = false; + isResolvingDuplicateResponses: boolean = false; expandedPanel: boolean = false; expandedTypePanel: boolean = false; expandedStatusPanel: boolean = false; + expandedDuplicateResponsesPanel: boolean = false; selectedResponses: Set = new Set(); selectedTypeResponses: Set = new Set(); selectedStatusResponses: Set = new Set(); + duplicateResponseSelections: Map = new Map(); // Maps duplicate key to selected response ID pageSizeOptions = [25, 50, 100, 200]; @@ -249,6 +256,14 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr paginatedTypeVariables = new MatTableDataSource([]); paginatedStatusVariables = new MatTableDataSource([]); + // Duplicate responses validation properties + duplicateResponses: DuplicateResponseSelectionDto[] = []; + duplicateResponsesResult: DuplicateResponsesResultDto | null = null; + totalDuplicateResponses: number = 0; + paginatedDuplicateResponses: DuplicateResponseSelectionDto[] = []; + duplicateResponsesPageSize: number = 10; + currentDuplicateResponsesPage: number = 1; + constructor( @Inject(MAT_DIALOG_DATA) public data: unknown, private dialogRef: MatDialogRef, @@ -851,6 +866,10 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr this.expandedGroupResponsesPanel = !this.expandedGroupResponsesPanel; } + toggleDuplicateResponsesExpansion(): void { + this.expandedDuplicateResponsesPanel = !this.expandedDuplicateResponsesPanel; + } + validateGroupResponses(): void { this.isGroupResponsesValidationRunning = true; this.groupResponsesResult = null; @@ -945,6 +964,109 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr this.subscriptions.push(subscription); } + validateDuplicateResponses(): void { + this.isDuplicateResponsesValidationRunning = true; + this.duplicateResponses = []; + this.duplicateResponsesResult = null; + this.totalDuplicateResponses = 0; + this.validateDuplicateResponsesWasRun = false; + this.currentDuplicateResponsesPage = 1; + this.duplicateResponseSelections.clear(); + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'duplicateResponses', + this.currentDuplicateResponsesPage, + this.duplicateResponsesPageSize + ).subscribe(task => { + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // Update progress if available + if (updatedTask.progress) { + // Could show progress here if needed + } + + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result as DuplicateResponsesResultDto + const typedResult = result as DuplicateResponsesResultDto; + + // Check if the result indicates errors (duplicate responses found) + const hasErrors = typedResult.total > 0; + + // Create a validation result with the appropriate status + const validationResult: ValidationResult = { + status: hasErrors ? 'failed' : 'success', + timestamp: Date.now(), + details: { + total: typedResult.total, + hasErrors: hasErrors + } + }; + + // Store the result in the validation task state service + this.validationTaskStateService.setValidationResult( + this.appService.selectedWorkspaceId, + 'duplicateResponses', + validationResult + ); + + // Convert to DuplicateResponseSelectionDto[] and initialize selections + this.duplicateResponses = typedResult.data.map(duplicate => { + // For each duplicate, select the first response by default + const defaultSelectedId = duplicate.duplicates.length > 0 ? + duplicate.duplicates[0].responseId : undefined; + + if (defaultSelectedId) { + const key = `${duplicate.unitId}_${duplicate.variableId}_${duplicate.testTakerLogin}`; + this.duplicateResponseSelections.set(key, defaultSelectedId); + } + + return { + ...duplicate, + key: `${duplicate.unitId}_${duplicate.variableId}_${duplicate.testTakerLogin}` + }; + }); + + this.totalDuplicateResponses = typedResult.total; + this.duplicateResponsesResult = typedResult; + this.updatePaginatedDuplicateResponses(); + this.isDuplicateResponsesValidationRunning = false; + this.validateDuplicateResponsesWasRun = true; + + // Save the validation result to the service + this.saveValidationResult('duplicateResponses'); + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isDuplicateResponsesValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isDuplicateResponsesValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); + } + updatePaginatedTypeVariables(): void { this.paginatedTypeVariables.data = this.invalidTypeVariables; } @@ -953,6 +1075,241 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr this.paginatedStatusVariables.data = this.invalidStatusVariables; } + updatePaginatedDuplicateResponses(): void { + this.paginatedDuplicateResponses = this.duplicateResponses.slice( + (this.currentDuplicateResponsesPage - 1) * this.duplicateResponsesPageSize, + this.currentDuplicateResponsesPage * this.duplicateResponsesPageSize + ); + } + + /** + * Checks if a specific response is selected for a duplicate + * @param duplicate The duplicate response + * @param responseId The response ID to check + * @returns True if the response is selected, false otherwise + */ + isSelectedDuplicateResponse(duplicate: DuplicateResponseSelectionDto, responseId: number): boolean { + return this.duplicateResponseSelections.get(duplicate.key) === responseId; + } + + /** + * Selects a specific response for a duplicate + * @param duplicate The duplicate response + * @param responseId The response ID to select + */ + selectDuplicateResponse(duplicate: DuplicateResponseSelectionDto, responseId: number): void { + this.duplicateResponseSelections.set(duplicate.key, responseId); + } + + /** + * Checks if any duplicate responses are selected + * @returns True if any duplicate responses are selected, false otherwise + */ + hasSelectedDuplicateResponses(): boolean { + return this.duplicateResponseSelections.size > 0; + } + + /** + * Gets the count of selected duplicate responses + * @returns The count of selected duplicate responses + */ + getSelectedDuplicateResponsesCount(): number { + return this.duplicateResponseSelections.size; + } + + onDuplicateResponsesPageChange(event: PageEvent): void { + this.currentDuplicateResponsesPage = event.pageIndex + 1; + this.duplicateResponsesPageSize = event.pageSize; + + // Reload data from server with new pagination parameters using background task + this.isDuplicateResponsesValidationRunning = true; + + // Cancel any existing subscription + this.subscriptions.forEach(sub => sub.unsubscribe()); + this.subscriptions = []; + + // Create a background validation task + const subscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'duplicateResponses', + this.currentDuplicateResponsesPage, + this.duplicateResponsesPageSize + ).subscribe(task => { + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + // If task is completed, get the results + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + // Type the result as DuplicateResponsesResultDto + const typedResult = result as DuplicateResponsesResultDto; + + // Convert to DuplicateResponseSelectionDto[] and preserve selections + this.duplicateResponses = typedResult.data.map(duplicate => { + const key = `${duplicate.unitId}_${duplicate.variableId}_${duplicate.testTakerLogin}`; + + // If we don't have a selection for this duplicate yet, select the first response by default + if (!this.duplicateResponseSelections.has(key) && duplicate.duplicates.length > 0) { + this.duplicateResponseSelections.set(key, duplicate.duplicates[0].responseId); + } + + return { + ...duplicate, + key + }; + }); + + this.totalDuplicateResponses = typedResult.total; + this.duplicateResponsesResult = typedResult; + this.updatePaginatedDuplicateResponses(); + this.isDuplicateResponsesValidationRunning = false; + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open(`Validierung fehlgeschlagen: ${updatedTask.error || 'Unbekannter Fehler'}`, 'Schließen', { duration: 5000 }); + this.isDuplicateResponsesValidationRunning = false; + } + }, + error: () => { + this.snackBar.open('Fehler beim Abrufen des Validierungsstatus', 'Schließen', { duration: 5000 }); + this.isDuplicateResponsesValidationRunning = false; + } + }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); + } + + /** + * Resolves duplicate responses by keeping the selected responses + * This method sends the selected responses to the backend for resolution + */ + resolveDuplicateResponses(): void { + if (this.isResolvingDuplicateResponses || !this.hasSelectedDuplicateResponses()) { + return; + } + + this.isResolvingDuplicateResponses = true; + + // Create a map of response IDs to keep + const responseIdsToKeep: Record = {}; + + // Convert the Map to a Record for the API request + this.duplicateResponseSelections.forEach((responseId, key) => { + responseIdsToKeep[key] = responseId; + }); + + // Call the validation service to resolve duplicates + const request = { + resolutionMap: responseIdsToKeep + }; + + this.validationService.resolveDuplicateResponses(this.appService.selectedWorkspaceId, request) + .subscribe({ + next: result => { + if (result.success) { + this.snackBar.open( + `${result.resolvedCount} doppelte Antworten wurden erfolgreich aufgelöst.`, + 'OK', + { duration: 3000 } + ); + + // Refresh the duplicate responses list + this.validateDuplicateResponses(); + } else { + this.snackBar.open( + 'Fehler beim Auflösen der doppelten Antworten.', + 'Fehler', + { duration: 3000 } + ); + } + this.isResolvingDuplicateResponses = false; + }, + error: () => { + this.snackBar.open( + 'Fehler beim Auflösen der doppelten Antworten.', + 'Fehler', + { duration: 3000 } + ); + this.isResolvingDuplicateResponses = false; + } + }); + } + + /** + * Resolves all duplicate responses automatically by keeping the first response for each duplicate + * This method uses the deleteAllInvalidResponses endpoint with 'duplicateResponses' type + */ + resolveAllDuplicateResponses(): void { + if (this.isResolvingDuplicateResponses || this.duplicateResponses.length === 0) { + return; + } + + this.isResolvingDuplicateResponses = true; + + // Create a background task to delete all duplicate responses except the first one + const subscription = this.backendService.createValidationTask( + this.appService.selectedWorkspaceId, + 'deleteAllResponses', + undefined, + undefined, + { validationType: 'duplicateResponses' } + ).subscribe(task => { + // Poll for task completion + const pollSubscription = this.backendService.pollValidationTask( + this.appService.selectedWorkspaceId, + task.id + ).subscribe({ + next: updatedTask => { + if (updatedTask.status === 'completed') { + this.backendService.getValidationResults( + this.appService.selectedWorkspaceId, + updatedTask.id + ).subscribe(result => { + const typedResult = result as { deletedCount: number }; + + this.snackBar.open( + `${typedResult.deletedCount} doppelte Antworten wurden automatisch aufgelöst.`, + 'OK', + { duration: 3000 } + ); + + // Refresh the duplicate responses list + this.validateDuplicateResponses(); + this.isResolvingDuplicateResponses = false; + }); + } else if (updatedTask.status === 'failed') { + this.snackBar.open( + `Fehler beim Auflösen der doppelten Antworten: ${updatedTask.error || 'Unbekannter Fehler'}`, + 'Fehler', + { duration: 3000 } + ); + this.isResolvingDuplicateResponses = false; + } + }, + error: () => { + this.snackBar.open( + 'Fehler beim Auflösen der doppelten Antworten.', + 'Fehler', + { duration: 3000 } + ); + this.isResolvingDuplicateResponses = false; + } + }); + + this.subscriptions.push(pollSubscription); + }); + + this.subscriptions.push(subscription); + } + validateVariables(): void { this.isVariableValidationRunning = true; this.invalidVariables = []; @@ -2210,10 +2567,11 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr this.isVariableTypeValidationRunning || this.isResponseStatusValidationRunning || this.isTestTakersValidationRunning || - this.isGroupResponsesValidationRunning; + this.isGroupResponsesValidationRunning || + this.isDuplicateResponsesValidationRunning; } - hasValidationFailed(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): boolean { + hasValidationFailed(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'duplicateResponses'): boolean { switch (type) { case 'variables': return this.validateVariablesWasRun && this.totalInvalidVariables > 0; @@ -2235,12 +2593,14 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr !this.groupResponsesResult.testTakersFound || !this.groupResponsesResult.allGroupsHaveResponses ); + case 'duplicateResponses': + return this.validateDuplicateResponsesWasRun && this.totalDuplicateResponses > 0; default: return false; } } - hasValidationSucceeded(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): boolean { + hasValidationSucceeded(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'duplicateResponses'): boolean { switch (type) { case 'variables': return this.validateVariablesWasRun && this.totalInvalidVariables === 0; @@ -2258,12 +2618,14 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr this.groupResponsesResult !== null && this.groupResponsesResult.testTakersFound && this.groupResponsesResult.allGroupsHaveResponses; + case 'duplicateResponses': + return this.validateDuplicateResponsesWasRun && this.totalDuplicateResponses === 0; default: return false; } } - getValidationStatus(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): 'running' | 'failed' | 'success' | 'not-run' { + getValidationStatus(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'duplicateResponses'): 'running' | 'failed' | 'success' | 'not-run' { switch (type) { case 'variables': if (this.isVariableValidationRunning) return 'running'; @@ -2290,12 +2652,17 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr if (this.hasValidationFailed('groupResponses')) return 'failed'; if (this.hasValidationSucceeded('groupResponses')) return 'success'; return 'not-run'; + case 'duplicateResponses': + if (this.isDuplicateResponsesValidationRunning) return 'running'; + if (this.hasValidationFailed('duplicateResponses')) return 'failed'; + if (this.hasValidationSucceeded('duplicateResponses')) return 'success'; + return 'not-run'; default: return 'not-run'; } } - getValidationLabel(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): string { + getValidationLabel(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'duplicateResponses'): string { switch (type) { case 'variables': return 'Variable definiert'; @@ -2307,12 +2674,14 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr return 'Testperson definiert'; case 'groupResponses': return 'Antworten für alle Gruppen'; + case 'duplicateResponses': + return 'Doppelte Antworten'; default: return ''; } } - private saveValidationResult(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): void { + private saveValidationResult(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'duplicateResponses'): void { const workspaceId = this.appService.selectedWorkspaceId; const status = this.getValidationStatus(type); @@ -2330,7 +2699,7 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr } } - private getValidationDetails(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses'): unknown { + private getValidationDetails(type: 'variables' | 'variableTypes' | 'responseStatus' | 'testTakers' | 'groupResponses' | 'duplicateResponses'): unknown { switch (type) { case 'variables': return { @@ -2363,6 +2732,11 @@ export class ValidationDialogComponent implements AfterViewInit, OnInit, OnDestr hasErrors: !this.groupResponsesResult.testTakersFound || !this.groupResponsesResult.allGroupsHaveResponses }; + case 'duplicateResponses': + return { + total: this.totalDuplicateResponses, + hasErrors: this.totalDuplicateResponses > 0 + }; default: return {}; } From 45d0f8aa7f79aa0a9756ca85d9a4d046342fe10f Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Sun, 20 Jul 2025 09:45:50 +0200 Subject: [PATCH 15/21] Implement unit notes --- .../admin/unit-notes/unit-notes.controller.ts | 31 ++++++ .../database/services/unit-note.service.ts | 46 ++++++-- .../src/app/services/backend.service.ts | 4 + .../src/app/services/unit-note.service.ts | 7 ++ .../note-dialog/note-dialog.component.ts | 37 +++++-- .../tag-dialog/tag-dialog.component.ts | 25 +++-- .../test-results/test-results.component.html | 26 +++-- .../test-results/test-results.component.scss | 64 +++++++++-- .../test-results/test-results.component.ts | 103 +++++++++++++----- .../changelog/coding-box.changelog-0.10.0.sql | 15 +++ .../changelog/coding-box.changelog-root.xml | 1 + 11 files changed, 285 insertions(+), 74 deletions(-) create mode 100644 database/changelog/coding-box.changelog-0.10.0.sql diff --git a/apps/backend/src/app/admin/unit-notes/unit-notes.controller.ts b/apps/backend/src/app/admin/unit-notes/unit-notes.controller.ts index d0ea46e13..0d3710837 100644 --- a/apps/backend/src/app/admin/unit-notes/unit-notes.controller.ts +++ b/apps/backend/src/app/admin/unit-notes/unit-notes.controller.ts @@ -110,6 +110,37 @@ export class UnitNotesController { } } + @Post('units/notes') + @UseGuards(JwtAuthGuard, WorkspaceGuard) + @ApiBearerAuth() + @ApiOperation({ + summary: 'Get all notes for multiple units', + description: 'Retrieves all notes for the specified units' + }) + @ApiParam({ + name: 'workspace_id', + type: Number, + required: true, + description: 'The ID of the workspace' + }) + @ApiOkResponse({ + description: 'The notes have been successfully retrieved.', + type: Object + }) + @ApiBadRequestResponse({ + description: 'Invalid input data.' + }) + async findAllByUnitIds( + @WorkspaceId() workspaceId: number, + @Body() { unitIds }: { unitIds: number[] } + ): Promise<{ [unitId: number]: UnitNoteDto[] }> { + try { + return await this.unitNoteService.findAllByUnitIds(unitIds); + } catch (error) { + throw new BadRequestException(`Failed to retrieve notes: ${error.message}`); + } + } + @Get(':id') @UseGuards(JwtAuthGuard, WorkspaceGuard) @ApiBearerAuth() diff --git a/apps/backend/src/app/database/services/unit-note.service.ts b/apps/backend/src/app/database/services/unit-note.service.ts index 10f475150..6f9ed4923 100644 --- a/apps/backend/src/app/database/services/unit-note.service.ts +++ b/apps/backend/src/app/database/services/unit-note.service.ts @@ -1,6 +1,6 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; +import { Repository, In } from 'typeorm'; import { UnitNote } from '../entities/unitNote.entity'; import { Unit } from '../entities/unit.entity'; import { CreateUnitNoteDto } from '../../../../../../api-dto/unit-notes/create-unit-note.dto'; @@ -22,7 +22,6 @@ export class UnitNoteService { * @returns The created note */ async create(createUnitNoteDto: CreateUnitNoteDto): Promise { - // Check if the unit exists const unit = await this.unitRepository.findOne({ where: { id: createUnitNoteDto.unitId } }); @@ -31,16 +30,13 @@ export class UnitNoteService { throw new NotFoundException(`Unit with ID ${createUnitNoteDto.unitId} not found`); } - // Create the note const unitNote = this.unitNoteRepository.create({ unitId: createUnitNoteDto.unitId, note: createUnitNoteDto.note }); - // Save the note const savedNote = await this.unitNoteRepository.save(unitNote); - // Return the DTO return { id: savedNote.id, unitId: savedNote.unitId, @@ -56,7 +52,6 @@ export class UnitNoteService { * @returns An array of notes */ async findAllByUnitId(unitId: number): Promise { - // Check if the unit exists const unit = await this.unitRepository.findOne({ where: { id: unitId } }); @@ -65,13 +60,11 @@ export class UnitNoteService { throw new NotFoundException(`Unit with ID ${unitId} not found`); } - // Find all notes for the unit const notes = await this.unitNoteRepository.find({ where: { unitId }, order: { createdAt: 'DESC' } }); - // Return the DTOs return notes.map(note => ({ id: note.id, unitId: note.unitId, @@ -119,13 +112,10 @@ export class UnitNoteService { throw new NotFoundException(`Note with ID ${id} not found`); } - // Update the note note.note = updateUnitNoteDto.note; - // Save the note const updatedNote = await this.unitNoteRepository.save(note); - // Return the DTO return { id: updatedNote.id, unitId: updatedNote.unitId, @@ -152,4 +142,38 @@ export class UnitNoteService { const result = await this.unitNoteRepository.delete(id); return result.affected > 0; } + + /** + * Find all notes for multiple units + * @param unitIds Array of unit IDs + * @returns An array of notes grouped by unit ID + */ + async findAllByUnitIds(unitIds: number[]): Promise<{ [unitId: number]: UnitNoteDto[] }> { + if (!unitIds || unitIds.length === 0) { + return {}; + } + + const notes = await this.unitNoteRepository.find({ + where: { unitId: In(unitIds) }, + order: { createdAt: 'DESC' } + }); + + const notesByUnitId: { [unitId: number]: UnitNoteDto[] } = {}; + + notes.forEach(note => { + if (!notesByUnitId[note.unitId]) { + notesByUnitId[note.unitId] = []; + } + + notesByUnitId[note.unitId].push({ + id: note.id, + unitId: note.unitId, + note: note.note, + createdAt: note.createdAt, + updatedAt: note.updatedAt + }); + }); + + return notesByUnitId; + } } diff --git a/apps/frontend/src/app/services/backend.service.ts b/apps/frontend/src/app/services/backend.service.ts index 7bea05a89..3b9d94a43 100755 --- a/apps/frontend/src/app/services/backend.service.ts +++ b/apps/frontend/src/app/services/backend.service.ts @@ -298,6 +298,10 @@ export class BackendService { return this.unitNoteService.getUnitNotes(workspaceId, unitId); } + getNotesForMultipleUnits(workspaceId: number, unitIds: number[]): Observable<{ [unitId: number]: UnitNoteDto[] }> { + return this.unitNoteService.getNotesForMultipleUnits(workspaceId, unitIds); + } + getUnitNote(workspaceId: number, noteId: number): Observable { return this.unitNoteService.getUnitNote(workspaceId, noteId); } diff --git a/apps/frontend/src/app/services/unit-note.service.ts b/apps/frontend/src/app/services/unit-note.service.ts index d93fe0127..adc04dc1f 100644 --- a/apps/frontend/src/app/services/unit-note.service.ts +++ b/apps/frontend/src/app/services/unit-note.service.ts @@ -32,6 +32,13 @@ export class UnitNoteService { { headers: this.authHeader }); } + getNotesForMultipleUnits(workspaceId: number, unitIds: number[]): Observable<{ [unitId: number]: UnitNoteDto[] }> { + return this.http.post<{ [unitId: number]: UnitNoteDto[] }>( + `${this.serverUrl}admin/workspace/${workspaceId}/unit-notes/units/notes`, + { unitIds }, + { headers: this.authHeader }); + } + getUnitNote(workspaceId: number, noteId: number): Observable { return this.http.get( `${this.serverUrl}admin/workspace/${workspaceId}/unit-notes/${noteId}`, diff --git a/apps/frontend/src/app/ws-admin/components/note-dialog/note-dialog.component.ts b/apps/frontend/src/app/ws-admin/components/note-dialog/note-dialog.component.ts index ef722e947..04b9af2cb 100644 --- a/apps/frontend/src/app/ws-admin/components/note-dialog/note-dialog.component.ts +++ b/apps/frontend/src/app/ws-admin/components/note-dialog/note-dialog.component.ts @@ -23,16 +23,16 @@ import { CreateUnitNoteDto } from '../../../../../../../api-dto/unit-notes/creat selector: 'app-note-dialog', template: `
-

{{ data.title || 'Unit Notes' }}

+

{{ data.title || 'Unit Notizen' }}

- {{ notes.length }} Notes + {{ notes.length }} Notizen
-

Notes

+

Notizen

@@ -42,7 +42,7 @@ import { CreateUnitNoteDto } from '../../../../../../../api-dto/unit-notes/creat
{{ formatDate(note.updatedAt) }}
-
@@ -154,6 +154,7 @@ import { CreateUnitNoteDto } from '../../../../../../../api-dto/unit-notes/creat margin-bottom: 8px; padding-bottom: 4px; border-bottom: 1px dashed #e0e0e0; + min-height: 36px; } .note-date { @@ -168,16 +169,30 @@ import { CreateUnitNoteDto } from '../../../../../../../api-dto/unit-notes/creat } .note-action-button { - width: 24px; - height: 24px; - line-height: 24px; + width: 36px; + height: 36px; + background-color: rgba(244, 67, 54, 0.1); + margin-right: 4px; + transition: all 0.2s ease; + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + padding: 0; + overflow: visible; + } + + .note-action-button:hover { + background-color: rgba(244, 67, 54, 0.2); + transform: scale(1.05); } .note-action-button mat-icon { - font-size: 16px; - width: 16px; - height: 16px; - line-height: 16px; + font-size: 20px; + width: 20px; + height: 20px; + color: #f44336; + margin: 0; } .note-content { diff --git a/apps/frontend/src/app/ws-admin/components/tag-dialog/tag-dialog.component.ts b/apps/frontend/src/app/ws-admin/components/tag-dialog/tag-dialog.component.ts index 1fffb79ee..26fed68df 100644 --- a/apps/frontend/src/app/ws-admin/components/tag-dialog/tag-dialog.component.ts +++ b/apps/frontend/src/app/ws-admin/components/tag-dialog/tag-dialog.component.ts @@ -155,16 +155,27 @@ import { CreateUnitTagDto } from '../../../../../../../api-dto/unit-tags/create- } .tag-action-button { - width: 24px; - height: 24px; - line-height: 24px; + width: 45px; + height: 30px; + display: flex; + justify-content: center; + align-items: center; + background-color: rgba(244, 67, 54, 0.1); + border-radius: 15px; + transition: all 0.2s ease; + } + + .tag-action-button:hover { + background-color: rgba(244, 67, 54, 0.2); + transform: scale(1.05); } .tag-action-button mat-icon { - font-size: 16px; - width: 16px; - height: 16px; - line-height: 16px; + font-size: 18px; + width: 18px; + height: 18px; + margin: 0; + color: #f44336; } .add-tag-form { diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html index acc22aa70..52b4dd330 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html @@ -217,11 +217,13 @@

Aufgaben

- assignment - {{ unit?.alias || 'Unbenannte Einheit' }} - @if (hasGeogebraResponse(unit)) { - Geogebra - } +
+ assignment + {{ unit?.alias || 'Unbenannte Einheit' }} + @if (hasGeogebraResponse(unit)) { + Geogebra + } +
@if (unit.id) {
@for (tag of getUnitTags(unit.id); track tag.id) { @@ -264,10 +266,16 @@

Antworten

label Tags - - - - +
+ + + circle + +
@for (response of this.responses; track response.id) { diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.scss b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.scss index ad0c8b581..d37c0b9c2 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.scss +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.scss @@ -630,7 +630,9 @@ transition: all 0.2s ease; cursor: pointer; border-radius: 0; - height: 48px; + min-height: 48px; + height: auto; + padding: 8px 16px; border-bottom: 1px solid rgba(0, 0, 0, 0.05); position: relative; @@ -640,16 +642,16 @@ &:hover { background-color: #f0f7ff; - padding-left: 4px; + padding-left: 20px; } .delete-unit-button { position: absolute; right: 8px; - top: 50%; - transform: translateY(-50%); + top: 8px; opacity: 0.7; transition: all 0.2s ease; + z-index: 2; &:hover { opacity: 1; @@ -663,16 +665,29 @@ } } + .unit-header { + display: flex; + align-items: center; + width: 100%; + margin-bottom: 4px; + } + .unit-icon { - margin-right: 10px; + margin-right: 12px; color: #1976d2; opacity: 0.8; + font-size: 20px; + height: 20px; + width: 20px; + flex-shrink: 0; } .unit-name { font-size: 14px; font-weight: 500; color: #444; + margin-right: 8px; + flex-shrink: 0; } .geogebra-tag { @@ -680,27 +695,33 @@ font-weight: 500; color: white; background-color: #4285F4; - padding: 2px 8px; + padding: 3px 10px; border-radius: 12px; margin-left: 8px; + margin-right: 4px; + flex-shrink: 0; + display: inline-block; } .unit-tags-container { display: flex; flex-wrap: wrap; - gap: 4px; - margin-left: 8px; + gap: 6px; + margin-left: 12px; + margin-top: 4px; align-items: center; + max-width: calc(100% - 120px); /* Leave space for the delete button and icon */ } .unit-tag-item { - display: flex; + display: inline-flex; align-items: center; background-color: #e3f2fd; border-radius: 10px; - padding: 0 0 0 6px; + padding: 3px 8px; border: 1px solid rgba(25, 118, 210, 0.2); margin-right: 4px; + margin-bottom: 4px; transition: all 0.2s ease; &:hover { @@ -712,6 +733,7 @@ font-size: 11px; font-weight: 500; color: #1976d2; + white-space: nowrap; } .tag-delete-button { @@ -775,6 +797,7 @@ border-radius: 18px; padding: 4px 16px; transition: all 0.2s ease; + position: relative; &:hover { background-color: rgba(25, 118, 210, 0.08); @@ -788,9 +811,30 @@ width: 18px; vertical-align: middle; } + } } + +// Notes indicator styles +.notes-indicator { + position: relative; + display: inline-flex; + justify-content: center; + align-items: center; + width: 16px; + height: 16px; + margin-left: 8px; + vertical-align: middle; + + .notes-badge { + color: #2196F3; + font-size: 10px; + height: 10px; + width: 10px; + } +} + // Unit Tags Section .unit-tags-section { margin: 20px 0; diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts index cbb2a4bfe..283d91812 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts @@ -212,10 +212,7 @@ export class TestResultsComponent implements OnInit, OnDestroy { isVariableValidationRunning: boolean = false; variableValidationResult: VariableValidationDto | null = null; readonly SHORT_PROCESSING_TIME_THRESHOLD_MS: number = 60000; - - // Interval for checking validation status private validationStatusInterval: number | null = null; - // Flag to track if component is initialized private isInitialized: boolean = false; @ViewChild(MatPaginator) paginator!: MatPaginator; @@ -230,8 +227,6 @@ export class TestResultsComponent implements OnInit, OnDestroy { }); this.createTestResultsList(0, this.pageSize); - - // Start interval to check validation status this.startValidationStatusCheck(); this.isInitialized = true; } @@ -356,6 +351,7 @@ export class TestResultsComponent implements OnInit, OnDestroy { this.bookletLogs = []; this.selectedUnit = undefined; this.unitTagsMap.clear(); + this.unitNotesMap.clear(); this.isLoadingBooklets = true; this.backendService.getPersonTestResults(this.appService.selectedWorkspaceId, row.id) .subscribe({ @@ -366,6 +362,7 @@ export class TestResultsComponent implements OnInit, OnDestroy { this.sortBooklets(); this.sortBookletUnits(); this.loadAllUnitTags(); + this.loadAllUnitNotes(); this.isLoadingBooklets = false; }, error: () => { @@ -436,6 +433,48 @@ export class TestResultsComponent implements OnInit, OnDestroy { }); } + loadAllUnitNotes(): void { + if (!this.booklets || this.booklets.length === 0) { + return; + } + + this.unitNotesMap.clear(); + + // Extract all unit IDs from the booklets + const unitIds: number[] = []; + this.booklets.forEach(booklet => { + if (booklet.units && Array.isArray(booklet.units)) { + booklet.units.forEach(unit => { + if (unit.id) { + unitIds.push(unit.id); + } + }); + } + }); + + if (unitIds.length === 0) { + return; + } + + this.backendService.getNotesForMultipleUnits( + this.appService.selectedWorkspaceId, + unitIds + ).subscribe({ + next: notesByUnitId => { + Object.entries(notesByUnitId).forEach(([unitId, notes]) => { + this.unitNotesMap.set(Number(unitId), notes); + }); + }, + error: () => { + this.snackBar.open( + 'Fehler beim Laden der Notizen', + 'Fehler', + { duration: 3000 } + ); + } + }); + } + replayBooklet() { } @@ -465,7 +504,7 @@ export class TestResultsComponent implements OnInit, OnDestroy { openBookletLogsDialog(booklet: Booklet) { if (!booklet.logs || booklet.logs.length === 0) { this.snackBar.open( - 'Keine Logs für dieses Booklet vorhanden', + 'Keine Logs für dieses Testheft vorhanden', 'Info', { duration: 3000 } ); @@ -592,7 +631,7 @@ export class TestResultsComponent implements OnInit, OnDestroy { this.selectedUnit = unit; this.loadUnitTags(); - // this.loadUnitNotes(); + this.loadUnitNotes(); } loadUnitTags(): void { @@ -606,30 +645,42 @@ export class TestResultsComponent implements OnInit, OnDestroy { loadUnitNotes(): void { if (this.selectedUnit && this.selectedUnit.id) { - this.backendService.getUnitNotes( - this.appService.selectedWorkspaceId, - this.selectedUnit.id as number - ).subscribe({ - next: notes => { - this.unitNotes = notes; - - // Update the unitNotesMap - // @ts-expect-error - Property 'id' may not exist on type '{ alias: string; }' - this.unitNotesMap.set(this.selectedUnit.id as number, notes); - }, - error: () => { - this.snackBar.open( - 'Fehler beim Laden der Notizen', - 'Fehler', - { duration: 3000 } - ); - } - }); + const unitId = this.selectedUnit.id as number; + if (this.unitNotesMap.has(unitId)) { + // Use the pre-fetched notes + this.unitNotes = this.unitNotesMap.get(unitId) || []; + } else { + this.backendService.getUnitNotes( + this.appService.selectedWorkspaceId, + unitId + ).subscribe({ + next: notes => { + this.unitNotes = notes; + this.unitNotesMap.set(unitId, notes); + }, + error: () => { + this.snackBar.open( + 'Fehler beim Laden der Notizen', + 'Fehler', + { duration: 3000 } + ); + } + }); + } } else { this.unitNotes = []; } } + + hasUnitNotes(unitId: number): boolean { + if (!unitId || !this.unitNotesMap.has(unitId)) { + return false; + } + const notes = this.unitNotesMap.get(unitId) || []; + return notes.length > 0; + } + addUnitTag(): void { if (!this.newTagText.trim()) { this.snackBar.open( diff --git a/database/changelog/coding-box.changelog-0.10.0.sql b/database/changelog/coding-box.changelog-0.10.0.sql new file mode 100644 index 000000000..e0c7a48d8 --- /dev/null +++ b/database/changelog/coding-box.changelog-0.10.0.sql @@ -0,0 +1,15 @@ +-- liquibase formatted sql + +-- changeset jurei733:1 +CREATE TABLE unit_note ( + id SERIAL PRIMARY KEY NOT NULL, + "unitId" BIGINT NOT NULL, + note TEXT NOT NULL, + "createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + "updatedAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX unit_note_unitId_idx ON unit_note("unitId"); +CREATE INDEX unit_note_composite_idx ON unit_note("unitId", note); + +-- rollback DROP TABLE IF EXISTS unit_note; diff --git a/database/changelog/coding-box.changelog-root.xml b/database/changelog/coding-box.changelog-root.xml index d7a53f5de..e87f9d0c7 100644 --- a/database/changelog/coding-box.changelog-root.xml +++ b/database/changelog/coding-box.changelog-root.xml @@ -18,4 +18,5 @@ + From b441fcf0ba64d12a0a5776e9750f0eb967a452e5 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Sun, 20 Jul 2025 17:19:16 +0200 Subject: [PATCH 16/21] Add a booklet replay option --- .../workspace/workspace-player.controller.ts | 21 ++- .../services/workspace-player.service.ts | 154 +++++++++++++++++- .../components/replay/replay.component.html | 26 ++- .../components/replay/replay.component.scss | 85 ++++++++++ .../components/replay/replay.component.ts | 153 ++++++++++++++--- .../src/app/replay/utils/dom-utils.ts | 2 - .../src/app/services/backend.service.ts | 6 +- .../app/services/booklet-replay.service.ts | 75 +++++++++ .../frontend/src/app/services/file.service.ts | 20 +++ .../test-results/test-results.component.html | 2 +- .../test-results/test-results.component.ts | 87 +++++++++- .../src/assets/config/runtime-config.js | 8 + 12 files changed, 607 insertions(+), 32 deletions(-) create mode 100644 apps/frontend/src/app/services/booklet-replay.service.ts create mode 100644 apps/frontend/src/assets/config/runtime-config.js diff --git a/apps/backend/src/app/admin/workspace/workspace-player.controller.ts b/apps/backend/src/app/admin/workspace/workspace-player.controller.ts index 93518636e..07340da5f 100644 --- a/apps/backend/src/app/admin/workspace/workspace-player.controller.ts +++ b/apps/backend/src/app/admin/workspace/workspace-player.controller.ts @@ -3,14 +3,14 @@ import { Get, Param, UseGuards } from '@nestjs/common'; import { - ApiParam, ApiTags + ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger'; import { JwtAuthGuard } from '../../auth/jwt-auth.guard'; import { WorkspaceGuard } from './workspace.guard'; import { WorkspaceId } from './workspace.decorator'; import { FilesDto } from '../../../../../../api-dto/files/files.dto'; import FileUpload from '../../database/entities/file_upload.entity'; -import { WorkspacePlayerService } from '../../database/services/workspace-player.service'; +import { WorkspacePlayerService, BookletUnit } from '../../database/services/workspace-player.service'; import { ResponseEntity } from '../../database/entities/response.entity'; @ApiTags('Admin Workspace Player') @@ -59,4 +59,21 @@ export class WorkspacePlayerController { const unitIdToUpperCase = unitId.toUpperCase(); return this.workspacePlayerService.findUnit(id, unitIdToUpperCase); } + + @Get(':workspace_id/booklet/:bookletId/units') + @UseGuards(JwtAuthGuard, WorkspaceGuard) + @ApiParam({ name: 'workspace_id', type: Number }) + @ApiParam({ name: 'bookletId', type: String }) + @ApiOperation({ summary: 'Get units from a booklet in order' }) + @ApiResponse({ + status: 200, + description: 'Returns an array of units from the booklet in the correct order', + }) + + async getBookletUnits( + @WorkspaceId() workspaceId: number, + @Param('bookletId') bookletId: string + ): Promise { + return this.workspacePlayerService.getBookletUnits(workspaceId, bookletId); + } } diff --git a/apps/backend/src/app/database/services/workspace-player.service.ts b/apps/backend/src/app/database/services/workspace-player.service.ts index fad51e92d..fed604a07 100644 --- a/apps/backend/src/app/database/services/workspace-player.service.ts +++ b/apps/backend/src/app/database/services/workspace-player.service.ts @@ -1,11 +1,43 @@ -import { Injectable, Logger } from '@nestjs/common'; +import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { parseStringPromise } from 'xml2js'; import FileUpload from '../entities/file_upload.entity'; import { FilesDto } from '../../../../../../api-dto/files/files.dto'; import Persons from '../entities/persons.entity'; import { ResponseEntity } from '../entities/response.entity'; +export interface BookletUnit { + id: number; + name: string; + alias: string | null; + bookletId: number; +} + +interface IndexTracker { + currentIndex: number; +} + +interface XmlElementWithAttributes { + $?: { + id?: string; + alias?: string; + label?: string; + }; +} + +interface BookletElement { + Unit?: XmlElementWithAttributes[]; + Testlet?: TestletElement[]; + $?: { + id?: string; + }; +} + +interface TestletElement extends BookletElement { + // Testlet extends BookletElement to allow for nested testlets +} + @Injectable() export class WorkspacePlayerService { private readonly logger = new Logger(WorkspacePlayerService.name); @@ -146,4 +178,124 @@ export class WorkspacePlayerService { } return []; } + + async getBookletUnits(workspaceId: number, bookletId: string): Promise { + this.logger.log(`Getting units for booklet ${bookletId} in workspace ${workspaceId}`); + + try { + const bookletFiles = await this.fileUploadRepository.find({ + where: { + file_id: bookletId.toUpperCase(), + workspace_id: workspaceId + } + }); + + if (!bookletFiles || bookletFiles.length === 0) { + this.logger.error(`Booklet file with ID ${bookletId} not found in workspace ${workspaceId}`); + throw new NotFoundException(`Booklet file with ID ${bookletId} not found`); + } + + const bookletFile = bookletFiles[0]; + const bookletData = bookletFile.data; + + const units: BookletUnit[] = []; + let parsedBookletId = 0; + + try { + const result = await parseStringPromise(bookletData); + + if (result.Booklet && result.Booklet.$) { + parsedBookletId = parseInt(result.Booklet.$.id || '0', 10) || 0; + this.logger.log(`Parsed booklet ID: ${parsedBookletId}`); + } + + if (result.Booklet && result.Booklet.Units && result.Booklet.Units[0]) { + const unitsElement = result.Booklet.Units[0]; + + const indexTracker = { currentIndex: 0 }; + + this.logger.log(`Starting to process booklet structure with ID: ${parsedBookletId}`); + + // Process all units and testlets in the booklet + this.processUnitsAndTestlets(unitsElement, units, parsedBookletId, indexTracker); + + this.logger.log(`Finished processing booklet structure. Final index: ${indexTracker.currentIndex}`); + + this.logger.log(`Found ${units.length} total units in booklet ${bookletId}`); + } + } catch (error) { + this.logger.error(`Error parsing booklet XML: ${error.message}`, error.stack); + throw new Error(`Error parsing booklet XML: ${error.message}`); + } + + if (units.length === 0) { + this.logger.warn(`No units found in booklet ${bookletId}`); + } + + return units; + } catch (error) { + if (error instanceof NotFoundException) { + throw error; + } + this.logger.error(`Error getting units for booklet ${bookletId}: ${error.message}`, error.stack); + throw new Error(`Error getting units for booklet ${bookletId}: ${error.message}`); + } + } + + private processUnitsAndTestlets( + element: BookletElement, + units: BookletUnit[], + bookletId: number, + indexTracker: IndexTracker + ): void { + // Process direct Unit elements if they exist + if (element.Unit && Array.isArray(element.Unit)) { + this.logger.log(`Processing ${element.Unit.length} direct Unit elements`); + element.Unit.forEach((unitElement: XmlElementWithAttributes) => { + if (unitElement && unitElement.$) { + this.addUnitToList(unitElement, units, bookletId, indexTracker); + } + }); + } + + // Process Testlet elements if they exist + if (element.Testlet && Array.isArray(element.Testlet)) { + this.logger.log(`Processing ${element.Testlet.length} Testlet elements`); + element.Testlet.forEach((testlet: TestletElement) => { + // Log testlet ID for debugging + if (testlet && testlet.$) { + this.logger.log(`Processing Testlet with ID: ${testlet.$.id || 'unknown'}`); + } + + // Process units inside this testlet + this.processUnitsAndTestlets(testlet, units, bookletId, indexTracker); + }); + } + } + + private addUnitToList( + unitElement: XmlElementWithAttributes, + units: BookletUnit[], + bookletId: number, + indexTracker: IndexTracker + ): void { + if (unitElement && unitElement.$) { + // Use the current index and then increment it + const currentIndex = indexTracker.currentIndex; + indexTracker.currentIndex += 1; + + const unitId = parseInt(unitElement.$.id || '0', 10) || currentIndex + 1; + const unitName = unitElement.$.id || ''; + const unitAlias = unitElement.$.alias || unitElement.$.label || null; + + units.push({ + id: unitId, + name: unitName, + alias: unitAlias, + bookletId: bookletId + }); + + this.logger.log(`Added unit: ${unitName} (${unitAlias || 'no alias'})`); + } + } } diff --git a/apps/frontend/src/app/replay/components/replay/replay.component.html b/apps/frontend/src/app/replay/components/replay/replay.component.html index 730c30070..fbab9d866 100755 --- a/apps/frontend/src/app/replay/components/replay/replay.component.html +++ b/apps/frontend/src/app/replay/components/replay/replay.component.html @@ -1,6 +1,28 @@ -
+
- @if (!!player && unitDef ){ + + + @if (isBookletMode && !!player && unitDef) { +
+ +
+ } + + @if (!!player && unitDef) { | null = null; private pageErrorSnackbarRef: MatSnackBarRef | null = null; @@ -58,6 +62,7 @@ export class ReplayComponent implements OnInit, OnDestroy, OnChanges { private routerSubscription: Subscription | null = null; readonly testPersonInput = input(); readonly unitIdInput = input(); + private bookletData: BookletReplay | null = null; @ViewChild(UnitPlayerComponent) unitPlayerComponent: UnitPlayerComponent | undefined; ngOnInit(): void { @@ -87,6 +92,23 @@ export class ReplayComponent implements OnInit, OnDestroy, OnChanges { return auth; } + private deserializeBookletData(encodedData: string): BookletReplay | null { + if (!encodedData) { + return null; + } + + try { + // Decode the Base64 string to get the JSON string + const jsonString = atob(encodedData); + + // Parse the JSON string to get the BookletReplay object + return JSON.parse(jsonString) as BookletReplay; + } catch (error) { + console.error('Error deserializing booklet data:', error); + return null; + } + } + subscribeRouter(): void { this.routerSubscription = this.route.params ?.subscribe(async params => { @@ -94,6 +116,21 @@ export class ReplayComponent implements OnInit, OnDestroy, OnChanges { this.resetUnitData(); this.authToken = await this.getAuthToken(); + const queryParams = await firstValueFrom(this.route.queryParams); + this.isBookletMode = queryParams.mode === 'booklet'; + + // If in booklet mode and bookletData is provided, deserialize it + if (this.isBookletMode && queryParams.bookletData) { + const deserializedBooklet = this.deserializeBookletData(queryParams.bookletData); + if (deserializedBooklet) { + console.log('Deserialized booklet data from URL:', deserializedBooklet); + this.bookletData = deserializedBooklet; + // Update the component state + this.currentUnitIndex = deserializedBooklet.currentUnitIndex; + this.totalUnits = deserializedBooklet.units.length; + } + } + if (this.authToken) { const tokenValidation = validateToken(this.authToken); if (!tokenValidation.isValid) { @@ -128,6 +165,7 @@ export class ReplayComponent implements OnInit, OnDestroy, OnChanges { if (workspace) { const unitData = await this.getUnitData(Number(workspace), this.authToken); this.setUnitProperties(unitData); + setTimeout(() => { if (this.unitPlayerComponent?.hostingIframe?.nativeElement) { if (this.anchor) { @@ -191,38 +229,44 @@ export class ReplayComponent implements OnInit, OnDestroy, OnChanges { } async ngOnChanges(changes: SimpleChanges): Promise { + // Handle unitIdInput changes // eslint-disable-next-line @typescript-eslint/dot-notation if (typeof changes['unitIdInput']?.currentValue === 'undefined') { this.resetUnitData(); this.resetSnackBars(); return Promise.resolve(); } - this.resetUnitData(); - this.resetSnackBars(); - if (this.authToken) { - const tokenValidation = validateToken(this.authToken); - if (!tokenValidation.isValid) { - this.setIsLoaded(); - if (tokenValidation.errorType === 'token_expired') { - this.openErrorSnackBar(this.getErrorMessages().tokenExpired, 'Schließen'); - } else { - this.openErrorSnackBar(this.getErrorMessages().tokenInvalid, 'Schließen'); + // eslint-disable-next-line @typescript-eslint/dot-notation + if (changes.unitIdInput) { + this.resetUnitData(); + this.resetSnackBars(); + + if (this.authToken) { + const tokenValidation = validateToken(this.authToken); + if (!tokenValidation.isValid) { + this.setIsLoaded(); + if (tokenValidation.errorType === 'token_expired') { + this.openErrorSnackBar(this.getErrorMessages().tokenExpired, 'Schließen'); + } else { + this.openErrorSnackBar(this.getErrorMessages().tokenInvalid, 'Schließen'); + } + return Promise.resolve(); } - return Promise.resolve(); } - } - const { unitIdInput } = changes; - try { - this.unitId = unitIdInput.currentValue; - this.setTestPerson(this.testPersonInput() || ''); - const unitData = await this.getUnitData(this.appService.selectedWorkspaceId, this.authToken); - this.setUnitProperties(unitData); - } catch (error) { - this.setIsLoaded(); - this.catchError(error as HttpErrorResponse); + const { unitIdInput } = changes; + try { + this.unitId = unitIdInput.currentValue; + this.setTestPerson(this.testPersonInput() || ''); + const unitData = await this.getUnitData(this.appService.selectedWorkspaceId, this.authToken); + this.setUnitProperties(unitData); + } catch (error) { + this.setIsLoaded(); + this.catchError(error as HttpErrorResponse); + } } + return Promise.resolve(); } @@ -389,6 +433,73 @@ export class ReplayComponent implements OnInit, OnDestroy, OnChanges { this.responses = undefined; } + nextUnit(): void { + if (this.isBookletMode && this.bookletData) { + if (this.bookletData.currentUnitIndex < this.bookletData.units.length - 1) { + this.bookletData = { + ...this.bookletData, + currentUnitIndex: this.bookletData.currentUnitIndex + 1 + }; + + this.currentUnitIndex = this.bookletData.currentUnitIndex; + + const currentUnit = this.bookletData.units[this.bookletData.currentUnitIndex]; + if (currentUnit && currentUnit.name !== this.unitId) { + this.unitId = currentUnit.name; + if (this.authToken) { + const decoded: JwtPayload & { workspace: string } = jwtDecode(this.authToken); + const workspace = decoded?.workspace; + if (workspace) { + this.getUnitData(Number(workspace), this.authToken).then(unitData => { + this.setUnitProperties(unitData); + }); + } + } + } + } + } + } + + previousUnit(): void { + if (this.isBookletMode && this.bookletData) { + if (this.bookletData.currentUnitIndex > 0) { + this.bookletData = { + ...this.bookletData, + currentUnitIndex: this.bookletData.currentUnitIndex - 1 + }; + + this.currentUnitIndex = this.bookletData.currentUnitIndex; + + const currentUnit = this.bookletData.units[this.bookletData.currentUnitIndex]; + if (currentUnit && currentUnit.name !== this.unitId) { + this.unitId = currentUnit.name; + + if (this.authToken) { + const decoded: JwtPayload & { workspace: string } = jwtDecode(this.authToken); + const workspace = decoded?.workspace; + if (workspace) { + this.getUnitData(Number(workspace), this.authToken).then(unitData => { + this.setUnitProperties(unitData); + }); + } + } + } + } + } + } + + hasNextUnit(): boolean { + if (!this.bookletData) return false; + + return this.bookletData.currentUnitIndex < this.bookletData.units.length - 1; + } + + hasPreviousUnit(): boolean { + if (!this.bookletData) return false; + + return this.bookletData.currentUnitIndex > 0; + } + ngOnDestroy(): void { this.routerSubscription?.unsubscribe(); this.routerSubscription = null; diff --git a/apps/frontend/src/app/replay/utils/dom-utils.ts b/apps/frontend/src/app/replay/utils/dom-utils.ts index a667cb3da..6287b740c 100644 --- a/apps/frontend/src/app/replay/utils/dom-utils.ts +++ b/apps/frontend/src/app/replay/utils/dom-utils.ts @@ -92,11 +92,9 @@ export function scrollToElementByAlias( options?: ScrollIntoViewOptions ): boolean { try { - console.log(iframe); const elements = findElementsByDataAlias(iframe); const element = elements[alias]; if (element) { - // Use scrollIntoView with smooth behavior by default element.scrollIntoView(options || { behavior: 'smooth', block: 'center' }); return true; } diff --git a/apps/frontend/src/app/services/backend.service.ts b/apps/frontend/src/app/services/backend.service.ts index 3b9d94a43..f28e22ed2 100755 --- a/apps/frontend/src/app/services/backend.service.ts +++ b/apps/frontend/src/app/services/backend.service.ts @@ -12,7 +12,7 @@ import { TestGroupsInfoDto } from '../../../../../api-dto/files/test-groups-info import { SERVER_URL } from '../injection-tokens'; import { UserService } from './user.service'; import { WorkspaceService } from './workspace.service'; -import { FileService } from './file.service'; +import { FileService, BookletUnit } from './file.service'; import { CodingService } from './coding.service'; import { UnitTagService } from './unit-tag.service'; import { UnitNoteService } from './unit-note.service'; @@ -345,6 +345,10 @@ export class BackendService { return this.fileService.getUnit(workspaceId, unitId, authToken); } + getBookletUnits(workspaceId: number, bookletId: string, authToken?: string): Observable { + return this.fileService.getBookletUnits(workspaceId, bookletId, authToken); + } + getTestPersons(workspaceId: number): Observable { return this.testResultService.getTestPersons(workspaceId); } diff --git a/apps/frontend/src/app/services/booklet-replay.service.ts b/apps/frontend/src/app/services/booklet-replay.service.ts new file mode 100644 index 000000000..a33671b58 --- /dev/null +++ b/apps/frontend/src/app/services/booklet-replay.service.ts @@ -0,0 +1,75 @@ +import { Injectable, inject } from '@angular/core'; +import { + Observable, + map, + catchError, + of, + switchMap +} from 'rxjs'; +import { BackendService } from './backend.service'; + +export interface BookletReplayUnit { + id: number; + name: string; + alias: string | null; + bookletId: number; +} + +export interface BookletReplay { + id: number; + name: string; + units: BookletReplayUnit[]; + currentUnitIndex: number; +} + +@Injectable({ + providedIn: 'root' +}) +export class BookletReplayService { + private backendService = inject(BackendService); + getBookletFromFileUpload(workspaceId: number, bookletFileId: string): Observable { + return this.backendService.getUnit(workspaceId, bookletFileId).pipe( + switchMap(bookletFiles => { + if (!bookletFiles || bookletFiles.length === 0) { + return of(null); + } + + const bookletFile = bookletFiles[0]; + const bookletId = 0; + let bookletName = bookletFileId; + + try { + if (bookletFile.file_id) { + bookletName = bookletFile.file_id; + } + } catch (error) { + console.error('Error extracting basic booklet information:', error); + } + + return this.backendService.getBookletUnits(workspaceId, bookletFileId).pipe( + map(units => { + if (!units || units.length === 0) { + console.warn(`No units found in booklet ${bookletFileId}`); + return null; + } + + const bookletReplay: BookletReplay = { + id: bookletId, + name: bookletName, + units: units.map(unit => ({ + id: unit.id, + name: unit.name, + alias: unit.alias, + bookletId: unit.bookletId || bookletId + })), + currentUnitIndex: 0 + }; + + return bookletReplay; + }) + ); + }), + catchError(() => of(null)) + ); + } +} diff --git a/apps/frontend/src/app/services/file.service.ts b/apps/frontend/src/app/services/file.service.ts index 9ba61ca88..ef41973e3 100644 --- a/apps/frontend/src/app/services/file.service.ts +++ b/apps/frontend/src/app/services/file.service.ts @@ -13,6 +13,13 @@ import { FileValidationResultDto } from '../../../../../api-dto/files/file-valid import { FileDownloadDto } from '../../../../../api-dto/files/file-download.dto'; import { SERVER_URL } from '../injection-tokens'; +export interface BookletUnit { + id: number; + name: string; + alias: string | null; + bookletId: number; +} + interface PaginatedResponse { data: T[]; total: number; @@ -175,4 +182,17 @@ export class FileService { catchError(() => of(false)) ); } + + getBookletUnits(workspaceId: number, bookletId: string, authToken?: string): Observable { + const headers = authToken ? { Authorization: `Bearer ${authToken}` } : this.authHeader; + return this.http.get( + `${this.serverUrl}admin/workspace/${workspaceId}/booklet/${bookletId}/units`, + { headers } + ).pipe( + catchError(error => { + console.error(`Error retrieving booklet units for ${bookletId}:`, error); + return of([]); + }) + ); + } } diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html index 52b4dd330..a59d88d7f 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html @@ -183,7 +183,7 @@

Testhefte

- diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts index 283d91812..61f99aa15 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts @@ -54,6 +54,7 @@ import { ValidationDialogComponent } from '../validation-dialog/validation-dialo import { VariableValidationDto } from '../../../../../../../api-dto/files/variable-validation.dto'; import { VariableAnalysisDialogComponent } from '../variable-analysis-dialog/variable-analysis-dialog.component'; import { ValidationTaskStateService } from '../../../services/validation-task-state.service'; +import { BookletReplay, BookletReplayService } from '../../../services/booklet-replay.service'; interface BookletLog { id: number; @@ -181,6 +182,7 @@ export class TestResultsComponent implements OnInit, OnDestroy { private snackBar = inject(MatSnackBar); private translateService = inject(TranslateService); private validationTaskStateService = inject(ValidationTaskStateService); + private bookletReplayService = inject(BookletReplayService); private searchSubject = new Subject(); private searchSubscription: Subscription | null = null; private readonly SEARCH_DEBOUNCE_TIME = 800; @@ -475,7 +477,77 @@ export class TestResultsComponent implements OnInit, OnDestroy { }); } - replayBooklet() { + replayBooklet(booklet: Booklet) { + if (!booklet || !booklet.name) { + this.snackBar.open( + 'Ungültiges Testheft', + 'Info', + { duration: 3000 } + ); + return; + } + + // Show loading indicator + const loadingSnackBar = this.snackBar.open( + 'Lade Testheft...', + '', + { duration: 3000 } + ); + + // Get the booklet from file_upload using the new method + this.bookletReplayService.getBookletFromFileUpload( + this.appService.selectedWorkspaceId, + booklet.name + ).subscribe({ + next: bookletReplay => { + loadingSnackBar.dismiss(); + + if (!bookletReplay || !bookletReplay.units || bookletReplay.units.length === 0) { + this.snackBar.open( + 'Keine Units im Testheft vorhanden', + 'Info', + { duration: 3000 } + ); + return; + } + + // Serialize the booklet data for URL transmission + console.log(bookletReplay); + const serializedBooklet = this.serializeBookletData(bookletReplay); + + const firstUnit = bookletReplay.units[0]; + + this.appService + .createToken(this.appService.selectedWorkspaceId, this.appService.loggedUser?.sub || '', 1) + .subscribe(token => { + const queryParams = { + auth: token, + mode: 'booklet', + bookletData: serializedBooklet + }; + + // Construct the URL with the first unit + const url = this.router + .serializeUrl( + this.router.createUrlTree( + [`replay/${this.testPerson.login}@${this.testPerson.code}@${booklet.name}/${firstUnit.name}/0/0`], + { queryParams: queryParams }) + ); + + // Open the replay in a new tab + window.open(`#/${url}`, '_blank'); + }); + }, + error: error => { + loadingSnackBar.dismiss(); + console.error('Error loading booklet:', error); + this.snackBar.open( + 'Fehler beim Laden des Testhefts', + 'Fehler', + { duration: 3000 } + ); + } + }); } replayUnit() { @@ -672,7 +744,6 @@ export class TestResultsComponent implements OnInit, OnDestroy { } } - hasUnitNotes(unitId: number): boolean { if (!unitId || !this.unitNotesMap.has(unitId)) { return false; @@ -1339,6 +1410,18 @@ export class TestResultsComponent implements OnInit, OnDestroy { }); } + private serializeBookletData(booklet: BookletReplay): string { + try { + // Convert the booklet to a JSON string + const jsonString = JSON.stringify(booklet); + + // Base64 encode the JSON string to make it URL-safe + return btoa(jsonString); + } catch (error) { + return ''; + } + } + openVariableAnalysisDialog(): void { const loadingSnackBar = this.snackBar.open( 'Lade Analyse-Aufträge...', diff --git a/apps/frontend/src/assets/config/runtime-config.js b/apps/frontend/src/assets/config/runtime-config.js new file mode 100644 index 000000000..ee361e12b --- /dev/null +++ b/apps/frontend/src/assets/config/runtime-config.js @@ -0,0 +1,8 @@ +window.RUNTIME_CONFIG = { + keycloak: { + url: 'https://keycloak.kodierbox.iqb.hu-berlin.de/', + realm: 'iqb', + clientId: 'coding-box' + }, + backendUrl: 'api/' +}; From af96089a4d2fb5479b7f252a44d9702748e36dad Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Sun, 20 Jul 2025 19:17:10 +0200 Subject: [PATCH 17/21] Add a booklet info button --- .../booklet-info/booklet-config-item.dto.ts | 12 + api-dto/booklet-info/booklet-config.dto.ts | 10 + api-dto/booklet-info/booklet-info.dto.ts | 26 ++ api-dto/booklet-info/booklet-metadata.dto.ts | 15 + .../booklet-info/booklet-restriction.dto.ts | 12 + api-dto/booklet-info/booklet-testlet.dto.ts | 20 + api-dto/booklet-info/booklet-unit.dto.ts | 18 + apps/backend/src/app/admin/admin.module.ts | 14 +- .../workspace/booklet-info.controller.ts | 38 ++ .../database/services/booklet-info.service.ts | 346 ++++++++++++++++++ .../src/app/services/backend.service.ts | 5 + .../frontend/src/app/services/file.service.ts | 16 +- .../booklet-info-dialog.component.html | 158 ++++++++ .../booklet-info-dialog.component.scss | 253 +++++++++++++ .../booklet-info-dialog.component.ts | 47 +++ .../test-results/test-results.component.html | 4 + .../test-results/test-results.component.ts | 42 ++- 17 files changed, 1028 insertions(+), 8 deletions(-) create mode 100644 api-dto/booklet-info/booklet-config-item.dto.ts create mode 100644 api-dto/booklet-info/booklet-config.dto.ts create mode 100644 api-dto/booklet-info/booklet-info.dto.ts create mode 100644 api-dto/booklet-info/booklet-metadata.dto.ts create mode 100644 api-dto/booklet-info/booklet-restriction.dto.ts create mode 100644 api-dto/booklet-info/booklet-testlet.dto.ts create mode 100644 api-dto/booklet-info/booklet-unit.dto.ts create mode 100644 apps/backend/src/app/admin/workspace/booklet-info.controller.ts create mode 100644 apps/backend/src/app/database/services/booklet-info.service.ts create mode 100644 apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.html create mode 100644 apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.scss create mode 100644 apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.ts diff --git a/api-dto/booklet-info/booklet-config-item.dto.ts b/api-dto/booklet-info/booklet-config-item.dto.ts new file mode 100644 index 000000000..1572a0410 --- /dev/null +++ b/api-dto/booklet-info/booklet-config-item.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +/** + * DTO for booklet configuration item + */ +export class BookletConfigItemDto { + @ApiProperty({ description: 'Configuration key', example: 'loading_mode' }) + key!: string; + + @ApiProperty({ description: 'Configuration value', example: 'LAZY' }) + value!: string; +} diff --git a/api-dto/booklet-info/booklet-config.dto.ts b/api-dto/booklet-info/booklet-config.dto.ts new file mode 100644 index 000000000..0b06e10de --- /dev/null +++ b/api-dto/booklet-info/booklet-config.dto.ts @@ -0,0 +1,10 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { BookletConfigItemDto } from './booklet-config-item.dto'; + +/** + * DTO for booklet configuration collection + */ +export class BookletConfigDto { + @ApiProperty({ description: 'List of configuration items', type: [BookletConfigItemDto] }) + items!: BookletConfigItemDto[]; +} diff --git a/api-dto/booklet-info/booklet-info.dto.ts b/api-dto/booklet-info/booklet-info.dto.ts new file mode 100644 index 000000000..919bc606c --- /dev/null +++ b/api-dto/booklet-info/booklet-info.dto.ts @@ -0,0 +1,26 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { BookletMetadataDto } from './booklet-metadata.dto'; +import { BookletUnitDto } from './booklet-unit.dto'; +import { BookletRestrictionDto } from './booklet-restriction.dto'; +import { BookletConfigDto } from './booklet-config.dto'; +import { BookletTestletDto } from './booklet-testlet.dto'; + +export class BookletInfoDto { + @ApiProperty({ description: 'Booklet metadata' }) + metadata!: BookletMetadataDto; + + @ApiProperty({ description: 'Booklet configuration', required: false }) + config?: BookletConfigDto; + + @ApiProperty({ description: 'List of units in the booklet', type: [BookletUnitDto] }) + units!: BookletUnitDto[]; + + @ApiProperty({ description: 'List of testlets in the booklet', type: [BookletTestletDto], required: false }) + testlets?: BookletTestletDto[]; + + @ApiProperty({ description: 'List of restrictions for the booklet', type: [BookletRestrictionDto] }) + restrictions!: BookletRestrictionDto[]; + + @ApiProperty({ description: 'Raw XML of the booklet', required: false }) + rawXml?: string; +} diff --git a/api-dto/booklet-info/booklet-metadata.dto.ts b/api-dto/booklet-info/booklet-metadata.dto.ts new file mode 100644 index 000000000..5f1dfd22c --- /dev/null +++ b/api-dto/booklet-info/booklet-metadata.dto.ts @@ -0,0 +1,15 @@ +import { ApiProperty } from '@nestjs/swagger'; + +/** + * DTO for booklet metadata + */ +export class BookletMetadataDto { + @ApiProperty({ description: 'Booklet ID', example: 'BOOKLET123' }) + id!: string; + + @ApiProperty({ description: 'Booklet label', example: 'Math Test 2023' }) + label?: string; + + @ApiProperty({ description: 'Booklet description', example: 'Mathematics assessment for grade 10' }) + description?: string; +} diff --git a/api-dto/booklet-info/booklet-restriction.dto.ts b/api-dto/booklet-info/booklet-restriction.dto.ts new file mode 100644 index 000000000..0655fc682 --- /dev/null +++ b/api-dto/booklet-info/booklet-restriction.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +/** + * DTO for booklet restriction + */ +export class BookletRestrictionDto { + @ApiProperty({ description: 'Restriction type', example: 'timeMax' }) + type!: string; + + @ApiProperty({ description: 'Restriction value', example: '60' }) + value!: string; +} diff --git a/api-dto/booklet-info/booklet-testlet.dto.ts b/api-dto/booklet-info/booklet-testlet.dto.ts new file mode 100644 index 000000000..6b4287eb6 --- /dev/null +++ b/api-dto/booklet-info/booklet-testlet.dto.ts @@ -0,0 +1,20 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { BookletUnitDto } from './booklet-unit.dto'; +import { BookletRestrictionDto } from './booklet-restriction.dto'; + +/** + * DTO for booklet testlet + */ +export class BookletTestletDto { + @ApiProperty({ description: 'Testlet ID', example: 'TESTLET123' }) + id!: string; + + @ApiProperty({ description: 'Testlet label', example: 'Math Section' }) + label?: string; + + @ApiProperty({ description: 'List of units in the testlet', type: [BookletUnitDto] }) + units!: BookletUnitDto[]; + + @ApiProperty({ description: 'List of restrictions for the testlet', type: [BookletRestrictionDto] }) + restrictions?: BookletRestrictionDto[]; +} diff --git a/api-dto/booklet-info/booklet-unit.dto.ts b/api-dto/booklet-info/booklet-unit.dto.ts new file mode 100644 index 000000000..603ca99ce --- /dev/null +++ b/api-dto/booklet-info/booklet-unit.dto.ts @@ -0,0 +1,18 @@ +import { ApiProperty } from '@nestjs/swagger'; + +/** + * DTO for booklet unit + */ +export class BookletUnitDto { + @ApiProperty({ description: 'Unit ID', example: 'UNIT123' }) + id!: string; + + @ApiProperty({ description: 'Unit label', example: 'Algebra Problem 1' }) + label?: string; + + @ApiProperty({ description: 'Unit alias', example: 'M1' }) + alias?: string; + + @ApiProperty({ description: 'Unit position in booklet', example: 1 }) + position!: number; +} diff --git a/apps/backend/src/app/admin/admin.module.ts b/apps/backend/src/app/admin/admin.module.ts index 96d427f94..b0d781330 100755 --- a/apps/backend/src/app/admin/admin.module.ts +++ b/apps/backend/src/app/admin/admin.module.ts @@ -1,5 +1,6 @@ import { Module } from '@nestjs/common'; import { HttpModule } from '@nestjs/axios'; +import { TypeOrmModule } from '@nestjs/typeorm'; import { UsersController } from './users/users.controller'; import { DatabaseModule } from '../database/database.module'; import { AuthModule } from '../auth/auth.module'; @@ -18,12 +19,16 @@ import { JournalController } from './workspace/journal.controller'; import { VariableAnalysisController } from './variable-analysis/variable-analysis.controller'; import { JobsController } from './jobs/jobs.controller'; import { ValidationTaskController } from './workspace/validation-task.controller'; +import { BookletInfoController } from './workspace/booklet-info.controller'; +import { BookletInfoService } from '../database/services/booklet-info.service'; +import FileUpload from '../database/entities/file_upload.entity'; @Module({ imports: [ DatabaseModule, AuthModule, - HttpModule + HttpModule, + TypeOrmModule.forFeature([FileUpload]) ], controllers: [ UsersController, @@ -41,8 +46,11 @@ import { ValidationTaskController } from './workspace/validation-task.controller JournalController, VariableAnalysisController, JobsController, - ValidationTaskController + ValidationTaskController, + BookletInfoController ], - providers: [] + providers: [ + BookletInfoService + ] }) export class AdminModule {} diff --git a/apps/backend/src/app/admin/workspace/booklet-info.controller.ts b/apps/backend/src/app/admin/workspace/booklet-info.controller.ts new file mode 100644 index 000000000..0581f9d77 --- /dev/null +++ b/apps/backend/src/app/admin/workspace/booklet-info.controller.ts @@ -0,0 +1,38 @@ +import { + Controller, + Get, + Param, + UseGuards +} from '@nestjs/common'; +import { + ApiOperation, + ApiParam, + ApiResponse, + ApiTags +} from '@nestjs/swagger'; +import { JwtAuthGuard } from '../../auth/jwt-auth.guard'; +import { BookletInfoService } from '../../database/services/booklet-info.service'; +import { BookletInfoDto } from '../../../../../../api-dto/booklet-info/booklet-info.dto'; + +@ApiTags('Booklet Info') +@Controller('admin/workspace/:workspaceId/booklet') +@UseGuards(JwtAuthGuard) +export class BookletInfoController { + constructor(private readonly bookletInfoService: BookletInfoService) {} + + @Get(':bookletId/info') + @ApiOperation({ summary: 'Get booklet info from XML' }) + @ApiParam({ name: 'workspaceId', type: Number }) + @ApiParam({ name: 'bookletId', type: String }) + @ApiResponse({ + status: 200, + description: 'Booklet info retrieved successfully', + type: BookletInfoDto + }) + async getBookletInfo( + @Param('workspaceId') workspaceId: number, + @Param('bookletId') bookletId: string + ): Promise { + return this.bookletInfoService.getBookletInfo(workspaceId, bookletId); + } +} diff --git a/apps/backend/src/app/database/services/booklet-info.service.ts b/apps/backend/src/app/database/services/booklet-info.service.ts new file mode 100644 index 000000000..31542409b --- /dev/null +++ b/apps/backend/src/app/database/services/booklet-info.service.ts @@ -0,0 +1,346 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import * as xml2js from 'xml2js'; +import { BookletInfoDto } from '../../../../../../api-dto/booklet-info/booklet-info.dto'; +import { BookletMetadataDto } from '../../../../../../api-dto/booklet-info/booklet-metadata.dto'; +import { BookletUnitDto } from '../../../../../../api-dto/booklet-info/booklet-unit.dto'; +import { BookletRestrictionDto } from '../../../../../../api-dto/booklet-info/booklet-restriction.dto'; +import { BookletConfigDto } from '../../../../../../api-dto/booklet-info/booklet-config.dto'; +import { BookletConfigItemDto } from '../../../../../../api-dto/booklet-info/booklet-config-item.dto'; +import { BookletTestletDto } from '../../../../../../api-dto/booklet-info/booklet-testlet.dto'; +import FileUpload from '../entities/file_upload.entity'; + +@Injectable() +export class BookletInfoService { + constructor( + @InjectRepository(FileUpload) + private fileUploadRepository: Repository + ) {} + + /** + * Get booklet info from XML + * @param workspaceId Workspace ID + * @param bookletId Booklet ID + * @returns BookletInfoDto + */ + async getBookletInfo(workspaceId: number, bookletId: string): Promise { + // Fetch the booklet XML from the fileUpload database table + const bookletFile = await this.fileUploadRepository.findOne({ + where: { + workspace_id: workspaceId, + file_id: bookletId + } + }); + + if (!bookletFile) { + throw new Error(`Booklet with ID ${bookletId} not found in workspace ${workspaceId}`); + } + + // Parse the XML + const bookletXml = bookletFile.data; + const bookletInfo = await this.parseBookletXml(bookletXml); + return bookletInfo; + } + + /** + * Parse booklet XML according to booklet.xsd schema + * @param bookletXml Booklet XML + * @returns BookletInfoDto + */ + private async parseBookletXml(bookletXml: string): Promise { + // Configure parser to handle arrays properly and preserve attributes + const parser = new xml2js.Parser({ + explicitArray: true, // Always return arrays for elements that can occur multiple times + mergeAttrs: false, // Don't merge attributes into the element + attrkey: '$', // Use $ for attributes + charkey: '_' // Use _ for element text content + }); + + try { + if (!bookletXml || typeof bookletXml !== 'string') { + throw new Error('Invalid booklet XML: XML data is empty or not a string'); + } + + const result = await parser.parseStringPromise(bookletXml); + + // Validate that the parsed result has the expected structure + if (!result || !result.Booklet) { + throw new Error('Invalid booklet XML: Missing Booklet element'); + } + + // Validate and extract booklet metadata (required by schema) + if (!result.Booklet.Metadata || !result.Booklet.Metadata.length) { + throw new Error('Invalid booklet XML: Missing Metadata element'); + } + + const metadataElement = result.Booklet.Metadata[0] as Record; + + // Check for required metadata fields + if (!metadataElement.Id || !Array.isArray(metadataElement.Id) || metadataElement.Id.length === 0) { + throw new Error('Invalid booklet XML: Missing required Id in Metadata'); + } + + if (!metadataElement.Label || !Array.isArray(metadataElement.Label) || metadataElement.Label.length === 0) { + throw new Error('Invalid booklet XML: Missing required Label in Metadata'); + } + + const metadata: BookletMetadataDto = { + id: metadataElement.Id[0] as string || '', + label: metadataElement.Label[0] as string || '', + description: metadataElement.Description && Array.isArray(metadataElement.Description) ? + metadataElement.Description[0] as string : undefined + }; + + // Extract BookletConfig if present + let config: BookletConfigDto | undefined; + if (result.Booklet.BookletConfig && + Array.isArray(result.Booklet.BookletConfig) && + result.Booklet.BookletConfig.length > 0) { + const configElement = result.Booklet.BookletConfig[0] as Record; + + if (configElement.Config && Array.isArray(configElement.Config) && configElement.Config.length > 0) { + const configItems: BookletConfigItemDto[] = []; + + configElement.Config.forEach((configItem: Record) => { + if (configItem.$ && typeof configItem.$ === 'object') { + const configAttrs = configItem.$ as Record; + const key = configAttrs.key || ''; + + // Get the value (content of the Config element) + let value = ''; + if (typeof configItem === 'string') { + value = configItem; + } else if (configItem._ && typeof configItem._ === 'string') { + value = configItem._ as string; + } + + if (key && value) { + configItems.push({ key, value }); + } + } + }); + + if (configItems.length > 0) { + config = { items: configItems }; + } + } + } + + // Validate and extract units (required by schema) + if (!result.Booklet.Units || !Array.isArray(result.Booklet.Units) || result.Booklet.Units.length === 0) { + throw new Error('Invalid booklet XML: Missing Units element'); + } + + // Extract units and testlets recursively + const units: BookletUnitDto[] = []; + const testlets: BookletTestletDto[] = []; + const position = 1; // Track position for ordering + + // Process Units element + const unitsElement = result.Booklet.Units[0] as Record; + this.processUnitsAndTestlets(unitsElement, units, position, testlets); + + // If no units were found, the XML might be invalid + if (units.length === 0) { + console.warn('Warning: No units found in booklet XML'); + } + + // Extract restrictions from Units.Restrictions + const restrictions: BookletRestrictionDto[] = []; + this.extractRestrictionsFromElement(unitsElement, restrictions); + + // Build the response object + const response: BookletInfoDto = { + metadata, + units, + restrictions, + rawXml: bookletXml // Include the raw XML in the response + }; + + // Add optional properties if they exist + if (config) { + response.config = config; + } + + if (testlets.length > 0) { + response.testlets = testlets; + } + + return response; + } catch (error) { + console.error('Error parsing booklet XML:', error); + if (error instanceof Error) { + throw new Error(`Failed to parse booklet XML: ${error.message}`); + } else { + throw new Error('Failed to parse booklet XML: Unknown error'); + } + } + } + + /** + * Process Units and Testlets recursively to extract all units + * @param element The Units or Testlet element to process + * @param units Array to collect all units + * @param position Starting position for units + * @param testlets Optional array to collect testlet information + * @returns The next position to use + */ + private processUnitsAndTestlets( + element: Record, + units: BookletUnitDto[], + position: number, + testlets?: BookletTestletDto[] + ): number { + let currentPosition = position; + + // Process direct Unit children + if (element.Unit && Array.isArray(element.Unit)) { + element.Unit.forEach((unit: Record) => { + if (unit.$ && typeof unit.$ === 'object') { + const unitAttrs = unit.$ as Record; + units.push({ + id: unitAttrs.id || '', + label: unitAttrs.label || '', + alias: unitAttrs.alias || unitAttrs.id || '', + position: currentPosition + }); + currentPosition += 1; + } + }); + } + + // Process Testlet children and collect testlet information + if (element.Testlet && Array.isArray(element.Testlet)) { + element.Testlet.forEach((testlet: Record) => { + if (testlet.$ && typeof testlet.$ === 'object') { + const testletAttrs = testlet.$ as Record; + + // If we're collecting testlet information + if (testlets && Array.isArray(testlets)) { + const testletUnits: BookletUnitDto[] = []; + const testletRestrictions: BookletRestrictionDto[] = []; + + // Extract restrictions from testlet + this.extractRestrictionsFromElement(testlet, testletRestrictions); + + // Process units within this testlet + const nextPosition = this.processUnitsAndTestlets(testlet, testletUnits, currentPosition); + + // Add testlet to the collection + testlets.push({ + id: testletAttrs.id || '', + label: testletAttrs.label || '', + units: testletUnits, + restrictions: testletRestrictions.length > 0 ? testletRestrictions : undefined + }); + + currentPosition = nextPosition; + } else { + // If we're not collecting testlet info, just process units + currentPosition = this.processUnitsAndTestlets(testlet, units, currentPosition); + } + } + }); + } + + return currentPosition; + } + + /** + * Extract restrictions from an element + * @param element The element to extract restrictions from + * @param restrictions Array to collect restrictions + */ + private extractRestrictionsFromElement( + element: Record, + restrictions: BookletRestrictionDto[] + ): void { + if (!element.Restrictions || !Array.isArray(element.Restrictions) || element.Restrictions.length === 0) { + return; + } + + const restrictionsElement = element.Restrictions[0] as Record; + + // Extract TimeMax restriction + if (restrictionsElement.TimeMax && Array.isArray(restrictionsElement.TimeMax) && restrictionsElement.TimeMax.length > 0) { + const timeMax = restrictionsElement.TimeMax[0] as Record; + let timeMaxValue = ''; + + // Handle TimeMax with minutes attribute + if (timeMax.$ && typeof timeMax.$ === 'object') { + const timeMaxAttrs = timeMax.$ as Record; + if (timeMaxAttrs.minutes) { + timeMaxValue = timeMaxAttrs.minutes; + + // Include leave attribute if present + if (timeMaxAttrs.leave) { + timeMaxValue += ` (leave: ${timeMaxAttrs.leave})`; + } + } + } else if (typeof timeMax === 'string' || (timeMax._ && typeof timeMax._ === 'string')) { + // Handle TimeMax as string value + timeMaxValue = (timeMax._ as string) || timeMax as unknown as string; + } + + if (timeMaxValue) { + restrictions.push({ + type: 'timeMax', + value: timeMaxValue + }); + } + } + + // Extract CodeToEnter restriction + if (restrictionsElement.CodeToEnter && Array.isArray(restrictionsElement.CodeToEnter) && restrictionsElement.CodeToEnter.length > 0) { + const codeToEnter = restrictionsElement.CodeToEnter[0] as Record; + let codeValue = ''; + let promptText = ''; + + if (codeToEnter.$ && typeof codeToEnter.$ === 'object') { + const codeAttrs = codeToEnter.$ as Record; + if (codeAttrs.code) { + codeValue = codeAttrs.code; + } + } + + // Get the prompt text (content of the CodeToEnter element) + if (typeof codeToEnter === 'string') { + promptText = codeToEnter; + } else if (codeToEnter._ && typeof codeToEnter._ === 'string') { + promptText = codeToEnter._ as string; + } + + if (codeValue) { + restrictions.push({ + type: 'codeToEnter', + value: codeValue + (promptText ? ` (${promptText})` : '') + }); + } + } + + // Extract DenyNavigationOnIncomplete restriction + if (restrictionsElement.DenyNavigationOnIncomplete && + Array.isArray(restrictionsElement.DenyNavigationOnIncomplete) && + restrictionsElement.DenyNavigationOnIncomplete.length > 0) { + const denyNav = restrictionsElement.DenyNavigationOnIncomplete[0] as Record; + let denyNavValue = ''; + + if (denyNav.$ && typeof denyNav.$ === 'object') { + const denyNavAttrs = denyNav.$ as Record; + if (denyNavAttrs.presentation || denyNavAttrs.response) { + denyNavValue = `presentation:${denyNavAttrs.presentation || 'OFF'},response:${denyNavAttrs.response || 'OFF'}`; + } + } else if (typeof denyNav === 'string' || (denyNav._ && typeof denyNav._ === 'string')) { + denyNavValue = (denyNav._ as string) || denyNav as unknown as string; + } + + if (denyNavValue) { + restrictions.push({ + type: 'denyNavigationOnIncomplete', + value: denyNavValue + }); + } + } + } +} diff --git a/apps/frontend/src/app/services/backend.service.ts b/apps/frontend/src/app/services/backend.service.ts index f28e22ed2..1ebe2099f 100755 --- a/apps/frontend/src/app/services/backend.service.ts +++ b/apps/frontend/src/app/services/backend.service.ts @@ -44,6 +44,7 @@ import { ImportOptions, Result } from '../ws-admin/components/test-center-import import { UpdateUnitNoteDto } from '../../../../../api-dto/unit-notes/update-unit-note.dto'; import { ResponseDto } from '../../../../../api-dto/responses/response-dto'; import { InvalidVariableDto } from '../../../../../api-dto/files/variable-validation.dto'; +import { BookletInfoDto } from '../../../../../api-dto/booklet-info/booklet-info.dto'; interface PaginatedResponse { data: T[]; @@ -349,6 +350,10 @@ export class BackendService { return this.fileService.getBookletUnits(workspaceId, bookletId, authToken); } + getBookletInfo(workspaceId: number, bookletId: string, authToken?: string): Observable { + return this.fileService.getBookletInfo(workspaceId, bookletId, authToken); + } + getTestPersons(workspaceId: number): Observable { return this.testResultService.getTestPersons(workspaceId); } diff --git a/apps/frontend/src/app/services/file.service.ts b/apps/frontend/src/app/services/file.service.ts index ef41973e3..ac30ef076 100644 --- a/apps/frontend/src/app/services/file.service.ts +++ b/apps/frontend/src/app/services/file.service.ts @@ -5,12 +5,13 @@ import { map, Observable, of, - switchMap + switchMap, throwError } from 'rxjs'; import { FilesInListDto } from '../../../../../api-dto/files/files-in-list.dto'; import { FilesDto } from '../../../../../api-dto/files/files.dto'; import { FileValidationResultDto } from '../../../../../api-dto/files/file-validation-result.dto'; import { FileDownloadDto } from '../../../../../api-dto/files/file-download.dto'; +import { BookletInfoDto } from '../../../../../api-dto/booklet-info/booklet-info.dto'; import { SERVER_URL } from '../injection-tokens'; export interface BookletUnit { @@ -195,4 +196,17 @@ export class FileService { }) ); } + + getBookletInfo(workspaceId: number, bookletId: string, authToken?: string): Observable { + const headers = authToken ? { Authorization: `Bearer ${authToken}` } : this.authHeader; + return this.http.get( + `${this.serverUrl}admin/workspace/${workspaceId}/booklet/${bookletId}/info`, + { headers } + ).pipe( + catchError(error => { + console.error(`Error retrieving booklet info for ${bookletId}:`, error); + return throwError(() => error); + }) + ); + } } diff --git a/apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.html b/apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.html new file mode 100644 index 000000000..f6809c8b3 --- /dev/null +++ b/apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.html @@ -0,0 +1,158 @@ +
+
+

Booklet Information: {{ data.bookletId }}

+ +
+ + + +
+ +
+ +

Loading booklet information...

+
+ + +
+ error +

{{ errorMessage }}

+
+ + +
+ + + +
+
+

Booklet Metadata

+
+ ID: + {{ data.bookletInfo.metadata.id }} +
+
+ Label: + {{ data.bookletInfo.metadata.label }} +
+
+ Description: + {{ data.bookletInfo.metadata.description }} +
+
+ +
+

Restrictions

+
+ {{ restriction.type }}: + {{ restriction.value }} +
+
+
+
+ + + +
+
+

Booklet Configuration

+
+
+ {{ configItem.key }} + {{ configItem.value }} +
+
+
+
+
+ + + +
+
+

Testlets in Booklet

+
+
+
+ {{ testlet.id }} + {{ testlet.label }} +
+ + +
+

Restrictions

+
+ {{ restriction.type }}: + {{ restriction.value }} +
+
+ + +
+

Units ({{ testlet.units.length }})

+
+
+
+ #{{ unit.position }} + {{ unit.id }} + ({{ unit.alias }}) +
+
+ {{ unit.label }} +
+
+
+
+
+
+
+
+
+ + + +
+
+

Units in Booklet

+
+
+
+ #{{ unit.position }} + {{ unit.id }} + ({{ unit.alias }}) +
+
+ {{ unit.label }} +
+
+
+
+
+
+ + + +
+
+

Raw XML

+
+
{{ data.bookletInfo.rawXml }}
+
+
+
+
+
+
+
+ + + +
+ +
+
diff --git a/apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.scss b/apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.scss new file mode 100644 index 000000000..ca4d95222 --- /dev/null +++ b/apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.scss @@ -0,0 +1,253 @@ +.dialog-container { + display: flex; + flex-direction: column; + min-width: 600px; + max-width: 800px; + max-height: 80vh; +} + +.dialog-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px 24px; +} + +.dialog-title { + margin: 0; + font-size: 20px; + font-weight: 500; +} + +.dialog-content { + flex: 1; + padding: 24px; + overflow-y: auto; +} + +.dialog-actions { + display: flex; + justify-content: flex-end; + padding: 16px 24px; +} + +.loading-container, .error-container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 32px; + text-align: center; +} + +.error-container { + color: #f44336; +} + +.error-container mat-icon { + font-size: 48px; + height: 48px; + width: 48px; + margin-bottom: 16px; +} + +.tab-content { + padding: 24px 0; +} + +.info-section { + margin-bottom: 24px; +} + +.info-section h3 { + margin-top: 0; + margin-bottom: 16px; + font-size: 16px; + font-weight: 500; + color: #333; +} + +.info-item { + display: flex; + margin-bottom: 8px; + line-height: 1.5; +} + +.info-label { + font-weight: 500; + min-width: 120px; + color: #555; +} + +.info-value { + flex: 1; +} + +.units-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.unit-item { + padding: 12px; + border-radius: 4px; + background-color: #f5f5f5; + border-left: 4px solid #3f51b5; +} + +.unit-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 4px; +} + +.unit-position { + background-color: #3f51b5; + color: white; + border-radius: 50%; + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: 500; +} + +.unit-id { + font-weight: 500; + color: #333; +} + +.unit-alias { + color: #666; + font-size: 14px; +} + +.unit-label { + color: #666; + font-size: 14px; + margin-left: 32px; +} + +// Config styles +.config-list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.config-item { + display: flex; + padding: 8px 12px; + background-color: #f5f5f5; + border-radius: 4px; + border-left: 4px solid #4caf50; +} + +.config-key { + font-weight: 500; + color: #333; + min-width: 180px; +} + +.config-value { + color: #666; +} + +// Testlet styles +.testlets-list { + display: flex; + flex-direction: column; + gap: 16px; +} + +.testlet-item { + padding: 16px; + border-radius: 4px; + background-color: #f0f0f0; + border-left: 4px solid #ff9800; +} + +.testlet-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 12px; +} + +.testlet-id { + font-weight: 500; + font-size: 16px; + color: #333; +} + +.testlet-label { + color: #666; +} + +.testlet-restrictions { + margin-bottom: 16px; + padding: 12px; + background-color: #fff3e0; + border-radius: 4px; +} + +.testlet-restrictions h4 { + margin-top: 0; + margin-bottom: 8px; + font-size: 14px; + font-weight: 500; + color: #e65100; +} + +.testlet-restriction { + display: flex; + margin-bottom: 4px; +} + +.restriction-type { + font-weight: 500; + min-width: 120px; + color: #555; +} + +.testlet-units { + margin-top: 12px; +} + +.testlet-units h4 { + margin-top: 0; + margin-bottom: 8px; + font-size: 14px; + font-weight: 500; + color: #333; +} + +// Make the units inside testlets slightly different +.testlet-units .unit-item { + background-color: #ffffff; + border-left-color: #7986cb; +} + +// XML display styles +.xml-content { + max-height: 500px; + overflow: auto; + background-color: #f5f5f5; + border-radius: 4px; + border: 1px solid #e0e0e0; +} + +.xml-content pre { + margin: 0; + padding: 16px; + font-family: 'Courier New', Courier, monospace; + font-size: 14px; + line-height: 1.5; + white-space: pre-wrap; + word-break: break-word; + color: #333; +} diff --git a/apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.ts b/apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.ts new file mode 100644 index 000000000..4c0499798 --- /dev/null +++ b/apps/frontend/src/app/ws-admin/components/booklet-info-dialog/booklet-info-dialog.component.ts @@ -0,0 +1,47 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { BookletInfoDto } from '../../../../../../../api-dto/booklet-info/booklet-info.dto'; + +@Component({ + selector: 'coding-box-booklet-info-dialog', + templateUrl: './booklet-info-dialog.component.html', + styleUrls: ['./booklet-info-dialog.component.scss'], + standalone: true, + imports: [ + CommonModule, + MatDialogModule, + MatButtonModule, + MatIconModule, + MatTabsModule, + MatDividerModule, + MatProgressSpinnerModule + ] +}) +export class BookletInfoDialogComponent implements OnInit { + isLoading = true; + errorMessage: string | null = null; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: { + bookletInfo: BookletInfoDto; + bookletId: string; + } + ) {} + + ngOnInit(): void { + if (this.data.bookletInfo) { + this.isLoading = false; + } + } + + close(): void { + this.dialogRef.close(); + } +} diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html index a59d88d7f..48b065044 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.html @@ -191,6 +191,10 @@

Testhefte

list Logs +
@if (hasShortProcessingTime(booklet) || !isBookletComplete(booklet)) {
diff --git a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts index 61f99aa15..38cce93e9 100755 --- a/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts +++ b/apps/frontend/src/app/ws-admin/components/test-results/test-results.component.ts @@ -55,6 +55,8 @@ import { VariableValidationDto } from '../../../../../../../api-dto/files/variab import { VariableAnalysisDialogComponent } from '../variable-analysis-dialog/variable-analysis-dialog.component'; import { ValidationTaskStateService } from '../../../services/validation-task-state.service'; import { BookletReplay, BookletReplayService } from '../../../services/booklet-replay.service'; +import { BookletInfoDto } from '../../../../../../../api-dto/booklet-info/booklet-info.dto'; +import { BookletInfoDialogComponent } from '../booklet-info-dialog/booklet-info-dialog.component'; interface BookletLog { id: number; @@ -172,7 +174,8 @@ interface P { MatButton, MatIconButton, MatDivider, - MatTooltipModule] + MatTooltipModule + ] }) export class TestResultsComponent implements OnInit, OnDestroy { private dialog = inject(MatDialog); @@ -512,7 +515,6 @@ export class TestResultsComponent implements OnInit, OnDestroy { } // Serialize the booklet data for URL transmission - console.log(bookletReplay); const serializedBooklet = this.serializeBookletData(bookletReplay); const firstUnit = bookletReplay.units[0]; @@ -538,9 +540,8 @@ export class TestResultsComponent implements OnInit, OnDestroy { window.open(`#/${url}`, '_blank'); }); }, - error: error => { + error: () => { loadingSnackBar.dismiss(); - console.error('Error loading booklet:', error); this.snackBar.open( 'Fehler beim Laden des Testhefts', 'Fehler', @@ -1457,4 +1458,37 @@ export class TestResultsComponent implements OnInit, OnDestroy { } }); } + + openBookletInfoDialog(booklet: Booklet): void { + const loadingSnackBar = this.snackBar.open( + 'Lade Booklet-Informationen...', + '', + { duration: 3000 } + ); + + this.backendService.getBookletInfo( + this.appService.selectedWorkspaceId, + booklet.name + ).subscribe({ + next: (bookletInfo: BookletInfoDto) => { + loadingSnackBar.dismiss(); + + this.dialog.open(BookletInfoDialogComponent, { + width: '800px', + data: { + bookletInfo, + bookletId: booklet.name + } + }); + }, + error: () => { + loadingSnackBar.dismiss(); + this.snackBar.open( + 'Fehler beim Laden der Booklet-Informationen', + 'Fehler', + { duration: 3000 } + ); + } + }); + } } From e8a00457b7951e186940db4c753fd8dfe5f992e5 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Sun, 20 Jul 2025 19:28:42 +0200 Subject: [PATCH 18/21] Increase Postgres Shared buffers --- database/Postgres.Dockerfile | 7 ------- docker-compose.yaml | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/database/Postgres.Dockerfile b/database/Postgres.Dockerfile index dfd43b6d9..2a64ee549 100644 --- a/database/Postgres.Dockerfile +++ b/database/Postgres.Dockerfile @@ -12,16 +12,9 @@ RUN --mount=type=cache,target=/var/cache/apk \ ENV LANG=de_DE.utf8 ENV TZ=Europe/Berlin -# Copy custom PostgreSQL configuration -# COPY database/config/postgresql.conf /etc/postgresql/postgresql.conf - # Copy healthcheck script COPY database/healthcheck/postgres-healthcheck /usr/local/bin/ -# RUN chown postgres:postgres /etc/postgresql/postgresql.conf - -# CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"] - HEALTHCHECK \ --interval=10s \ --timeout=3s \ diff --git a/docker-compose.yaml b/docker-compose.yaml index 200104300..5c0400a4d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -4,7 +4,7 @@ x-env-postgres: &env-postgres POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} - + POSTGRES_SHARED_BUFFERS: ${POSTGRES_SHARED_BUFFERS} services: db: environment: From 1bc84b13adb7de58f6417be3a649a804d2ca4749 Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Sun, 20 Jul 2025 19:59:08 +0200 Subject: [PATCH 19/21] Set version to 0.10.0 --- .../app/components/home/home.component.html | 2 +- package-lock.json | 705 ++++-------------- package.json | 2 +- 3 files changed, 149 insertions(+), 560 deletions(-) diff --git a/apps/frontend/src/app/components/home/home.component.html b/apps/frontend/src/app/components/home/home.component.html index 0ad745cb7..1a38e71e1 100755 --- a/apps/frontend/src/app/components/home/home.component.html +++ b/apps/frontend/src/app/components/home/home.component.html @@ -9,7 +9,7 @@ [appTitle]="'Web application for coding'" [introHtml]="'appService.appConfig.introHtml'" [appName]="'IQB-Kodierbox'" - [appVersion]="'0.9.1'" + [appVersion]="'0.10.0'" [userName]="authData.userName" [userLongName]="appService.userProfile.firstName + ' ' + appService.userProfile.lastName" [isUserLoggedIn]="Number(authData.userId) > 0" diff --git a/package-lock.json b/package-lock.json index 7622ad095..bf4fca3a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coding-box", - "version": "0.9.1", + "version": "0.10.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coding-box", - "version": "0.9.1", + "version": "0.10.0", "license": "MIT", "dependencies": { "@angular/animations": "20.0.3", @@ -5328,433 +5328,21 @@ "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==" }, "node_modules/@modern-js/node-bundle-require": { - "version": "2.67.6", - "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.67.6.tgz", - "integrity": "sha512-rRiDQkrm3kgn0E/GNrcvqo4c71PaUs2R8Xmpv6GUKbEr6lz7VNgfZmAhdAQPtNfRfiBe+1sFLzEcwfEdDo/dTA==", + "version": "2.68.2", + "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.68.2.tgz", + "integrity": "sha512-MWk/pYx7KOsp+A/rN0as2ji/Ba8x0m129aqZ3Lj6T6CCTWdz0E/IsamPdTmF9Jnb6whQoBKtWSaLTCQlmCoY0Q==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/utils": "2.67.6", + "@modern-js/utils": "2.68.2", "@swc/helpers": "^0.5.17", - "esbuild": "0.17.19" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@modern-js/node-bundle-require/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "esbuild": "0.25.5" } }, "node_modules/@modern-js/utils": { - "version": "2.67.6", - "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.67.6.tgz", - "integrity": "sha512-cxY7HsSH0jIN3rlL6RZ0tgzC1tH0gHW++8X6h7sXCNCylhUdbGZI9yTGbpAS8bU7c97NmPaTKg+/ILt00Kju1Q==", + "version": "2.68.2", + "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.68.2.tgz", + "integrity": "sha512-revom/i/EhKfI0STNLo/AUbv7gY0JY0Ni2gO6P/Z4cTyZZRgd5j90678YB2DGn+LtmSrEWtUphyDH5Jn1RKjgg==", "dev": true, "license": "MIT", "dependencies": { @@ -5777,15 +5365,15 @@ } }, "node_modules/@module-federation/cli": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.15.0.tgz", - "integrity": "sha512-ZFQ7TA7vwSro4n21/+9cGxVkeRU9IcXcQGs1GIToz/JFvomTHbGN33iplR3GNMhuMNyXQ/wxe2gWkEmIBCzW2w==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.17.0.tgz", + "integrity": "sha512-07tj/Bfs7OmWUm/AvK8LRDoXDtPGw1zh5deH9srsryqGB8j8s2OTgYCbNtGXxTVhDR5zgoyqnOwLa8xFwr+zYw==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/node-bundle-require": "2.67.6", - "@module-federation/dts-plugin": "0.15.0", - "@module-federation/sdk": "0.15.0", + "@modern-js/node-bundle-require": "2.68.2", + "@module-federation/dts-plugin": "0.17.0", + "@module-federation/sdk": "0.17.0", "chalk": "3.0.0", "commander": "11.1.0" }, @@ -5797,16 +5385,16 @@ } }, "node_modules/@module-federation/cli/node_modules/@module-federation/dts-plugin": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.15.0.tgz", - "integrity": "sha512-UztaFAhpCpsy+EUOP1BiqlYpRdD4h2TUITphCmThO1grOCqU7dYYwGjWNy37NtJeykRRznH3FU0+iGBG3Oiw6w==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.17.0.tgz", + "integrity": "sha512-D6dIIdAxRzJbP6cUyOmZnxlCMJs4423jxo7y9klWWlZAYce6hnd2Sk4xd3AQ1UClQEcR6HqclnXao0wonnsN1g==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.15.0", - "@module-federation/managers": "0.15.0", - "@module-federation/sdk": "0.15.0", - "@module-federation/third-party-dts-extractor": "0.15.0", + "@module-federation/error-codes": "0.17.0", + "@module-federation/managers": "0.17.0", + "@module-federation/sdk": "0.17.0", + "@module-federation/third-party-dts-extractor": "0.17.0", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.8.2", @@ -5831,35 +5419,35 @@ } }, "node_modules/@module-federation/cli/node_modules/@module-federation/error-codes": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.15.0.tgz", - "integrity": "sha512-CFJSF+XKwTcy0PFZ2l/fSUpR4z247+Uwzp1sXVkdIfJ/ATsnqf0Q01f51qqSEA6MYdQi6FKos9FIcu3dCpQNdg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.17.0.tgz", + "integrity": "sha512-+pZ12frhaDqh4Xs/MQj4Vu4CAjnJTiEb8Z6fqPfn/TLHh4YLWMOzpzxGuMFDHqXwMb3o8FRAUhNB0eX2ZmhwTA==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/cli/node_modules/@module-federation/managers": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.15.0.tgz", - "integrity": "sha512-YMIiFRgMHtuMcLBgOYyfkFpwU9vo6l0VjOZE5Wdr33DltQBUgp9Lo8+2AkyZ4TTkelqjvUWSNKKYV3MV4GL7gw==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.17.0.tgz", + "integrity": "sha512-7Dc2RTn9n1FO4NXSc4cNKclbXrFLj5reNi5Y9NmSE0Y/rUm+5Ac6CvwZibRDPu/ivDJM6U51+eJWZJXzpi7+rQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.15.0", + "@module-federation/sdk": "0.17.0", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/cli/node_modules/@module-federation/sdk": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.15.0.tgz", - "integrity": "sha512-PWiYbGcJrKUD6JZiEPihrXhV3bgXdll4bV7rU+opV7tHaun+Z0CdcawjZ82Xnpb8MCPGmqHwa1MPFeUs66zksw==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.17.0.tgz", + "integrity": "sha512-tjrNaYdDocHZsWu5iXlm83lwEK8A64r4PQB3/kY1cW1iOvggR2RESLAWPxRJXC2cLF8fg8LDKOBdgERZW1HPFA==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/cli/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.15.0.tgz", - "integrity": "sha512-rML74G1NB9wtHubXP+ZTMI5HZkYypN/E93w8Zkwr6rc/k1eoZZza2lghw2znCNeu3lDlhvI9i4iaVsJQrX4oQA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.17.0.tgz", + "integrity": "sha512-1OkHLDgRZBGNH3h2aQ8f2V8g8p3x8DvLD6qzRb1s7P27/oOrKZW8OGxUSOwQ8M2+/R5cwUgRM0+KYeKUD1xa4g==", "dev": true, "license": "MIT", "dependencies": { @@ -6167,15 +5755,15 @@ } }, "node_modules/@module-federation/node": { - "version": "2.7.7", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.7.tgz", - "integrity": "sha512-8NaByOBkbTkv25k2iBgaEFvjzLPAQKjlFBtR1JYdMXMyeouzzsDi9G7S0Hblc5td8ZKe7PDP/+KA3+uS35jMcQ==", + "version": "2.7.9", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.9.tgz", + "integrity": "sha512-CeTdqJVfHJ0OhyHHU+5nyf+2MEva+DdwPIqoFekuyzvWur+vnlzO1x4SrftsJtb6lqfkhVW/kJ+DzdHmAlUgag==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/enhanced": "0.15.0", - "@module-federation/runtime": "0.15.0", - "@module-federation/sdk": "0.15.0", + "@module-federation/enhanced": "0.17.0", + "@module-federation/runtime": "0.17.0", + "@module-federation/sdk": "0.17.0", "btoa": "1.2.1", "encoding": "^0.1.13", "node-fetch": "2.7.0" @@ -6198,26 +5786,26 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.15.0.tgz", - "integrity": "sha512-bbinV0gC82x0JGrT6kNV1tQHi4UBxqY79mZJKWVbGpSMPM+nifC9y/nQCYhZZajT7D/5zIHNkP0BKrQmPA7ArA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.17.0.tgz", + "integrity": "sha512-QI4uK91eyH/krevQ/3w20E+c5F3oCapE6DND0QTzJTNpwG4YIpT6aBG3SyvqWXK+lzTIaoXxkLgYsOpWzTQc0g==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.15.0", + "@module-federation/sdk": "0.17.0", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.15.0.tgz", - "integrity": "sha512-ivAnthD4SbBoT3590qLzCyKELGyfa7nj8BEjWjb6BNrP5Eu8sHX3Q2wHf76QsYfuwErtjaMU87N7dTe2ELZPVg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.17.0.tgz", + "integrity": "sha512-5JRtxCk+XFur75Vrv2V36ch92K8Sm9/9tPAgmC8LzJXUxt925D6sQTZGk789sOV4T+3iocmewUEdhQoD3NvDjQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.15.0", - "@module-federation/sdk": "0.15.0", + "@module-federation/runtime": "0.17.0", + "@module-federation/sdk": "0.17.0", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -6226,16 +5814,16 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.15.0.tgz", - "integrity": "sha512-UztaFAhpCpsy+EUOP1BiqlYpRdD4h2TUITphCmThO1grOCqU7dYYwGjWNy37NtJeykRRznH3FU0+iGBG3Oiw6w==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.17.0.tgz", + "integrity": "sha512-D6dIIdAxRzJbP6cUyOmZnxlCMJs4423jxo7y9klWWlZAYce6hnd2Sk4xd3AQ1UClQEcR6HqclnXao0wonnsN1g==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.15.0", - "@module-federation/managers": "0.15.0", - "@module-federation/sdk": "0.15.0", - "@module-federation/third-party-dts-extractor": "0.15.0", + "@module-federation/error-codes": "0.17.0", + "@module-federation/managers": "0.17.0", + "@module-federation/sdk": "0.17.0", + "@module-federation/third-party-dts-extractor": "0.17.0", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.8.2", @@ -6260,23 +5848,23 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.15.0.tgz", - "integrity": "sha512-YzGcjdggtR+VrNdIgT1nvhT+V6I+LnrdsLV3YfOB0iVkOe4+YFbDLZJK16CuYRSm/HTR38LVbziE/6tWcibKYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.15.0", - "@module-federation/cli": "0.15.0", - "@module-federation/data-prefetch": "0.15.0", - "@module-federation/dts-plugin": "0.15.0", - "@module-federation/error-codes": "0.15.0", - "@module-federation/inject-external-runtime-core-plugin": "0.15.0", - "@module-federation/managers": "0.15.0", - "@module-federation/manifest": "0.15.0", - "@module-federation/rspack": "0.15.0", - "@module-federation/runtime-tools": "0.15.0", - "@module-federation/sdk": "0.15.0", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.17.0.tgz", + "integrity": "sha512-lsEUF0f6K/v+cODEj/mGEE64PrL63jou5aPGTakIljTSlRbOguws9eU4eMVNYRySiaNp5KriuxjMoS3DN4yYBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.17.0", + "@module-federation/cli": "0.17.0", + "@module-federation/data-prefetch": "0.17.0", + "@module-federation/dts-plugin": "0.17.0", + "@module-federation/error-codes": "0.17.0", + "@module-federation/inject-external-runtime-core-plugin": "0.17.0", + "@module-federation/managers": "0.17.0", + "@module-federation/manifest": "0.17.0", + "@module-federation/rspack": "0.17.0", + "@module-federation/runtime-tools": "0.17.0", + "@module-federation/sdk": "0.17.0", "btoa": "^1.2.1", "schema-utils": "^4.3.0", "upath": "2.0.1" @@ -6302,62 +5890,62 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.15.0.tgz", - "integrity": "sha512-CFJSF+XKwTcy0PFZ2l/fSUpR4z247+Uwzp1sXVkdIfJ/ATsnqf0Q01f51qqSEA6MYdQi6FKos9FIcu3dCpQNdg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.17.0.tgz", + "integrity": "sha512-+pZ12frhaDqh4Xs/MQj4Vu4CAjnJTiEb8Z6fqPfn/TLHh4YLWMOzpzxGuMFDHqXwMb3o8FRAUhNB0eX2ZmhwTA==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.15.0.tgz", - "integrity": "sha512-D6+FO2oj2Gr6QpfWv3i9RI9VJM2IFCMiFQKg5zOpKw1qdrPRWb35fiXAXGjw9RrVgrZz0Z1b9OP4zC9hfbpnQQ==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.17.0.tgz", + "integrity": "sha512-WPYRIqdgEDx5WkKOPLT6c6KRinwfvFgsuvr0dSZJOFSlPiU6gCwy9AZBqr1NNLQs/CDLiCRdsReXyOwS/geBiQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "0.15.0" + "@module-federation/runtime-tools": "0.17.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/managers": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.15.0.tgz", - "integrity": "sha512-YMIiFRgMHtuMcLBgOYyfkFpwU9vo6l0VjOZE5Wdr33DltQBUgp9Lo8+2AkyZ4TTkelqjvUWSNKKYV3MV4GL7gw==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.17.0.tgz", + "integrity": "sha512-7Dc2RTn9n1FO4NXSc4cNKclbXrFLj5reNi5Y9NmSE0Y/rUm+5Ac6CvwZibRDPu/ivDJM6U51+eJWZJXzpi7+rQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.15.0", + "@module-federation/sdk": "0.17.0", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.15.0.tgz", - "integrity": "sha512-x+UVFkdoKiNZhpUO8H/9jlM3nmC5bIApZvbC2TQuNva+ElCPotdhEO8jduiVkBnc2lr8D9qnFm8U5Kx/aFnGlA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.17.0.tgz", + "integrity": "sha512-h7PxQmlV8nusRkEUhxZCnYmZqRDk4XqUi43tVsYt5MjFFauBE+ClgRBBWy1bpvwtNdIEby6HDwO+3pEFgat2Iw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.15.0", - "@module-federation/managers": "0.15.0", - "@module-federation/sdk": "0.15.0", + "@module-federation/dts-plugin": "0.17.0", + "@module-federation/managers": "0.17.0", + "@module-federation/sdk": "0.17.0", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.15.0.tgz", - "integrity": "sha512-nRz0JHcoTz+M5A+wXCG3981lmPeEm91EZe4q5GVfbVhvlAf/Ctd26qSz4lXuyUA1Ar5afBTxKvqWy7xh4wcg2A==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.17.0.tgz", + "integrity": "sha512-tRYTk53Oc4Ymreo4gcdOoCnMUAHRcmGIm7uRqS/emZmdy8h+oqiYQB6HoIuQMDWDG0HZ28I6ErbpHP6quNQHCw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.15.0", - "@module-federation/dts-plugin": "0.15.0", - "@module-federation/inject-external-runtime-core-plugin": "0.15.0", - "@module-federation/managers": "0.15.0", - "@module-federation/manifest": "0.15.0", - "@module-federation/runtime-tools": "0.15.0", - "@module-federation/sdk": "0.15.0", + "@module-federation/bridge-react-webpack-plugin": "0.17.0", + "@module-federation/dts-plugin": "0.17.0", + "@module-federation/inject-external-runtime-core-plugin": "0.17.0", + "@module-federation/managers": "0.17.0", + "@module-federation/manifest": "0.17.0", + "@module-federation/runtime-tools": "0.17.0", + "@module-federation/sdk": "0.17.0", "btoa": "1.2.1" }, "peerDependencies": { @@ -6375,50 +5963,50 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.15.0.tgz", - "integrity": "sha512-dTPsCNum9Bhu3yPOcrPYq0YnM9eCMMMNB1wuiqf1+sFbQlNApF0vfZxooqz3ln0/MpgE0jerVvFsLVGfqvC9Ug==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.17.0.tgz", + "integrity": "sha512-eMtrtCSSV6neJpMmQ8WdFpYv93raSgsG5RiAPsKUuSCXfZ5D+yzvleZ+gPcEpFT9HokmloxAn0jep50/1upTQw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.15.0", - "@module-federation/runtime-core": "0.15.0", - "@module-federation/sdk": "0.15.0" + "@module-federation/error-codes": "0.17.0", + "@module-federation/runtime-core": "0.17.0", + "@module-federation/sdk": "0.17.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.15.0.tgz", - "integrity": "sha512-RYzI61fRDrhyhaEOXH3AgIGlHiot0wPFXu7F43cr+ZnTi+VlSYWLdlZ4NBuT9uV6JSmH54/c+tEZm5SXgKR2sQ==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.17.0.tgz", + "integrity": "sha512-MYwDDevYnBB9gXFfNOmJVIX5XZcbCHd0dral7gT7yVmlwOhbuGOLlm2dh2icwwdCYHA9AFDCfU9l1nJR4ex/ng==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.15.0", - "@module-federation/sdk": "0.15.0" + "@module-federation/error-codes": "0.17.0", + "@module-federation/sdk": "0.17.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.15.0.tgz", - "integrity": "sha512-kzFn3ObUeBp5vaEtN1WMxhTYBuYEErxugu1RzFUERD21X3BZ+b4cWwdFJuBDlsmVjctIg/QSOoZoPXRKAO0foA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.17.0.tgz", + "integrity": "sha512-t4QcKfhmwOHedwByDKUlTQVw4+gPotySYPyNa8GFrBSr1F6wcGdGyOhzP+PdgpiJLIM03cB6V+IKGGHE28SfDQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.15.0", - "@module-federation/webpack-bundler-runtime": "0.15.0" + "@module-federation/runtime": "0.17.0", + "@module-federation/webpack-bundler-runtime": "0.17.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.15.0.tgz", - "integrity": "sha512-PWiYbGcJrKUD6JZiEPihrXhV3bgXdll4bV7rU+opV7tHaun+Z0CdcawjZ82Xnpb8MCPGmqHwa1MPFeUs66zksw==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.17.0.tgz", + "integrity": "sha512-tjrNaYdDocHZsWu5iXlm83lwEK8A64r4PQB3/kY1cW1iOvggR2RESLAWPxRJXC2cLF8fg8LDKOBdgERZW1HPFA==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.15.0.tgz", - "integrity": "sha512-rML74G1NB9wtHubXP+ZTMI5HZkYypN/E93w8Zkwr6rc/k1eoZZza2lghw2znCNeu3lDlhvI9i4iaVsJQrX4oQA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.17.0.tgz", + "integrity": "sha512-1OkHLDgRZBGNH3h2aQ8f2V8g8p3x8DvLD6qzRb1s7P27/oOrKZW8OGxUSOwQ8M2+/R5cwUgRM0+KYeKUD1xa4g==", "dev": true, "license": "MIT", "dependencies": { @@ -6428,14 +6016,14 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.15.0.tgz", - "integrity": "sha512-i+3wu2Ljh2TmuUpsnjwZVupOVqV50jP0ndA8PSP4gwMKlgdGeaZ4VH5KkHAXGr2eiYUxYLMrJXz1+eILJqeGDg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.17.0.tgz", + "integrity": "sha512-o8XtXwqTDlqLgcALOfObcCbqXvUcSDHIEXrkcb4W+I8GJY7IqV0+x6rX4mJ3f59tca9qOF8zsZsOA6BU93Pvgw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.15.0", - "@module-federation/sdk": "0.15.0" + "@module-federation/runtime": "0.17.0", + "@module-federation/sdk": "0.17.0" } }, "node_modules/@module-federation/node/node_modules/chalk": { @@ -7097,9 +6685,9 @@ } }, "node_modules/@nestjs/core": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.15.tgz", - "integrity": "sha512-UBejmdiYwaH6fTsz2QFBlC1cJHM+3UDeLZN+CiP9I1fRv2KlBZsmozGLbV5eS1JAVWJB4T5N5yQ0gjN8ZvcS2w==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.19.tgz", + "integrity": "sha512-gahghu0y4Rn4gn/xPjTgNHFMpUM8TxfhdeMowVWTGVnYMZtGeEGbIXMFhJS0Dce3E4VKyqAglzgO9ecAZd4Ong==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -7310,9 +6898,9 @@ } }, "node_modules/@nestjs/testing": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.15.tgz", - "integrity": "sha512-eGlWESkACMKti+iZk1hs6FUY/UqObmMaa8HAN9JLnaYkoLf1Jeh+EuHlGnfqo/Rq77oznNLIyaA3PFjrFDlNUg==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.19.tgz", + "integrity": "sha512-YfzkjTmwEcoWqo8xr8YiTZMC4FjBEOg4uRTAPI2p6iGLWu+27tYau1CtAKFHY0uSAK3FzgtsAuYoxBSlfr9mWA==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -13075,9 +12663,9 @@ } }, "node_modules/compression": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", - "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "dev": true, "license": "MIT", "dependencies": { @@ -13085,7 +12673,7 @@ "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", - "on-headers": "~1.0.2", + "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" }, @@ -21801,9 +21389,9 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "dev": true, "license": "MIT", "engines": { @@ -24017,10 +23605,11 @@ } }, "node_modules/rslog": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rslog/-/rslog-1.2.6.tgz", - "integrity": "sha512-TGqKQNWVdVTQBG8dtIhdzJheYMCQy4JNG778OmyQAHc3NksEPK0ESexnHm/5EHC7BYAjYkc0r9SDI9PnKtzodw==", - "dev": true + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/rslog/-/rslog-1.2.9.tgz", + "integrity": "sha512-KSjM8jJKYYaKgI4jUGZZ4kdTBTM/EIGH1JnoB0ptMkzcyWaHeXW9w6JVLCYs37gh8sFZkLLqAyBb2sT02bqpcQ==", + "dev": true, + "license": "MIT" }, "node_modules/run-applescript": { "version": "7.0.0", diff --git a/package.json b/package.json index 2d47e689f..4ac3a5500 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coding-box", - "version": "0.9.1", + "version": "0.10.0", "author": "IQB - Institut zur Qualitätsentwicklung im Bildungswesen", "license": "MIT", "scripts": { From 0b36dbf03047e41c4cb9d0fda776249c937ff86f Mon Sep 17 00:00:00 2001 From: jurei733 <67505990+jurei733@users.noreply.github.com> Date: Sun, 20 Jul 2025 21:24:03 +0200 Subject: [PATCH 20/21] Upgrade nest js to version 11 --- package-lock.json | 806 ++++++++++++++++++++++++++++++++++++---------- package.json | 22 +- 2 files changed, 656 insertions(+), 172 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf4fca3a7..0ba24f404 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,22 +20,23 @@ "@angular/platform-browser-dynamic": "20.0.3", "@angular/router": "20.0.3", "@iqb/responses": "^3.6.0", - "@nestjs/axios": "^3.0.2", - "@nestjs/common": "^10.4.17", - "@nestjs/config": "^3.0.0", - "@nestjs/core": "^10.4.4", - "@nestjs/jwt": "^10.2.0", - "@nestjs/passport": "^10.0.3", - "@nestjs/platform-express": "^10.4.19", - "@nestjs/swagger": "^7.4.2", - "@nestjs/testing": "^10.3.3", - "@nestjs/typeorm": "^10.0.2", + "@nestjs/axios": "^4.0.1", + "@nestjs/common": "^11.1.5", + "@nestjs/config": "^4.0.2", + "@nestjs/core": "^11.1.5", + "@nestjs/jwt": "^11.0.0", + "@nestjs/passport": "^11.0.5", + "@nestjs/platform-express": "^11.1.5", + "@nestjs/swagger": "^11.1.5", + "@nestjs/testing": "^11.1.5", + "@nestjs/typeorm": "^11.0.0", "@ngx-translate/core": "^15.0.0", "@ngx-translate/http-loader": "^8.0.0", "@types/adm-zip": "^0.5.0", "adm-zip": "^0.5.9", "ajv": "^8.17.1", "ajv-keywords": "^5.1.0", + "axios": "^1.3.1", "cheerio": "^1.1.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", @@ -48,6 +49,7 @@ "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", "pg": "^8.11.5", + "reflect-metadata": "^0.2.0", "rxjs": "~7.8.0", "stream": "^0.0.2", "timers": "^0.1.1", @@ -5323,9 +5325,10 @@ } }, "node_modules/@microsoft/tsdoc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", - "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==" + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "license": "MIT" }, "node_modules/@modern-js/node-bundle-require": { "version": "2.68.2", @@ -6629,24 +6632,25 @@ } }, "node_modules/@nestjs/axios": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-3.1.3.tgz", - "integrity": "sha512-RZ/63c1tMxGLqyG3iOCVt7A72oy4x1eM6QEhd4KzCYpaVWW0igq0WSREeRoEZhIxRcZfDfIIkvsOMiM7yfVGZQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-4.0.1.tgz", + "integrity": "sha512-68pFJgu+/AZbWkGu65Z3r55bTsCPlgyKaV4BSG8yUAD72q1PPuyVRgUwFv6BxdnibTUHlyxm06FmYWNC+bjN7A==", "license": "MIT", "peerDependencies": { - "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", "axios": "^1.3.1", - "rxjs": "^6.0.0 || ^7.0.0" + "rxjs": "^7.0.0" } }, "node_modules/@nestjs/common": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.17.tgz", - "integrity": "sha512-NKzPA4Tb35XjlxizsT8KZb3CCX8tNKj5EnsXsTl/gZX//uAWccBsqB8BjU69x/u4/kQ0106/Kt6PP+yrHAez0w==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.5.tgz", + "integrity": "sha512-DQpWdr3ShO0BHWkHl3I4W/jR6R3pDtxyBlmrpTuZF+PXxQyBXNvsUne0Wyo6QHPEDi+pAz9XchBFoKbqOhcdTg==", "license": "MIT", "dependencies": { - "file-type": "20.4.1", + "file-type": "21.0.0", "iterare": "1.2.1", + "load-esm": "1.0.2", "tslib": "2.8.1", "uid": "2.0.2" }, @@ -6655,8 +6659,8 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -6670,43 +6674,46 @@ } }, "node_modules/@nestjs/config": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.3.0.tgz", - "integrity": "sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.2.tgz", + "integrity": "sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==", "license": "MIT", "dependencies": { - "dotenv": "16.4.5", - "dotenv-expand": "10.0.0", + "dotenv": "16.4.7", + "dotenv-expand": "12.0.1", "lodash": "4.17.21" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", "rxjs": "^7.1.0" } }, "node_modules/@nestjs/core": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.19.tgz", - "integrity": "sha512-gahghu0y4Rn4gn/xPjTgNHFMpUM8TxfhdeMowVWTGVnYMZtGeEGbIXMFhJS0Dce3E4VKyqAglzgO9ecAZd4Ong==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.5.tgz", + "integrity": "sha512-Qr25MEY9t8VsMETy7eXQ0cNXqu0lzuFrrTr+f+1G57ABCtV5Pogm7n9bF71OU2bnkDD32Bi4hQLeFR90cku3Tw==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@nuxtjs/opencollective": "0.3.2", + "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", - "path-to-regexp": "3.3.0", + "path-to-regexp": "8.2.0", "tslib": "2.8.1", "uid": "2.0.2" }, + "engines": { + "node": ">= 20" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/websockets": "^10.0.0", + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -6723,23 +6730,25 @@ } }, "node_modules/@nestjs/jwt": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.2.0.tgz", - "integrity": "sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.0.tgz", + "integrity": "sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==", + "license": "MIT", "dependencies": { - "@types/jsonwebtoken": "9.0.5", + "@types/jsonwebtoken": "9.0.7", "jsonwebtoken": "9.0.2" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0" + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" } }, "node_modules/@nestjs/mapped-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz", - "integrity": "sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", + "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", + "license": "MIT", "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", "class-transformer": "^0.4.0 || ^0.5.0", "class-validator": "^0.13.0 || ^0.14.0", "reflect-metadata": "^0.1.12 || ^0.2.0" @@ -6754,24 +6763,25 @@ } }, "node_modules/@nestjs/passport": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-10.0.3.tgz", - "integrity": "sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz", + "integrity": "sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==", + "license": "MIT", "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "passport": "^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0" + "@nestjs/common": "^10.0.0 || ^11.0.0", + "passport": "^0.5.0 || ^0.6.0 || ^0.7.0" } }, "node_modules/@nestjs/platform-express": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.19.tgz", - "integrity": "sha512-IeQkBZUtPeJoO4E0QqSLwkB+60KcThw8/s4gGvAwIRJ5ViuXoxnwU59eBDy84PUuVbNe4VdKjfAF9fuQOEh11Q==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.5.tgz", + "integrity": "sha512-OsoiUBY9Shs5IG3uvDIt9/IDfY5OlvWBESuB/K4Eun8xILw1EK5d5qMfC3d2sIJ+kA3l+kBR1d/RuzH7VprLIg==", "license": "MIT", "dependencies": { - "body-parser": "1.20.3", "cors": "2.8.5", - "express": "4.21.2", - "multer": "2.0.1", + "express": "5.1.0", + "multer": "2.0.2", + "path-to-regexp": "8.2.0", "tslib": "2.8.1" }, "funding": { @@ -6779,8 +6789,306 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nestjs/platform-express/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@nestjs/platform-express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nestjs/platform-express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/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==", + "license": "MIT" + }, + "node_modules/@nestjs/platform-express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@nestjs/platform-express/node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nestjs/platform-express/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nestjs/platform-express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/@nestjs/schematics": { @@ -6866,21 +7174,22 @@ } }, "node_modules/@nestjs/swagger": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.4.2.tgz", - "integrity": "sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.2.0.tgz", + "integrity": "sha512-5wolt8GmpNcrQv34tIPUtPoV1EeFbCetm40Ij3+M0FNNnf2RJ3FyWfuQvI8SBlcJyfaounYVTKzKHreFXsUyOg==", + "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "^0.15.0", - "@nestjs/mapped-types": "2.0.5", + "@microsoft/tsdoc": "0.15.1", + "@nestjs/mapped-types": "2.1.0", "js-yaml": "4.1.0", "lodash": "4.17.21", - "path-to-regexp": "3.3.0", - "swagger-ui-dist": "5.17.14" + "path-to-regexp": "8.2.0", + "swagger-ui-dist": "5.21.0" }, "peerDependencies": { - "@fastify/static": "^6.0.0 || ^7.0.0", - "@nestjs/common": "^9.0.0 || ^10.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0", + "@fastify/static": "^8.0.0", + "@nestjs/common": "^11.0.1", + "@nestjs/core": "^11.0.1", "class-transformer": "*", "class-validator": "*", "reflect-metadata": "^0.1.12 || ^0.2.0" @@ -6898,9 +7207,9 @@ } }, "node_modules/@nestjs/testing": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.19.tgz", - "integrity": "sha512-YfzkjTmwEcoWqo8xr8YiTZMC4FjBEOg4uRTAPI2p6iGLWu+27tYau1CtAKFHY0uSAK3FzgtsAuYoxBSlfr9mWA==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.5.tgz", + "integrity": "sha512-ZYRYF750SefmuIo7ZqPlHDcin1OHh6My0OkOfGEFjrD9mJ0vMVIpwMTOOkpzCfCcpqUuxeHBuecpiIn+NLrQbQ==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -6910,10 +7219,10 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" }, "peerDependenciesMeta": { "@nestjs/microservices": { @@ -6925,15 +7234,13 @@ } }, "node_modules/@nestjs/typeorm": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-10.0.2.tgz", - "integrity": "sha512-H738bJyydK4SQkRCTeh1aFBxoO1E9xdL/HaLGThwrqN95os5mEyAtK7BLADOS+vldP4jDZ2VQPLj4epWwRqCeQ==", - "dependencies": { - "uuid": "9.0.1" - }, + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz", + "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==", + "license": "MIT", "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0", "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.2.0", "typeorm": "^0.3.0" @@ -7344,21 +7651,20 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" + "consola": "^3.2.3" }, "bin": { "opencollective": "bin/opencollective.js" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" } }, "node_modules/@nx/angular": { @@ -9545,6 +9851,13 @@ } } }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, "node_modules/@schematics/angular": { "version": "19.1.9", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.9.tgz", @@ -10148,9 +10461,10 @@ "dev": true }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", - "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -10839,6 +11153,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -11119,7 +11434,8 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, "node_modules/array-includes": { "version": "3.1.8", @@ -11688,6 +12004,7 @@ "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -11711,6 +12028,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -11718,7 +12036,8 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/bonjour-service": { "version": "1.3.0", @@ -12031,6 +12350,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -12062,7 +12382,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -12831,14 +13150,19 @@ } }, "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -12872,7 +13196,8 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true }, "node_modules/cookies": { "version": "0.9.1", @@ -13546,6 +13871,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -13615,6 +13941,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -13802,9 +14129,10 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -13813,11 +14141,18 @@ } }, "node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz", + "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/dunder-proto": { @@ -13913,6 +14248,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -15025,6 +15361,7 @@ "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -15071,6 +15408,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -15079,6 +15417,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -15086,12 +15425,14 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, "license": "MIT" }, "node_modules/extend": { @@ -15276,18 +15617,18 @@ } }, "node_modules/file-type": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", - "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.0.0.tgz", + "integrity": "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==", "license": "MIT", "dependencies": { - "@tokenizer/inflate": "^0.2.6", - "strtok3": "^10.2.0", + "@tokenizer/inflate": "^0.2.7", + "strtok3": "^10.2.2", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sindresorhus/file-type?sponsor=1" @@ -15338,6 +15679,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -15355,6 +15697,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -15363,6 +15706,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -15370,7 +15714,8 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/find-cache-dir": { "version": "4.0.0", @@ -15832,6 +16177,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -16320,6 +16666,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -16750,6 +17097,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -17293,6 +17641,12 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -19453,6 +19807,25 @@ "@lmdb/lmdb-win32-x64": "3.3.0" } }, + "node_modules/load-esm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.2.tgz", + "integrity": "sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "engines": { + "node": ">=13.2.0" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -20032,6 +20405,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -20055,6 +20429,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -20089,6 +20464,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -20457,9 +20833,9 @@ } }, "node_modules/multer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz", - "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -20581,6 +20957,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -20623,6 +21000,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -20641,17 +21019,20 @@ "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -21270,9 +21651,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -21962,9 +22347,13 @@ } }, "node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } }, "node_modules/path-type": { "version": "4.0.0", @@ -21981,19 +22370,6 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==", "peer": true }, - "node_modules/peek-readable": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-7.0.0.tgz", - "integrity": "sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/pg": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", @@ -23075,6 +23451,7 @@ "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, "dependencies": { "side-channel": "^1.0.6" }, @@ -23140,6 +23517,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -23604,6 +23982,45 @@ "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/router/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==", + "license": "MIT" + }, "node_modules/rslog": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/rslog/-/rslog-1.2.9.tgz", @@ -24206,6 +24623,7 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -24229,6 +24647,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -24236,12 +24655,14 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/send/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==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -24343,6 +24764,7 @@ "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -24357,6 +24779,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -24365,6 +24788,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -24461,14 +24885,69 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -25150,13 +25629,12 @@ } }, "node_modules/strtok3": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.2.2.tgz", - "integrity": "sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.2.tgz", + "integrity": "sha512-or9w505RhhY66+uoe5YOC5QO/bRuATaoim3XTh+pGKx5VMWi/HDhMKuCjDLsLJouU2zg9Hf1nLPcNW7IHv80kQ==", "license": "MIT", "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^7.0.0" + "@tokenizer/token": "^0.3.0" }, "engines": { "node": ">=18" @@ -25332,9 +25810,13 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.17.14", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.14.tgz", - "integrity": "sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==" + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.21.0.tgz", + "integrity": "sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } }, "node_modules/symbol-tree": { "version": "3.2.4", @@ -25789,9 +26271,9 @@ } }, "node_modules/token-types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", - "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.3.tgz", + "integrity": "sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ==", "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", diff --git a/package.json b/package.json index 4ac3a5500..a3f077c17 100644 --- a/package.json +++ b/package.json @@ -31,21 +31,22 @@ "@angular/platform-browser-dynamic": "20.0.3", "@angular/router": "20.0.3", "@iqb/responses": "^3.6.0", - "@nestjs/axios": "^3.0.2", - "@nestjs/common": "^10.4.17", - "@nestjs/config": "^3.0.0", - "@nestjs/core": "^10.4.4", - "@nestjs/jwt": "^10.2.0", - "@nestjs/passport": "^10.0.3", - "@nestjs/platform-express": "^10.4.19", - "@nestjs/swagger": "^7.4.2", - "@nestjs/testing": "^10.3.3", - "@nestjs/typeorm": "^10.0.2", + "@nestjs/axios": "^4.0.1", + "@nestjs/common": "^11.1.5", + "@nestjs/config": "^4.0.2", + "@nestjs/core": "^11.1.5", + "@nestjs/jwt": "^11.0.0", + "@nestjs/passport": "^11.0.5", + "@nestjs/platform-express": "^11.1.5", + "@nestjs/swagger": "^11.1.5", + "@nestjs/testing": "^11.1.5", + "@nestjs/typeorm": "^11.0.0", "@ngx-translate/core": "^15.0.0", "@ngx-translate/http-loader": "^8.0.0", "@types/adm-zip": "^0.5.0", "adm-zip": "^0.5.9", "ajv": "^8.17.1", + "axios": "^1.3.1", "ajv-keywords": "^5.1.0", "cheerio": "^1.1.0", "class-transformer": "^0.5.1", @@ -59,6 +60,7 @@ "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", "pg": "^8.11.5", + "reflect-metadata": "^0.2.0", "rxjs": "~7.8.0", "stream": "^0.0.2", "timers": "^0.1.1", From f8e7d3a2971487c83744055d1b9bb23887dea059 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 20 Jul 2025 19:26:21 +0000 Subject: [PATCH 21/21] Bump the npm_and_yarn group across 1 directory with 3 updates Bumps the npm_and_yarn group with 2 updates in the / directory: [@nx/angular](https://github.com/nrwl/nx/tree/HEAD/packages/angular) and [esbuild](https://github.com/evanw/esbuild). Updates `@nx/angular` from 21.2.0 to 21.3.1 - [Release notes](https://github.com/nrwl/nx/releases) - [Commits](https://github.com/nrwl/nx/commits/21.3.1/packages/angular) Updates `esbuild` from 0.25.5 to 0.25.8 - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.25.5...v0.25.8) Updates `koa` from 2.15.4 to 2.16.1 - [Release notes](https://github.com/koajs/koa/releases) - [Changelog](https://github.com/koajs/koa/blob/master/History.md) - [Commits](https://github.com/koajs/koa/compare/2.15.4...v2.16.1) --- updated-dependencies: - dependency-name: "@nx/angular" dependency-version: 21.3.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: esbuild dependency-version: 0.25.8 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: koa dependency-version: 2.16.1 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- package-lock.json | 14005 +++++++++++++++++++++++++++----------------- package.json | 4 +- 2 files changed, 8630 insertions(+), 5379 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ba24f404..9531c4d7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,7 +66,7 @@ "@angular/compiler-cli": "20.0.3", "@golevelup/ts-jest": "^0.5.0", "@iqb/eslint-config": "^2.1.1", - "@nx/angular": "21.2.0", + "@nx/angular": "21.3.1", "@nx/cypress": "21.2.0", "@nx/esbuild": "21.2.0", "@nx/eslint": "21.2.0", @@ -80,7 +80,7 @@ "@types/multer": "^1.4.7", "@types/passport-jwt": "^4.0.1", "@types/xml2js": "^0.4.14", - "esbuild": "^0.25.5", + "esbuild": "^0.25.8", "eslint": "8.57.1", "eslint-plugin-html": "^8.1.1", "eslint-plugin-import": "^2.29.1", @@ -322,458 +322,432 @@ "semver": "bin/semver.js" } }, - "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/@angular-devkit/build-angular/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": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/babel-loader": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", - "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "find-up": "^5.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.20.0 || ^20.10.0 || >=22.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5.61.0" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "node_modules/@angular-devkit/build-angular/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": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "restore-cursor": "^5.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "node_modules/@angular-devkit/build-angular/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": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/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==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/@angular-devkit/build-angular/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": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "node_modules/@angular-devkit/build-angular/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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/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==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "p-locate": "^5.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/@angular-devkit/build-angular/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": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "mimic-function": "^5.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/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==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "p-limit": "^3.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/piscina": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.0.0.tgz", - "integrity": "sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==", + "node_modules/@angular-devkit/build-angular/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.x" - }, - "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "node_modules/@angular-devkit/build-angular/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": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/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==", + "node_modules/@angular-devkit/build-angular/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": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/@angular-devkit/build-angular/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": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=18.0.0" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.2000.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2000.2.tgz", - "integrity": "sha512-kFqvZNOcU1zwwMRG3Kh7V661HWgtt9G3+xId9A2VNXvW0ZfuVZmgfaR8TLEmtCSrQ4KHGGQmK0zn2lPHttY5HA==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "@angular-devkit/architect": "0.2000.2", - "rxjs": "7.8.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^5.0.2" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular-devkit/core": { - "version": "20.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.2.tgz", - "integrity": "sha512-qqTSpcIw+TqJ6u/tkQzqgpwVelHsHr8Jhws1Vlx6E0L6E+cRILBK48i9ttE+oYkQlcopQ3VZAmzcZodXJ1SQ9Q==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.2", - "source-map": "0.7.4" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/core/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" + "node": ">=18" } }, - "node_modules/@angular-devkit/schematics": { - "version": "20.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.2.tgz", - "integrity": "sha512-r1aSZhcadLtUMhzUUfy+pkJdZW93z8WQtpGR24y88yFpPgDL5kY85VSlOzjGgo1vEs8Dd7ADcOcsVsUW8MxQ3A==", + "node_modules/@angular-devkit/build-angular/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", - "dependencies": { - "@angular-devkit/core": "20.0.2", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "8.2.0", - "rxjs": "7.8.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=18" } }, - "node_modules/@angular-devkit/schematics/node_modules/ansi-regex": { + "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", @@ -786,7 +760,24 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@angular-devkit/schematics/node_modules/chalk": { + "node_modules/@angular-devkit/build-angular/node_modules/babel-loader": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", + "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5.61.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/chalk": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", @@ -799,7 +790,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@angular-devkit/schematics/node_modules/cli-cursor": { + "node_modules/@angular-devkit/build-angular/node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", @@ -815,7 +806,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/cli-spinners": { + "node_modules/@angular-devkit/build-angular/node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", @@ -828,14 +819,80 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/emoji-regex": { + "node_modules/@angular-devkit/build-angular/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/emoji-regex": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true, "license": "MIT" }, - "node_modules/@angular-devkit/schematics/node_modules/is-interactive": { + "node_modules/@angular-devkit/build-angular/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", + "optional": true, + "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/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", @@ -848,7 +905,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/is-unicode-supported": { + "node_modules/@angular-devkit/build-angular/node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", @@ -861,7 +918,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/log-symbols": { + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/log-symbols": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", @@ -878,7 +951,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/log-symbols/node_modules/is-unicode-supported": { + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols/node_modules/is-unicode-supported": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", @@ -891,7 +964,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/onetime": { + "node_modules/@angular-devkit/build-angular/node_modules/onetime": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", @@ -907,7 +980,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/ora": { + "node_modules/@angular-devkit/build-angular/node_modules/ora": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", @@ -931,7 +1004,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/restore-cursor": { + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/piscina": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.0.0.tgz", + "integrity": "sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", @@ -948,7 +1050,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", @@ -958,7 +1060,20 @@ "tslib": "^2.1.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/signal-exit": { + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", @@ -971,7 +1086,7 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@angular-devkit/schematics/node_modules/string-width": { + "node_modules/@angular-devkit/build-angular/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", @@ -989,7 +1104,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/schematics/node_modules/strip-ansi": { + "node_modules/@angular-devkit/build-angular/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", @@ -1005,1658 +1120,1734 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@angular/animations": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.3.tgz", - "integrity": "sha512-R6yv2RmrH49nW1ybgoOMw5pWzqaRYo8Kn3VtvrUDBty4TXjwc0addaw/t89n0smO3/lmBB4vnlRScePAEQZ/3w==", + "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.2000.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2000.2.tgz", + "integrity": "sha512-kFqvZNOcU1zwwMRG3Kh7V661HWgtt9G3+xId9A2VNXvW0ZfuVZmgfaR8TLEmtCSrQ4KHGGQmK0zn2lPHttY5HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2000.2", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/common": "20.0.3", - "@angular/core": "20.0.3" + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular/build": { + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/core": { "version": "20.0.2", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.2.tgz", - "integrity": "sha512-nxha/dncAwEbY0nkgDWeiWSi+MSCJBuQbFf5bjTZ+pu0fS+5SOQllZKzZE9H+dms/JsLHm2YmPiScIYVvUenDw==", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.2.tgz", + "integrity": "sha512-qqTSpcIw+TqJ6u/tkQzqgpwVelHsHr8Jhws1Vlx6E0L6E+cRILBK48i9ttE+oYkQlcopQ3VZAmzcZodXJ1SQ9Q==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2000.2", - "@babel/core": "7.27.1", - "@babel/helper-annotate-as-pure": "7.27.1", - "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.10", - "@vitejs/plugin-basic-ssl": "2.0.0", - "beasties": "0.3.4", - "browserslist": "^4.23.0", - "esbuild": "0.25.5", - "https-proxy-agent": "7.0.6", - "istanbul-lib-instrument": "6.0.3", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", - "listr2": "8.3.3", - "magic-string": "0.30.17", - "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "7.1.0", "picomatch": "4.0.2", - "piscina": "5.0.0", - "rollup": "4.40.2", - "sass": "1.88.0", - "semver": "7.7.2", - "source-map-support": "0.5.21", - "tinyglobby": "0.2.13", - "vite": "6.3.5", - "watchpack": "2.4.2" + "rxjs": "7.8.2", + "source-map": "0.7.4" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, - "optionalDependencies": { - "lmdb": "3.3.0" - }, "peerDependencies": { - "@angular/compiler": "^20.0.0", - "@angular/compiler-cli": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/localize": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "@angular/platform-server": "^20.0.0", - "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.0.2", - "karma": "^6.4.0", - "less": "^4.2.0", - "ng-packagr": "^20.0.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "tslib": "^2.3.0", - "typescript": ">=5.8 <5.9", - "vitest": "^3.1.1" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { - "@angular/core": { - "optional": true - }, - "@angular/localize": { - "optional": true - }, - "@angular/platform-browser": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@angular/ssr": { - "optional": true - }, - "karma": { - "optional": true - }, - "less": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - }, - "vitest": { + "chokidar": { "optional": true } } }, - "node_modules/@angular/build/node_modules/@babel/core": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", - "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", + "node_modules/@angular-devkit/core/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helpers": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "ajv": "^8.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@angular/build/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "node_modules/@angular/build/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "node_modules/@angular-devkit/schematics": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.0.2.tgz", + "integrity": "sha512-r1aSZhcadLtUMhzUUfy+pkJdZW93z8WQtpGR24y88yFpPgDL5kY85VSlOzjGgo1vEs8Dd7ADcOcsVsUW8MxQ3A==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.0.2", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } }, - "node_modules/@angular/build/node_modules/piscina": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.0.0.tgz", - "integrity": "sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==", + "node_modules/@angular-devkit/schematics/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.x" + "node": ">=12" }, - "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@angular/build/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "node_modules/@angular-devkit/schematics/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@angular/cdk": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.3.tgz", - "integrity": "sha512-70KG8GpK4aV9j5hUkpDZJQ6oMgCuaCRY6JX1axPxkNtQaiK6PAmTfQLiGqF2cYhbQneeq3uGvTorAjRfvp8NPQ==", + "node_modules/@angular-devkit/schematics/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, "license": "MIT", "dependencies": { - "parse5": "^7.1.2", - "tslib": "^2.3.0" + "restore-cursor": "^5.0.0" }, - "peerDependencies": { - "@angular/common": "^20.0.0 || ^21.0.0", - "@angular/core": "^20.0.0 || ^21.0.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/cli": { - "version": "20.0.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.2.tgz", - "integrity": "sha512-LzBONPETA1uCZuylgZRYe+vImf8i+rRrwAgOBHWbW2wxut9ZQ8ZFwQgNkjvDhE7DLmsFV+GskfAs5+Td/5LZwA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.2000.2", - "@angular-devkit/core": "20.0.2", - "@angular-devkit/schematics": "20.0.2", - "@inquirer/prompts": "7.5.1", - "@listr2/prompt-adapter-inquirer": "2.0.22", - "@schematics/angular": "20.0.2", - "@yarnpkg/lockfile": "1.1.0", - "ini": "5.0.0", - "jsonc-parser": "3.3.1", - "listr2": "8.3.3", - "npm-package-arg": "12.0.2", - "npm-pick-manifest": "10.0.0", - "pacote": "21.0.0", - "resolve": "1.22.10", - "semver": "7.7.2", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/@schematics/angular": { - "version": "20.0.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.2.tgz", - "integrity": "sha512-TyF+/hV+8flAa/Vu8xOQF241Syg9rdbZD1dARdm6edbLo8nwxmHdRsIulRektb7oD5CpTnxpvrcNJjX77nhv6A==", + "node_modules/@angular-devkit/schematics/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/schematics/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "license": "MIT", - "dependencies": { - "@angular-devkit/core": "20.0.2", - "@angular-devkit/schematics": "20.0.2", - "jsonc-parser": "3.3.1" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "node_modules/@angular-devkit/schematics/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^10.0.1" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "node_modules/@angular-devkit/schematics/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@angular/cli/node_modules/npm-package-arg": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", - "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "node_modules/@angular-devkit/schematics/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "node_modules/@angular-devkit/schematics/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/@angular-devkit/schematics/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@angular/cli/node_modules/validate-npm-package-name": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", - "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", + "node_modules/@angular-devkit/schematics/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/common": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.3.tgz", - "integrity": "sha512-HqqVqaj+xzByWJOIrONVRkpvM6mRuGmC+m9wKixhc9f+xXsymVTBR6xg+G/RwyYP2NuC5chxIZbaJTz2Hj+6+g==", + "node_modules/@angular-devkit/schematics/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.3.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": ">=12" }, - "peerDependencies": { - "@angular/core": "20.0.3", - "rxjs": "^6.5.3 || ^7.4.0" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@angular/compiler": { + "node_modules/@angular/animations": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.3.tgz", - "integrity": "sha512-CShPNvqqV5Cleyho8CKtcFlt7l2thHPUdXZPtKHH3Zf43KojvJbJksZLBz6ZbyoQdgxNMYSfbh4h0UbSGtPOzQ==", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.0.3.tgz", + "integrity": "sha512-R6yv2RmrH49nW1ybgoOMw5pWzqaRYo8Kn3VtvrUDBty4TXjwc0addaw/t89n0smO3/lmBB4vnlRScePAEQZ/3w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.0.3", + "@angular/core": "20.0.3" } }, - "node_modules/@angular/compiler-cli": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.3.tgz", - "integrity": "sha512-u+fYnx1sRrwL0fd8kaAD2LqJjfe/Zj7zyOv0A3Ue7r8jzdNsPU8MWr/QyBaWlqSpPEpR+kD3xmDvRT9ra9RTBA==", + "node_modules/@angular/build": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.2.tgz", + "integrity": "sha512-nxha/dncAwEbY0nkgDWeiWSi+MSCJBuQbFf5bjTZ+pu0fS+5SOQllZKzZE9H+dms/JsLHm2YmPiScIYVvUenDw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "7.27.4", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^18.0.0" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js" + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2000.2", + "@babel/core": "7.27.1", + "@babel/helper-annotate-as-pure": "7.27.1", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.10", + "@vitejs/plugin-basic-ssl": "2.0.0", + "beasties": "0.3.4", + "browserslist": "^4.23.0", + "esbuild": "0.25.5", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "8.3.3", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "7.1.0", + "picomatch": "4.0.2", + "piscina": "5.0.0", + "rollup": "4.40.2", + "sass": "1.88.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.13", + "vite": "6.3.5", + "watchpack": "2.4.2" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.3.0" }, "peerDependencies": { - "@angular/compiler": "20.0.3", - "typescript": ">=5.8 <5.9" + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.0.2", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <5.9", + "vitest": "^3.1.1" }, "peerDependenciesMeta": { - "typescript": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { "optional": true } } }, - "node_modules/@angular/compiler-cli/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/@angular/build/node_modules/@babel/core": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@angular/compiler-cli/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6.9.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@angular/compiler-cli/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "node_modules/@angular/build/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@angular/compiler-cli/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "node_modules/@angular/build/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" + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@angular/compiler-cli/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/@angular/build/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", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/compiler-cli/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@angular/build/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", - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "node_modules/@angular/build/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", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@angular/compiler-cli/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "node_modules/@angular/build/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", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">=18" } }, - "node_modules/@angular/compiler-cli/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "node_modules/@angular/build/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": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">=18" } }, - "node_modules/@angular/core": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.3.tgz", - "integrity": "sha512-kB6w1bQgClfmkTbWJeD3vSLqX0e3uSaJD6KJ7XXT1IEaqUs4J+mKRKHQyxpJlpdUb7R+jDaHSM/vrVF15/L2rA==", + "node_modules/@angular/build/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", - "dependencies": { - "tslib": "^2.3.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/compiler": "20.0.3", - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" - }, - "peerDependenciesMeta": { - "@angular/compiler": { - "optional": true - }, - "zone.js": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@angular/forms": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.3.tgz", - "integrity": "sha512-tb4M+c+/JnmPmtTb3+Si/DWGttnCEW5rvi4u55q+EFxYGQO0GeHa53yQTl1e2ngQLT9/kgmDAsJ2mt1Ql9N6xg==", + "node_modules/@angular/build/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", - "dependencies": { - "tslib": "^2.3.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/common": "20.0.3", - "@angular/core": "20.0.3", - "@angular/platform-browser": "20.0.3", - "rxjs": "^6.5.3 || ^7.4.0" + "node": ">=18" } }, - "node_modules/@angular/material": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.0.3.tgz", - "integrity": "sha512-kd5Mi6gVxcjDs1nfm8GG2rId59SXWQjkiBMqrYuhy2Trpb+zG0vrLClrpoe3JdWqoX4GJagxGwl3VRDBIoP/cw==", + "node_modules/@angular/build/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", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/cdk": "20.0.3", - "@angular/common": "^20.0.0 || ^21.0.0", - "@angular/core": "^20.0.0 || ^21.0.0", - "@angular/forms": "^20.0.0 || ^21.0.0", - "@angular/platform-browser": "^20.0.0 || ^21.0.0", - "rxjs": "^6.5.3 || ^7.4.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@angular/platform-browser": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.3.tgz", - "integrity": "sha512-cba0bibw9dJ8b+a2a8mwkiq5/HPiakY9P5OiJEVefN+2V/K9CND/pW+KIbW0/P6KhSSDQ29xgcGRseVtkjYLmg==", + "node_modules/@angular/build/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", - "dependencies": { - "tslib": "^2.3.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/animations": "20.0.3", - "@angular/common": "20.0.3", - "@angular/core": "20.0.3" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.0.3.tgz", - "integrity": "sha512-EUC0q9/L7nBQOJkOi7aKz0cKXym7XIZtZJjZ+K7hCZaE92wb+Uk5YdBfBaq6hJ3aEp896GUs3FVFI6Rxklrm2A==", + "node_modules/@angular/build/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", - "dependencies": { - "tslib": "^2.3.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/common": "20.0.3", - "@angular/compiler": "20.0.3", - "@angular/core": "20.0.3", - "@angular/platform-browser": "20.0.3" + "node": ">=18" } }, - "node_modules/@angular/router": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.3.tgz", - "integrity": "sha512-FY2kMZjLh7NUKjSaZ1K26azl67T4aVnOD8PE/w1Ih3eQmSIlHniNP1NmCGMUy6t1O/ZV6sCSKkA5AZFv18wzIQ==", + "node_modules/@angular/build/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", - "dependencies": { - "tslib": "^2.3.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@angular/common": "20.0.3", - "@angular/core": "20.0.3", - "@angular/platform-browser": "20.0.3", - "rxjs": "^6.5.3 || ^7.4.0" + "node": ">=18" } }, - "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==", + "node_modules/@angular/build/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", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "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==", + "node_modules/@angular/build/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": ">=6.9.0" + "node": ">=18" } }, - "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==", + "node_modules/@angular/build/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", - "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" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=18" } }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "node_modules/@angular/build/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", - "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" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular/build/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, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "node_modules/@angular/build/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", - "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "node_modules/@angular/build/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", - "dependencies": { - "@babel/types": "^7.27.1" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "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==", + "node_modules/@angular/build/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", - "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" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular/build/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, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "node_modules/@angular/build/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", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular/build/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": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "node_modules/@angular/build/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", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular/build/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": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", - "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "node_modules/@angular/build/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } + "license": "MIT" }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "node_modules/@angular/build/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", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "bin": { + "esbuild": "bin/esbuild" }, "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" + "node": ">=18" }, - "engines": { - "node": ">=6.9.0" + "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/@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==", + "node_modules/@angular/build/node_modules/piscina": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.0.0.tgz", + "integrity": "sha512-R+arufwL7sZvGjAhSMK3TfH55YdGOqhpKXkcwQJr432AAnJX/xxX19PA4QisrmJ+BTTfZVggaz6HexbkQq1l1Q==", "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" + "node": ">=18.x" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "node_modules/@angular/build/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.9.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": ">=10" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, + "node_modules/@angular/cdk": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.3.tgz", + "integrity": "sha512-70KG8GpK4aV9j5hUkpDZJQ6oMgCuaCRY6JX1axPxkNtQaiK6PAmTfQLiGqF2cYhbQneeq3uGvTorAjRfvp8NPQ==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "parse5": "^7.1.2", + "tslib": "^2.3.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "node_modules/@angular/cli": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.0.2.tgz", + "integrity": "sha512-LzBONPETA1uCZuylgZRYe+vImf8i+rRrwAgOBHWbW2wxut9ZQ8ZFwQgNkjvDhE7DLmsFV+GskfAs5+Td/5LZwA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@angular-devkit/architect": "0.2000.2", + "@angular-devkit/core": "20.0.2", + "@angular-devkit/schematics": "20.0.2", + "@inquirer/prompts": "7.5.1", + "@listr2/prompt-adapter-inquirer": "2.0.22", + "@schematics/angular": "20.0.2", + "@yarnpkg/lockfile": "1.1.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.3.3", + "npm-package-arg": "12.0.2", + "npm-pick-manifest": "10.0.0", + "pacote": "21.0.0", + "resolve": "1.22.10", + "semver": "7.7.2", + "yargs": "17.7.2" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "ng": "bin/ng.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "node_modules/@angular/cli/node_modules/@schematics/angular": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.0.2.tgz", + "integrity": "sha512-TyF+/hV+8flAa/Vu8xOQF241Syg9rdbZD1dARdm6edbLo8nwxmHdRsIulRektb7oD5CpTnxpvrcNJjX77nhv6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@angular-devkit/core": "20.0.2", + "@angular-devkit/schematics": "20.0.2", + "jsonc-parser": "3.3.1" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "node_modules/@angular/cli/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@babel/types": "^7.24.7" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^18.17.0 || >=20.5.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==", + "node_modules/@angular/cli/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } + "license": "ISC" }, - "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==", + "node_modules/@angular/cli/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": "^18.17.0 || >=20.5.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==", + "node_modules/@angular/cli/node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=6.9.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "node_modules/@angular/cli/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "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" + "node": ">= 0.4" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, + "license": "ISC", "bin": { - "parser": "bin/babel-parser.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "node_modules/@angular/cli/node_modules/validate-npm-package-name": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", + "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, + "license": "ISC", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, + "node_modules/@angular/common": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.3.tgz", + "integrity": "sha512-HqqVqaj+xzByWJOIrONVRkpvM6mRuGmC+m9wKixhc9f+xXsymVTBR6xg+G/RwyYP2NuC5chxIZbaJTz2Hj+6+g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@angular/core": "20.0.3", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, + "node_modules/@angular/compiler": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.3.tgz", + "integrity": "sha512-CShPNvqqV5Cleyho8CKtcFlt7l2thHPUdXZPtKHH3Zf43KojvJbJksZLBz6ZbyoQdgxNMYSfbh4h0UbSGtPOzQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "node_modules/@angular/compiler-cli": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.0.3.tgz", + "integrity": "sha512-u+fYnx1sRrwL0fd8kaAD2LqJjfe/Zj7zyOv0A3Ue7r8jzdNsPU8MWr/QyBaWlqSpPEpR+kD3xmDvRT9ra9RTBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/core": "7.27.4", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^18.0.0" }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@angular/compiler": "20.0.3", + "typescript": ">=5.8 <5.9" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz", - "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==", + "node_modules/@angular/compiler-cli/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-decorators": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@angular/compiler-cli/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@angular/compiler-cli/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@angular/compiler-cli/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "node_modules/@angular/compiler-cli/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "node_modules/@angular/compiler-cli/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@angular/compiler-cli/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@angular/compiler-cli/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "dev": true, + "node_modules/@angular/core": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.3.tgz", + "integrity": "sha512-kB6w1bQgClfmkTbWJeD3vSLqX0e3uSaJD6KJ7XXT1IEaqUs4J+mKRKHQyxpJlpdUb7R+jDaHSM/vrVF15/L2rA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@angular/compiler": "20.0.3", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, + "node_modules/@angular/forms": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.0.3.tgz", + "integrity": "sha512-tb4M+c+/JnmPmtTb3+Si/DWGttnCEW5rvi4u55q+EFxYGQO0GeHa53yQTl1e2ngQLT9/kgmDAsJ2mt1Ql9N6xg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.3.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "20.0.3", + "@angular/core": "20.0.3", + "@angular/platform-browser": "20.0.3", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, + "node_modules/@angular/material": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.0.3.tgz", + "integrity": "sha512-kd5Mi6gVxcjDs1nfm8GG2rId59SXWQjkiBMqrYuhy2Trpb+zG0vrLClrpoe3JdWqoX4GJagxGwl3VRDBIoP/cw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.3.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/cdk": "20.0.3", + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "@angular/forms": "^20.0.0 || ^21.0.0", + "@angular/platform-browser": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, + "node_modules/@angular/platform-browser": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.3.tgz", + "integrity": "sha512-cba0bibw9dJ8b+a2a8mwkiq5/HPiakY9P5OiJEVefN+2V/K9CND/pW+KIbW0/P6KhSSDQ29xgcGRseVtkjYLmg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.3.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/animations": "20.0.3", + "@angular/common": "20.0.3", + "@angular/core": "20.0.3" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, + "node_modules/@angular/platform-browser-dynamic": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.0.3.tgz", + "integrity": "sha512-EUC0q9/L7nBQOJkOi7aKz0cKXym7XIZtZJjZ+K7hCZaE92wb+Uk5YdBfBaq6hJ3aEp896GUs3FVFI6Rxklrm2A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "20.0.3", + "@angular/compiler": "20.0.3", + "@angular/core": "20.0.3", + "@angular/platform-browser": "20.0.3" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "dev": true, + "node_modules/@angular/router": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.0.3.tgz", + "integrity": "sha512-FY2kMZjLh7NUKjSaZ1K26azl67T4aVnOD8PE/w1Ih3eQmSIlHniNP1NmCGMUy6t1O/ZV6sCSKkA5AZFv18wzIQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "20.0.3", + "@angular/core": "20.0.3", + "@angular/platform-browser": "20.0.3", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "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-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "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", - "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-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "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": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@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" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "node_modules/@babel/core/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/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" + "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", - "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", + "node_modules/@babel/generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-properties": { + "node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "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/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@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" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-classes": { + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", - "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { + "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { + "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "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/helper-plugin-utils": "^7.27.1" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "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-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -2665,231 +2856,207 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { + "node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "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", - "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-export-namespace-from": { + "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-for-of": { + "node_modules/@babel/helper-replace-supers": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-function-name": { + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { + "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "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-logical-assignment-operators": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "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", - "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-member-expression-literals": { + "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "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-modules-amd": { + "node_modules/@babel/helper-wrap-function": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "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/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@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" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -2899,46 +3066,51 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-new-target": { + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { + "node_modules/@babel/plugin-proposal-decorators": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz", + "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2947,18 +3119,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", - "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.3", - "@babel/plugin-transform-parameters": "^7.27.1" - }, "engines": { "node": ">=6.9.0" }, @@ -2966,60 +3132,46 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { + "node_modules/@babel/plugin-syntax-decorators": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "license": "MIT", "dependencies": { @@ -3032,14 +3184,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-methods": { + "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -3049,15 +3200,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { + "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -3067,26 +3216,34 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", - "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "license": "MIT", "dependencies": { @@ -3099,27 +3256,130 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { + "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, "license": "MIT", "dependencies": { @@ -3132,19 +3392,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { + "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.1.tgz", - "integrity": "sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3153,20 +3410,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { + "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "license": "MIT", "dependencies": { @@ -3179,15 +3444,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3196,13 +3460,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { + "node_modules/@babel/plugin-transform-class-properties": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -3212,30 +3477,36 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { + "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { + "node_modules/@babel/plugin-transform-classes": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -3244,18 +3515,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { + "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", - "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3264,10 +3532,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", "dev": true, "license": "MIT", "dependencies": { @@ -3280,10 +3548,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { + "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, "license": "MIT", "dependencies": { @@ -3297,14 +3565,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { + "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -3314,10 +3581,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3331,82 +3598,14 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", - "semver": "^6.3.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3415,43 +3614,47 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "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/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-typescript": { + "node_modules/@babel/plugin-transform-for-of": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3460,2780 +3663,2535 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { + "node_modules/@babel/plugin-transform-function-name": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^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==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "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" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "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" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.5.2.tgz", - "integrity": "sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=0.1.90" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=14.17.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emnapi/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", - "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, "license": "MIT", "dependencies": { - "@emnapi/wasi-threads": "1.0.1", - "tslib": "^2.4.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@emnapi/runtime": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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" - ], + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", + "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.3", + "@babel/plugin-transform-parameters": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", + "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.1.tgz", + "integrity": "sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-runtime/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": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "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" - ], + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "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": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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" - ], + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.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" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "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" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@eslint/eslintrc/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 - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/preset-env": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@babel/preset-env/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, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fast-csv/format": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-5.0.0.tgz", - "integrity": "sha512-IyMpHwYIOGa2f0BJi6Wk55UF0oBA5urdIydoEDYxPo88LFbeb3Yr4rgpu98OAO1glUWheSnNtUgS80LE+/dqmw==", - "license": "MIT", - "dependencies": { - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@fast-csv/parse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-5.0.0.tgz", - "integrity": "sha512-ecF8tCm3jVxeRjEB6VPzmA+1wGaJ5JgaUX2uesOXdXD6qQp0B3EdshOIed4yT1Xlj/F2f8v4zHSo0Oi31L697g==", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, "license": "MIT", "dependencies": { - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@golevelup/ts-jest": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@golevelup/ts-jest/-/ts-jest-0.5.0.tgz", - "integrity": "sha512-UniUNOBraDD8vf6QNUPkpWMzhUXBtw40nCHekgBlaHy2p99MDV0aYLp4ZXifiyPOsFmg4BZQGs60lF6EpV7JpA==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "dev": true, + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "node_modules/@babel/runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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": { - "brace-expansion": "^1.1.7" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "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==", + "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, - "engines": { - "node": ">=12.22" + "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" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@inquirer/checkbox": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.8.tgz", - "integrity": "sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==", + "node_modules/@babel/traverse/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": { - "@inquirer/core": "^10.1.13", - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@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": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@inquirer/confirm": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz", - "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==", + "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": { - "@inquirer/core": "^10.1.11", - "@inquirer/type": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@inquirer/core": { - "version": "10.1.13", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.13.tgz", - "integrity": "sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.5.2.tgz", + "integrity": "sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14.17.0" } }, - "node_modules/@inquirer/editor": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.13.tgz", - "integrity": "sha512-WbicD9SUQt/K8O5Vyk9iC2ojq5RHoCLK6itpp2fHsWe44VxxcA9z3GTWlvjSTGmMQpZr+lbVmrxdHcumJoLbMA==", + "node_modules/@emnapi/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", + "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7", - "external-editor": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" } }, - "node_modules/@inquirer/expand": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.15.tgz", - "integrity": "sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==", + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "tslib": "^2.4.0" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", - "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@inquirer/input": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.12.tgz", - "integrity": "sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/number": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.15.tgz", - "integrity": "sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7" - }, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/password": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.15.tgz", - "integrity": "sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/prompts": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.5.1.tgz", - "integrity": "sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.1.6", - "@inquirer/confirm": "^5.1.10", - "@inquirer/editor": "^4.2.11", - "@inquirer/expand": "^4.0.13", - "@inquirer/input": "^4.1.10", - "@inquirer/number": "^3.0.13", - "@inquirer/password": "^4.0.13", - "@inquirer/rawlist": "^4.1.1", - "@inquirer/search": "^3.0.13", - "@inquirer/select": "^4.2.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.3.tgz", - "integrity": "sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7", - "yoctocolors-cjs": "^2.1.2" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/search": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.15.tgz", - "integrity": "sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "yoctocolors-cjs": "^2.1.2" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/select": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.3.tgz", - "integrity": "sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/type": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", - "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@iqb/eslint-config": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@iqb/eslint-config/-/eslint-config-2.2.0.tgz", - "integrity": "sha512-llWApHPreLQQtKGxusCZkquJFYXaoZs1BntehI5mGH4gUiQYABPfg12crhiRMo7vsQSqWs5g5OzjvJ5Sa7DbJQ==", + "node_modules/@esbuild/linux-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "cpu": [ + "arm" + ], "dev": true, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "eslint": "^8.57.0", - "eslint-config-airbnb-typescript": "^18.0.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@iqb/responses": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@iqb/responses/-/responses-3.6.0.tgz", - "integrity": "sha512-x4Qs11JdF3FYAYIplA1y7sorV6yN7dVNaJ0zdpDbcPkD/ZyRn9Ntgl00jDOk90RUiNooPUDczZ/Xifg6umlWfg==", - "license": "CC0 1.0", - "dependencies": { - "mathjs": "^12.4.2" + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.0.0" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "jest-get-type": "^29.6.3" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.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": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@eslint/eslintrc/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, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "node": ">=8" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/transform/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==", + "node_modules/@eslint/eslintrc/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 }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@eslint/eslintrc/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, "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "*" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "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==", - "devOptional": true, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "engines": { - "node": ">=6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, + "node_modules/@fast-csv/format": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-5.0.0.tgz", + "integrity": "sha512-IyMpHwYIOGa2f0BJi6Wk55UF0oBA5urdIydoEDYxPo88LFbeb3Yr4rgpu98OAO1glUWheSnNtUgS80LE+/dqmw==", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.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==", - "devOptional": true, - "license": "MIT" + "node_modules/@fast-csv/parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-5.0.0.tgz", + "integrity": "sha512-ecF8tCm3jVxeRjEB6VPzmA+1wGaJ5JgaUX2uesOXdXD6qQp0B3EdshOIed4yT1Xlj/F2f8v4zHSo0Oi31L697g==", + "license": "MIT", + "dependencies": { + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } }, - "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==", + "node_modules/@golevelup/ts-jest": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@golevelup/ts-jest/-/ts-jest-0.5.0.tgz", + "integrity": "sha512-UniUNOBraDD8vf6QNUPkpWMzhUXBtw40nCHekgBlaHy2p99MDV0aYLp4ZXifiyPOsFmg4BZQGs60lF6EpV7JpA==", + "dev": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=10.0" + "node": "*" + } + }, + "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, + "engines": { + "node": ">=12.22" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/streamich" + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@inquirer/checkbox": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.8.tgz", + "integrity": "sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "tslib": "2" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz", - "integrity": "sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==", + "node_modules/@inquirer/confirm": { + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz", + "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" + "@inquirer/core": "^10.1.11", + "@inquirer/type": "^3.0.6" }, "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "node": ">=18" }, "peerDependencies": { - "tslib": "2" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jsonjoy.com/util": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", - "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "node_modules/@inquirer/core": { + "version": "10.1.13", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.13.tgz", + "integrity": "sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "engines": { + "node": ">=18" }, "peerDependencies": { - "tslib": "2" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.22.tgz", - "integrity": "sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==", + "node_modules/@inquirer/editor": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.13.tgz", + "integrity": "sha512-WbicD9SUQt/K8O5Vyk9iC2ojq5RHoCLK6itpp2fHsWe44VxxcA9z3GTWlvjSTGmMQpZr+lbVmrxdHcumJoLbMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/type": "^1.5.5" + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "external-editor": "^3.1.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18" }, "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "node_modules/@inquirer/expand": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.15.tgz", + "integrity": "sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==", "dev": true, "license": "MIT", "dependencies": { - "mute-stream": "^1.0.0" + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "node_modules/@inquirer/figures": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", + "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.3.0.tgz", - "integrity": "sha512-LipbQobyEfQtu8WixasaFUZZ+JCGlho4OWwWIQ5ol0rB1RKkcZvypu7sS1CBvofBGVAa3vbOh8IOGQMrbmL5dg==", - "cpu": [ - "arm64" - ], + "node_modules/@inquirer/input": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.12.tgz", + "integrity": "sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.3.0.tgz", - "integrity": "sha512-yA+9P+ZeA3vg76BLXWeUomIAjxfmSmR2eg8fueHXDg5Xe1Xmkl9JCKuHXUhtJ+mMVcH12d5k4kJBLbyXTadfGQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.3.0.tgz", - "integrity": "sha512-EDYrW9kle+8wI19JCj/PhRnGoCN9bked5cdOPdo1wdgH/HzjgoLPFTn9DHlZccgTEVhp3O+bpWXdN/rWySVvjw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.3.0.tgz", - "integrity": "sha512-OeWvSgjXXZ/zmtLqqL78I3910F6UYpUubmsUU+iBHo6nTtjkpXms95rJtGrjkWQqwswKBD7xSMplbYC4LEsiPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.3.0.tgz", - "integrity": "sha512-wDd02mt5ScX4+xd6g78zKBr6ojpgCJCTrllCAabjgap5FzuETqOqaQfKhO+tJuGWv/J5q+GIds6uY7rNFueOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-win32-arm64": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.3.0.tgz", - "integrity": "sha512-COotWhHJgzXULLiEjOgWQwqig6PoA+6ji6W+sDl6M1HhMXWIymEVHGs0edsVSNtsNSCAWMxJgR3asv6FNX/2EA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.3.0.tgz", - "integrity": "sha512-kqUgQH+l8HDbkAapx+aoko7Ez4X4DqkIraOqY/k0QY5EN/iialVlFpBUXh4wFXzirdmEVjbIUMrceUh0Kh8LeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@microsoft/tsdoc": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", - "license": "MIT" - }, - "node_modules/@modern-js/node-bundle-require": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.68.2.tgz", - "integrity": "sha512-MWk/pYx7KOsp+A/rN0as2ji/Ba8x0m129aqZ3Lj6T6CCTWdz0E/IsamPdTmF9Jnb6whQoBKtWSaLTCQlmCoY0Q==", + "node_modules/@inquirer/number": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.15.tgz", + "integrity": "sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/utils": "2.68.2", - "@swc/helpers": "^0.5.17", - "esbuild": "0.25.5" + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@modern-js/utils": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.68.2.tgz", - "integrity": "sha512-revom/i/EhKfI0STNLo/AUbv7gY0JY0Ni2gO6P/Z4cTyZZRgd5j90678YB2DGn+LtmSrEWtUphyDH5Jn1RKjgg==", + "node_modules/@inquirer/password": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.15.tgz", + "integrity": "sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==", "dev": true, "license": "MIT", "dependencies": { - "@swc/helpers": "^0.5.17", - "caniuse-lite": "^1.0.30001520", - "lodash": "^4.17.21", - "rslog": "^1.1.0" + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.9.1.tgz", - "integrity": "sha512-znN/Qm6M0U1t3iF10gu1hSxDkk18yz78yvk+AMB34UDzpXHiC1zbpIeV2CQNV5GCeafmCICmcn9y1qh7F54KTg==", + "node_modules/@inquirer/prompts": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.5.1.tgz", + "integrity": "sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.9.1", - "@types/semver": "7.5.8", - "semver": "7.6.3" + "@inquirer/checkbox": "^4.1.6", + "@inquirer/confirm": "^5.1.10", + "@inquirer/editor": "^4.2.11", + "@inquirer/expand": "^4.0.13", + "@inquirer/input": "^4.1.10", + "@inquirer/number": "^3.0.13", + "@inquirer/password": "^4.0.13", + "@inquirer/rawlist": "^4.1.1", + "@inquirer/search": "^3.0.13", + "@inquirer/select": "^4.2.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@module-federation/cli": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.17.0.tgz", - "integrity": "sha512-07tj/Bfs7OmWUm/AvK8LRDoXDtPGw1zh5deH9srsryqGB8j8s2OTgYCbNtGXxTVhDR5zgoyqnOwLa8xFwr+zYw==", + "node_modules/@inquirer/rawlist": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.3.tgz", + "integrity": "sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/node-bundle-require": "2.68.2", - "@module-federation/dts-plugin": "0.17.0", - "@module-federation/sdk": "0.17.0", - "chalk": "3.0.0", - "commander": "11.1.0" - }, - "bin": { - "mf": "bin/mf.js" + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@module-federation/cli/node_modules/@module-federation/dts-plugin": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.17.0.tgz", - "integrity": "sha512-D6dIIdAxRzJbP6cUyOmZnxlCMJs4423jxo7y9klWWlZAYce6hnd2Sk4xd3AQ1UClQEcR6HqclnXao0wonnsN1g==", + "node_modules/@inquirer/search": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.15.tgz", + "integrity": "sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.17.0", - "@module-federation/managers": "0.17.0", - "@module-federation/sdk": "0.17.0", - "@module-federation/third-party-dts-extractor": "0.17.0", - "adm-zip": "^0.5.10", - "ansi-colors": "^4.1.3", - "axios": "^1.8.2", - "chalk": "3.0.0", - "fs-extra": "9.1.0", - "isomorphic-ws": "5.0.0", - "koa": "2.16.1", - "lodash.clonedeepwith": "4.5.0", - "log4js": "6.9.1", - "node-schedule": "2.1.1", - "rambda": "^9.1.0", - "ws": "8.18.0" + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24" + "@types/node": ">=18" }, "peerDependenciesMeta": { - "vue-tsc": { + "@types/node": { "optional": true } } }, - "node_modules/@module-federation/cli/node_modules/@module-federation/error-codes": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.17.0.tgz", - "integrity": "sha512-+pZ12frhaDqh4Xs/MQj4Vu4CAjnJTiEb8Z6fqPfn/TLHh4YLWMOzpzxGuMFDHqXwMb3o8FRAUhNB0eX2ZmhwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@module-federation/cli/node_modules/@module-federation/managers": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.17.0.tgz", - "integrity": "sha512-7Dc2RTn9n1FO4NXSc4cNKclbXrFLj5reNi5Y9NmSE0Y/rUm+5Ac6CvwZibRDPu/ivDJM6U51+eJWZJXzpi7+rQ==", + "node_modules/@inquirer/select": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.3.tgz", + "integrity": "sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.17.0", - "find-pkg": "2.0.0", - "fs-extra": "9.1.0" + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@module-federation/cli/node_modules/@module-federation/sdk": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.17.0.tgz", - "integrity": "sha512-tjrNaYdDocHZsWu5iXlm83lwEK8A64r4PQB3/kY1cW1iOvggR2RESLAWPxRJXC2cLF8fg8LDKOBdgERZW1HPFA==", + "node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } }, - "node_modules/@module-federation/cli/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.17.0.tgz", - "integrity": "sha512-1OkHLDgRZBGNH3h2aQ8f2V8g8p3x8DvLD6qzRb1s7P27/oOrKZW8OGxUSOwQ8M2+/R5cwUgRM0+KYeKUD1xa4g==", + "node_modules/@iqb/eslint-config": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@iqb/eslint-config/-/eslint-config-2.2.0.tgz", + "integrity": "sha512-llWApHPreLQQtKGxusCZkquJFYXaoZs1BntehI5mGH4gUiQYABPfg12crhiRMo7vsQSqWs5g5OzjvJ5Sa7DbJQ==", "dev": true, - "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-typescript": "^18.0.0" + } + }, + "node_modules/@iqb/responses": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@iqb/responses/-/responses-3.6.0.tgz", + "integrity": "sha512-x4Qs11JdF3FYAYIplA1y7sorV6yN7dVNaJ0zdpDbcPkD/ZyRn9Ntgl00jDOk90RUiNooPUDczZ/Xifg6umlWfg==", + "license": "CC0 1.0", "dependencies": { - "find-pkg": "2.0.0", - "fs-extra": "9.1.0", - "resolve": "1.22.8" + "mathjs": "^12.4.2" } }, - "node_modules/@module-federation/cli/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@module-federation/cli/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { - "node": ">=16" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@module-federation/cli/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@module-federation/cli/node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@module-federation/cli/node_modules/koa": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", - "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@module-federation/cli/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, "engines": { - "node": ">= 0.6" + "node": ">=18.0.0" } }, - "node_modules/@module-federation/cli/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/@module-federation/data-prefetch": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.9.1.tgz", - "integrity": "sha512-rS1AsgRvIMAWK8oMprEBF0YQ3WvsqnumjinvAZU1Dqut5DICmpQMTPEO1OrAKyjO+PQgEhmq13HggzN6ebGLrQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.9.1", - "@module-federation/sdk": "0.9.1", - "fs-extra": "9.1.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/@module-federation/dts-plugin": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.9.1.tgz", - "integrity": "sha512-DezBrFaIKfDcEY7UhqyO1WbYocERYsR/CDN8AV6OvMnRlQ8u0rgM8qBUJwx0s+K59f+CFQFKEN4C8p7naCiHrw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.9.1", - "@module-federation/managers": "0.9.1", - "@module-federation/sdk": "0.9.1", - "@module-federation/third-party-dts-extractor": "0.9.1", - "adm-zip": "^0.5.10", - "ansi-colors": "^4.1.3", - "axios": "^1.7.4", - "chalk": "3.0.0", - "fs-extra": "9.1.0", - "isomorphic-ws": "5.0.0", - "koa": "2.15.4", - "lodash.clonedeepwith": "4.5.0", - "log4js": "6.9.1", - "node-schedule": "2.1.1", - "rambda": "^9.1.0", - "ws": "8.18.0" - }, - "peerDependencies": { - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "peerDependenciesMeta": { - "vue-tsc": { - "optional": true - } + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@module-federation/dts-plugin/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=8" } }, - "node_modules/@module-federation/dts-plugin/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/enhanced": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.9.1.tgz", - "integrity": "sha512-c9siKVjcgT2gtDdOTqEr+GaP2X/PWAS0OV424ljKLstFL1lcS/BIsxWFDmxPPl5hDByAH+1q4YhC1LWY4LNDQw==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.9.1", - "@module-federation/data-prefetch": "0.9.1", - "@module-federation/dts-plugin": "0.9.1", - "@module-federation/error-codes": "0.9.1", - "@module-federation/inject-external-runtime-core-plugin": "0.9.1", - "@module-federation/managers": "0.9.1", - "@module-federation/manifest": "0.9.1", - "@module-federation/rspack": "0.9.1", - "@module-federation/runtime-tools": "0.9.1", - "@module-federation/sdk": "0.9.1", - "btoa": "^1.2.1", - "upath": "2.0.1" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24", - "webpack": "^5.0.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue-tsc": { - "optional": true - }, - "webpack": { + "node-notifier": { "optional": true } } }, - "node_modules/@module-federation/error-codes": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.9.1.tgz", - "integrity": "sha512-q8spCvlwUzW42iX1irnlBTcwcZftRNHyGdlaoFO1z/fW4iphnBIfijzkigWQzOMhdPgzqN/up7XN+g5hjBGBtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.9.1.tgz", - "integrity": "sha512-BPfzu1cqDU5BhM493enVF1VfxJWmruen0ktlHrWdJJlcddhZzyFBGaLAGoGc+83fS75aEllvJTEthw4kMViMQQ==", + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", "dev": true, "license": "MIT", - "peerDependencies": { - "@module-federation/runtime-tools": "0.9.1" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@module-federation/managers": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.9.1.tgz", - "integrity": "sha512-8hpIrvGfiODxS1qelTd7eaLRVF7jrp17RWgeH1DWoprxELANxm5IVvqUryB+7j+BhoQzamog9DL5q4MuNfGgIA==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.9.1", - "find-pkg": "2.0.0", - "fs-extra": "9.1.0" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/manifest": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.9.1.tgz", - "integrity": "sha512-+GteKBXrAUkq49i2CSyWZXM4vYa+mEVXxR9Du71R55nXXxgbzAIoZj9gxjRunj9pcE8+YpAOyfHxLEdWngxWdg==", + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.9.1", - "@module-federation/managers": "0.9.1", - "@module-federation/sdk": "0.9.1", - "chalk": "3.0.0", - "find-pkg": "2.0.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/manifest/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "jest-get-type": "^29.6.3" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/node": { - "version": "2.7.9", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.9.tgz", - "integrity": "sha512-CeTdqJVfHJ0OhyHHU+5nyf+2MEva+DdwPIqoFekuyzvWur+vnlzO1x4SrftsJtb6lqfkhVW/kJ+DzdHmAlUgag==", + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/enhanced": "0.17.0", - "@module-federation/runtime": "0.17.0", - "@module-federation/sdk": "0.17.0", - "btoa": "1.2.1", - "encoding": "^0.1.13", - "node-fetch": "2.7.0" - }, - "peerDependencies": { - "react": "^16||^17||^18||^19", - "react-dom": "^16||^17||^18||^19", - "webpack": "^5.40.0" + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, - "peerDependenciesMeta": { - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.17.0.tgz", - "integrity": "sha512-QI4uK91eyH/krevQ/3w20E+c5F3oCapE6DND0QTzJTNpwG4YIpT6aBG3SyvqWXK+lzTIaoXxkLgYsOpWzTQc0g==", + "node_modules/@jest/get-type": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", + "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", "dev": true, "license": "MIT", - "dependencies": { - "@module-federation/sdk": "0.17.0", - "@types/semver": "7.5.8", - "semver": "7.6.3" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.17.0.tgz", - "integrity": "sha512-5JRtxCk+XFur75Vrv2V36ch92K8Sm9/9tPAgmC8LzJXUxt925D6sQTZGk789sOV4T+3iocmewUEdhQoD3NvDjQ==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.17.0", - "@module-federation/sdk": "0.17.0", - "fs-extra": "9.1.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.17.0.tgz", - "integrity": "sha512-D6dIIdAxRzJbP6cUyOmZnxlCMJs4423jxo7y9klWWlZAYce6hnd2Sk4xd3AQ1UClQEcR6HqclnXao0wonnsN1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.17.0", - "@module-federation/managers": "0.17.0", - "@module-federation/sdk": "0.17.0", - "@module-federation/third-party-dts-extractor": "0.17.0", - "adm-zip": "^0.5.10", - "ansi-colors": "^4.1.3", - "axios": "^1.8.2", - "chalk": "3.0.0", - "fs-extra": "9.1.0", - "isomorphic-ws": "5.0.0", - "koa": "2.16.1", - "lodash.clonedeepwith": "4.5.0", - "log4js": "6.9.1", - "node-schedule": "2.1.1", - "rambda": "^9.1.0", - "ws": "8.18.0" - }, - "peerDependencies": { - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24" - }, - "peerDependenciesMeta": { - "vue-tsc": { - "optional": true - } - } - }, - "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.17.0.tgz", - "integrity": "sha512-lsEUF0f6K/v+cODEj/mGEE64PrL63jou5aPGTakIljTSlRbOguws9eU4eMVNYRySiaNp5KriuxjMoS3DN4yYBQ==", + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.17.0", - "@module-federation/cli": "0.17.0", - "@module-federation/data-prefetch": "0.17.0", - "@module-federation/dts-plugin": "0.17.0", - "@module-federation/error-codes": "0.17.0", - "@module-federation/inject-external-runtime-core-plugin": "0.17.0", - "@module-federation/managers": "0.17.0", - "@module-federation/manifest": "0.17.0", - "@module-federation/rspack": "0.17.0", - "@module-federation/runtime-tools": "0.17.0", - "@module-federation/sdk": "0.17.0", - "btoa": "^1.2.1", - "schema-utils": "^4.3.0", - "upath": "2.0.1" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, - "bin": { - "mf": "bin/mf.js" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24", - "webpack": "^5.0.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue-tsc": { - "optional": true - }, - "webpack": { + "node-notifier": { "optional": true } } }, - "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.17.0.tgz", - "integrity": "sha512-+pZ12frhaDqh4Xs/MQj4Vu4CAjnJTiEb8Z6fqPfn/TLHh4YLWMOzpzxGuMFDHqXwMb3o8FRAUhNB0eX2ZmhwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.17.0.tgz", - "integrity": "sha512-WPYRIqdgEDx5WkKOPLT6c6KRinwfvFgsuvr0dSZJOFSlPiU6gCwy9AZBqr1NNLQs/CDLiCRdsReXyOwS/geBiQ==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "license": "MIT", - "peerDependencies": { - "@module-federation/runtime-tools": "0.17.0" + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/managers": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.17.0.tgz", - "integrity": "sha512-7Dc2RTn9n1FO4NXSc4cNKclbXrFLj5reNi5Y9NmSE0Y/rUm+5Ac6CvwZibRDPu/ivDJM6U51+eJWZJXzpi7+rQ==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.17.0", - "find-pkg": "2.0.0", - "fs-extra": "9.1.0" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.17.0.tgz", - "integrity": "sha512-h7PxQmlV8nusRkEUhxZCnYmZqRDk4XqUi43tVsYt5MjFFauBE+ClgRBBWy1bpvwtNdIEby6HDwO+3pEFgat2Iw==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.17.0", - "@module-federation/managers": "0.17.0", - "@module-federation/sdk": "0.17.0", - "chalk": "3.0.0", - "find-pkg": "2.0.0" + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.17.0.tgz", - "integrity": "sha512-tRYTk53Oc4Ymreo4gcdOoCnMUAHRcmGIm7uRqS/emZmdy8h+oqiYQB6HoIuQMDWDG0HZ28I6ErbpHP6quNQHCw==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.17.0", - "@module-federation/dts-plugin": "0.17.0", - "@module-federation/inject-external-runtime-core-plugin": "0.17.0", - "@module-federation/managers": "0.17.0", - "@module-federation/manifest": "0.17.0", - "@module-federation/runtime-tools": "0.17.0", - "@module-federation/sdk": "0.17.0", - "btoa": "1.2.1" - }, - "peerDependencies": { - "@rspack/core": ">=0.7", - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue-tsc": { - "optional": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.17.0.tgz", - "integrity": "sha512-eMtrtCSSV6neJpMmQ8WdFpYv93raSgsG5RiAPsKUuSCXfZ5D+yzvleZ+gPcEpFT9HokmloxAn0jep50/1upTQw==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.17.0", - "@module-federation/runtime-core": "0.17.0", - "@module-federation/sdk": "0.17.0" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.17.0.tgz", - "integrity": "sha512-MYwDDevYnBB9gXFfNOmJVIX5XZcbCHd0dral7gT7yVmlwOhbuGOLlm2dh2icwwdCYHA9AFDCfU9l1nJR4ex/ng==", + "node_modules/@jest/transform/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 + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.17.0", - "@module-federation/sdk": "0.17.0" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.17.0.tgz", - "integrity": "sha512-t4QcKfhmwOHedwByDKUlTQVw4+gPotySYPyNa8GFrBSr1F6wcGdGyOhzP+PdgpiJLIM03cB6V+IKGGHE28SfDQ==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, - "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.17.0", - "@module-federation/webpack-bundler-runtime": "0.17.0" + "@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/@module-federation/node/node_modules/@module-federation/sdk": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.17.0.tgz", - "integrity": "sha512-tjrNaYdDocHZsWu5iXlm83lwEK8A64r4PQB3/kY1cW1iOvggR2RESLAWPxRJXC2cLF8fg8LDKOBdgERZW1HPFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.17.0.tgz", - "integrity": "sha512-1OkHLDgRZBGNH3h2aQ8f2V8g8p3x8DvLD6qzRb1s7P27/oOrKZW8OGxUSOwQ8M2+/R5cwUgRM0+KYeKUD1xa4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-pkg": "2.0.0", - "fs-extra": "9.1.0", - "resolve": "1.22.8" + "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==", + "devOptional": true, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.17.0.tgz", - "integrity": "sha512-o8XtXwqTDlqLgcALOfObcCbqXvUcSDHIEXrkcb4W+I8GJY7IqV0+x6rX4mJ3f59tca9qOF8zsZsOA6BU93Pvgw==", + "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", - "dependencies": { - "@module-federation/runtime": "0.17.0", - "@module-federation/sdk": "0.17.0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@module-federation/node/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@module-federation/node/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "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==", + "devOptional": 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": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@module-federation/node/node_modules/http-errors/node_modules/depd": { + "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">= 0.6" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@module-federation/node/node_modules/koa": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", - "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz", + "integrity": "sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" }, "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@module-federation/node/node_modules/statuses": { + "node_modules/@jsonjoy.com/util": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@module-federation/node/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "node": ">=10.0" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@module-federation/rspack": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.9.1.tgz", - "integrity": "sha512-ZJqG75dWHhyTMa9I0YPJEV2XRt0MFxnDiuMOpI92esdmwWY633CBKyNh1XxcLd629YVeTv03+whr+Fz/f91JEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.9.1", - "@module-federation/dts-plugin": "0.9.1", - "@module-federation/inject-external-runtime-core-plugin": "0.9.1", - "@module-federation/managers": "0.9.1", - "@module-federation/manifest": "0.9.1", - "@module-federation/runtime-tools": "0.9.1", - "@module-federation/sdk": "0.9.1" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@rspack/core": ">=0.7", - "typescript": "^4.9.0 || ^5.0.0", - "vue-tsc": ">=1.0.24" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vue-tsc": { - "optional": true - } - } - }, - "node_modules/@module-federation/runtime": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.9.1.tgz", - "integrity": "sha512-jp7K06weabM5BF5sruHr/VLyalO+cilvRDy7vdEBqq88O9mjc0RserD8J+AP4WTl3ZzU7/GRqwRsiwjjN913dA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.9.1", - "@module-federation/runtime-core": "0.9.1", - "@module-federation/sdk": "0.9.1" + "tslib": "2" } }, - "node_modules/@module-federation/runtime-core": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.9.1.tgz", - "integrity": "sha512-r61ufhKt5pjl81v7TkmhzeIoSPOaNtLynW6+aCy3KZMa3RfRevFxmygJqv4Nug1L0NhqUeWtdLejh4VIglNy5Q==", + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.9.1", - "@module-federation/sdk": "0.9.1" - } + "license": "MIT" }, - "node_modules/@module-federation/runtime-tools": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.9.1.tgz", - "integrity": "sha512-JQZ//ab+lEXoU2DHAH+JtYASGzxEjXB0s4rU+6VJXc8c+oUPxH3kWIwzjdncg2mcWBmC1140DCk+K+kDfOZ5CQ==", + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.22.tgz", + "integrity": "sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.9.1", - "@module-federation/webpack-bundler-runtime": "0.9.1" + "@inquirer/type": "^1.5.5" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8" } }, - "node_modules/@module-federation/sdk": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.9.1.tgz", - "integrity": "sha512-YQonPTImgnCqZjE/A+3N2g3J5ypR6kx1tbBzc9toUANKr/dw/S63qlh/zHKzWQzxjjNNVMdXRtTMp07g3kgEWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.9.1.tgz", - "integrity": "sha512-KeIByP718hHyq+Mc53enZ419pZZ1fh9Ns6+/bYLkc3iCoJr/EDBeiLzkbMwh2AS4Qk57WW0yNC82xzf7r0Zrrw==", + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", "dev": true, "license": "MIT", "dependencies": { - "find-pkg": "2.0.0", - "fs-extra": "9.1.0", - "resolve": "1.22.8" + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.9.1.tgz", - "integrity": "sha512-CxySX01gT8cBowKl9xZh+voiHvThMZ471icasWnlDIZb14KasZoX1eCh9wpGvwoOdIk9rIRT7h70UvW9nmop6w==", + "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/runtime": "0.9.1", - "@module-federation/sdk": "0.9.1" + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.3.0.tgz", + "integrity": "sha512-LipbQobyEfQtu8WixasaFUZZ+JCGlho4OWwWIQ5ol0rB1RKkcZvypu7sS1CBvofBGVAa3vbOh8IOGQMrbmL5dg==", "cpu": [ "arm64" ], @@ -6244,10 +6202,10 @@ "darwin" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.3.0.tgz", + "integrity": "sha512-yA+9P+ZeA3vg76BLXWeUomIAjxfmSmR2eg8fueHXDg5Xe1Xmkl9JCKuHXUhtJ+mMVcH12d5k4kJBLbyXTadfGQ==", "cpu": [ "x64" ], @@ -6258,10 +6216,10 @@ "darwin" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.3.0.tgz", + "integrity": "sha512-EDYrW9kle+8wI19JCj/PhRnGoCN9bked5cdOPdo1wdgH/HzjgoLPFTn9DHlZccgTEVhp3O+bpWXdN/rWySVvjw==", "cpu": [ "arm" ], @@ -6272,10 +6230,10 @@ "linux" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.3.0.tgz", + "integrity": "sha512-OeWvSgjXXZ/zmtLqqL78I3910F6UYpUubmsUU+iBHo6nTtjkpXms95rJtGrjkWQqwswKBD7xSMplbYC4LEsiPA==", "cpu": [ "arm64" ], @@ -6286,10 +6244,10 @@ "linux" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.3.0.tgz", + "integrity": "sha512-wDd02mt5ScX4+xd6g78zKBr6ojpgCJCTrllCAabjgap5FzuETqOqaQfKhO+tJuGWv/J5q+GIds6uY7rNFueOxg==", "cpu": [ "x64" ], @@ -6300,12 +6258,12 @@ "linux" ] }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.3.0.tgz", + "integrity": "sha512-COotWhHJgzXULLiEjOgWQwqig6PoA+6ji6W+sDl6M1HhMXWIymEVHGs0edsVSNtsNSCAWMxJgR3asv6FNX/2EA==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", @@ -6314,62 +6272,69 @@ "win32" ] }, - "node_modules/@napi-rs/nice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", - "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.3.0.tgz", + "integrity": "sha512-kqUgQH+l8HDbkAapx+aoko7Ez4X4DqkIraOqY/k0QY5EN/iialVlFpBUXh4wFXzirdmEVjbIUMrceUh0Kh8LeA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@napi-rs/nice-android-arm-eabi": "1.0.1", - "@napi-rs/nice-android-arm64": "1.0.1", - "@napi-rs/nice-darwin-arm64": "1.0.1", - "@napi-rs/nice-darwin-x64": "1.0.1", - "@napi-rs/nice-freebsd-x64": "1.0.1", - "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", - "@napi-rs/nice-linux-arm64-gnu": "1.0.1", - "@napi-rs/nice-linux-arm64-musl": "1.0.1", - "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", - "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", - "@napi-rs/nice-linux-s390x-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-musl": "1.0.1", - "@napi-rs/nice-win32-arm64-msvc": "1.0.1", - "@napi-rs/nice-win32-ia32-msvc": "1.0.1", - "@napi-rs/nice-win32-x64-msvc": "1.0.1" + "node": ">=8" } }, - "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", - "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "node_modules/@microsoft/tsdoc": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "license": "MIT" + }, + "node_modules/@modern-js/node-bundle-require": { + "version": "2.68.2", + "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.68.2.tgz", + "integrity": "sha512-MWk/pYx7KOsp+A/rN0as2ji/Ba8x0m129aqZ3Lj6T6CCTWdz0E/IsamPdTmF9Jnb6whQoBKtWSaLTCQlmCoY0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@modern-js/utils": "2.68.2", + "@swc/helpers": "^0.5.17", + "esbuild": "0.25.5" + } + }, + "node_modules/@modern-js/node-bundle-require/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": [ - "arm" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "aix" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", - "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "node_modules/@modern-js/node-bundle-require/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": [ - "arm64" + "arm" ], "dev": true, "license": "MIT", @@ -6378,13 +6343,13 @@ "android" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", - "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "node_modules/@modern-js/node-bundle-require/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" ], @@ -6392,16 +6357,16 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", - "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "node_modules/@modern-js/node-bundle-require/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" ], @@ -6409,50 +6374,50 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", - "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "node_modules/@modern-js/node-bundle-require/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": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" + "darwin" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", - "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "node_modules/@modern-js/node-bundle-require/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": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", - "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "node_modules/@modern-js/node-bundle-require/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" ], @@ -6460,35 +6425,35 @@ "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", - "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "node_modules/@modern-js/node-bundle-require/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": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", - "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "node_modules/@modern-js/node-bundle-require/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": [ - "ppc64" + "arm" ], "dev": true, "license": "MIT", @@ -6497,15 +6462,15 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", - "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "node_modules/@modern-js/node-bundle-require/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": [ - "riscv64" + "arm64" ], "dev": true, "license": "MIT", @@ -6514,15 +6479,15 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", - "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "node_modules/@modern-js/node-bundle-require/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": [ - "s390x" + "ia32" ], "dev": true, "license": "MIT", @@ -6531,15 +6496,15 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", - "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "node_modules/@modern-js/node-bundle-require/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": [ - "x64" + "loong64" ], "dev": true, "license": "MIT", @@ -6548,15 +6513,15 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", - "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "node_modules/@modern-js/node-bundle-require/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": [ - "x64" + "mips64el" ], "dev": true, "license": "MIT", @@ -6565,1490 +6530,4649 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", - "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "node_modules/@modern-js/node-bundle-require/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": [ - "arm64" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", - "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "node_modules/@modern-js/node-bundle-require/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": [ - "ia32" + "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", - "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "node_modules/@modern-js/node-bundle-require/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": [ - "x64" + "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "node_modules/@modern-js/node-bundle-require/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", - "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@nestjs/axios": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-4.0.1.tgz", - "integrity": "sha512-68pFJgu+/AZbWkGu65Z3r55bTsCPlgyKaV4BSG8yUAD72q1PPuyVRgUwFv6BxdnibTUHlyxm06FmYWNC+bjN7A==", + "node_modules/@modern-js/node-bundle-require/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", - "peerDependencies": { - "@nestjs/common": "^10.0.0 || ^11.0.0", - "axios": "^1.3.1", - "rxjs": "^7.0.0" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@nestjs/common": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.5.tgz", - "integrity": "sha512-DQpWdr3ShO0BHWkHl3I4W/jR6R3pDtxyBlmrpTuZF+PXxQyBXNvsUne0Wyo6QHPEDi+pAz9XchBFoKbqOhcdTg==", + "node_modules/@modern-js/node-bundle-require/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", - "dependencies": { - "file-type": "21.0.0", - "iterare": "1.2.1", - "load-esm": "1.0.2", - "tslib": "2.8.1", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "class-transformer": ">=0.4.1", - "class-validator": ">=0.13.2", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@nestjs/config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.2.tgz", - "integrity": "sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==", + "node_modules/@modern-js/node-bundle-require/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", - "dependencies": { - "dotenv": "16.4.7", - "dotenv-expand": "12.0.1", - "lodash": "4.17.21" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0 || ^11.0.0", - "rxjs": "^7.1.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@nestjs/core": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.5.tgz", - "integrity": "sha512-Qr25MEY9t8VsMETy7eXQ0cNXqu0lzuFrrTr+f+1G57ABCtV5Pogm7n9bF71OU2bnkDD32Bi4hQLeFR90cku3Tw==", - "hasInstallScript": true, + "node_modules/@modern-js/node-bundle-require/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", - "dependencies": { - "@nuxt/opencollective": "0.4.1", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "path-to-regexp": "8.2.0", - "tslib": "2.8.1", - "uid": "2.0.2" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 20" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^11.0.0", - "@nestjs/microservices": "^11.0.0", - "@nestjs/platform-express": "^11.0.0", - "@nestjs/websockets": "^11.0.0", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@nestjs/jwt": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.0.tgz", - "integrity": "sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==", + "node_modules/@modern-js/node-bundle-require/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", - "dependencies": { - "@types/jsonwebtoken": "9.0.7", - "jsonwebtoken": "9.0.2" - }, - "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@nestjs/mapped-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", - "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", + "node_modules/@modern-js/node-bundle-require/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", - "peerDependencies": { - "@nestjs/common": "^10.0.0 || ^11.0.0", - "class-transformer": "^0.4.0 || ^0.5.0", - "class-validator": "^0.13.0 || ^0.14.0", - "reflect-metadata": "^0.1.12 || ^0.2.0" - }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@nestjs/passport": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz", - "integrity": "sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==", + "node_modules/@modern-js/node-bundle-require/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", - "peerDependencies": { - "@nestjs/common": "^10.0.0 || ^11.0.0", - "passport": "^0.5.0 || ^0.6.0 || ^0.7.0" - } - }, - "node_modules/@nestjs/platform-express": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.5.tgz", - "integrity": "sha512-OsoiUBY9Shs5IG3uvDIt9/IDfY5OlvWBESuB/K4Eun8xILw1EK5d5qMfC3d2sIJ+kA3l+kBR1d/RuzH7VprLIg==", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@modern-js/node-bundle-require/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", - "dependencies": { - "cors": "2.8.5", - "express": "5.1.0", - "multer": "2.0.2", - "path-to-regexp": "8.2.0", - "tslib": "2.8.1" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@modern-js/node-bundle-require/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" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" + "engines": { + "node": ">=18" }, - "peerDependencies": { - "@nestjs/common": "^11.0.0", - "@nestjs/core": "^11.0.0" + "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/@nestjs/platform-express/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "node_modules/@modern-js/utils": { + "version": "2.68.2", + "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.68.2.tgz", + "integrity": "sha512-revom/i/EhKfI0STNLo/AUbv7gY0JY0Ni2gO6P/Z4cTyZZRgd5j90678YB2DGn+LtmSrEWtUphyDH5Jn1RKjgg==", + "dev": true, "license": "MIT", "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" + "@swc/helpers": "^0.5.17", + "caniuse-lite": "^1.0.30001520", + "lodash": "^4.17.21", + "rslog": "^1.1.0" } }, - "node_modules/@nestjs/platform-express/node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.17.0.tgz", + "integrity": "sha512-QI4uK91eyH/krevQ/3w20E+c5F3oCapE6DND0QTzJTNpwG4YIpT6aBG3SyvqWXK+lzTIaoXxkLgYsOpWzTQc0g==", + "dev": true, "license": "MIT", "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" + "@module-federation/sdk": "0.17.0", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/cli": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.17.0.tgz", + "integrity": "sha512-07tj/Bfs7OmWUm/AvK8LRDoXDtPGw1zh5deH9srsryqGB8j8s2OTgYCbNtGXxTVhDR5zgoyqnOwLa8xFwr+zYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@modern-js/node-bundle-require": "2.68.2", + "@module-federation/dts-plugin": "0.17.0", + "@module-federation/sdk": "0.17.0", + "chalk": "3.0.0", + "commander": "11.1.0" + }, + "bin": { + "mf": "bin/mf.js" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@nestjs/platform-express/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "node_modules/@module-federation/cli/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/@nestjs/platform-express/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "node_modules/@module-federation/data-prefetch": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.17.0.tgz", + "integrity": "sha512-5JRtxCk+XFur75Vrv2V36ch92K8Sm9/9tPAgmC8LzJXUxt925D6sQTZGk789sOV4T+3iocmewUEdhQoD3NvDjQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6.6.0" + "dependencies": { + "@module-federation/runtime": "0.17.0", + "@module-federation/sdk": "0.17.0", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@nestjs/platform-express/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "node_modules/@module-federation/dts-plugin": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.17.0.tgz", + "integrity": "sha512-D6dIIdAxRzJbP6cUyOmZnxlCMJs4423jxo7y9klWWlZAYce6hnd2Sk4xd3AQ1UClQEcR6HqclnXao0wonnsN1g==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "@module-federation/error-codes": "0.17.0", + "@module-federation/managers": "0.17.0", + "@module-federation/sdk": "0.17.0", + "@module-federation/third-party-dts-extractor": "0.17.0", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.8.2", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "2.16.1", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" }, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" }, "peerDependenciesMeta": { - "supports-color": { + "vue-tsc": { "optional": true } } }, - "node_modules/@nestjs/platform-express/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/@module-federation/dts-plugin/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/@nestjs/platform-express/node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "node_modules/@module-federation/dts-plugin/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, "engines": { - "node": ">= 18" + "node": ">=10.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "node_modules/@nestjs/platform-express/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "node_modules/@module-federation/enhanced": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.17.0.tgz", + "integrity": "sha512-lsEUF0f6K/v+cODEj/mGEE64PrL63jou5aPGTakIljTSlRbOguws9eU4eMVNYRySiaNp5KriuxjMoS3DN4yYBQ==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "@module-federation/bridge-react-webpack-plugin": "0.17.0", + "@module-federation/cli": "0.17.0", + "@module-federation/data-prefetch": "0.17.0", + "@module-federation/dts-plugin": "0.17.0", + "@module-federation/error-codes": "0.17.0", + "@module-federation/inject-external-runtime-core-plugin": "0.17.0", + "@module-federation/managers": "0.17.0", + "@module-federation/manifest": "0.17.0", + "@module-federation/rspack": "0.17.0", + "@module-federation/runtime-tools": "0.17.0", + "@module-federation/sdk": "0.17.0", + "btoa": "^1.2.1", + "schema-utils": "^4.3.0", + "upath": "2.0.1" }, - "engines": { - "node": ">= 0.8" + "bin": { + "mf": "bin/mf.js" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/@nestjs/platform-express/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "node_modules/@module-federation/error-codes": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.17.0.tgz", + "integrity": "sha512-+pZ12frhaDqh4Xs/MQj4Vu4CAjnJTiEb8Z6fqPfn/TLHh4YLWMOzpzxGuMFDHqXwMb3o8FRAUhNB0eX2ZmhwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.17.0.tgz", + "integrity": "sha512-WPYRIqdgEDx5WkKOPLT6c6KRinwfvFgsuvr0dSZJOFSlPiU6gCwy9AZBqr1NNLQs/CDLiCRdsReXyOwS/geBiQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "peerDependencies": { + "@module-federation/runtime-tools": "0.17.0" } }, - "node_modules/@nestjs/platform-express/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/@module-federation/managers": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.17.0.tgz", + "integrity": "sha512-7Dc2RTn9n1FO4NXSc4cNKclbXrFLj5reNi5Y9NmSE0Y/rUm+5Ac6CvwZibRDPu/ivDJM6U51+eJWZJXzpi7+rQ==", + "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@module-federation/sdk": "0.17.0", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" } }, - "node_modules/@nestjs/platform-express/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "node_modules/@module-federation/manifest": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.17.0.tgz", + "integrity": "sha512-h7PxQmlV8nusRkEUhxZCnYmZqRDk4XqUi43tVsYt5MjFFauBE+ClgRBBWy1bpvwtNdIEby6HDwO+3pEFgat2Iw==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "@module-federation/dts-plugin": "0.17.0", + "@module-federation/managers": "0.17.0", + "@module-federation/sdk": "0.17.0", + "chalk": "3.0.0", + "find-pkg": "2.0.0" } }, - "node_modules/@nestjs/platform-express/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "node_modules/@module-federation/manifest/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nestjs/platform-express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/@nestjs/platform-express/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "node_modules/@module-federation/node": { + "version": "2.7.9", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.9.tgz", + "integrity": "sha512-CeTdqJVfHJ0OhyHHU+5nyf+2MEva+DdwPIqoFekuyzvWur+vnlzO1x4SrftsJtb6lqfkhVW/kJ+DzdHmAlUgag==", + "dev": true, "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" + "@module-federation/enhanced": "0.17.0", + "@module-federation/runtime": "0.17.0", + "@module-federation/sdk": "0.17.0", + "btoa": "1.2.1", + "encoding": "^0.1.13", + "node-fetch": "2.7.0" }, - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "react": "^16||^17||^18||^19", + "react-dom": "^16||^17||^18||^19", + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, - "node_modules/@nestjs/platform-express/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==", - "license": "MIT" - }, - "node_modules/@nestjs/platform-express/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "node_modules/@module-federation/rspack": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.17.0.tgz", + "integrity": "sha512-tRYTk53Oc4Ymreo4gcdOoCnMUAHRcmGIm7uRqS/emZmdy8h+oqiYQB6HoIuQMDWDG0HZ28I6ErbpHP6quNQHCw==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nestjs/platform-express/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "@module-federation/bridge-react-webpack-plugin": "0.17.0", + "@module-federation/dts-plugin": "0.17.0", + "@module-federation/inject-external-runtime-core-plugin": "0.17.0", + "@module-federation/managers": "0.17.0", + "@module-federation/manifest": "0.17.0", + "@module-federation/runtime-tools": "0.17.0", + "@module-federation/sdk": "0.17.0", + "btoa": "1.2.1" }, - "engines": { - "node": ">=0.6" + "peerDependencies": { + "@rspack/core": ">=0.7", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } } }, - "node_modules/@nestjs/platform-express/node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "node_modules/@module-federation/runtime": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.17.0.tgz", + "integrity": "sha512-eMtrtCSSV6neJpMmQ8WdFpYv93raSgsG5RiAPsKUuSCXfZ5D+yzvleZ+gPcEpFT9HokmloxAn0jep50/1upTQw==", + "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" + "@module-federation/error-codes": "0.17.0", + "@module-federation/runtime-core": "0.17.0", + "@module-federation/sdk": "0.17.0" } }, - "node_modules/@nestjs/platform-express/node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "node_modules/@module-federation/runtime-core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.17.0.tgz", + "integrity": "sha512-MYwDDevYnBB9gXFfNOmJVIX5XZcbCHd0dral7gT7yVmlwOhbuGOLlm2dh2icwwdCYHA9AFDCfU9l1nJR4ex/ng==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" + "@module-federation/error-codes": "0.17.0", + "@module-federation/sdk": "0.17.0" } }, - "node_modules/@nestjs/platform-express/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "node_modules/@module-federation/runtime-tools": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.17.0.tgz", + "integrity": "sha512-t4QcKfhmwOHedwByDKUlTQVw4+gPotySYPyNa8GFrBSr1F6wcGdGyOhzP+PdgpiJLIM03cB6V+IKGGHE28SfDQ==", + "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" + "@module-federation/runtime": "0.17.0", + "@module-federation/webpack-bundler-runtime": "0.17.0" } }, - "node_modules/@nestjs/platform-express/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "node_modules/@module-federation/sdk": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.17.0.tgz", + "integrity": "sha512-tjrNaYdDocHZsWu5iXlm83lwEK8A64r4PQB3/kY1cW1iOvggR2RESLAWPxRJXC2cLF8fg8LDKOBdgERZW1HPFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.17.0.tgz", + "integrity": "sha512-1OkHLDgRZBGNH3h2aQ8f2V8g8p3x8DvLD6qzRb1s7P27/oOrKZW8OGxUSOwQ8M2+/R5cwUgRM0+KYeKUD1xa4g==", + "dev": true, "license": "MIT", "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" } }, - "node_modules/@nestjs/schematics": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.5.tgz", - "integrity": "sha512-T50SCNyqCZ/fDssaOD7meBKLZ87ebRLaJqZTJPvJKjlib1VYhMOCwXYsr7bjMPmuPgiQHOwvppz77xN/m6GM7A==", + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.17.0.tgz", + "integrity": "sha512-o8XtXwqTDlqLgcALOfObcCbqXvUcSDHIEXrkcb4W+I8GJY7IqV0+x6rX4mJ3f59tca9qOF8zsZsOA6BU93Pvgw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.6", - "@angular-devkit/schematics": "19.2.6", - "comment-json": "4.2.5", - "jsonc-parser": "3.3.1", - "pluralize": "8.0.0" - }, - "peerDependencies": { - "typescript": ">=4.8.2" + "@module-federation/runtime": "0.17.0", + "@module-federation/sdk": "0.17.0" } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.6.tgz", - "integrity": "sha512-WFgiYhrDMq83UNaGRAneIM7CYYdBozD+yYA9BjoU8AgBLKtrvn6S8ZcjKAk5heoHtY/u8pEb0mwDTz9gxFmJZQ==", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", + "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">= 10" }, - "peerDependencies": { - "chokidar": "^4.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.1", + "@napi-rs/nice-android-arm64": "1.0.1", + "@napi-rs/nice-darwin-arm64": "1.0.1", + "@napi-rs/nice-darwin-x64": "1.0.1", + "@napi-rs/nice-freebsd-x64": "1.0.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", + "@napi-rs/nice-linux-arm64-gnu": "1.0.1", + "@napi-rs/nice-linux-arm64-musl": "1.0.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", + "@napi-rs/nice-linux-s390x-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-musl": "1.0.1", + "@napi-rs/nice-win32-arm64-msvc": "1.0.1", + "@napi-rs/nice-win32-ia32-msvc": "1.0.1", + "@napi-rs/nice-win32-x64-msvc": "1.0.1" } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.6.tgz", - "integrity": "sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ==", + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", + "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.2.6", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">= 10" } }, - "node_modules/@nestjs/schematics/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", + "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@nestjs/swagger": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.2.0.tgz", - "integrity": "sha512-5wolt8GmpNcrQv34tIPUtPoV1EeFbCetm40Ij3+M0FNNnf2RJ3FyWfuQvI8SBlcJyfaounYVTKzKHreFXsUyOg==", - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.15.1", - "@nestjs/mapped-types": "2.1.0", - "js-yaml": "4.1.0", - "lodash": "4.17.21", - "path-to-regexp": "8.2.0", - "swagger-ui-dist": "5.21.0" - }, - "peerDependencies": { - "@fastify/static": "^8.0.0", - "@nestjs/common": "^11.0.1", - "@nestjs/core": "^11.0.1", - "class-transformer": "*", - "class-validator": "*", - "reflect-metadata": "^0.1.12 || ^0.2.0" - }, - "peerDependenciesMeta": { - "@fastify/static": { - "optional": true - }, - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, - "node_modules/@nestjs/testing": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.5.tgz", - "integrity": "sha512-ZYRYF750SefmuIo7ZqPlHDcin1OHh6My0OkOfGEFjrD9mJ0vMVIpwMTOOkpzCfCcpqUuxeHBuecpiIn+NLrQbQ==", + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^11.0.0", - "@nestjs/core": "^11.0.0", - "@nestjs/microservices": "^11.0.0", - "@nestjs/platform-express": "^11.0.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - } + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@nestjs/typeorm": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz", - "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==", + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", + "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "@nestjs/common": "^10.0.0 || ^11.0.0", - "@nestjs/core": "^10.0.0 || ^11.0.0", - "reflect-metadata": "^0.1.13 || ^0.2.0", - "rxjs": "^7.2.0", - "typeorm": "^0.3.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@ngtools/webpack": { - "version": "20.0.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.0.2.tgz", - "integrity": "sha512-Thpk7LR4cpM90sjGXdvrM+HnUFvHzNJn2h0U6/Ow5ez+OipQDYKoFm1bisk2K/B6zGI7sGavXUlZagoTOXucUw==", + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^20.0.0", - "typescript": ">=5.8 <5.9", - "webpack": "^5.54.0" + "node": ">= 10" } }, - "node_modules/@ngx-translate/core": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz", - "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==", + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^16.13.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "rxjs": "^6.5.5 || ^7.4.0" + "node": ">= 10" } }, - "node_modules/@ngx-translate/http-loader": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz", - "integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==", + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^16.13.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@ngx-translate/core": ">=15.0.0", - "rxjs": "^6.5.5 || ^7.4.0" + "node": ">= 10" } }, - "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==", + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "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==", + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "cpu": [ + "ppc64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "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==", + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", + "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 10" } }, - "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14" + "node": ">= 10" } }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 10" } }, - "node_modules/@npmcli/git": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", - "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^5.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 10" } }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", + "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=16" + "node": ">= 10" } }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/git/node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 10" } }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^3.1.1" + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@nestjs/axios": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-4.0.1.tgz", + "integrity": "sha512-68pFJgu+/AZbWkGu65Z3r55bTsCPlgyKaV4BSG8yUAD72q1PPuyVRgUwFv6BxdnibTUHlyxm06FmYWNC+bjN7A==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "axios": "^1.3.1", + "rxjs": "^7.0.0" + } + }, + "node_modules/@nestjs/common": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.5.tgz", + "integrity": "sha512-DQpWdr3ShO0BHWkHl3I4W/jR6R3pDtxyBlmrpTuZF+PXxQyBXNvsUne0Wyo6QHPEDi+pAz9XchBFoKbqOhcdTg==", + "license": "MIT", + "dependencies": { + "file-type": "21.0.0", + "iterare": "1.2.1", + "load-esm": "1.0.2", + "tslib": "2.8.1", + "uid": "2.0.2" }, - "bin": { - "node-which": "bin/which.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "peerDependencies": { + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", - "dev": true, - "license": "ISC", + "node_modules/@nestjs/config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.2.tgz", + "integrity": "sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==", + "license": "MIT", "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" + "dotenv": "16.4.7", + "dotenv-expand": "12.0.1", + "lodash": "4.17.21" }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "rxjs": "^7.1.0" } }, - "node_modules/@npmcli/node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", - "dev": true, - "license": "ISC", + "node_modules/@nestjs/core": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.5.tgz", + "integrity": "sha512-Qr25MEY9t8VsMETy7eXQ0cNXqu0lzuFrrTr+f+1G57ABCtV5Pogm7n9bF71OU2bnkDD32Bi4hQLeFR90cku3Tw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxt/opencollective": "0.4.1", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.2.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } } }, - "node_modules/@npmcli/package-json": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", - "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", - "dev": true, - "license": "ISC", + "node_modules/@nestjs/jwt": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.0.tgz", + "integrity": "sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==", + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "9.0.7", + "jsonwebtoken": "9.0.2" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" + } + }, + "node_modules/@nestjs/mapped-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", + "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/passport": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz", + "integrity": "sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "passport": "^0.5.0 || ^0.6.0 || ^0.7.0" + } + }, + "node_modules/@nestjs/platform-express": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.5.tgz", + "integrity": "sha512-OsoiUBY9Shs5IG3uvDIt9/IDfY5OlvWBESuB/K4Eun8xILw1EK5d5qMfC3d2sIJ+kA3l+kBR1d/RuzH7VprLIg==", + "license": "MIT", + "dependencies": { + "cors": "2.8.5", + "express": "5.1.0", + "multer": "2.0.2", + "path-to-regexp": "8.2.0", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nestjs/platform-express/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@nestjs/platform-express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nestjs/platform-express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/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==", + "license": "MIT" + }, + "node_modules/@nestjs/platform-express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@nestjs/platform-express/node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nestjs/platform-express/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nestjs/platform-express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/schematics": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.5.tgz", + "integrity": "sha512-T50SCNyqCZ/fDssaOD7meBKLZ87ebRLaJqZTJPvJKjlib1VYhMOCwXYsr7bjMPmuPgiQHOwvppz77xN/m6GM7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.6", + "@angular-devkit/schematics": "19.2.6", + "comment-json": "4.2.5", + "jsonc-parser": "3.3.1", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "typescript": ">=4.8.2" + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.6.tgz", + "integrity": "sha512-WFgiYhrDMq83UNaGRAneIM7CYYdBozD+yYA9BjoU8AgBLKtrvn6S8ZcjKAk5heoHtY/u8pEb0mwDTz9gxFmJZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.6.tgz", + "integrity": "sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.6", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@nestjs/schematics/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@nestjs/swagger": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.2.0.tgz", + "integrity": "sha512-5wolt8GmpNcrQv34tIPUtPoV1EeFbCetm40Ij3+M0FNNnf2RJ3FyWfuQvI8SBlcJyfaounYVTKzKHreFXsUyOg==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.15.1", + "@nestjs/mapped-types": "2.1.0", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "8.2.0", + "swagger-ui-dist": "5.21.0" + }, + "peerDependencies": { + "@fastify/static": "^8.0.0", + "@nestjs/common": "^11.0.1", + "@nestjs/core": "^11.0.1", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/testing": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.5.tgz", + "integrity": "sha512-ZYRYF750SefmuIo7ZqPlHDcin1OHh6My0OkOfGEFjrD9mJ0vMVIpwMTOOkpzCfCcpqUuxeHBuecpiIn+NLrQbQ==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@nestjs/typeorm": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz", + "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.2.0", + "typeorm": "^0.3.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.0.2.tgz", + "integrity": "sha512-Thpk7LR4cpM90sjGXdvrM+HnUFvHzNJn2h0U6/Ow5ez+OipQDYKoFm1bisk2K/B6zGI7sGavXUlZagoTOXucUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "typescript": ">=5.8 <5.9", + "webpack": "^5.54.0" + } + }, + "node_modules/@ngx-translate/core": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz", + "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==", + "engines": { + "node": "^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0", + "@angular/core": ">=16.0.0", + "rxjs": "^6.5.5 || ^7.4.0" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz", + "integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==", + "engines": { + "node": "^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0", + "@angular/core": ">=16.0.0", + "@ngx-translate/core": ">=15.0.0", + "rxjs": "^6.5.5 || ^7.4.0" + } + }, + "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, + "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, + "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, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", + "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" + } + }, + "node_modules/@nx/angular": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-21.3.1.tgz", + "integrity": "sha512-v2VogTfmBfR/OLEm7lwWsW0e33al8W3xOyw4hlVmPZg7lgruvaqabKABepukxOizzwd9rDDirQkFAL+zWX9wlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "21.3.1", + "@nx/eslint": "21.3.1", + "@nx/js": "21.3.1", + "@nx/module-federation": "21.3.1", + "@nx/rspack": "21.3.1", + "@nx/web": "21.3.1", + "@nx/webpack": "21.3.1", + "@nx/workspace": "21.3.1", + "@phenomnomnominal/tsquery": "~5.0.1", + "@typescript-eslint/type-utils": "^8.0.0", + "enquirer": "~2.3.6", + "magic-string": "~0.30.2", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "@angular-devkit/build-angular": ">= 18.0.0 < 21.0.0", + "@angular-devkit/core": ">= 18.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 18.0.0 < 21.0.0", + "@angular/build": ">= 18.0.0 < 21.0.0", + "@schematics/angular": ">= 18.0.0 < 21.0.0", + "ng-packagr": ">= 18.0.0 < 21.0.0", + "rxjs": "^6.5.3 || ^7.5.0" + }, + "peerDependenciesMeta": { + "@angular-devkit/build-angular": { + "optional": true + }, + "@angular/build": { + "optional": true + }, + "ng-packagr": { + "optional": true + } + } + }, + "node_modules/@nx/angular/node_modules/@jest/schemas": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", + "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/angular/node_modules/@nx/devkit": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.3.1.tgz", + "integrity": "sha512-0FA6uVIJ5tOrUz6kJEeyX6KKPmXBs9kWQbf08yXogEzMimz9cVpoDS8MGmK14e13UwnY68vqXgknHAL+ATs3Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": "21.3.1" + } + }, + "node_modules/@nx/angular/node_modules/@nx/eslint": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.3.1.tgz", + "integrity": "sha512-Vjb0tk6nd0khljt57RZLTZhH7sUGkefZhkVdM5AVTDYVz4S1U2xuowwBnbIf0VbdTZ9xmxYIoWsPewEmSA5kXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "21.3.1", + "@nx/js": "21.3.1", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "typescript": "~5.8.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } + } + }, + "node_modules/@nx/angular/node_modules/@nx/js": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.3.1.tgz", + "integrity": "sha512-zc+3t3NOBWdnqPL94gsYspYhkiKYd3fflvDNdiOpf3XKhXZCE89YsbcZGoxDnW0A0bKAk4Z7wwh9txnG4A2jZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "21.3.1", + "@nx/workspace": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/angular/node_modules/@nx/nx-darwin-arm64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.3.1.tgz", + "integrity": "sha512-DND5/CRN1rP7qMt4xkDjklzf3OoA3JcweN+47xZCfiQlu/VobvnS04OC6tLZc+Nymi73whk4lserpUG9biQjCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/nx-darwin-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.3.1.tgz", + "integrity": "sha512-iFR/abYakCwrFFIfb6gRXN6/gytle/8jj2jwEol0EFrkBIrBi/YrSyuRpsbnxuDB7MhuZ9zwvxlkE6mEJt9UoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/nx-freebsd-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.3.1.tgz", + "integrity": "sha512-e/cx0cR8sLBX3b2JRLqwXj8z4ENhgDwJ5CF7hbcNRkMncKz1J2MZSsqHQHKUfls+HT4Mmmzwyf86laj879cs7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.3.1.tgz", + "integrity": "sha512-JvDfLVZhxzKfetcA1r5Ak+re5Qfks6JdgQD165wMysgAyZDdeM1GFn78xo5CqRPShlE8f/nhF4aX405OL6HYPw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.3.1.tgz", + "integrity": "sha512-J+LkCHzFCgZw4ZMgIuahprjaabWTDmsqJdsYLPFm/pw7TR6AyidXzUEZPfEgBK5WTO1PQr1LJp+Ps8twpf+iBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/nx-linux-arm64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.3.1.tgz", + "integrity": "sha512-VCiwPf4pj6WZWmPl30UpcKyp8DWb7Axs0pvU0/dsJz6Ye7bhKnsEZ/Ehp4laVZkck+MVEMFMHavikUdgNzWx3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/nx-linux-x64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.3.1.tgz", + "integrity": "sha512-Erxxqir8zZDgfrTgOOeaByn22e8vbOTxWNif5i0brH2tQpdr6+2f3v1qNrRlP9CWjqwypPDmkU781U38u+qHHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/nx-linux-x64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.3.1.tgz", + "integrity": "sha512-dG5djRnC3zzOjEzOAzVX8u1sZSn0TSmvVUKKH+WorxI8QKpxHVHbzpvvyLXpiAbtSk0reIPC1c9iRw+MR0GAvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.3.1.tgz", + "integrity": "sha512-mkV6HERTtP2uY6aq0AhxbkL6KSsvomobPOypdEdrnfUsc2Rvd+U/pWl/flZHFkk8V6aXzEG56lWCZqXVyGUD1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/nx-win32-x64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.3.1.tgz", + "integrity": "sha512-9cQZDiLT9bD1ixZ+WwNHVPRrxuszGHc30xzLzVgQ2l/IwOHJX6oRxMZa1IfgUYv846K0TSKWis+S41tcxUy80Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/angular/node_modules/@nx/workspace": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.3.1.tgz", + "integrity": "sha512-MiS0x/Wl4vv+4oFWvsZLFsRR9E3tDh002ZeGjvGJbiZw8eUAMfX1mYhU7URxHSr8yoW1qCAKEvgAjGTLRz9Kkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "21.3.1", + "picomatch": "4.0.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/angular/node_modules/@sinclair/typebox": { + "version": "0.34.38", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", + "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/angular/node_modules/@typescript-eslint/scope-manager": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.0.tgz", + "integrity": "sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@nx/angular/node_modules/@typescript-eslint/type-utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.0.tgz", + "integrity": "sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.26.0", + "@typescript-eslint/utils": "8.26.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "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/@nx/angular/node_modules/@typescript-eslint/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.0.tgz", + "integrity": "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==", + "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/@nx/angular/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.0.tgz", + "integrity": "sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.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.0.1" + }, + "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/@nx/angular/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/@nx/angular/node_modules/@typescript-eslint/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.26.0", + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/typescript-estree": "8.26.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/@nx/angular/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.0.tgz", + "integrity": "sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.26.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/@nx/angular/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@nx/angular/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/angular/node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@nx/angular/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "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/@nx/angular/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/angular/node_modules/jest-diff": { + "version": "30.0.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.4.tgz", + "integrity": "sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.0.1", + "chalk": "^4.1.2", + "pretty-format": "30.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/angular/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/angular/node_modules/nx": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.3.1.tgz", + "integrity": "sha512-lOMDktM4CUcVa/yUmiAXGNxbNo6SC0T8/alRml1sgaOG1QHUpH6XyA1/nR4M3DNjlmON4wD06pZQUDKFb8kd8w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.8.3", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^30.0.2", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "21.3.1", + "@nx/nx-darwin-x64": "21.3.1", + "@nx/nx-freebsd-x64": "21.3.1", + "@nx/nx-linux-arm-gnueabihf": "21.3.1", + "@nx/nx-linux-arm64-gnu": "21.3.1", + "@nx/nx-linux-arm64-musl": "21.3.1", + "@nx/nx-linux-x64-gnu": "21.3.1", + "@nx/nx-linux-x64-musl": "21.3.1", + "@nx/nx-win32-arm64-msvc": "21.3.1", + "@nx/nx-win32-x64-msvc": "21.3.1" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nx/angular/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/angular/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/angular/node_modules/pretty-format": { + "version": "30.0.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.2.tgz", + "integrity": "sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.1", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/angular/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/angular/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/angular/node_modules/ts-api-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/@nx/cypress": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-21.2.0.tgz", + "integrity": "sha512-ChWsT1Ke7GvYR/6y+hTFXph4iynJHPuG/tJ8lRtl/HXbVJ+iM2GSjPXgbVNKqgc1cCxClnaTLZ788kKE8hUBLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "21.2.0", + "@nx/eslint": "21.2.0", + "@nx/js": "21.2.0", + "@phenomnomnominal/tsquery": "~5.0.1", + "detect-port": "^1.5.1", + "semver": "^7.6.3", + "tree-kill": "1.2.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "cypress": ">= 3 < 15" + }, + "peerDependenciesMeta": { + "cypress": { + "optional": true + } + } + }, + "node_modules/@nx/devkit": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.2.0.tgz", + "integrity": "sha512-IunVWFtqiq7NqGu1dL8fUPW3uaShbxGqjwbfkRVAiEq+GqpAWgeFLJYHqUb0THdHegX7Fxit8x0sTz4QNNpd2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": "21.2.0" + } + }, + "node_modules/@nx/esbuild": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/esbuild/-/esbuild-21.2.0.tgz", + "integrity": "sha512-DW/Ue7uyd6I9xw8GBonkGW4Yyc8EhjniGLY35T/OULrH0qdbi1IAHj1iTgxTfitfa+UISU0pw6oUowL8pniflw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "21.2.0", + "@nx/js": "21.2.0", + "picocolors": "^1.1.0", + "tinyglobby": "^0.2.12", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "esbuild": ">=0.19.2 <1.0.0" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + } + } + }, + "node_modules/@nx/eslint": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.2.0.tgz", + "integrity": "sha512-IxVItkeApgbQxeCb8D0A8Rm7eyxoFD9N5QfyKua89jNnPdtr+JkVZ4LlFyCMmtFzrmu+A06+x0pyY2wCNv4sPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "21.2.0", + "@nx/js": "21.2.0", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "typescript": "~5.8.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } + } + }, + "node_modules/@nx/jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-21.2.0.tgz", + "integrity": "sha512-QLBgnQWdHn+EAvp9+juPmOYTTcR3/RIYKIaL7fbSVrXi2h1Axnx02DtNXSYEN1wGGF6DbWxoRLN6gb84dG2wDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/reporters": "^29.4.1", + "@jest/test-result": "^29.4.1", + "@nx/devkit": "21.2.0", + "@nx/js": "21.2.0", + "@phenomnomnominal/tsquery": "~5.0.1", + "identity-obj-proxy": "3.0.0", + "jest-config": "^29.4.1", + "jest-resolve": "^29.4.1", + "jest-util": "^29.4.1", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/js": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.2.0.tgz", + "integrity": "sha512-BdDvhaEYh+/Aat8lrbmsuaUsYyxpLO4sRKiiAgW4NMRG+1a96BSwd9tvkrJkiLPJO5SnbI+/YKImunQwqcg/dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "21.2.0", + "@nx/workspace": "21.2.0", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/js/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/js/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/js/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/module-federation": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-21.3.1.tgz", + "integrity": "sha512-LSQ0iOIYESjIWH0ShykfV5dnyOVlBHlmUnC6xpLVNjghbs1qp5t/HXto3SRhKMomwkj/XN5ZQBsvY9uD9/yo4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/enhanced": "^0.17.0", + "@module-federation/node": "^2.7.9", + "@module-federation/sdk": "^0.17.0", + "@nx/devkit": "21.3.1", + "@nx/js": "21.3.1", + "@nx/web": "21.3.1", + "@rspack/core": "^1.3.8", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.3", + "picocolors": "^1.1.0", + "tslib": "^2.3.0", + "webpack": "^5.88.0" + } + }, + "node_modules/@nx/module-federation/node_modules/@jest/schemas": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", + "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/devkit": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.3.1.tgz", + "integrity": "sha512-0FA6uVIJ5tOrUz6kJEeyX6KKPmXBs9kWQbf08yXogEzMimz9cVpoDS8MGmK14e13UwnY68vqXgknHAL+ATs3Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": "21.3.1" + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/js": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.3.1.tgz", + "integrity": "sha512-zc+3t3NOBWdnqPL94gsYspYhkiKYd3fflvDNdiOpf3XKhXZCE89YsbcZGoxDnW0A0bKAk4Z7wwh9txnG4A2jZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "21.3.1", + "@nx/workspace": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-darwin-arm64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.3.1.tgz", + "integrity": "sha512-DND5/CRN1rP7qMt4xkDjklzf3OoA3JcweN+47xZCfiQlu/VobvnS04OC6tLZc+Nymi73whk4lserpUG9biQjCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-darwin-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.3.1.tgz", + "integrity": "sha512-iFR/abYakCwrFFIfb6gRXN6/gytle/8jj2jwEol0EFrkBIrBi/YrSyuRpsbnxuDB7MhuZ9zwvxlkE6mEJt9UoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-freebsd-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.3.1.tgz", + "integrity": "sha512-e/cx0cR8sLBX3b2JRLqwXj8z4ENhgDwJ5CF7hbcNRkMncKz1J2MZSsqHQHKUfls+HT4Mmmzwyf86laj879cs7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.3.1.tgz", + "integrity": "sha512-JvDfLVZhxzKfetcA1r5Ak+re5Qfks6JdgQD165wMysgAyZDdeM1GFn78xo5CqRPShlE8f/nhF4aX405OL6HYPw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.3.1.tgz", + "integrity": "sha512-J+LkCHzFCgZw4ZMgIuahprjaabWTDmsqJdsYLPFm/pw7TR6AyidXzUEZPfEgBK5WTO1PQr1LJp+Ps8twpf+iBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-arm64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.3.1.tgz", + "integrity": "sha512-VCiwPf4pj6WZWmPl30UpcKyp8DWb7Axs0pvU0/dsJz6Ye7bhKnsEZ/Ehp4laVZkck+MVEMFMHavikUdgNzWx3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-x64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.3.1.tgz", + "integrity": "sha512-Erxxqir8zZDgfrTgOOeaByn22e8vbOTxWNif5i0brH2tQpdr6+2f3v1qNrRlP9CWjqwypPDmkU781U38u+qHHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-linux-x64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.3.1.tgz", + "integrity": "sha512-dG5djRnC3zzOjEzOAzVX8u1sZSn0TSmvVUKKH+WorxI8QKpxHVHbzpvvyLXpiAbtSk0reIPC1c9iRw+MR0GAvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.3.1.tgz", + "integrity": "sha512-mkV6HERTtP2uY6aq0AhxbkL6KSsvomobPOypdEdrnfUsc2Rvd+U/pWl/flZHFkk8V6aXzEG56lWCZqXVyGUD1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/nx-win32-x64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.3.1.tgz", + "integrity": "sha512-9cQZDiLT9bD1ixZ+WwNHVPRrxuszGHc30xzLzVgQ2l/IwOHJX6oRxMZa1IfgUYv846K0TSKWis+S41tcxUy80Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/module-federation/node_modules/@nx/workspace": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.3.1.tgz", + "integrity": "sha512-MiS0x/Wl4vv+4oFWvsZLFsRR9E3tDh002ZeGjvGJbiZw8eUAMfX1mYhU7URxHSr8yoW1qCAKEvgAjGTLRz9Kkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "21.3.1", + "picomatch": "4.0.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/module-federation/node_modules/@sinclair/typebox": { + "version": "0.34.38", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", + "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/module-federation/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@nx/module-federation/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/module-federation/node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@nx/module-federation/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/module-federation/node_modules/jest-diff": { + "version": "30.0.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.4.tgz", + "integrity": "sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.0.1", + "chalk": "^4.1.2", + "pretty-format": "30.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/module-federation/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/module-federation/node_modules/nx": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.3.1.tgz", + "integrity": "sha512-lOMDktM4CUcVa/yUmiAXGNxbNo6SC0T8/alRml1sgaOG1QHUpH6XyA1/nR4M3DNjlmON4wD06pZQUDKFb8kd8w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.8.3", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^30.0.2", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "21.3.1", + "@nx/nx-darwin-x64": "21.3.1", + "@nx/nx-freebsd-x64": "21.3.1", + "@nx/nx-linux-arm-gnueabihf": "21.3.1", + "@nx/nx-linux-arm64-gnu": "21.3.1", + "@nx/nx-linux-arm64-musl": "21.3.1", + "@nx/nx-linux-x64-gnu": "21.3.1", + "@nx/nx-linux-x64-musl": "21.3.1", + "@nx/nx-win32-arm64-msvc": "21.3.1", + "@nx/nx-win32-x64-msvc": "21.3.1" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nx/module-federation/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/module-federation/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", - "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/module-federation/node_modules/pretty-format": { + "version": "30.0.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.2.tgz", + "integrity": "sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.1", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/module-federation/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/module-federation/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/nest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-21.2.0.tgz", + "integrity": "sha512-zu4NrTkiVNDk86+kwod2Z6nSY4XJQxVd7a7DZjoy+eISE77D5A5aJ68MZlRWTwp4ajDl7COtmotPPTOZ5za3+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nestjs/schematics": "^11.0.0", + "@nx/devkit": "21.2.0", + "@nx/eslint": "21.2.0", + "@nx/js": "21.2.0", + "@nx/node": "21.2.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/node": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-21.2.0.tgz", + "integrity": "sha512-YRENukvKe4wZxC35CwUrLFVld7fGB8NbDPaqPDDtDQMFuOhD6WodDtD1fpki40ZUpIxdZVaOAsCK4JA/xwUKXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "21.2.0", + "@nx/eslint": "21.2.0", + "@nx/jest": "21.2.0", + "@nx/js": "21.2.0", + "kill-port": "^1.6.1", + "tcp-port-used": "^1.0.2", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.2.0.tgz", + "integrity": "sha512-vfGvQ9IKinXo785jB1gTa9pAFRfxkZGeK/4P5hQNxYNLyROGu9caujrseXTLjZvF1hDuStvnUfoaBlcfhP36hQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.2.0.tgz", + "integrity": "sha512-+EMFxQzZshXbKXF1AexSnutroF1+Fs2W84DdfukHL0Q/hT00CZTKS4wgVAkMEO5dfRKpSB/fs8owRkSbE8R9vQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.2.0.tgz", + "integrity": "sha512-wKTSZI9jb7lEjc8x60h10XCm5NExbXpz0vRjLEt8x8y5NXvDYCgHCRpAU4jPQRS3PIm2fBqa+5umc8qskQu7CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.2.0.tgz", + "integrity": "sha512-6/Uoun4plMesFCrmjtaY5Ye2YvYqNZVkucZyjBYfJ8D5mF967I8Vpt0hDyDVfXxT0zx9YQGeUb33UgOktVL+xg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.2.0.tgz", + "integrity": "sha512-0U2Q760B0pf9dQBGK3qes25jm1SwqGZ4bCgrdfccWpkka+Z+wWyIga55fAh3KIJQr5Cdw6QgsPKra6HbIFbpfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.2.0.tgz", + "integrity": "sha512-lM5GEliTA8TH8l64v1zq3sfsSOsODy+KdBLkcis0mNsuCop1kv/CxyuE0X3PwCGAGFchzDNj7mDprRR4FLfWoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.2.0.tgz", + "integrity": "sha512-5KoTe9Kv9elMWPvlWI4cXLXYmFjnD2asQIMgR4eSuWi09CqX9ua4mIyKC5sPjgy9VxWUhaKx+fZydp+akWh37w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.2.0.tgz", + "integrity": "sha512-UbFzIU331vEEprCeKN01k+9Sn1y9pQO32/6yV4eLvK/FdrvzJahu0Dn+IinvCqdIAMiUvIdkBtcKirQby+Pc2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.2.0.tgz", + "integrity": "sha512-mKqED/y9hD4qTPSeBTc3uZHQozm0XtqnnnrZui4BdXJOMvS3llCiCxmZF2E5N6GZl5L5sb6nNkjhzJDbAfs3TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.2.0.tgz", + "integrity": "sha512-UWc5C16yT99ntbHv5a3mlXuRNuPnmPtZ/q9UdRHWbfXbtlf5CBLOH7MrP6bbpNCsRdwsCpGCqAu8XO1QRBjeMw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/rspack": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-21.3.1.tgz", + "integrity": "sha512-9AFTbPLZVVC+IO13onllU/wliWS8z+Uv/i4J4zBVM5Z3mK9BlPyV8hOOJ7zHar76/2O2o2dhAYZhwxyC+GwEDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "21.3.1", + "@nx/js": "21.3.1", + "@nx/module-federation": "21.3.1", + "@nx/web": "21.3.1", + "@phenomnomnominal/tsquery": "~5.0.1", + "@rspack/core": "^1.3.8", + "@rspack/dev-server": "^1.1.1", + "@rspack/plugin-react-refresh": "^1.0.0", + "autoprefixer": "^10.4.9", + "browserslist": "^4.21.4", + "css-loader": "^6.4.0", + "enquirer": "~2.3.6", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.3", + "less-loader": "^11.1.0", + "license-webpack-plugin": "^4.0.2", + "loader-utils": "^2.0.3", + "parse5": "4.0.0", + "picocolors": "^1.1.0", + "postcss": "^8.4.38", + "postcss-import": "~14.1.0", + "postcss-loader": "^8.1.1", + "sass": "^1.85.0", + "sass-embedded": "^1.83.4", + "sass-loader": "^16.0.4", + "source-map-loader": "^5.0.0", + "style-loader": "^3.3.0", + "ts-checker-rspack-plugin": "^1.1.1", + "tslib": "^2.3.0", + "webpack": "^5.80.0", + "webpack-node-externals": "^3.0.0" }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "peerDependencies": { + "@module-federation/enhanced": "^0.17.0", + "@module-federation/node": "^2.7.9" } }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/@nx/rspack/node_modules/@jest/schemas": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", + "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "@sinclair/typebox": "^0.34.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "node_modules/@nx/rspack/node_modules/@nx/devkit": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.3.1.tgz", + "integrity": "sha512-0FA6uVIJ5tOrUz6kJEeyX6KKPmXBs9kWQbf08yXogEzMimz9cVpoDS8MGmK14e13UwnY68vqXgknHAL+ATs3Zg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^10.0.1" + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "peerDependencies": { + "nx": "21.3.1" } }, - "node_modules/@npmcli/package-json/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@nx/rspack/node_modules/@nx/js": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.3.1.tgz", + "integrity": "sha512-zc+3t3NOBWdnqPL94gsYspYhkiKYd3fflvDNdiOpf3XKhXZCE89YsbcZGoxDnW0A0bKAk4Z7wwh9txnG4A2jZA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "21.3.1", + "@nx/workspace": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" }, - "engines": { - "node": ">=16 || 14 >=14.17" + "peerDependencies": { + "verdaccio": "^6.0.5" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } } }, - "node_modules/@npmcli/package-json/node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "node_modules/@nx/rspack/node_modules/@nx/nx-darwin-arm64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.3.1.tgz", + "integrity": "sha512-DND5/CRN1rP7qMt4xkDjklzf3OoA3JcweN+47xZCfiQlu/VobvnS04OC6tLZc+Nymi73whk4lserpUG9biQjCA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", + "node_modules/@nx/rspack/node_modules/@nx/nx-darwin-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.3.1.tgz", + "integrity": "sha512-iFR/abYakCwrFFIfb6gRXN6/gytle/8jj2jwEol0EFrkBIrBi/YrSyuRpsbnxuDB7MhuZ9zwvxlkE6mEJt9UoQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "node_modules/@nx/rspack/node_modules/@nx/nx-freebsd-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.3.1.tgz", + "integrity": "sha512-e/cx0cR8sLBX3b2JRLqwXj8z4ENhgDwJ5CF7hbcNRkMncKz1J2MZSsqHQHKUfls+HT4Mmmzwyf86laj879cs7Q==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "node_modules/@nx/rspack/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.3.1.tgz", + "integrity": "sha512-JvDfLVZhxzKfetcA1r5Ak+re5Qfks6JdgQD165wMysgAyZDdeM1GFn78xo5CqRPShlE8f/nhF4aX405OL6HYPw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@npmcli/redact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", - "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "node_modules/@nx/rspack/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.3.1.tgz", + "integrity": "sha512-J+LkCHzFCgZw4ZMgIuahprjaabWTDmsqJdsYLPFm/pw7TR6AyidXzUEZPfEgBK5WTO1PQr1LJp+Ps8twpf+iBg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@npmcli/run-script": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", - "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "node_modules/@nx/rspack/node_modules/@nx/nx-linux-arm64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.3.1.tgz", + "integrity": "sha512-VCiwPf4pj6WZWmPl30UpcKyp8DWb7Axs0pvU0/dsJz6Ye7bhKnsEZ/Ehp4laVZkck+MVEMFMHavikUdgNzWx3g==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "node_modules/@nx/rspack/node_modules/@nx/nx-linux-x64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.3.1.tgz", + "integrity": "sha512-Erxxqir8zZDgfrTgOOeaByn22e8vbOTxWNif5i0brH2tQpdr6+2f3v1qNrRlP9CWjqwypPDmkU781U38u+qHHg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@npmcli/run-script/node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "node_modules/@nx/rspack/node_modules/@nx/nx-linux-x64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.3.1.tgz", + "integrity": "sha512-dG5djRnC3zzOjEzOAzVX8u1sZSn0TSmvVUKKH+WorxI8QKpxHVHbzpvvyLXpiAbtSk0reIPC1c9iRw+MR0GAvw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/rspack/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.3.1.tgz", + "integrity": "sha512-mkV6HERTtP2uY6aq0AhxbkL6KSsvomobPOypdEdrnfUsc2Rvd+U/pWl/flZHFkk8V6aXzEG56lWCZqXVyGUD1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/rspack/node_modules/@nx/nx-win32-x64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.3.1.tgz", + "integrity": "sha512-9cQZDiLT9bD1ixZ+WwNHVPRrxuszGHc30xzLzVgQ2l/IwOHJX6oRxMZa1IfgUYv846K0TSKWis+S41tcxUy80Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "node_modules/@nx/rspack/node_modules/@nx/workspace": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.3.1.tgz", + "integrity": "sha512-MiS0x/Wl4vv+4oFWvsZLFsRR9E3tDh002ZeGjvGJbiZw8eUAMfX1mYhU7URxHSr8yoW1qCAKEvgAjGTLRz9Kkw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "@nx/devkit": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "21.3.1", + "picomatch": "4.0.2", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" } }, - "node_modules/@nuxt/opencollective": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", - "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "node_modules/@nx/rspack/node_modules/@sinclair/typebox": { + "version": "0.34.38", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", + "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/rspack/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "license": "MIT", - "dependencies": { - "consola": "^3.2.3" - }, - "bin": { - "opencollective": "bin/opencollective.js" - }, "engines": { - "node": "^14.18.0 || >=16.10.0", - "npm": ">=5.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/angular": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-21.2.0.tgz", - "integrity": "sha512-s+YxkTSKUJwqfM9nro/UK6umGk+3sMh826eHxChybyRMsB7Pu0dzo5n92+RiZtbViDvxmVxjyL0yHyF4tRDGtQ==", + "node_modules/@nx/rspack/node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.2.0", - "@nx/eslint": "21.2.0", - "@nx/js": "21.2.0", - "@nx/module-federation": "21.2.0", - "@nx/rspack": "21.2.0", - "@nx/web": "21.2.0", - "@nx/webpack": "21.2.0", - "@nx/workspace": "21.2.0", - "@phenomnomnominal/tsquery": "~5.0.1", - "@typescript-eslint/type-utils": "^8.0.0", - "enquirer": "~2.3.6", - "magic-string": "~0.30.2", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", - "semver": "^7.5.3", - "tslib": "^2.3.0", - "webpack-merge": "^5.8.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@angular-devkit/build-angular": ">= 18.0.0 < 21.0.0", - "@angular-devkit/core": ">= 18.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 18.0.0 < 21.0.0", - "@angular/build": ">= 18.0.0 < 21.0.0", - "@schematics/angular": ">= 18.0.0 < 21.0.0", - "ng-packagr": ">= 18.0.0 < 21.0.0", - "rxjs": "^6.5.3 || ^7.5.0" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "@angular-devkit/build-angular": { - "optional": true - }, - "@angular/build": { + "@rspack/core": { "optional": true }, - "ng-packagr": { + "webpack": { "optional": true } } }, - "node_modules/@nx/angular/node_modules/@typescript-eslint/scope-manager": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.0.tgz", - "integrity": "sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==", + "node_modules/@nx/rspack/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/rspack/node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.26.0", - "@typescript-eslint/visitor-keys": "8.26.0" + "dotenv": "^16.4.5" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://dotenvx.com" } }, - "node_modules/@nx/angular/node_modules/@typescript-eslint/type-utils": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.0.tgz", - "integrity": "sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==", + "node_modules/@nx/rspack/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.26.0", - "@typescript-eslint/utils": "8.26.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "is-docker": "^2.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" + } + }, + "node_modules/@nx/rspack/node_modules/jest-diff": { + "version": "30.0.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.4.tgz", + "integrity": "sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.0.1", + "chalk": "^4.1.2", + "pretty-format": "30.0.2" }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/@typescript-eslint/types": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.0.tgz", - "integrity": "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==", + "node_modules/@nx/rspack/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/rspack/node_modules/less-loader": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.4.tgz", + "integrity": "sha512-6/GrYaB6QcW6Vj+/9ZPgKKs6G10YZai/l/eJ4SLwbzqNTBsAqt5hSLVF47TgsiBxV1P6eAU0GYRH3YRuQU9V3A==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" } }, - "node_modules/@nx/angular/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.0.tgz", - "integrity": "sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==", + "node_modules/@nx/rspack/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.0", - "@typescript-eslint/visitor-keys": "8.26.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.0.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8.9.0" + } + }, + "node_modules/@nx/rspack/node_modules/nx": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.3.1.tgz", + "integrity": "sha512-lOMDktM4CUcVa/yUmiAXGNxbNo6SC0T8/alRml1sgaOG1QHUpH6XyA1/nR4M3DNjlmON4wD06pZQUDKFb8kd8w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.8.3", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^30.0.2", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "21.3.1", + "@nx/nx-darwin-x64": "21.3.1", + "@nx/nx-freebsd-x64": "21.3.1", + "@nx/nx-linux-arm-gnueabihf": "21.3.1", + "@nx/nx-linux-arm64-gnu": "21.3.1", + "@nx/nx-linux-arm64-musl": "21.3.1", + "@nx/nx-linux-x64-gnu": "21.3.1", + "@nx/nx-linux-x64-musl": "21.3.1", + "@nx/nx-win32-arm64-msvc": "21.3.1", + "@nx/nx-win32-x64-msvc": "21.3.1" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } } }, - "node_modules/@nx/angular/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==", + "node_modules/@nx/rspack/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/angular/node_modules/@typescript-eslint/utils": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.0.tgz", - "integrity": "sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==", + "node_modules/@nx/rspack/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.26.0", - "@typescript-eslint/types": "8.26.0", - "@typescript-eslint/typescript-estree": "8.26.0" + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/angular/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.0.tgz", - "integrity": "sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==", + "node_modules/@nx/rspack/node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/rspack/node_modules/pretty-format": { + "version": "30.0.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.2.tgz", + "integrity": "sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.0", - "eslint-visitor-keys": "^4.2.0" + "@jest/schemas": "30.0.1", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/angular/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "node_modules/@nx/rspack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "Apache-2.0", + "license": "BSD-3-Clause", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.10.0" } }, - "node_modules/@nx/angular/node_modules/ts-api-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", - "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "node_modules/@nx/rspack/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/web": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-21.3.1.tgz", + "integrity": "sha512-z1BqpHPHf1PQXy5Npr3vpdJIUZqfq5VXdSIanAXaLJNPgP18AfVap2ozlHcQytLQErNVKHK1JTzUuHJFipSl4A==", "dev": true, "license": "MIT", + "dependencies": { + "@nx/devkit": "21.3.1", + "@nx/js": "21.3.1", + "detect-port": "^1.5.1", + "http-server": "^14.1.0", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/web/node_modules/@jest/schemas": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", + "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { - "node": ">=18.12" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/web/node_modules/@nx/devkit": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.3.1.tgz", + "integrity": "sha512-0FA6uVIJ5tOrUz6kJEeyX6KKPmXBs9kWQbf08yXogEzMimz9cVpoDS8MGmK14e13UwnY68vqXgknHAL+ATs3Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" }, "peerDependencies": { - "typescript": ">=4.8.4" + "nx": "21.3.1" } }, - "node_modules/@nx/cypress": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-21.2.0.tgz", - "integrity": "sha512-ChWsT1Ke7GvYR/6y+hTFXph4iynJHPuG/tJ8lRtl/HXbVJ+iM2GSjPXgbVNKqgc1cCxClnaTLZ788kKE8hUBLg==", + "node_modules/@nx/web/node_modules/@nx/js": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.3.1.tgz", + "integrity": "sha512-zc+3t3NOBWdnqPL94gsYspYhkiKYd3fflvDNdiOpf3XKhXZCE89YsbcZGoxDnW0A0bKAk4Z7wwh9txnG4A2jZA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.2.0", - "@nx/eslint": "21.2.0", - "@nx/js": "21.2.0", - "@phenomnomnominal/tsquery": "~5.0.1", + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "21.3.1", + "@nx/workspace": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", "detect-port": "^1.5.1", - "semver": "^7.6.3", - "tree-kill": "1.2.2", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", "tslib": "^2.3.0" }, "peerDependencies": { - "cypress": ">= 3 < 15" + "verdaccio": "^6.0.5" }, "peerDependenciesMeta": { - "cypress": { + "verdaccio": { "optional": true } } }, - "node_modules/@nx/devkit": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.2.0.tgz", - "integrity": "sha512-IunVWFtqiq7NqGu1dL8fUPW3uaShbxGqjwbfkRVAiEq+GqpAWgeFLJYHqUb0THdHegX7Fxit8x0sTz4QNNpd2Q==", + "node_modules/@nx/web/node_modules/@nx/nx-darwin-arm64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.3.1.tgz", + "integrity": "sha512-DND5/CRN1rP7qMt4xkDjklzf3OoA3JcweN+47xZCfiQlu/VobvnS04OC6tLZc+Nymi73whk4lserpUG9biQjCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/web/node_modules/@nx/nx-darwin-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.3.1.tgz", + "integrity": "sha512-iFR/abYakCwrFFIfb6gRXN6/gytle/8jj2jwEol0EFrkBIrBi/YrSyuRpsbnxuDB7MhuZ9zwvxlkE6mEJt9UoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/web/node_modules/@nx/nx-freebsd-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.3.1.tgz", + "integrity": "sha512-e/cx0cR8sLBX3b2JRLqwXj8z4ENhgDwJ5CF7hbcNRkMncKz1J2MZSsqHQHKUfls+HT4Mmmzwyf86laj879cs7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@nx/web/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.3.1.tgz", + "integrity": "sha512-JvDfLVZhxzKfetcA1r5Ak+re5Qfks6JdgQD165wMysgAyZDdeM1GFn78xo5CqRPShlE8f/nhF4aX405OL6HYPw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/web/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.3.1.tgz", + "integrity": "sha512-J+LkCHzFCgZw4ZMgIuahprjaabWTDmsqJdsYLPFm/pw7TR6AyidXzUEZPfEgBK5WTO1PQr1LJp+Ps8twpf+iBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/web/node_modules/@nx/nx-linux-arm64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.3.1.tgz", + "integrity": "sha512-VCiwPf4pj6WZWmPl30UpcKyp8DWb7Axs0pvU0/dsJz6Ye7bhKnsEZ/Ehp4laVZkck+MVEMFMHavikUdgNzWx3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/web/node_modules/@nx/nx-linux-x64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.3.1.tgz", + "integrity": "sha512-Erxxqir8zZDgfrTgOOeaByn22e8vbOTxWNif5i0brH2tQpdr6+2f3v1qNrRlP9CWjqwypPDmkU781U38u+qHHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/web/node_modules/@nx/nx-linux-x64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.3.1.tgz", + "integrity": "sha512-dG5djRnC3zzOjEzOAzVX8u1sZSn0TSmvVUKKH+WorxI8QKpxHVHbzpvvyLXpiAbtSk0reIPC1c9iRw+MR0GAvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/web/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.3.1.tgz", + "integrity": "sha512-mkV6HERTtP2uY6aq0AhxbkL6KSsvomobPOypdEdrnfUsc2Rvd+U/pWl/flZHFkk8V6aXzEG56lWCZqXVyGUD1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/web/node_modules/@nx/nx-win32-x64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.3.1.tgz", + "integrity": "sha512-9cQZDiLT9bD1ixZ+WwNHVPRrxuszGHc30xzLzVgQ2l/IwOHJX6oRxMZa1IfgUYv846K0TSKWis+S41tcxUy80Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/web/node_modules/@nx/workspace": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.3.1.tgz", + "integrity": "sha512-MiS0x/Wl4vv+4oFWvsZLFsRR9E3tDh002ZeGjvGJbiZw8eUAMfX1mYhU7URxHSr8yoW1qCAKEvgAjGTLRz9Kkw==", "dev": true, "license": "MIT", "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", + "@nx/devkit": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "21.3.1", + "picomatch": "4.0.2", "tslib": "^2.3.0", "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/web/node_modules/@sinclair/typebox": { + "version": "0.34.38", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", + "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/web/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" }, - "peerDependencies": { - "nx": "21.2.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/esbuild": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/esbuild/-/esbuild-21.2.0.tgz", - "integrity": "sha512-DW/Ue7uyd6I9xw8GBonkGW4Yyc8EhjniGLY35T/OULrH0qdbi1IAHj1iTgxTfitfa+UISU0pw6oUowL8pniflw==", + "node_modules/@nx/web/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/web/node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@nx/devkit": "21.2.0", - "@nx/js": "21.2.0", - "picocolors": "^1.1.0", - "tinyglobby": "^0.2.12", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0" + "dotenv": "^16.4.5" }, - "peerDependencies": { - "esbuild": ">=0.19.2 <1.0.0" + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "esbuild": { - "optional": true - } + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/@nx/eslint": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.2.0.tgz", - "integrity": "sha512-IxVItkeApgbQxeCb8D0A8Rm7eyxoFD9N5QfyKua89jNnPdtr+JkVZ4LlFyCMmtFzrmu+A06+x0pyY2wCNv4sPg==", + "node_modules/@nx/web/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.2.0", - "@nx/js": "21.2.0", - "semver": "^7.5.3", - "tslib": "^2.3.0", - "typescript": "~5.8.2" - }, - "peerDependencies": { - "@zkochan/js-yaml": "0.0.7", - "eslint": "^8.0.0 || ^9.0.0" + "is-docker": "^2.0.0" }, - "peerDependenciesMeta": { - "@zkochan/js-yaml": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/@nx/jest": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-21.2.0.tgz", - "integrity": "sha512-QLBgnQWdHn+EAvp9+juPmOYTTcR3/RIYKIaL7fbSVrXi2h1Axnx02DtNXSYEN1wGGF6DbWxoRLN6gb84dG2wDA==", + "node_modules/@nx/web/node_modules/jest-diff": { + "version": "30.0.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.4.tgz", + "integrity": "sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/reporters": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@nx/devkit": "21.2.0", - "@nx/js": "21.2.0", - "@phenomnomnominal/tsquery": "~5.0.1", - "identity-obj-proxy": "3.0.0", - "jest-config": "^29.4.1", - "jest-resolve": "^29.4.1", - "jest-util": "^29.4.1", - "minimatch": "9.0.3", - "picocolors": "^1.1.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.0.1", + "chalk": "^4.1.2", + "pretty-format": "30.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nx/js": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.2.0.tgz", - "integrity": "sha512-BdDvhaEYh+/Aat8lrbmsuaUsYyxpLO4sRKiiAgW4NMRG+1a96BSwd9tvkrJkiLPJO5SnbI+/YKImunQwqcg/dg==", + "node_modules/@nx/web/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true, + "license": "MIT" + }, + "node_modules/@nx/web/node_modules/nx": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.3.1.tgz", + "integrity": "sha512-lOMDktM4CUcVa/yUmiAXGNxbNo6SC0T8/alRml1sgaOG1QHUpH6XyA1/nR4M3DNjlmON4wD06pZQUDKFb8kd8w==", + "dev": true, + "hasInstallScript": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nx/devkit": "21.2.0", - "@nx/workspace": "21.2.0", + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", "@zkochan/js-yaml": "0.0.7", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", + "axios": "^1.8.3", "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", "ignore": "^5.0.4", - "js-tokens": "^4.0.0", + "jest-diff": "^30.0.2", "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", + "open": "^8.4.0", "ora": "5.3.0", - "picocolors": "^1.1.0", - "picomatch": "4.0.2", + "resolve.exports": "2.0.3", "semver": "^7.5.3", - "source-map-support": "0.5.19", - "tinyglobby": "^0.2.12", - "tslib": "^2.3.0" + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "21.3.1", + "@nx/nx-darwin-x64": "21.3.1", + "@nx/nx-freebsd-x64": "21.3.1", + "@nx/nx-linux-arm-gnueabihf": "21.3.1", + "@nx/nx-linux-arm64-gnu": "21.3.1", + "@nx/nx-linux-arm64-musl": "21.3.1", + "@nx/nx-linux-x64-gnu": "21.3.1", + "@nx/nx-linux-x64-musl": "21.3.1", + "@nx/nx-win32-arm64-msvc": "21.3.1", + "@nx/nx-win32-x64-msvc": "21.3.1" }, "peerDependencies": { - "verdaccio": "^6.0.5" + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" }, "peerDependenciesMeta": { - "verdaccio": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { "optional": true } } }, - "node_modules/@nx/js/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "node_modules/@nx/web/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@nx/js/node_modules/ora": { + "node_modules/@nx/web/node_modules/ora": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", @@ -8071,7 +11195,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/js/node_modules/source-map": { + "node_modules/@nx/web/node_modules/pretty-format": { + "version": "30.0.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.2.tgz", + "integrity": "sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.1", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/web/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", @@ -8081,7 +11220,7 @@ "node": ">=0.10.0" } }, - "node_modules/@nx/js/node_modules/source-map-support": { + "node_modules/@nx/web/node_modules/source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", @@ -8092,62 +11231,136 @@ "source-map": "^0.6.0" } }, - "node_modules/@nx/module-federation": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-21.2.0.tgz", - "integrity": "sha512-r9wCTGBotob1YAjAulyj0PrXtKGRJuT6MSBwdTme2Pr+c/Ps2BUDiP5utTLSLbOp09ma1uX/zC4tLx7BSQ7Dkg==", + "node_modules/@nx/webpack": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-21.3.1.tgz", + "integrity": "sha512-Nanso6q137zXR5dJhJM890GLMQBp4HaFKdXIsB5D5rgUMj3m8dQ3duUIiuaqI+dwajRi/e4Za8GENi5y3vl6Sg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/enhanced": "^0.9.0", - "@module-federation/node": "^2.6.26", - "@module-federation/sdk": "^0.9.0", - "@nx/devkit": "21.2.0", - "@nx/js": "21.2.0", - "@nx/web": "21.2.0", - "@rspack/core": "^1.3.8", - "express": "^4.21.2", - "http-proxy-middleware": "^3.0.3", + "@babel/core": "^7.23.2", + "@nx/devkit": "21.3.1", + "@nx/js": "21.3.1", + "@phenomnomnominal/tsquery": "~5.0.1", + "ajv": "^8.12.0", + "autoprefixer": "^10.4.9", + "babel-loader": "^9.1.2", + "browserslist": "^4.21.4", + "copy-webpack-plugin": "^10.2.4", + "css-loader": "^6.4.0", + "css-minimizer-webpack-plugin": "^5.0.0", + "fork-ts-checker-webpack-plugin": "7.2.13", + "less": "^4.1.3", + "less-loader": "^11.1.0", + "license-webpack-plugin": "^4.0.2", + "loader-utils": "^2.0.3", + "mini-css-extract-plugin": "~2.4.7", + "parse5": "4.0.0", "picocolors": "^1.1.0", + "postcss": "^8.4.38", + "postcss-import": "~14.1.0", + "postcss-loader": "^6.1.1", + "rxjs": "^7.8.0", + "sass": "^1.85.0", + "sass-embedded": "^1.83.4", + "sass-loader": "^16.0.4", + "source-map-loader": "^5.0.0", + "style-loader": "^3.3.0", + "stylus": "^0.64.0", + "stylus-loader": "^7.1.0", + "terser-webpack-plugin": "^5.3.3", + "ts-loader": "^9.3.1", + "tsconfig-paths-webpack-plugin": "4.0.0", "tslib": "^2.3.0", - "webpack": "^5.88.0" + "webpack": "~5.99.0", + "webpack-dev-server": "^5.2.1", + "webpack-node-externals": "^3.0.0", + "webpack-subresource-integrity": "^5.1.0" } }, - "node_modules/@nx/nest": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-21.2.0.tgz", - "integrity": "sha512-zu4NrTkiVNDk86+kwod2Z6nSY4XJQxVd7a7DZjoy+eISE77D5A5aJ68MZlRWTwp4ajDl7COtmotPPTOZ5za3+g==", + "node_modules/@nx/webpack/node_modules/@jest/schemas": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", + "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", "dev": true, "license": "MIT", "dependencies": { - "@nestjs/schematics": "^11.0.0", - "@nx/devkit": "21.2.0", - "@nx/eslint": "21.2.0", - "@nx/js": "21.2.0", - "@nx/node": "21.2.0", - "tslib": "^2.3.0" + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/webpack/node_modules/@nx/devkit": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.3.1.tgz", + "integrity": "sha512-0FA6uVIJ5tOrUz6kJEeyX6KKPmXBs9kWQbf08yXogEzMimz9cVpoDS8MGmK14e13UwnY68vqXgknHAL+ATs3Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": "21.3.1" } }, - "node_modules/@nx/node": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-21.2.0.tgz", - "integrity": "sha512-YRENukvKe4wZxC35CwUrLFVld7fGB8NbDPaqPDDtDQMFuOhD6WodDtD1fpki40ZUpIxdZVaOAsCK4JA/xwUKXQ==", + "node_modules/@nx/webpack/node_modules/@nx/js": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.3.1.tgz", + "integrity": "sha512-zc+3t3NOBWdnqPL94gsYspYhkiKYd3fflvDNdiOpf3XKhXZCE89YsbcZGoxDnW0A0bKAk4Z7wwh9txnG4A2jZA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.2.0", - "@nx/eslint": "21.2.0", - "@nx/jest": "21.2.0", - "@nx/js": "21.2.0", - "kill-port": "^1.6.1", - "tcp-port-used": "^1.0.2", + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "21.3.1", + "@nx/workspace": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } } }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.2.0.tgz", - "integrity": "sha512-vfGvQ9IKinXo785jB1gTa9pAFRfxkZGeK/4P5hQNxYNLyROGu9caujrseXTLjZvF1hDuStvnUfoaBlcfhP36hQ==", + "node_modules/@nx/webpack/node_modules/@nx/nx-darwin-arm64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.3.1.tgz", + "integrity": "sha512-DND5/CRN1rP7qMt4xkDjklzf3OoA3JcweN+47xZCfiQlu/VobvnS04OC6tLZc+Nymi73whk4lserpUG9biQjCA==", "cpu": [ "arm64" ], @@ -8158,10 +11371,10 @@ "darwin" ] }, - "node_modules/@nx/nx-darwin-x64": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.2.0.tgz", - "integrity": "sha512-+EMFxQzZshXbKXF1AexSnutroF1+Fs2W84DdfukHL0Q/hT00CZTKS4wgVAkMEO5dfRKpSB/fs8owRkSbE8R9vQ==", + "node_modules/@nx/webpack/node_modules/@nx/nx-darwin-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.3.1.tgz", + "integrity": "sha512-iFR/abYakCwrFFIfb6gRXN6/gytle/8jj2jwEol0EFrkBIrBi/YrSyuRpsbnxuDB7MhuZ9zwvxlkE6mEJt9UoQ==", "cpu": [ "x64" ], @@ -8172,10 +11385,10 @@ "darwin" ] }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.2.0.tgz", - "integrity": "sha512-wKTSZI9jb7lEjc8x60h10XCm5NExbXpz0vRjLEt8x8y5NXvDYCgHCRpAU4jPQRS3PIm2fBqa+5umc8qskQu7CQ==", + "node_modules/@nx/webpack/node_modules/@nx/nx-freebsd-x64": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.3.1.tgz", + "integrity": "sha512-e/cx0cR8sLBX3b2JRLqwXj8z4ENhgDwJ5CF7hbcNRkMncKz1J2MZSsqHQHKUfls+HT4Mmmzwyf86laj879cs7Q==", "cpu": [ "x64" ], @@ -8186,10 +11399,10 @@ "freebsd" ] }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.2.0.tgz", - "integrity": "sha512-6/Uoun4plMesFCrmjtaY5Ye2YvYqNZVkucZyjBYfJ8D5mF967I8Vpt0hDyDVfXxT0zx9YQGeUb33UgOktVL+xg==", + "node_modules/@nx/webpack/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.3.1.tgz", + "integrity": "sha512-JvDfLVZhxzKfetcA1r5Ak+re5Qfks6JdgQD165wMysgAyZDdeM1GFn78xo5CqRPShlE8f/nhF4aX405OL6HYPw==", "cpu": [ "arm" ], @@ -8200,10 +11413,10 @@ "linux" ] }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.2.0.tgz", - "integrity": "sha512-0U2Q760B0pf9dQBGK3qes25jm1SwqGZ4bCgrdfccWpkka+Z+wWyIga55fAh3KIJQr5Cdw6QgsPKra6HbIFbpfQ==", + "node_modules/@nx/webpack/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.3.1.tgz", + "integrity": "sha512-J+LkCHzFCgZw4ZMgIuahprjaabWTDmsqJdsYLPFm/pw7TR6AyidXzUEZPfEgBK5WTO1PQr1LJp+Ps8twpf+iBg==", "cpu": [ "arm64" ], @@ -8214,10 +11427,10 @@ "linux" ] }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.2.0.tgz", - "integrity": "sha512-lM5GEliTA8TH8l64v1zq3sfsSOsODy+KdBLkcis0mNsuCop1kv/CxyuE0X3PwCGAGFchzDNj7mDprRR4FLfWoA==", + "node_modules/@nx/webpack/node_modules/@nx/nx-linux-arm64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.3.1.tgz", + "integrity": "sha512-VCiwPf4pj6WZWmPl30UpcKyp8DWb7Axs0pvU0/dsJz6Ye7bhKnsEZ/Ehp4laVZkck+MVEMFMHavikUdgNzWx3g==", "cpu": [ "arm64" ], @@ -8228,10 +11441,10 @@ "linux" ] }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.2.0.tgz", - "integrity": "sha512-5KoTe9Kv9elMWPvlWI4cXLXYmFjnD2asQIMgR4eSuWi09CqX9ua4mIyKC5sPjgy9VxWUhaKx+fZydp+akWh37w==", + "node_modules/@nx/webpack/node_modules/@nx/nx-linux-x64-gnu": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.3.1.tgz", + "integrity": "sha512-Erxxqir8zZDgfrTgOOeaByn22e8vbOTxWNif5i0brH2tQpdr6+2f3v1qNrRlP9CWjqwypPDmkU781U38u+qHHg==", "cpu": [ "x64" ], @@ -8242,10 +11455,10 @@ "linux" ] }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.2.0.tgz", - "integrity": "sha512-UbFzIU331vEEprCeKN01k+9Sn1y9pQO32/6yV4eLvK/FdrvzJahu0Dn+IinvCqdIAMiUvIdkBtcKirQby+Pc2Q==", + "node_modules/@nx/webpack/node_modules/@nx/nx-linux-x64-musl": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.3.1.tgz", + "integrity": "sha512-dG5djRnC3zzOjEzOAzVX8u1sZSn0TSmvVUKKH+WorxI8QKpxHVHbzpvvyLXpiAbtSk0reIPC1c9iRw+MR0GAvw==", "cpu": [ "x64" ], @@ -8256,10 +11469,10 @@ "linux" ] }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.2.0.tgz", - "integrity": "sha512-mKqED/y9hD4qTPSeBTc3uZHQozm0XtqnnnrZui4BdXJOMvS3llCiCxmZF2E5N6GZl5L5sb6nNkjhzJDbAfs3TQ==", + "node_modules/@nx/webpack/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.3.1.tgz", + "integrity": "sha512-mkV6HERTtP2uY6aq0AhxbkL6KSsvomobPOypdEdrnfUsc2Rvd+U/pWl/flZHFkk8V6aXzEG56lWCZqXVyGUD1Q==", "cpu": [ "arm64" ], @@ -8270,10 +11483,10 @@ "win32" ] }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.2.0.tgz", - "integrity": "sha512-UWc5C16yT99ntbHv5a3mlXuRNuPnmPtZ/q9UdRHWbfXbtlf5CBLOH7MrP6bbpNCsRdwsCpGCqAu8XO1QRBjeMw==", + "node_modules/@nx/webpack/node_modules/@nx/nx-win32-x64-msvc": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.3.1.tgz", + "integrity": "sha512-9cQZDiLT9bD1ixZ+WwNHVPRrxuszGHc30xzLzVgQ2l/IwOHJX6oRxMZa1IfgUYv846K0TSKWis+S41tcxUy80Q==", "cpu": [ "x64" ], @@ -8284,189 +11497,41 @@ "win32" ] }, - "node_modules/@nx/rspack": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-21.2.0.tgz", - "integrity": "sha512-xXoub8icanopBxDeVEV7vSIxZgOUgoddAfTInW+gxyzEw1TcXHQ+IhkoWBTePfF2E98y1yCk/ZaPWexfFM1xyA==", + "node_modules/@nx/webpack/node_modules/@nx/workspace": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.3.1.tgz", + "integrity": "sha512-MiS0x/Wl4vv+4oFWvsZLFsRR9E3tDh002ZeGjvGJbiZw8eUAMfX1mYhU7URxHSr8yoW1qCAKEvgAjGTLRz9Kkw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "21.2.0", - "@nx/js": "21.2.0", - "@nx/module-federation": "21.2.0", - "@nx/web": "21.2.0", - "@phenomnomnominal/tsquery": "~5.0.1", - "@rspack/core": "^1.3.8", - "@rspack/dev-server": "^1.1.1", - "@rspack/plugin-react-refresh": "^1.0.0", - "autoprefixer": "^10.4.9", - "browserslist": "^4.21.4", - "css-loader": "^6.4.0", + "@nx/devkit": "21.3.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", "enquirer": "~2.3.6", - "express": "^4.21.2", - "http-proxy-middleware": "^3.0.3", - "less-loader": "11.1.0", - "license-webpack-plugin": "^4.0.2", - "loader-utils": "^2.0.3", - "parse5": "4.0.0", - "picocolors": "^1.1.0", - "postcss": "^8.4.38", - "postcss-import": "~14.1.0", - "postcss-loader": "^8.1.1", - "sass": "^1.85.0", - "sass-embedded": "^1.83.4", - "sass-loader": "^16.0.4", - "source-map-loader": "^5.0.0", - "style-loader": "^3.3.0", - "ts-checker-rspack-plugin": "^1.1.1", - "tslib": "^2.3.0", - "webpack": "^5.80.0", - "webpack-node-externals": "^3.0.0" - }, - "peerDependencies": { - "@module-federation/enhanced": "^0.9.0", - "@module-federation/node": "^2.6.26" - } - }, - "node_modules/@nx/rspack/node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/@nx/rspack/node_modules/less-loader": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", - "dev": true, - "license": "MIT", - "dependencies": { - "klona": "^2.0.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/@nx/rspack/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/@nx/rspack/node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/web": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-21.2.0.tgz", - "integrity": "sha512-OYvsOZ/Vk3K3aIAyqxXj/GeT0lpx0j21SsnexD7ptUtZlb9kxLLpPP/Jbvy71bXQny4f5werTH2+bRsj9EKGsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "21.2.0", - "@nx/js": "21.2.0", - "detect-port": "^1.5.1", - "http-server": "^14.1.0", - "picocolors": "^1.1.0", - "tslib": "^2.3.0" - } - }, - "node_modules/@nx/webpack": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-21.2.0.tgz", - "integrity": "sha512-uHiEIqk514ZyR4tJOsc5KJaLBvdlsCXkuwQrmWzvYEWKeXbZ60DHX9U+v/BL78IEl0+4qE+/OO/rAJANnAoDPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.2", - "@nx/devkit": "21.2.0", - "@nx/js": "21.2.0", - "@phenomnomnominal/tsquery": "~5.0.1", - "ajv": "^8.12.0", - "autoprefixer": "^10.4.9", - "babel-loader": "^9.1.2", - "browserslist": "^4.21.4", - "copy-webpack-plugin": "^10.2.4", - "css-loader": "^6.4.0", - "css-minimizer-webpack-plugin": "^5.0.0", - "fork-ts-checker-webpack-plugin": "7.2.13", - "less": "4.1.3", - "less-loader": "11.1.0", - "license-webpack-plugin": "^4.0.2", - "loader-utils": "^2.0.3", - "mini-css-extract-plugin": "~2.4.7", - "parse5": "4.0.0", - "picocolors": "^1.1.0", - "postcss": "^8.4.38", - "postcss-import": "~14.1.0", - "postcss-loader": "^6.1.1", - "rxjs": "^7.8.0", - "sass": "^1.85.0", - "sass-embedded": "^1.83.4", - "sass-loader": "^16.0.4", - "source-map-loader": "^5.0.0", - "style-loader": "^3.3.0", - "stylus": "^0.64.0", - "stylus-loader": "^7.1.0", - "terser-webpack-plugin": "^5.3.3", - "ts-loader": "^9.3.1", - "tsconfig-paths-webpack-plugin": "4.0.0", + "nx": "21.3.1", + "picomatch": "4.0.2", "tslib": "^2.3.0", - "webpack": "~5.99.0", - "webpack-dev-server": "^5.2.1", - "webpack-node-externals": "^3.0.0", - "webpack-subresource-integrity": "^5.1.0" + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/webpack/node_modules/@sinclair/typebox": { + "version": "0.34.38", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", + "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/webpack/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@nx/webpack/node_modules/array-union": { @@ -8543,6 +11608,32 @@ } } }, + "node_modules/@nx/webpack/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/webpack/node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/@nx/webpack/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -8577,42 +11668,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/webpack/node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "node_modules/@nx/webpack/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" + "node": ">=8" } }, - "node_modules/@nx/webpack/node_modules/less-loader": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "node_modules/@nx/webpack/node_modules/jest-diff": { + "version": "30.0.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.4.tgz", + "integrity": "sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==", "dev": true, "license": "MIT", "dependencies": { - "klona": "^2.0.4" + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.0.1", + "chalk": "^4.1.2", + "pretty-format": "30.0.2" }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/webpack/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/webpack/node_modules/less-loader": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.4.tgz", + "integrity": "sha512-6/GrYaB6QcW6Vj+/9ZPgKKs6G10YZai/l/eJ4SLwbzqNTBsAqt5hSLVF47TgsiBxV1P6eAU0GYRH3YRuQU9V3A==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 14.15.0" }, @@ -8660,6 +11757,120 @@ "webpack": "^5.0.0" } }, + "node_modules/@nx/webpack/node_modules/nx": { + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.3.1.tgz", + "integrity": "sha512-lOMDktM4CUcVa/yUmiAXGNxbNo6SC0T8/alRml1sgaOG1QHUpH6XyA1/nR4M3DNjlmON4wD06pZQUDKFb8kd8w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.8.3", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^30.0.2", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "21.3.1", + "@nx/nx-darwin-x64": "21.3.1", + "@nx/nx-freebsd-x64": "21.3.1", + "@nx/nx-linux-arm-gnueabihf": "21.3.1", + "@nx/nx-linux-arm64-gnu": "21.3.1", + "@nx/nx-linux-arm64-musl": "21.3.1", + "@nx/nx-linux-x64-gnu": "21.3.1", + "@nx/nx-linux-x64-musl": "21.3.1", + "@nx/nx-win32-arm64-msvc": "21.3.1", + "@nx/nx-win32-x64-msvc": "21.3.1" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nx/webpack/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/webpack/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@nx/webpack/node_modules/parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", @@ -8690,6 +11901,21 @@ "webpack": "^5.0.0" } }, + "node_modules/@nx/webpack/node_modules/pretty-format": { + "version": "30.0.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.2.tgz", + "integrity": "sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.1", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@nx/webpack/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -8709,11 +11935,21 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", - "optional": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/@nx/webpack/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/@nx/workspace": { "version": "21.2.0", "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.2.0.tgz", @@ -9800,9 +13036,9 @@ } }, "node_modules/@rspack/dev-server/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -12923,13 +16159,13 @@ } }, "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=16" } }, "node_modules/comment-json": { @@ -14604,9 +17840,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -14617,31 +17853,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" } }, "node_modules/esbuild-wasm": { @@ -16258,9 +19495,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", "dev": true, "license": "Unlicense" }, @@ -19418,9 +22655,9 @@ } }, "node_modules/koa": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", - "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", + "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", "dev": true, "license": "MIT", "dependencies": { @@ -20230,9 +23467,9 @@ } }, "node_modules/luxon": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", - "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", "dev": true, "license": "MIT", "engines": { @@ -21001,6 +24238,7 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -21020,19 +24258,22 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -25809,6 +29050,16 @@ "url": "https://opencollective.com/svgo" } }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/swagger-ui-dist": { "version": "5.21.0", "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.21.0.tgz", diff --git a/package.json b/package.json index a3f077c17..0a2d051db 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@angular/compiler-cli": "20.0.3", "@golevelup/ts-jest": "^0.5.0", "@iqb/eslint-config": "^2.1.1", - "@nx/angular": "21.2.0", + "@nx/angular": "21.3.1", "@nx/cypress": "21.2.0", "@nx/esbuild": "21.2.0", "@nx/eslint": "21.2.0", @@ -91,7 +91,7 @@ "@types/multer": "^1.4.7", "@types/passport-jwt": "^4.0.1", "@types/xml2js": "^0.4.14", - "esbuild": "^0.25.5", + "esbuild": "^0.25.8", "eslint": "8.57.1", "eslint-plugin-html": "^8.1.1", "eslint-plugin-import": "^2.29.1",