From cf1b44137fbe7bb1466462db21ec7c7ac46af5c2 Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 18:51:27 +0200 Subject: [PATCH 01/15] Improve local development --- .example.env | 5 ++++- docker-compose.yaml | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.example.env b/.example.env index 336652380..c5b000fbc 100644 --- a/.example.env +++ b/.example.env @@ -1,2 +1,5 @@ +ENABLE_CORS=false + AHB_CONTAINER_NAME='uploaded-files' -AZURE_BLOB_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol='http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;' \ No newline at end of file +AZURE_BLOB_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol='http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;' +FORMAT_VERSION_CONTAINER_NAME=format-versions \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 72dd2e3c4..01f8de7f2 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -19,8 +19,9 @@ services: build: dockerfile: ./Dockerfile ports: - - 3000:3000 + - 4000:4000 environment: + - PORT=4000 - AZURE_BLOB_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://host.docker.internal:10000/devstoreaccount1; - AHB_CONTAINER_NAME=uploaded-files - FORMAT_VERSION_CONTAINER_NAME=format-versions From 10260dd3b8b3a503a98016a5a59baefd28ef53dc Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 18:52:01 +0200 Subject: [PATCH 02/15] Add new component format-version-input --- .../format-version-select.component.html | 9 +++ .../format-version-select.component.spec.ts | 22 +++++++ .../format-version-select.component.ts | 60 +++++++++++++++++++ .../ahb-landing-page.component.html | 6 +- .../ahb-landing-page.component.ts | 8 ++- 5 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 src/app/features/ahbs/components/format-version-select/format-version-select.component.html create mode 100644 src/app/features/ahbs/components/format-version-select/format-version-select.component.spec.ts create mode 100644 src/app/features/ahbs/components/format-version-select/format-version-select.component.ts diff --git a/src/app/features/ahbs/components/format-version-select/format-version-select.component.html b/src/app/features/ahbs/components/format-version-select/format-version-select.component.html new file mode 100644 index 000000000..47b2db568 --- /dev/null +++ b/src/app/features/ahbs/components/format-version-select/format-version-select.component.html @@ -0,0 +1,9 @@ + diff --git a/src/app/features/ahbs/components/format-version-select/format-version-select.component.spec.ts b/src/app/features/ahbs/components/format-version-select/format-version-select.component.spec.ts new file mode 100644 index 000000000..7f0bde538 --- /dev/null +++ b/src/app/features/ahbs/components/format-version-select/format-version-select.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FormatVersionSelectComponent } from './format-version-select.component'; + +describe('FormatVersionSelectComponent', () => { + let component: FormatVersionSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [FormatVersionSelectComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(FormatVersionSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts b/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts new file mode 100644 index 000000000..30df14f1b --- /dev/null +++ b/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts @@ -0,0 +1,60 @@ +import { Component, OnInit, forwardRef } from '@angular/core'; +import { + ControlValueAccessor, + FormControl, + FormsModule, + NG_VALUE_ACCESSOR, + ReactiveFormsModule, +} from '@angular/forms'; +import { AhbService } from '../../../../core/api'; +import { Observable } from 'rxjs'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-format-version-select', + standalone: true, + imports: [CommonModule, FormsModule, ReactiveFormsModule], + templateUrl: './format-version-select.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FormatVersionSelectComponent), + multi: true, + }, + ], +}) +export class FormatVersionSelectComponent + implements ControlValueAccessor, OnInit +{ + control = new FormControl(''); + + formatVersions$!: Observable; + + public onChange?: (formatVersion: string | null) => void; + + constructor(private readonly ahbService: AhbService) {} + + ngOnInit(): void { + this.formatVersions$ = this.ahbService.getFormatVersions(); + } + + writeValue(formatVersion: string): void { + this.control.setValue(formatVersion); + } + + registerOnChange(fn: (formatVersion: string | null) => void): void { + this.onChange = fn; + } + + registerOnTouched(fn: () => void): void { + // do nothing + } + + setDisabledState?(isDisabled: boolean): void { + if (isDisabled) { + this.control.disable(); + } else { + this.control.enable(); + } + } +} diff --git a/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html b/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html index aa5ffdf43..a7d7a05fe 100644 --- a/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html +++ b/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html @@ -25,10 +25,8 @@

- @if ( @@ -41,7 +39,7 @@

- + Date: Fri, 17 May 2024 18:52:18 +0200 Subject: [PATCH 03/15] Fix format --- azure-mock/upload-documents.ts | 85 ++++---- src/server.ts | 9 +- src/server/controller/ahb.ts | 32 ++- src/server/controller/formatVersion.ts | 43 ++-- src/server/infrastructure/api.routes.ts | 13 +- .../azure-blob-storage-client.ts | 14 +- src/server/infrastructure/errors.ts | 24 +-- .../repository/abstract/blobStorageBacked.ts | 40 ++-- src/server/repository/ahb.ts | 153 +++++++------- src/server/repository/formatVersion.ts | 186 ++++++++++-------- 10 files changed, 323 insertions(+), 276 deletions(-) diff --git a/azure-mock/upload-documents.ts b/azure-mock/upload-documents.ts index 0d0d8b6b0..c810d7bd1 100644 --- a/azure-mock/upload-documents.ts +++ b/azure-mock/upload-documents.ts @@ -1,53 +1,60 @@ -import { BlobServiceClient, ContainerClient } from "@azure/storage-blob"; -import * as fs from "fs"; -import * as path from "path"; +import { BlobServiceClient, ContainerClient } from '@azure/storage-blob'; +import * as fs from 'fs'; +import * as path from 'path'; // Function to create a BlobServiceClient const createBlobServiceClient = () => { - const azureHost = process.env["AZURE_STORAGE_HOST"] || "http://127.0.0.1"; - const connectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=${azureHost}:10000/devstoreaccount1;`; - return BlobServiceClient.fromConnectionString(connectionString); + const azureHost = process.env['AZURE_STORAGE_HOST'] || 'http://127.0.0.1'; + const connectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=${azureHost}:10000/devstoreaccount1;`; + return BlobServiceClient.fromConnectionString(connectionString); }; // Recursive function to upload files -const uploadFiles = async (folderPath: string, containerClient: ContainerClient) => { - const files = fs.readdirSync(folderPath); - - for (const file of files) { - const filePath = path.join(folderPath, file); - const stat = fs.statSync(filePath); - - if (stat.isDirectory()) { - await uploadFiles(filePath, containerClient); - } else { - const blobName = path.relative(process.argv[2], filePath).replace(/\\/g, "/"); - const blockBlobClient = containerClient.getBlockBlobClient(blobName); - console.log(`Uploading ${filePath} as ${blobName}`); - await blockBlobClient.uploadFile(filePath); - } +const uploadFiles = async ( + folderPath: string, + containerClient: ContainerClient, +) => { + const files = fs.readdirSync(folderPath); + + for (const file of files) { + const filePath = path.join(folderPath, file); + const stat = fs.statSync(filePath); + + if (stat.isDirectory()) { + await uploadFiles(filePath, containerClient); + } else { + const blobName = path + .relative(process.argv[2], filePath) + .replace(/\\/g, '/'); + const blockBlobClient = containerClient.getBlockBlobClient(blobName); + console.log(`Uploading ${filePath} as ${blobName}`); + await blockBlobClient.uploadFile(filePath); } + } }; // Main function to handle the upload process const main = async () => { - if (process.argv.length < 3) { - console.log("Usage: node dist/uploadFilesToAzurite.js "); - return; - } - - const folderPath = process.argv[2]; - const containerName = "uploaded-files"; - const blobServiceClient = createBlobServiceClient(); - const containerClient = blobServiceClient.getContainerClient(containerName); - - try { - await containerClient.createIfNotExists(); - console.log(`Starting upload of files from ${folderPath} to container '${containerName}'`); - await uploadFiles(folderPath, containerClient); - console.log("All files uploaded successfully."); - } catch (error) { - console.error("Error uploading files:", error); - } + if (process.argv.length < 3) { + console.log('Usage: node dist/uploadFilesToAzurite.js '); + return; + } + + const folderPath = process.argv[2]; + const containerName = 'uploaded-files'; + const blobServiceClient = createBlobServiceClient(); + const containerClient = blobServiceClient.getContainerClient(containerName); + + try { + await containerClient.createIfNotExists(); + console.log( + `Starting upload of files from ${folderPath} to container '${containerName}'`, + ); + await uploadFiles(folderPath, containerClient); + console.log('All files uploaded successfully.'); + } catch (error) { + console.error('Error uploading files:', error); + } }; main(); diff --git a/src/server.ts b/src/server.ts index cc686346e..b6338d8e5 100644 --- a/src/server.ts +++ b/src/server.ts @@ -13,10 +13,9 @@ if (process.env['ENABLE_CORS'] === 'true') { } const distFolder = join(process.cwd(), 'dist/ahbesser/browser'); -const docsFolder = join(process.cwd(), 'docs'); const indexHtml = 'index.html'; -server.get('/version', (req, res) => +server.get('/version', (_, res) => res.send({ buildDate: '', commitId: '', @@ -24,8 +23,8 @@ server.get('/version', (req, res) => version: '0.0.0', }), ); -server.get('/health', (req, res) => res.send()); -server.get('/readiness', (req, res) => res.send()); +server.get('/health', (_, res) => res.send()); +server.get('/readiness', (_, res) => res.send()); server.use('/api', router); @@ -33,7 +32,7 @@ server.use('/api', router); server.get('*.*', express.static(distFolder, { maxAge: '1y' })); // All regular routes serve angular -server.get('*', async (req, res) => res.sendFile(join(distFolder, indexHtml))); +server.get('*', async (_, res) => res.sendFile(join(distFolder, indexHtml))); // Apply error handler middleware server.use(httpErrorHandler); diff --git a/src/server/controller/ahb.ts b/src/server/controller/ahb.ts index d64ddfc29..258c68c0f 100644 --- a/src/server/controller/ahb.ts +++ b/src/server/controller/ahb.ts @@ -1,19 +1,17 @@ -import AHBRepository, { FileType } from "../repository/ahb"; -import { Request, Response } from "express"; +import AHBRepository, { FileType } from '../repository/ahb'; +import { Request, Response } from 'express'; export default class AHBController { - private repository: AHBRepository; - constructor(repository?: AHBRepository) { - this.repository = repository ?? new AHBRepository(); - } - public async get(req: Request, res: Response): Promise { - const pruefi = req.params["pruefi"]; - const formatVersion = req.params["formatVersion"]; - // TODO: Make this dynamic - const type = FileType.JSON; - const ahb = await this.repository.get(pruefi, formatVersion, type); - res.status(200) - .setHeader("Content-Type", "application/json") - .send(ahb); - } -} \ No newline at end of file + private repository: AHBRepository; + constructor(repository?: AHBRepository) { + this.repository = repository ?? new AHBRepository(); + } + public async get(req: Request, res: Response): Promise { + const pruefi = req.params['pruefi']; + const formatVersion = req.params['formatVersion']; + // TODO: Make this dynamic + const type = FileType.JSON; + const ahb = await this.repository.get(pruefi, formatVersion, type); + res.status(200).setHeader('Content-Type', 'application/json').send(ahb); + } +} diff --git a/src/server/controller/formatVersion.ts b/src/server/controller/formatVersion.ts index f601034fc..4f2414d0c 100644 --- a/src/server/controller/formatVersion.ts +++ b/src/server/controller/formatVersion.ts @@ -1,24 +1,27 @@ -import { Request, Response } from "express"; -import FormatVersionRepository from "../repository/formatVersion"; +import { Request, Response } from 'express'; +import FormatVersionRepository from '../repository/formatVersion'; export default class FormatVersionController { - private repository: FormatVersionRepository; - constructor(repository?: FormatVersionRepository) { - this.repository = repository ?? new FormatVersionRepository(); - } + private repository: FormatVersionRepository; + constructor(repository?: FormatVersionRepository) { + this.repository = repository ?? new FormatVersionRepository(); + } - public async list(_req: Request, res: Response): Promise { - const formatVersionEntity = await this.repository.list(); - res.status(200) - .setHeader("Content-Type", "application/json") - .send(formatVersionEntity); - } + public async list(_req: Request, res: Response): Promise { + const formatVersionEntity = await this.repository.list(); + res + .status(200) + .setHeader('Content-Type', 'application/json') + .send(formatVersionEntity); + } - public async listPruefisByFormatVersion(req: Request, res: Response): Promise { - const formatVersion = req.params["formatVersion"]; - const pruefis = await this.repository.listPruefisByFormatVersion(formatVersion); - res.status(200) - .setHeader("Content-Type", "application/json") - .send(pruefis); - } -} \ No newline at end of file + public async listPruefisByFormatVersion( + req: Request, + res: Response, + ): Promise { + const formatVersion = req.params['formatVersion']; + const pruefis = + await this.repository.listPruefisByFormatVersion(formatVersion); + res.status(200).setHeader('Content-Type', 'application/json').send(pruefis); + } +} diff --git a/src/server/infrastructure/api.routes.ts b/src/server/infrastructure/api.routes.ts index f538b45c8..98fa5a168 100644 --- a/src/server/infrastructure/api.routes.ts +++ b/src/server/infrastructure/api.routes.ts @@ -15,13 +15,18 @@ router.get('/format-versions', async (req, res, next) => { await formatVersionController.list(req, res).catch((err: Error) => next(err)); }); -router.get('/format-versions/:formatVersion/pruefis', async (req, res, next) => { - await formatVersionController.listPruefisByFormatVersion(req, res).catch((err: Error) => next(err)); -}); +router.get( + '/format-versions/:formatVersion/pruefis', + async (req, res, next) => { + await formatVersionController + .listPruefisByFormatVersion(req, res) + .catch((err: Error) => next(err)); + }, +); router.all('/**', (req, res) => { res.status(404); res.send({ message: 'not found' }); }); -export default router; \ No newline at end of file +export default router; diff --git a/src/server/infrastructure/azure-blob-storage-client.ts b/src/server/infrastructure/azure-blob-storage-client.ts index 45febc32d..46a214e8d 100644 --- a/src/server/infrastructure/azure-blob-storage-client.ts +++ b/src/server/infrastructure/azure-blob-storage-client.ts @@ -1,9 +1,9 @@ -import { BlobServiceClient } from "@azure/storage-blob"; +import { BlobServiceClient } from '@azure/storage-blob'; export function createNewBlobStorageClient(): BlobServiceClient { - const connectionString = process.env["AZURE_BLOB_STORAGE_CONNECTION_STRING"]; - if (!connectionString) { - throw new Error("AZURE_BLOB_STORAGE_CONNECTION_STRING is not set"); - } - return BlobServiceClient.fromConnectionString(connectionString); -} \ No newline at end of file + const connectionString = process.env['AZURE_BLOB_STORAGE_CONNECTION_STRING']; + if (!connectionString) { + throw new Error('AZURE_BLOB_STORAGE_CONNECTION_STRING is not set'); + } + return BlobServiceClient.fromConnectionString(connectionString); +} diff --git a/src/server/infrastructure/errors.ts b/src/server/infrastructure/errors.ts index dfb83a670..083e42513 100644 --- a/src/server/infrastructure/errors.ts +++ b/src/server/infrastructure/errors.ts @@ -1,16 +1,16 @@ -import { ErrorRequestHandler } from "express"; +import { ErrorRequestHandler } from 'express'; export class NotFoundError extends Error {} export const httpErrorHandler: ErrorRequestHandler = (err, _, res, _next) => { - console.error('in error handler'); - if (err instanceof NotFoundError) { - res.status(404).json({ - error: 'NotFoundError', - message: err.message - }); - } else { - console.error(err instanceof Error ? err.message : 'Unknown error'); - res.status(500).send("Internal server error"); - } -} \ No newline at end of file + console.error('in error handler'); + if (err instanceof NotFoundError) { + res.status(404).json({ + error: 'NotFoundError', + message: err.message, + }); + } else { + console.error(err instanceof Error ? err.message : 'Unknown error'); + res.status(500).send('Internal server error'); + } +}; diff --git a/src/server/repository/abstract/blobStorageBacked.ts b/src/server/repository/abstract/blobStorageBacked.ts index 2212272c5..8d9951eb2 100644 --- a/src/server/repository/abstract/blobStorageBacked.ts +++ b/src/server/repository/abstract/blobStorageBacked.ts @@ -1,24 +1,24 @@ -import { BlobServiceClient } from "@azure/storage-blob"; -import { createNewBlobStorageClient } from "../../infrastructure/azure-blob-storage-client"; -import { Readable } from "stream"; +import { BlobServiceClient } from '@azure/storage-blob'; +import { createNewBlobStorageClient } from '../../infrastructure/azure-blob-storage-client'; +import { Readable } from 'stream'; export default abstract class BlobStorageBacked { - protected client: BlobServiceClient; - constructor(client?: BlobServiceClient) { - this.client = client ?? createNewBlobStorageClient(); - } + protected client: BlobServiceClient; + constructor(client?: BlobServiceClient) { + this.client = client ?? createNewBlobStorageClient(); + } - // Helper function to convert a stream to a string - protected async streamToString(readableStream: Readable): Promise { - return new Promise((resolve, reject) => { - const chunks: string[] = []; - readableStream.on("data", (data: string | Buffer) => { - chunks.push(data.toString()); - }); - readableStream.on("end", () => { - resolve(chunks.join("")); - }); - readableStream.on("error", reject); - }); - } + // Helper function to convert a stream to a string + protected async streamToString(readableStream: Readable): Promise { + return new Promise((resolve, reject) => { + const chunks: string[] = []; + readableStream.on('data', (data: string | Buffer) => { + chunks.push(data.toString()); + }); + readableStream.on('end', () => { + resolve(chunks.join('')); + }); + readableStream.on('error', reject); + }); + } } diff --git a/src/server/repository/ahb.ts b/src/server/repository/ahb.ts index 16ed0625a..4d22bcb6f 100644 --- a/src/server/repository/ahb.ts +++ b/src/server/repository/ahb.ts @@ -1,77 +1,98 @@ -import { BlobServiceClient } from "@azure/storage-blob"; -import { Ahb } from "../../app/core/api/models"; -import { Readable } from "stream"; -import { NotFoundError } from "../infrastructure/errors"; -import BlobStorageBacked from "./abstract/blobStorageBacked"; +import { BlobServiceClient } from '@azure/storage-blob'; +import { Ahb } from '../../app/core/api/models'; +import { Readable } from 'stream'; +import { NotFoundError } from '../infrastructure/errors'; +import BlobStorageBacked from './abstract/blobStorageBacked'; export enum FileType { - CSV = "csv", - JSON = "json", - XLSX = "xlsx" + CSV = 'csv', + JSON = 'json', + XLSX = 'xlsx', } -export default class AHBRepository extends BlobStorageBacked{ - private ahbContainerName: string; - constructor(client?: BlobServiceClient) { - super(client); - if (!process.env["AHB_CONTAINER_NAME"]) { - throw new Error("AHB_CONTAINER_NAME is not set"); - } - this.ahbContainerName = process.env["AHB_CONTAINER_NAME"]; +export default class AHBRepository extends BlobStorageBacked { + private ahbContainerName: string; + constructor(client?: BlobServiceClient) { + super(client); + if (!process.env['AHB_CONTAINER_NAME']) { + throw new Error('AHB_CONTAINER_NAME is not set'); } + this.ahbContainerName = process.env['AHB_CONTAINER_NAME']; + } - // Retrieve a single AHB from the blob storage - // 1. Get the container client (all AHB blobs are stored in the same container) - // 2. Get the blob name based on the pruefi, formatVersion and file type - // 3. Get the block blob client - // 4. Download the blob - // 5. Convert the blob content to a string - // 6. Parse the string to an Ahb object - public async get(pruefi: string, formatVersion: string, type: FileType): Promise { - const containerClient = this.client.getContainerClient(this.ahbContainerName); - const blobName = await this.getBlobName(pruefi, formatVersion, type); - const blockBlobClient = containerClient.getBlockBlobClient(blobName); - const downloadBlockBlobResponse = await blockBlobClient.download(0); - const downloadedContent = await this.streamToString(downloadBlockBlobResponse.readableStreamBody as Readable); - return JSON.parse(downloadedContent); - } + // Retrieve a single AHB from the blob storage + // 1. Get the container client (all AHB blobs are stored in the same container) + // 2. Get the blob name based on the pruefi, formatVersion and file type + // 3. Get the block blob client + // 4. Download the blob + // 5. Convert the blob content to a string + // 6. Parse the string to an Ahb object + public async get( + pruefi: string, + formatVersion: string, + type: FileType, + ): Promise { + const containerClient = this.client.getContainerClient( + this.ahbContainerName, + ); + const blobName = await this.getBlobName(pruefi, formatVersion, type); + const blockBlobClient = containerClient.getBlockBlobClient(blobName); + const downloadBlockBlobResponse = await blockBlobClient.download(0); + const downloadedContent = await this.streamToString( + downloadBlockBlobResponse.readableStreamBody as Readable, + ); + return JSON.parse(downloadedContent); + } - // Get the blob name based on the pruefi, formatVersion and file type. - // Structure of a blob name: {formatVersion}/{format}/{fileTypeDirectory}/{pruefi}.{fileType} - // This method needs to further to find {format} and {fileTypeDirectory}. - private async getBlobName(pruefi: string, formatVersion: string, type: FileType): Promise { - const format = await this.getFormatName(pruefi, formatVersion); - const fileFormatDirectoryName = this.getFileTypeDirectoryName(type); - return `${formatVersion}/${format}/${fileFormatDirectoryName}/${pruefi}.${type.toString()}`; - } + // Get the blob name based on the pruefi, formatVersion and file type. + // Structure of a blob name: {formatVersion}/{format}/{fileTypeDirectory}/{pruefi}.{fileType} + // This method needs to further to find {format} and {fileTypeDirectory}. + private async getBlobName( + pruefi: string, + formatVersion: string, + type: FileType, + ): Promise { + const format = await this.getFormatName(pruefi, formatVersion); + const fileFormatDirectoryName = this.getFileTypeDirectoryName(type); + return `${formatVersion}/${format}/${fileFormatDirectoryName}/${pruefi}.${type.toString()}`; + } - // Get the directory name for a specified file type - private getFileTypeDirectoryName(fileType: FileType): string { - switch (fileType) { - case FileType.CSV: - return "csv"; - case FileType.JSON: - return "flatahb"; - case FileType.XLSX: - return "xlsx"; - default: - throw new NotFoundError(`Unknown file type ${fileType}`); - } + // Get the directory name for a specified file type + private getFileTypeDirectoryName(fileType: FileType): string { + switch (fileType) { + case FileType.CSV: + return 'csv'; + case FileType.JSON: + return 'flatahb'; + case FileType.XLSX: + return 'xlsx'; + default: + throw new NotFoundError(`Unknown file type ${fileType}`); } + } - // Retrieve the format name by looking at the blobs names in the container. - // Assuming each pruefi is unique for a formatVersion. - private async getFormatName(pruefi: string, formatVersion: string): Promise { - const containerClient = this.client.getContainerClient(this.ahbContainerName); - let blobsFound = false; - for await (const blob of containerClient.listBlobsFlat({ prefix: `${formatVersion}/`})) { - blobsFound = true; - if (blob.name.includes(pruefi)) { - return blob.name.split("/")[1]; - } - } - throw blobsFound - ? new NotFoundError(`Pruefi ${pruefi} does not exist on Format Version ${formatVersion}`) - : new NotFoundError(`Format Version ${formatVersion} does not exist`); + // Retrieve the format name by looking at the blobs names in the container. + // Assuming each pruefi is unique for a formatVersion. + private async getFormatName( + pruefi: string, + formatVersion: string, + ): Promise { + const containerClient = this.client.getContainerClient( + this.ahbContainerName, + ); + let blobsFound = false; + for await (const blob of containerClient.listBlobsFlat({ + prefix: `${formatVersion}/`, + })) { + blobsFound = true; + if (blob.name.includes(pruefi)) { + return blob.name.split('/')[1]; + } } -} \ No newline at end of file + throw blobsFound + ? new NotFoundError( + `Pruefi ${pruefi} does not exist on Format Version ${formatVersion}`, + ) + : new NotFoundError(`Format Version ${formatVersion} does not exist`); + } +} diff --git a/src/server/repository/formatVersion.ts b/src/server/repository/formatVersion.ts index 37635980a..c093c13d1 100644 --- a/src/server/repository/formatVersion.ts +++ b/src/server/repository/formatVersion.ts @@ -1,10 +1,10 @@ -import { BlobServiceClient, ContainerClient } from "@azure/storage-blob"; -import BlobStorageContainerBacked from "./abstract/blobStorageBacked"; -import { Readable } from "stream"; -import { NotFoundError } from "../infrastructure/errors"; +import { BlobServiceClient, ContainerClient } from '@azure/storage-blob'; +import BlobStorageContainerBacked from './abstract/blobStorageBacked'; +import { Readable } from 'stream'; +import { NotFoundError } from '../infrastructure/errors'; interface FormatVersionsWithPruefis { - [formatVersion: string]: Set; + [formatVersion: string]: Set; } // The FormatVersionRepository class is responsible for retreiving the format versions and their related pruefis. @@ -12,95 +12,109 @@ interface FormatVersionsWithPruefis { // By storing the format versions in a separate container, we can reduce the number of requests to the blob storage and save computation time. // This repository creates the format version container itself if it does not exist. export default class FormatVersionRepository extends BlobStorageContainerBacked { - private ahbContainerName: string; - private formatVersionContainerName: string; - constructor(client?: BlobServiceClient) { - super(client); - if (!process.env["AHB_CONTAINER_NAME"]) { - throw new Error("AHB_CONTAINER_NAME is not set"); - } - this.ahbContainerName = process.env["AHB_CONTAINER_NAME"]; + private ahbContainerName: string; + private formatVersionContainerName: string; + constructor(client?: BlobServiceClient) { + super(client); + if (!process.env['AHB_CONTAINER_NAME']) { + throw new Error('AHB_CONTAINER_NAME is not set'); + } + this.ahbContainerName = process.env['AHB_CONTAINER_NAME']; - if (!process.env["FORMAT_VERSION_CONTAINER_NAME"]) { - throw new Error("FORMAT_VERSION_CONTAINER_NAME is not set"); - } - this.formatVersionContainerName = process.env["FORMAT_VERSION_CONTAINER_NAME"]; + if (!process.env['FORMAT_VERSION_CONTAINER_NAME']) { + throw new Error('FORMAT_VERSION_CONTAINER_NAME is not set'); } + this.formatVersionContainerName = + process.env['FORMAT_VERSION_CONTAINER_NAME']; + } - // Return a list of all unique format versions - // 1. Get the container client which stores the format versions - // 2. Iterate over all blobs in the container - // 3. Return the list of format versions - public async list(): Promise { - const containerClient = await this.getFormatVersionsContainerClient(); - const formatVersions: string[] = []; - for await (const blob of containerClient.listBlobsFlat()) { - formatVersions.push(blob.name); - } - return formatVersions; + // Return a list of all unique format versions + // 1. Get the container client which stores the format versions + // 2. Iterate over all blobs in the container + // 3. Return the list of format versions + public async list(): Promise { + const containerClient = await this.getFormatVersionsContainerClient(); + const formatVersions: string[] = []; + for await (const blob of containerClient.listBlobsFlat()) { + formatVersions.push(blob.name); } + return formatVersions; + } - // Return a list of all pruefis for a specific format version - // 1. Get the container client which stores the format versions - // 2. Get the blob client for the specified format version - // 3. Download the blob - // 4. Convert the blob content to a string - // 5. Parse the string to a list of pruefis - public async listPruefisByFormatVersion(formatVersion: string): Promise { - const containerClient = await this.getFormatVersionsContainerClient(); - const blobClient = containerClient.getBlockBlobClient(formatVersion); - if (!(await blobClient.exists())) { - throw new NotFoundError(`Format version ${formatVersion} does not exist`); - } - const downloadBlockBlobResponse = await blobClient.download(0); - const downloadedContent = await this.streamToString(downloadBlockBlobResponse.readableStreamBody as Readable); - return JSON.parse(downloadedContent); + // Return a list of all pruefis for a specific format version + // 1. Get the container client which stores the format versions + // 2. Get the blob client for the specified format version + // 3. Download the blob + // 4. Convert the blob content to a string + // 5. Parse the string to a list of pruefis + public async listPruefisByFormatVersion( + formatVersion: string, + ): Promise { + const containerClient = await this.getFormatVersionsContainerClient(); + const blobClient = containerClient.getBlockBlobClient(formatVersion); + if (!(await blobClient.exists())) { + throw new NotFoundError(`Format version ${formatVersion} does not exist`); } + const downloadBlockBlobResponse = await blobClient.download(0); + const downloadedContent = await this.streamToString( + downloadBlockBlobResponse.readableStreamBody as Readable, + ); + return JSON.parse(downloadedContent); + } - // Get the format versions container client. Create the container if it does not exist. - private async getFormatVersionsContainerClient(): Promise { - const containerClient = this.client.getContainerClient(this.formatVersionContainerName); - if (!(await containerClient.exists())) { - await this.createFormatVersionContainer(); - } - return containerClient; + // Get the format versions container client. Create the container if it does not exist. + private async getFormatVersionsContainerClient(): Promise { + const containerClient = this.client.getContainerClient( + this.formatVersionContainerName, + ); + if (!(await containerClient.exists())) { + await this.createFormatVersionContainer(); } - // Create the format version container - // 1. Create the container client - // 2. Build a list of format versions with the related pruefis - // 3. Create a blob for each format version - // 4. Upload the pruefis to the blob - private async createFormatVersionContainer(): Promise { - console.log('Creating format version container'); - const containerClient = this.client.getContainerClient(this.formatVersionContainerName); - await containerClient.createIfNotExists(); - const formatVersionsWithPruefis = await this.buildFormatVersionsWithPruefis(); - const promises = []; - for (const formatVersion in formatVersionsWithPruefis) { - const blobClient = containerClient.getBlockBlobClient(formatVersion); - const data = Buffer.from(JSON.stringify(Array.from(formatVersionsWithPruefis[formatVersion]))); - promises.push(blobClient.uploadData(data)); - } - await Promise.all(promises); + return containerClient; + } + // Create the format version container + // 1. Create the container client + // 2. Build a list of format versions with the related pruefis + // 3. Create a blob for each format version + // 4. Upload the pruefis to the blob + private async createFormatVersionContainer(): Promise { + console.log('Creating format version container'); + const containerClient = this.client.getContainerClient( + this.formatVersionContainerName, + ); + await containerClient.createIfNotExists(); + const formatVersionsWithPruefis = + await this.buildFormatVersionsWithPruefis(); + const promises = []; + for (const formatVersion in formatVersionsWithPruefis) { + const blobClient = containerClient.getBlockBlobClient(formatVersion); + const data = Buffer.from( + JSON.stringify(Array.from(formatVersionsWithPruefis[formatVersion])), + ); + promises.push(blobClient.uploadData(data)); } + await Promise.all(promises); + } - // Build a list of format versions with the related pruefis - // 1. Get the container client which stores the AHB blobs - // 2. Iterate over all blobs in the container - // 3. Parse the blob name to extract the format version and pruefi - // 4. Store the pruefi in the formatVersionsWithPruefis object - // 5. Return the object - private async buildFormatVersionsWithPruefis(): Promise { - const containerClient = this.client.getContainerClient(this.ahbContainerName); - const formatVersionBlobStorage: FormatVersionsWithPruefis = {}; - for await (const blob of containerClient.listBlobsFlat()) { - const formatVersion = blob.name.split("/")[0]; - if (!formatVersionBlobStorage[formatVersion]) { - formatVersionBlobStorage[formatVersion] = new Set(); - } - const pruefi = blob.name.split("/")[3].split(".")[0]; - formatVersionBlobStorage[formatVersion].add(pruefi); - } - return formatVersionBlobStorage; + // Build a list of format versions with the related pruefis + // 1. Get the container client which stores the AHB blobs + // 2. Iterate over all blobs in the container + // 3. Parse the blob name to extract the format version and pruefi + // 4. Store the pruefi in the formatVersionsWithPruefis object + // 5. Return the object + private async buildFormatVersionsWithPruefis(): Promise { + const containerClient = this.client.getContainerClient( + this.ahbContainerName, + ); + const formatVersionBlobStorage: FormatVersionsWithPruefis = {}; + for await (const blob of containerClient.listBlobsFlat()) { + const formatVersion = blob.name.split('/')[0]; + if (!formatVersionBlobStorage[formatVersion]) { + formatVersionBlobStorage[formatVersion] = new Set(); + } + const pruefi = blob.name.split('/')[3].split('.')[0]; + formatVersionBlobStorage[formatVersion].add(pruefi); } -} \ No newline at end of file + return formatVersionBlobStorage; + } +} From 1b49045e62cc369815023425f4fd9a1736a4aac3 Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 19:37:45 +0200 Subject: [PATCH 04/15] Use string instead of enum for format-versions in pruefi endpoint --- openapi.yml | 1 - src/app/core/api/fn/ahb/get-pruefis.ts | 18 +++---------- src/app/core/api/models/format-version.ts | 6 +---- src/app/core/api/services/ahb.service.ts | 33 ++++------------------- 4 files changed, 9 insertions(+), 49 deletions(-) diff --git a/openapi.yml b/openapi.yml index b0f575890..15e2f780a 100644 --- a/openapi.yml +++ b/openapi.yml @@ -179,7 +179,6 @@ components: - meta FormatVersion: type: string - enum: [FV2310, FV2404, FV2410] Version: type: object properties: diff --git a/src/app/core/api/fn/ahb/get-pruefis.ts b/src/app/core/api/fn/ahb/get-pruefis.ts index cb2b374be..8a5b3e952 100644 --- a/src/app/core/api/fn/ahb/get-pruefis.ts +++ b/src/app/core/api/fn/ahb/get-pruefis.ts @@ -20,14 +20,7 @@ export function getPruefis( rootUrl: string, params: GetPruefis$Params, context?: HttpContext, -): Observable< - StrictHttpResponse< - Array<{ - pruefidentifikator?: string; - description?: string; - }> - > -> { +): Observable>> { const rb = new RequestBuilder(rootUrl, getPruefis.PATH, 'get'); if (params) { rb.path('format-version', params['format-version'], {}); @@ -40,14 +33,9 @@ export function getPruefis( .pipe( filter((r: any): r is HttpResponse => r instanceof HttpResponse), map((r: HttpResponse) => { - return r as StrictHttpResponse< - Array<{ - pruefidentifikator?: string; - description?: string; - }> - >; + return r as StrictHttpResponse>; }), ); } -getPruefis.PATH = '/api/{format-version}/pruefis'; +getPruefis.PATH = '/api/format-versions/{format-version}/pruefis'; diff --git a/src/app/core/api/models/format-version.ts b/src/app/core/api/models/format-version.ts index fd2d6b720..10c9cb5a9 100644 --- a/src/app/core/api/models/format-version.ts +++ b/src/app/core/api/models/format-version.ts @@ -1,7 +1,3 @@ /* tslint:disable */ /* eslint-disable */ -export enum FormatVersion { - Fv2310 = 'FV2310', - Fv2404 = 'FV2404', - Fv2410 = 'FV2410', -} +export type FormatVersion = string; diff --git a/src/app/core/api/services/ahb.service.ts b/src/app/core/api/services/ahb.service.ts index 816b2f872..3e8adb6e8 100644 --- a/src/app/core/api/services/ahb.service.ts +++ b/src/app/core/api/services/ahb.service.ts @@ -102,7 +102,8 @@ export class AhbService extends BaseService { } /** Path part for operation `getPruefis()` */ - static readonly GetPruefisPath = '/api/{format-version}/pruefis'; + static readonly GetPruefisPath = + '/api/format-versions/{format-version}/pruefis'; /** * Get a list of all available Pruefidentifikators for a given format version. @@ -117,14 +118,7 @@ export class AhbService extends BaseService { getPruefis$Response( params: GetPruefis$Params, context?: HttpContext, - ): Observable< - StrictHttpResponse< - Array<{ - pruefidentifikator?: string; - description?: string; - }> - > - > { + ): Observable>> { return getPruefis(this.http, this.rootUrl, params, context); } @@ -141,26 +135,9 @@ export class AhbService extends BaseService { getPruefis( params: GetPruefis$Params, context?: HttpContext, - ): Observable< - Array<{ - pruefidentifikator?: string; - description?: string; - }> - > { + ): Observable> { return this.getPruefis$Response(params, context).pipe( - map( - ( - r: StrictHttpResponse< - Array<{ - pruefidentifikator?: string; - description?: string; - }> - >, - ): Array<{ - pruefidentifikator?: string; - description?: string; - }> => r.body, - ), + map((r: StrictHttpResponse>): Array => r.body), ); } } From 756ae085251375e6fcdf0a01098a07ac73119597 Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 19:38:08 +0200 Subject: [PATCH 05/15] Add pruefi-input --- .../pruefi-input/pruefi-input.component.html | 9 +++ .../pruefi-input.component.spec.ts | 22 ++++++ .../pruefi-input/pruefi-input.component.ts | 67 +++++++++++++++++++ .../ahb-landing-page.component.html | 5 +- .../ahb-landing-page.component.ts | 2 + 5 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 src/app/features/ahbs/components/pruefi-input/pruefi-input.component.html create mode 100644 src/app/features/ahbs/components/pruefi-input/pruefi-input.component.spec.ts create mode 100644 src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts diff --git a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.html b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.html new file mode 100644 index 000000000..f1f682719 --- /dev/null +++ b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.html @@ -0,0 +1,9 @@ + diff --git a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.spec.ts b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.spec.ts new file mode 100644 index 000000000..77ac99485 --- /dev/null +++ b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PruefiInputComponent } from './pruefi-input.component'; + +describe('PruefiInputComponent', () => { + let component: PruefiInputComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PruefiInputComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(PruefiInputComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts new file mode 100644 index 000000000..142779e15 --- /dev/null +++ b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts @@ -0,0 +1,67 @@ +import { Component, effect, forwardRef, input } from '@angular/core'; +import { + ControlValueAccessor, + FormControl, + FormsModule, + NG_VALUE_ACCESSOR, + ReactiveFormsModule, +} from '@angular/forms'; +import { AhbService } from '../../../../core/api'; +import { CommonModule } from '@angular/common'; +import { of } from 'rxjs'; + +@Component({ + selector: 'app-pruefi-input', + standalone: true, + imports: [CommonModule, FormsModule, ReactiveFormsModule], + templateUrl: './pruefi-input.component.html', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => PruefiInputComponent), + multi: true, + }, + ], +}) +export class PruefiInputComponent implements ControlValueAccessor { + formatVersion = input.required(); + + control = new FormControl(''); + + pruefis$!: ReturnType; + + public onChange?: (pruefi: string | null) => void; + + constructor(private readonly ahbService: AhbService) { + effect(() => { + const formatVersion = this.formatVersion(); + if (!formatVersion) { + this.pruefis$ = of([]); + return; + } + this.pruefis$ = this.ahbService.getPruefis({ + 'format-version': formatVersion, + }); + }); + } + + writeValue(pruefi: string): void { + this.control.setValue(pruefi); + } + + registerOnChange(fn: (pruefi: string | null) => void): void { + this.onChange = fn; + } + + registerOnTouched(_: () => void): void { + // do nothing + } + + setDisabledState?(isDisabled: boolean): void { + if (isDisabled) { + this.control.disable(); + } else { + this.control.enable(); + } + } +} diff --git a/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html b/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html index a7d7a05fe..bafecf2c7 100644 --- a/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html +++ b/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html @@ -40,11 +40,10 @@

- @if ( form.controls.pruefi.errors?.["required"] && diff --git a/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.ts b/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.ts index 79ce68025..67893693b 100644 --- a/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.ts +++ b/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.ts @@ -9,6 +9,7 @@ import { } from '@angular/forms'; import { Router } from '@angular/router'; import { FormatVersionSelectComponent } from '../../components/format-version-select/format-version-select.component'; +import { PruefiInputComponent } from '../../components/pruefi-input/pruefi-input.component'; @Component({ selector: 'app-ahb-landing-page', @@ -18,6 +19,7 @@ import { FormatVersionSelectComponent } from '../../components/format-version-se FormsModule, ReactiveFormsModule, FormatVersionSelectComponent, + PruefiInputComponent, ], templateUrl: './ahb-landing-page.component.html', }) From 0bd889a6b8464b133e2db6d58859fabcbf6b5fa0 Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 19:48:11 +0200 Subject: [PATCH 06/15] Remove another enum --- src/app/core/api/api.module.ts | 39 +++---- src/app/core/api/base-service.ts | 5 +- src/app/core/api/fn/ahb/get-ahb.ts | 38 +++--- .../core/api/fn/ahb/get-format-versions.ts | 29 ++--- src/app/core/api/fn/ahb/get-pruefis.ts | 32 +++--- .../core/api/fn/maintenance/version-get.ts | 28 ++--- src/app/core/api/models/ahb.ts | 30 ++--- src/app/core/api/request-builder.ts | 108 +++++------------- src/app/core/api/services/ahb.service.ts | 36 ++---- .../core/api/services/maintenance.service.ts | 13 +-- src/app/core/api/strict-http-response.ts | 2 +- 11 files changed, 132 insertions(+), 228 deletions(-) diff --git a/src/app/core/api/api.module.ts b/src/app/core/api/api.module.ts index d57cb6066..21858cb53 100644 --- a/src/app/core/api/api.module.ts +++ b/src/app/core/api/api.module.ts @@ -1,11 +1,6 @@ /* tslint:disable */ /* eslint-disable */ -import { - NgModule, - ModuleWithProviders, - SkipSelf, - Optional, -} from '@angular/core'; +import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { ApiConfiguration, ApiConfigurationParams } from './api-configuration'; @@ -19,37 +14,35 @@ import { MaintenanceService } from './services/maintenance.service'; imports: [], exports: [], declarations: [], - providers: [AhbService, MaintenanceService, ApiConfiguration], + providers: [ + AhbService, + MaintenanceService, + ApiConfiguration + ], }) export class ApiModule { - static forRoot( - params: ApiConfigurationParams, - ): ModuleWithProviders { + static forRoot(params: ApiConfigurationParams): ModuleWithProviders { return { ngModule: ApiModule, providers: [ { provide: ApiConfiguration, - useValue: params, - }, - ], - }; + useValue: params + } + ] + } } - constructor( + constructor( @Optional() @SkipSelf() parentModule: ApiModule, - @Optional() http: HttpClient, + @Optional() http: HttpClient ) { if (parentModule) { - throw new Error( - 'ApiModule is already loaded. Import in your base AppModule only.', - ); + throw new Error('ApiModule is already loaded. Import in your base AppModule only.'); } if (!http) { - throw new Error( - 'You need to import the HttpClientModule in your AppModule! \n' + - 'See also https://github.com/angular/angular/issues/20575', - ); + throw new Error('You need to import the HttpClientModule in your AppModule! \n' + + 'See also https://github.com/angular/angular/issues/20575'); } } } diff --git a/src/app/core/api/base-service.ts b/src/app/core/api/base-service.ts index c6b248ffa..24c2c7270 100644 --- a/src/app/core/api/base-service.ts +++ b/src/app/core/api/base-service.ts @@ -11,8 +11,9 @@ import { ApiConfiguration } from './api-configuration'; export class BaseService { constructor( protected config: ApiConfiguration, - protected http: HttpClient, - ) {} + protected http: HttpClient + ) { + } private _rootUrl?: string; diff --git a/src/app/core/api/fn/ahb/get-ahb.ts b/src/app/core/api/fn/ahb/get-ahb.ts index 424497208..166247ec4 100644 --- a/src/app/core/api/fn/ahb/get-ahb.ts +++ b/src/app/core/api/fn/ahb/get-ahb.ts @@ -10,39 +10,33 @@ import { Ahb } from '../../models/ahb'; import { FormatVersion } from '../../models/format-version'; export interface GetAhb$Params { - /** - * Formatversion of the AHB to return - */ + +/** + * Formatversion of the AHB to return + */ 'format-version': FormatVersion; - /** - * Pruefidentifikator of the AHB to return - */ +/** + * Pruefidentifikator of the AHB to return + */ pruefi: string; } -export function getAhb( - http: HttpClient, - rootUrl: string, - params: GetAhb$Params, - context?: HttpContext, -): Observable> { +export function getAhb(http: HttpClient, rootUrl: string, params: GetAhb$Params, context?: HttpContext): Observable> { const rb = new RequestBuilder(rootUrl, getAhb.PATH, 'get'); if (params) { rb.path('format-version', params['format-version'], {}); rb.path('pruefi', params.pruefi, {}); } - return http - .request( - rb.build({ responseType: 'json', accept: 'application/json', context }), - ) - .pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse; - }), - ); + return http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); } getAhb.PATH = '/api/ahb/{format-version}/{pruefi}'; diff --git a/src/app/core/api/fn/ahb/get-format-versions.ts b/src/app/core/api/fn/ahb/get-format-versions.ts index dd794cb5a..9dcfb3610 100644 --- a/src/app/core/api/fn/ahb/get-format-versions.ts +++ b/src/app/core/api/fn/ahb/get-format-versions.ts @@ -6,28 +6,23 @@ import { filter, map } from 'rxjs/operators'; import { StrictHttpResponse } from '../../strict-http-response'; import { RequestBuilder } from '../../request-builder'; -export interface GetFormatVersions$Params {} -export function getFormatVersions( - http: HttpClient, - rootUrl: string, - params?: GetFormatVersions$Params, - context?: HttpContext, -): Observable>> { +export interface GetFormatVersions$Params { +} + +export function getFormatVersions(http: HttpClient, rootUrl: string, params?: GetFormatVersions$Params, context?: HttpContext): Observable>> { const rb = new RequestBuilder(rootUrl, getFormatVersions.PATH, 'get'); if (params) { } - return http - .request( - rb.build({ responseType: 'json', accept: 'application/json', context }), - ) - .pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse>; - }), - ); + return http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse>; + }) + ); } getFormatVersions.PATH = '/api/format-versions'; diff --git a/src/app/core/api/fn/ahb/get-pruefis.ts b/src/app/core/api/fn/ahb/get-pruefis.ts index 8a5b3e952..4cbea1e29 100644 --- a/src/app/core/api/fn/ahb/get-pruefis.ts +++ b/src/app/core/api/fn/ahb/get-pruefis.ts @@ -9,33 +9,27 @@ import { RequestBuilder } from '../../request-builder'; import { FormatVersion } from '../../models/format-version'; export interface GetPruefis$Params { - /** - * Formatversion of the AHB to return - */ + +/** + * Formatversion of the AHB to return + */ 'format-version': FormatVersion; } -export function getPruefis( - http: HttpClient, - rootUrl: string, - params: GetPruefis$Params, - context?: HttpContext, -): Observable>> { +export function getPruefis(http: HttpClient, rootUrl: string, params: GetPruefis$Params, context?: HttpContext): Observable>> { const rb = new RequestBuilder(rootUrl, getPruefis.PATH, 'get'); if (params) { rb.path('format-version', params['format-version'], {}); } - return http - .request( - rb.build({ responseType: 'json', accept: 'application/json', context }), - ) - .pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse>; - }), - ); + return http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse>; + }) + ); } getPruefis.PATH = '/api/format-versions/{format-version}/pruefis'; diff --git a/src/app/core/api/fn/maintenance/version-get.ts b/src/app/core/api/fn/maintenance/version-get.ts index b7ac219be..c7cfc34e6 100644 --- a/src/app/core/api/fn/maintenance/version-get.ts +++ b/src/app/core/api/fn/maintenance/version-get.ts @@ -8,28 +8,22 @@ import { RequestBuilder } from '../../request-builder'; import { Version } from '../../models/version'; -export interface VersionGet$Params {} +export interface VersionGet$Params { +} -export function versionGet( - http: HttpClient, - rootUrl: string, - params?: VersionGet$Params, - context?: HttpContext, -): Observable> { +export function versionGet(http: HttpClient, rootUrl: string, params?: VersionGet$Params, context?: HttpContext): Observable> { const rb = new RequestBuilder(rootUrl, versionGet.PATH, 'get'); if (params) { } - return http - .request( - rb.build({ responseType: 'json', accept: 'application/json', context }), - ) - .pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse; - }), - ); + return http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); } versionGet.PATH = '/version'; diff --git a/src/app/core/api/models/ahb.ts b/src/app/core/api/models/ahb.ts index 8830649a5..3810fd4bb 100644 --- a/src/app/core/api/models/ahb.ts +++ b/src/app/core/api/models/ahb.ts @@ -2,20 +2,20 @@ /* eslint-disable */ export interface Ahb { lines: Array<{ - ahb_expression: string; - data_element: string; - guid: string; - index: number; - name: string; - section_name: string; - segment_code: string; - segment_group_key: string; - value_pool_entry: string; - }>; +'ahb_expression': string; +'data_element': string; +'guid': string; +'index': number; +'name': string; +'section_name': string; +'segment_code': string; +'segment_group_key': string; +'value_pool_entry': string; +}>; meta: { - description: string; - direction: string; - maus_version: string; - pruefidentifikator: string; - }; +'description': string; +'direction': string; +'maus_version': string; +'pruefidentifikator': string; +}; } diff --git a/src/app/core/api/request-builder.ts b/src/app/core/api/request-builder.ts index 49dd7c87b..5b7a63b87 100644 --- a/src/app/core/api/request-builder.ts +++ b/src/app/core/api/request-builder.ts @@ -1,12 +1,6 @@ /* tslint:disable */ /* eslint-disable */ -import { - HttpRequest, - HttpParameterCodec, - HttpParams, - HttpHeaders, - HttpContext, -} from '@angular/common/http'; +import { HttpRequest, HttpParameterCodec, HttpParams, HttpHeaders, HttpContext } from '@angular/common/http'; /** * Custom parameter codec to correctly handle the plus sign in parameter @@ -43,13 +37,7 @@ interface ParameterOptions { * Base class for a parameter */ abstract class Parameter { - constructor( - public name: string, - public value: any, - public options: ParameterOptions, - defaultStyle: string, - defaultExplode: boolean, - ) { + constructor(public name: string, public value: any, public options: ParameterOptions, defaultStyle: string, defaultExplode: boolean) { this.options = options || {}; if (this.options.style === null || this.options.style === undefined) { this.options.style = defaultStyle; @@ -63,21 +51,13 @@ abstract class Parameter { if (value === null || value === undefined) { return ''; } else if (value instanceof Array) { - return value - .map((v) => - this.serializeValue(v) - .split(separator) - .join(encodeURIComponent(separator)), - ) - .join(separator); + return value.map(v => this.serializeValue(v).split(separator).join(encodeURIComponent(separator))).join(separator); } else if (typeof value === 'object') { const array: string[] = []; for (const key of Object.keys(value)) { let propVal = value[key]; if (propVal !== null && propVal !== undefined) { - propVal = this.serializeValue(propVal) - .split(separator) - .join(encodeURIComponent(separator)); + propVal = this.serializeValue(propVal).split(separator).join(encodeURIComponent(separator)); if (this.options.explode) { array.push(`${key}=${propVal}`); } else { @@ -107,7 +87,7 @@ class PathParameter extends Parameter { value = ''; } let prefix = this.options.style === 'label' ? '.' : ''; - let separator = this.options.explode ? (prefix === '' ? ',' : prefix) : ','; + let separator = this.options.explode ? prefix === '' ? ',' : prefix : ','; let alreadySerialized = false; if (this.options.style === 'matrix') { // The parameter name is just used as prefix, except in some cases... @@ -116,36 +96,26 @@ class PathParameter extends Parameter { prefix = ';'; if (value instanceof Array) { // For arrays we have to repeat the name for each element - value = value.map( - (v) => `${this.name}=${this.serializeValue(v, ';')}`, - ); + value = value.map(v => `${this.name}=${this.serializeValue(v, ';')}`); value = value.join(';'); alreadySerialized = true; } else { // For objects we have to put each the key / value pairs value = this.serializeValue(value, ';'); - alreadySerialized = true; + alreadySerialized = true } } } - value = - prefix + - (alreadySerialized ? value : this.serializeValue(value, separator)); + value = prefix + (alreadySerialized ? value : this.serializeValue(value, separator)); // Replace both the plain variable and the corresponding variant taking in the prefix and explode into account path = path.replace(`{${this.name}}`, value); - path = path.replace( - `{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, - value, - ); + path = path.replace(`{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, value); return path; } // @ts-ignore serializeValue(value: any, separator = ','): string { - var result = - typeof value === 'string' - ? encodeURIComponent(value) - : super.serializeValue(value, separator); + var result = typeof value === 'string' ? encodeURIComponent(value) : super.serializeValue(value, separator); result = result.replace(/%3D/g, '='); result = result.replace(/%3B/g, ';'); result = result.replace(/%2C/g, ','); @@ -169,16 +139,10 @@ class QueryParameter extends Parameter { params = params.append(this.name, this.serializeValue(v)); } } else { - const separator = - this.options.style === 'spaceDelimited' - ? ' ' - : this.options.style === 'pipeDelimited' - ? '|' - : ','; - return params.append( - this.name, - this.serializeValue(this.value, separator), - ); + const separator = this.options.style === 'spaceDelimited' + ? ' ' : this.options.style === 'pipeDelimited' + ? '|' : ','; + return params.append(this.name, this.serializeValue(this.value, separator)); } } else if (this.value !== null && typeof this.value === 'object') { // Object serialization @@ -187,10 +151,7 @@ class QueryParameter extends Parameter { for (const key of Object.keys(this.value)) { const propVal = this.value[key]; if (propVal !== null && propVal !== undefined) { - params = params.append( - `${this.name}[${key}]`, - this.serializeValue(propVal), - ); + params = params.append(`${this.name}[${key}]`, this.serializeValue(propVal)); } } } else if (this.options.explode) { @@ -247,6 +208,7 @@ class HeaderParameter extends Parameter { * Helper to build http requests from parameters */ export class RequestBuilder { + private _path = new Map(); private _query = new Map(); private _header = new Map(); @@ -256,8 +218,8 @@ export class RequestBuilder { constructor( public rootUrl: string, public operationPath: string, - public method: string, - ) {} + public method: string) { + } /** * Sets a path parameter @@ -289,11 +251,7 @@ export class RequestBuilder { } else { this._bodyContentType = contentType; } - if ( - this._bodyContentType === 'application/x-www-form-urlencoded' && - value !== null && - typeof value === 'object' - ) { + if (this._bodyContentType === 'application/x-www-form-urlencoded' && value !== null && typeof value === 'object') { // Handle URL-encoded data const pairs: Array<[string, string]> = []; for (const key of Object.keys(value)) { @@ -308,9 +266,7 @@ export class RequestBuilder { } } } - this._bodyContent = pairs - .map((p) => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`) - .join('&'); + this._bodyContent = pairs.map(p => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`).join('&'); } else if (this._bodyContentType === 'multipart/form-data') { // Handle multipart form data const formData = new FormData(); @@ -347,7 +303,7 @@ export class RequestBuilder { return value; } if (typeof value === 'object') { - return new Blob([JSON.stringify(value)], { type: 'application/json' }); + return new Blob([JSON.stringify(value)], {type: 'application/json'}) } return String(value); } @@ -368,6 +324,7 @@ export class RequestBuilder { /** Allow passing HttpContext for HttpClient */ context?: HttpContext; }): HttpRequest { + options = options || {}; // Path parameters @@ -379,7 +336,7 @@ export class RequestBuilder { // Query parameters let httpParams = new HttpParams({ - encoder: ParameterCodecInstance, + encoder: ParameterCodecInstance }); for (const queryParam of this._query.values()) { httpParams = queryParam.append(httpParams); @@ -400,17 +357,12 @@ export class RequestBuilder { } // Perform the request - return new HttpRequest( - this.method.toUpperCase(), - url, - this._bodyContent, - { - params: httpParams, - headers: httpHeaders, - responseType: options.responseType, - reportProgress: options.reportProgress, - context: options.context, - }, - ); + return new HttpRequest(this.method.toUpperCase(), url, this._bodyContent, { + params: httpParams, + headers: httpHeaders, + responseType: options.responseType, + reportProgress: options.reportProgress, + context: options.context + }); } } diff --git a/src/app/core/api/services/ahb.service.ts b/src/app/core/api/services/ahb.service.ts index 3e8adb6e8..d1ae83cd8 100644 --- a/src/app/core/api/services/ahb.service.ts +++ b/src/app/core/api/services/ahb.service.ts @@ -17,6 +17,7 @@ import { GetFormatVersions$Params } from '../fn/ahb/get-format-versions'; import { getPruefis } from '../fn/ahb/get-pruefis'; import { GetPruefis$Params } from '../fn/ahb/get-pruefis'; + /** * Everything about AHB documents */ @@ -39,10 +40,7 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getAhb$Response( - params: GetAhb$Params, - context?: HttpContext, - ): Observable> { + getAhb$Response(params: GetAhb$Params, context?: HttpContext): Observable> { return getAhb(this.http, this.rootUrl, params, context); } @@ -58,7 +56,7 @@ export class AhbService extends BaseService { */ getAhb(params: GetAhb$Params, context?: HttpContext): Observable { return this.getAhb$Response(params, context).pipe( - map((r: StrictHttpResponse): Ahb => r.body), + map((r: StrictHttpResponse): Ahb => r.body) ); } @@ -75,10 +73,7 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getFormatVersions$Response( - params?: GetFormatVersions$Params, - context?: HttpContext, - ): Observable>> { + getFormatVersions$Response(params?: GetFormatVersions$Params, context?: HttpContext): Observable>> { return getFormatVersions(this.http, this.rootUrl, params, context); } @@ -92,18 +87,14 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getFormatVersions( - params?: GetFormatVersions$Params, - context?: HttpContext, - ): Observable> { + getFormatVersions(params?: GetFormatVersions$Params, context?: HttpContext): Observable> { return this.getFormatVersions$Response(params, context).pipe( - map((r: StrictHttpResponse>): Array => r.body), + map((r: StrictHttpResponse>): Array => r.body) ); } /** Path part for operation `getPruefis()` */ - static readonly GetPruefisPath = - '/api/format-versions/{format-version}/pruefis'; + static readonly GetPruefisPath = '/api/format-versions/{format-version}/pruefis'; /** * Get a list of all available Pruefidentifikators for a given format version. @@ -115,10 +106,7 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getPruefis$Response( - params: GetPruefis$Params, - context?: HttpContext, - ): Observable>> { + getPruefis$Response(params: GetPruefis$Params, context?: HttpContext): Observable>> { return getPruefis(this.http, this.rootUrl, params, context); } @@ -132,12 +120,10 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getPruefis( - params: GetPruefis$Params, - context?: HttpContext, - ): Observable> { + getPruefis(params: GetPruefis$Params, context?: HttpContext): Observable> { return this.getPruefis$Response(params, context).pipe( - map((r: StrictHttpResponse>): Array => r.body), + map((r: StrictHttpResponse>): Array => r.body) ); } + } diff --git a/src/app/core/api/services/maintenance.service.ts b/src/app/core/api/services/maintenance.service.ts index 88bc34851..db21b05ad 100644 --- a/src/app/core/api/services/maintenance.service.ts +++ b/src/app/core/api/services/maintenance.service.ts @@ -32,10 +32,7 @@ export class MaintenanceService extends BaseService { * * This method doesn't expect any request body. */ - versionGet$Response( - params?: VersionGet$Params, - context?: HttpContext, - ): Observable> { + versionGet$Response(params?: VersionGet$Params, context?: HttpContext): Observable> { return versionGet(this.http, this.rootUrl, params, context); } @@ -49,12 +46,10 @@ export class MaintenanceService extends BaseService { * * This method doesn't expect any request body. */ - versionGet( - params?: VersionGet$Params, - context?: HttpContext, - ): Observable { + versionGet(params?: VersionGet$Params, context?: HttpContext): Observable { return this.versionGet$Response(params, context).pipe( - map((r: StrictHttpResponse): Version => r.body), + map((r: StrictHttpResponse): Version => r.body) ); } + } diff --git a/src/app/core/api/strict-http-response.ts b/src/app/core/api/strict-http-response.ts index 174cdbd76..42589fac4 100644 --- a/src/app/core/api/strict-http-response.ts +++ b/src/app/core/api/strict-http-response.ts @@ -7,4 +7,4 @@ import { HttpResponse } from '@angular/common/http'; */ export type StrictHttpResponse = HttpResponse & { readonly body: T; -}; +} From 94600d00cb514b82a4ac6320ba0feb1318e24d94 Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 20:09:27 +0200 Subject: [PATCH 07/15] update openapi --- src/app/core/api/api.module.ts | 39 ++++--- src/app/core/api/base-service.ts | 5 +- src/app/core/api/fn/ahb/get-ahb.ts | 38 +++--- .../core/api/fn/ahb/get-format-versions.ts | 29 +++-- src/app/core/api/fn/ahb/get-pruefis.ts | 32 +++--- .../core/api/fn/maintenance/version-get.ts | 28 +++-- src/app/core/api/models/ahb.ts | 30 ++--- src/app/core/api/request-builder.ts | 108 +++++++++++++----- src/app/core/api/services/ahb.service.ts | 36 ++++-- .../core/api/services/maintenance.service.ts | 13 ++- src/app/core/api/strict-http-response.ts | 2 +- 11 files changed, 228 insertions(+), 132 deletions(-) diff --git a/src/app/core/api/api.module.ts b/src/app/core/api/api.module.ts index 21858cb53..d57cb6066 100644 --- a/src/app/core/api/api.module.ts +++ b/src/app/core/api/api.module.ts @@ -1,6 +1,11 @@ /* tslint:disable */ /* eslint-disable */ -import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core'; +import { + NgModule, + ModuleWithProviders, + SkipSelf, + Optional, +} from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { ApiConfiguration, ApiConfigurationParams } from './api-configuration'; @@ -14,35 +19,37 @@ import { MaintenanceService } from './services/maintenance.service'; imports: [], exports: [], declarations: [], - providers: [ - AhbService, - MaintenanceService, - ApiConfiguration - ], + providers: [AhbService, MaintenanceService, ApiConfiguration], }) export class ApiModule { - static forRoot(params: ApiConfigurationParams): ModuleWithProviders { + static forRoot( + params: ApiConfigurationParams, + ): ModuleWithProviders { return { ngModule: ApiModule, providers: [ { provide: ApiConfiguration, - useValue: params - } - ] - } + useValue: params, + }, + ], + }; } - constructor( + constructor( @Optional() @SkipSelf() parentModule: ApiModule, - @Optional() http: HttpClient + @Optional() http: HttpClient, ) { if (parentModule) { - throw new Error('ApiModule is already loaded. Import in your base AppModule only.'); + throw new Error( + 'ApiModule is already loaded. Import in your base AppModule only.', + ); } if (!http) { - throw new Error('You need to import the HttpClientModule in your AppModule! \n' + - 'See also https://github.com/angular/angular/issues/20575'); + throw new Error( + 'You need to import the HttpClientModule in your AppModule! \n' + + 'See also https://github.com/angular/angular/issues/20575', + ); } } } diff --git a/src/app/core/api/base-service.ts b/src/app/core/api/base-service.ts index 24c2c7270..c6b248ffa 100644 --- a/src/app/core/api/base-service.ts +++ b/src/app/core/api/base-service.ts @@ -11,9 +11,8 @@ import { ApiConfiguration } from './api-configuration'; export class BaseService { constructor( protected config: ApiConfiguration, - protected http: HttpClient - ) { - } + protected http: HttpClient, + ) {} private _rootUrl?: string; diff --git a/src/app/core/api/fn/ahb/get-ahb.ts b/src/app/core/api/fn/ahb/get-ahb.ts index 166247ec4..424497208 100644 --- a/src/app/core/api/fn/ahb/get-ahb.ts +++ b/src/app/core/api/fn/ahb/get-ahb.ts @@ -10,33 +10,39 @@ import { Ahb } from '../../models/ahb'; import { FormatVersion } from '../../models/format-version'; export interface GetAhb$Params { - -/** - * Formatversion of the AHB to return - */ + /** + * Formatversion of the AHB to return + */ 'format-version': FormatVersion; -/** - * Pruefidentifikator of the AHB to return - */ + /** + * Pruefidentifikator of the AHB to return + */ pruefi: string; } -export function getAhb(http: HttpClient, rootUrl: string, params: GetAhb$Params, context?: HttpContext): Observable> { +export function getAhb( + http: HttpClient, + rootUrl: string, + params: GetAhb$Params, + context?: HttpContext, +): Observable> { const rb = new RequestBuilder(rootUrl, getAhb.PATH, 'get'); if (params) { rb.path('format-version', params['format-version'], {}); rb.path('pruefi', params.pruefi, {}); } - return http.request( - rb.build({ responseType: 'json', accept: 'application/json', context }) - ).pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse; - }) - ); + return http + .request( + rb.build({ responseType: 'json', accept: 'application/json', context }), + ) + .pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }), + ); } getAhb.PATH = '/api/ahb/{format-version}/{pruefi}'; diff --git a/src/app/core/api/fn/ahb/get-format-versions.ts b/src/app/core/api/fn/ahb/get-format-versions.ts index 9dcfb3610..dd794cb5a 100644 --- a/src/app/core/api/fn/ahb/get-format-versions.ts +++ b/src/app/core/api/fn/ahb/get-format-versions.ts @@ -6,23 +6,28 @@ import { filter, map } from 'rxjs/operators'; import { StrictHttpResponse } from '../../strict-http-response'; import { RequestBuilder } from '../../request-builder'; +export interface GetFormatVersions$Params {} -export interface GetFormatVersions$Params { -} - -export function getFormatVersions(http: HttpClient, rootUrl: string, params?: GetFormatVersions$Params, context?: HttpContext): Observable>> { +export function getFormatVersions( + http: HttpClient, + rootUrl: string, + params?: GetFormatVersions$Params, + context?: HttpContext, +): Observable>> { const rb = new RequestBuilder(rootUrl, getFormatVersions.PATH, 'get'); if (params) { } - return http.request( - rb.build({ responseType: 'json', accept: 'application/json', context }) - ).pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse>; - }) - ); + return http + .request( + rb.build({ responseType: 'json', accept: 'application/json', context }), + ) + .pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse>; + }), + ); } getFormatVersions.PATH = '/api/format-versions'; diff --git a/src/app/core/api/fn/ahb/get-pruefis.ts b/src/app/core/api/fn/ahb/get-pruefis.ts index 4cbea1e29..8a5b3e952 100644 --- a/src/app/core/api/fn/ahb/get-pruefis.ts +++ b/src/app/core/api/fn/ahb/get-pruefis.ts @@ -9,27 +9,33 @@ import { RequestBuilder } from '../../request-builder'; import { FormatVersion } from '../../models/format-version'; export interface GetPruefis$Params { - -/** - * Formatversion of the AHB to return - */ + /** + * Formatversion of the AHB to return + */ 'format-version': FormatVersion; } -export function getPruefis(http: HttpClient, rootUrl: string, params: GetPruefis$Params, context?: HttpContext): Observable>> { +export function getPruefis( + http: HttpClient, + rootUrl: string, + params: GetPruefis$Params, + context?: HttpContext, +): Observable>> { const rb = new RequestBuilder(rootUrl, getPruefis.PATH, 'get'); if (params) { rb.path('format-version', params['format-version'], {}); } - return http.request( - rb.build({ responseType: 'json', accept: 'application/json', context }) - ).pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse>; - }) - ); + return http + .request( + rb.build({ responseType: 'json', accept: 'application/json', context }), + ) + .pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse>; + }), + ); } getPruefis.PATH = '/api/format-versions/{format-version}/pruefis'; diff --git a/src/app/core/api/fn/maintenance/version-get.ts b/src/app/core/api/fn/maintenance/version-get.ts index c7cfc34e6..b7ac219be 100644 --- a/src/app/core/api/fn/maintenance/version-get.ts +++ b/src/app/core/api/fn/maintenance/version-get.ts @@ -8,22 +8,28 @@ import { RequestBuilder } from '../../request-builder'; import { Version } from '../../models/version'; -export interface VersionGet$Params { -} +export interface VersionGet$Params {} -export function versionGet(http: HttpClient, rootUrl: string, params?: VersionGet$Params, context?: HttpContext): Observable> { +export function versionGet( + http: HttpClient, + rootUrl: string, + params?: VersionGet$Params, + context?: HttpContext, +): Observable> { const rb = new RequestBuilder(rootUrl, versionGet.PATH, 'get'); if (params) { } - return http.request( - rb.build({ responseType: 'json', accept: 'application/json', context }) - ).pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse; - }) - ); + return http + .request( + rb.build({ responseType: 'json', accept: 'application/json', context }), + ) + .pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }), + ); } versionGet.PATH = '/version'; diff --git a/src/app/core/api/models/ahb.ts b/src/app/core/api/models/ahb.ts index 3810fd4bb..8830649a5 100644 --- a/src/app/core/api/models/ahb.ts +++ b/src/app/core/api/models/ahb.ts @@ -2,20 +2,20 @@ /* eslint-disable */ export interface Ahb { lines: Array<{ -'ahb_expression': string; -'data_element': string; -'guid': string; -'index': number; -'name': string; -'section_name': string; -'segment_code': string; -'segment_group_key': string; -'value_pool_entry': string; -}>; + ahb_expression: string; + data_element: string; + guid: string; + index: number; + name: string; + section_name: string; + segment_code: string; + segment_group_key: string; + value_pool_entry: string; + }>; meta: { -'description': string; -'direction': string; -'maus_version': string; -'pruefidentifikator': string; -}; + description: string; + direction: string; + maus_version: string; + pruefidentifikator: string; + }; } diff --git a/src/app/core/api/request-builder.ts b/src/app/core/api/request-builder.ts index 5b7a63b87..49dd7c87b 100644 --- a/src/app/core/api/request-builder.ts +++ b/src/app/core/api/request-builder.ts @@ -1,6 +1,12 @@ /* tslint:disable */ /* eslint-disable */ -import { HttpRequest, HttpParameterCodec, HttpParams, HttpHeaders, HttpContext } from '@angular/common/http'; +import { + HttpRequest, + HttpParameterCodec, + HttpParams, + HttpHeaders, + HttpContext, +} from '@angular/common/http'; /** * Custom parameter codec to correctly handle the plus sign in parameter @@ -37,7 +43,13 @@ interface ParameterOptions { * Base class for a parameter */ abstract class Parameter { - constructor(public name: string, public value: any, public options: ParameterOptions, defaultStyle: string, defaultExplode: boolean) { + constructor( + public name: string, + public value: any, + public options: ParameterOptions, + defaultStyle: string, + defaultExplode: boolean, + ) { this.options = options || {}; if (this.options.style === null || this.options.style === undefined) { this.options.style = defaultStyle; @@ -51,13 +63,21 @@ abstract class Parameter { if (value === null || value === undefined) { return ''; } else if (value instanceof Array) { - return value.map(v => this.serializeValue(v).split(separator).join(encodeURIComponent(separator))).join(separator); + return value + .map((v) => + this.serializeValue(v) + .split(separator) + .join(encodeURIComponent(separator)), + ) + .join(separator); } else if (typeof value === 'object') { const array: string[] = []; for (const key of Object.keys(value)) { let propVal = value[key]; if (propVal !== null && propVal !== undefined) { - propVal = this.serializeValue(propVal).split(separator).join(encodeURIComponent(separator)); + propVal = this.serializeValue(propVal) + .split(separator) + .join(encodeURIComponent(separator)); if (this.options.explode) { array.push(`${key}=${propVal}`); } else { @@ -87,7 +107,7 @@ class PathParameter extends Parameter { value = ''; } let prefix = this.options.style === 'label' ? '.' : ''; - let separator = this.options.explode ? prefix === '' ? ',' : prefix : ','; + let separator = this.options.explode ? (prefix === '' ? ',' : prefix) : ','; let alreadySerialized = false; if (this.options.style === 'matrix') { // The parameter name is just used as prefix, except in some cases... @@ -96,26 +116,36 @@ class PathParameter extends Parameter { prefix = ';'; if (value instanceof Array) { // For arrays we have to repeat the name for each element - value = value.map(v => `${this.name}=${this.serializeValue(v, ';')}`); + value = value.map( + (v) => `${this.name}=${this.serializeValue(v, ';')}`, + ); value = value.join(';'); alreadySerialized = true; } else { // For objects we have to put each the key / value pairs value = this.serializeValue(value, ';'); - alreadySerialized = true + alreadySerialized = true; } } } - value = prefix + (alreadySerialized ? value : this.serializeValue(value, separator)); + value = + prefix + + (alreadySerialized ? value : this.serializeValue(value, separator)); // Replace both the plain variable and the corresponding variant taking in the prefix and explode into account path = path.replace(`{${this.name}}`, value); - path = path.replace(`{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, value); + path = path.replace( + `{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, + value, + ); return path; } // @ts-ignore serializeValue(value: any, separator = ','): string { - var result = typeof value === 'string' ? encodeURIComponent(value) : super.serializeValue(value, separator); + var result = + typeof value === 'string' + ? encodeURIComponent(value) + : super.serializeValue(value, separator); result = result.replace(/%3D/g, '='); result = result.replace(/%3B/g, ';'); result = result.replace(/%2C/g, ','); @@ -139,10 +169,16 @@ class QueryParameter extends Parameter { params = params.append(this.name, this.serializeValue(v)); } } else { - const separator = this.options.style === 'spaceDelimited' - ? ' ' : this.options.style === 'pipeDelimited' - ? '|' : ','; - return params.append(this.name, this.serializeValue(this.value, separator)); + const separator = + this.options.style === 'spaceDelimited' + ? ' ' + : this.options.style === 'pipeDelimited' + ? '|' + : ','; + return params.append( + this.name, + this.serializeValue(this.value, separator), + ); } } else if (this.value !== null && typeof this.value === 'object') { // Object serialization @@ -151,7 +187,10 @@ class QueryParameter extends Parameter { for (const key of Object.keys(this.value)) { const propVal = this.value[key]; if (propVal !== null && propVal !== undefined) { - params = params.append(`${this.name}[${key}]`, this.serializeValue(propVal)); + params = params.append( + `${this.name}[${key}]`, + this.serializeValue(propVal), + ); } } } else if (this.options.explode) { @@ -208,7 +247,6 @@ class HeaderParameter extends Parameter { * Helper to build http requests from parameters */ export class RequestBuilder { - private _path = new Map(); private _query = new Map(); private _header = new Map(); @@ -218,8 +256,8 @@ export class RequestBuilder { constructor( public rootUrl: string, public operationPath: string, - public method: string) { - } + public method: string, + ) {} /** * Sets a path parameter @@ -251,7 +289,11 @@ export class RequestBuilder { } else { this._bodyContentType = contentType; } - if (this._bodyContentType === 'application/x-www-form-urlencoded' && value !== null && typeof value === 'object') { + if ( + this._bodyContentType === 'application/x-www-form-urlencoded' && + value !== null && + typeof value === 'object' + ) { // Handle URL-encoded data const pairs: Array<[string, string]> = []; for (const key of Object.keys(value)) { @@ -266,7 +308,9 @@ export class RequestBuilder { } } } - this._bodyContent = pairs.map(p => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`).join('&'); + this._bodyContent = pairs + .map((p) => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`) + .join('&'); } else if (this._bodyContentType === 'multipart/form-data') { // Handle multipart form data const formData = new FormData(); @@ -303,7 +347,7 @@ export class RequestBuilder { return value; } if (typeof value === 'object') { - return new Blob([JSON.stringify(value)], {type: 'application/json'}) + return new Blob([JSON.stringify(value)], { type: 'application/json' }); } return String(value); } @@ -324,7 +368,6 @@ export class RequestBuilder { /** Allow passing HttpContext for HttpClient */ context?: HttpContext; }): HttpRequest { - options = options || {}; // Path parameters @@ -336,7 +379,7 @@ export class RequestBuilder { // Query parameters let httpParams = new HttpParams({ - encoder: ParameterCodecInstance + encoder: ParameterCodecInstance, }); for (const queryParam of this._query.values()) { httpParams = queryParam.append(httpParams); @@ -357,12 +400,17 @@ export class RequestBuilder { } // Perform the request - return new HttpRequest(this.method.toUpperCase(), url, this._bodyContent, { - params: httpParams, - headers: httpHeaders, - responseType: options.responseType, - reportProgress: options.reportProgress, - context: options.context - }); + return new HttpRequest( + this.method.toUpperCase(), + url, + this._bodyContent, + { + params: httpParams, + headers: httpHeaders, + responseType: options.responseType, + reportProgress: options.reportProgress, + context: options.context, + }, + ); } } diff --git a/src/app/core/api/services/ahb.service.ts b/src/app/core/api/services/ahb.service.ts index d1ae83cd8..3e8adb6e8 100644 --- a/src/app/core/api/services/ahb.service.ts +++ b/src/app/core/api/services/ahb.service.ts @@ -17,7 +17,6 @@ import { GetFormatVersions$Params } from '../fn/ahb/get-format-versions'; import { getPruefis } from '../fn/ahb/get-pruefis'; import { GetPruefis$Params } from '../fn/ahb/get-pruefis'; - /** * Everything about AHB documents */ @@ -40,7 +39,10 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getAhb$Response(params: GetAhb$Params, context?: HttpContext): Observable> { + getAhb$Response( + params: GetAhb$Params, + context?: HttpContext, + ): Observable> { return getAhb(this.http, this.rootUrl, params, context); } @@ -56,7 +58,7 @@ export class AhbService extends BaseService { */ getAhb(params: GetAhb$Params, context?: HttpContext): Observable { return this.getAhb$Response(params, context).pipe( - map((r: StrictHttpResponse): Ahb => r.body) + map((r: StrictHttpResponse): Ahb => r.body), ); } @@ -73,7 +75,10 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getFormatVersions$Response(params?: GetFormatVersions$Params, context?: HttpContext): Observable>> { + getFormatVersions$Response( + params?: GetFormatVersions$Params, + context?: HttpContext, + ): Observable>> { return getFormatVersions(this.http, this.rootUrl, params, context); } @@ -87,14 +92,18 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getFormatVersions(params?: GetFormatVersions$Params, context?: HttpContext): Observable> { + getFormatVersions( + params?: GetFormatVersions$Params, + context?: HttpContext, + ): Observable> { return this.getFormatVersions$Response(params, context).pipe( - map((r: StrictHttpResponse>): Array => r.body) + map((r: StrictHttpResponse>): Array => r.body), ); } /** Path part for operation `getPruefis()` */ - static readonly GetPruefisPath = '/api/format-versions/{format-version}/pruefis'; + static readonly GetPruefisPath = + '/api/format-versions/{format-version}/pruefis'; /** * Get a list of all available Pruefidentifikators for a given format version. @@ -106,7 +115,10 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getPruefis$Response(params: GetPruefis$Params, context?: HttpContext): Observable>> { + getPruefis$Response( + params: GetPruefis$Params, + context?: HttpContext, + ): Observable>> { return getPruefis(this.http, this.rootUrl, params, context); } @@ -120,10 +132,12 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getPruefis(params: GetPruefis$Params, context?: HttpContext): Observable> { + getPruefis( + params: GetPruefis$Params, + context?: HttpContext, + ): Observable> { return this.getPruefis$Response(params, context).pipe( - map((r: StrictHttpResponse>): Array => r.body) + map((r: StrictHttpResponse>): Array => r.body), ); } - } diff --git a/src/app/core/api/services/maintenance.service.ts b/src/app/core/api/services/maintenance.service.ts index db21b05ad..88bc34851 100644 --- a/src/app/core/api/services/maintenance.service.ts +++ b/src/app/core/api/services/maintenance.service.ts @@ -32,7 +32,10 @@ export class MaintenanceService extends BaseService { * * This method doesn't expect any request body. */ - versionGet$Response(params?: VersionGet$Params, context?: HttpContext): Observable> { + versionGet$Response( + params?: VersionGet$Params, + context?: HttpContext, + ): Observable> { return versionGet(this.http, this.rootUrl, params, context); } @@ -46,10 +49,12 @@ export class MaintenanceService extends BaseService { * * This method doesn't expect any request body. */ - versionGet(params?: VersionGet$Params, context?: HttpContext): Observable { + versionGet( + params?: VersionGet$Params, + context?: HttpContext, + ): Observable { return this.versionGet$Response(params, context).pipe( - map((r: StrictHttpResponse): Version => r.body) + map((r: StrictHttpResponse): Version => r.body), ); } - } diff --git a/src/app/core/api/strict-http-response.ts b/src/app/core/api/strict-http-response.ts index 42589fac4..174cdbd76 100644 --- a/src/app/core/api/strict-http-response.ts +++ b/src/app/core/api/strict-http-response.ts @@ -7,4 +7,4 @@ import { HttpResponse } from '@angular/common/http'; */ export type StrictHttpResponse = HttpResponse & { readonly body: T; -} +}; From bb8f858be187c56472c88cfa096e30c29d78c1cb Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 20:09:45 +0200 Subject: [PATCH 08/15] Add individual pruefi inputs --- .../format-version-select.component.html | 20 ++--- .../format-version-select.component.ts | 7 +- .../pruefi-input/pruefi-input.component.html | 20 ++--- .../pruefi-input/pruefi-input.component.ts | 11 ++- .../ahb-landing-page.component.html | 2 +- .../views/ahb-page/ahb-page.component.html | 33 +++++++- .../ahbs/views/ahb-page/ahb-page.component.ts | 79 +++++++++++++++---- .../components/header/header.component.html | 2 +- 8 files changed, 132 insertions(+), 42 deletions(-) diff --git a/src/app/features/ahbs/components/format-version-select/format-version-select.component.html b/src/app/features/ahbs/components/format-version-select/format-version-select.component.html index 47b2db568..e9ffd5f7f 100644 --- a/src/app/features/ahbs/components/format-version-select/format-version-select.component.html +++ b/src/app/features/ahbs/components/format-version-select/format-version-select.component.html @@ -1,9 +1,11 @@ - +@if (formatVersions$ | async; as formatVersions) { + +} diff --git a/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts b/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts index 30df14f1b..0b588377c 100644 --- a/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts +++ b/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts @@ -7,7 +7,7 @@ import { ReactiveFormsModule, } from '@angular/forms'; import { AhbService } from '../../../../core/api'; -import { Observable } from 'rxjs'; +import { Observable, tap } from 'rxjs'; import { CommonModule } from '@angular/common'; @Component({ @@ -35,7 +35,10 @@ export class FormatVersionSelectComponent constructor(private readonly ahbService: AhbService) {} ngOnInit(): void { - this.formatVersions$ = this.ahbService.getFormatVersions(); + this.control.disable(); + this.formatVersions$ = this.ahbService + .getFormatVersions() + .pipe(tap(() => this.control.enable())); } writeValue(formatVersion: string): void { diff --git a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.html b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.html index f1f682719..5e42e2c8b 100644 --- a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.html +++ b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.html @@ -1,9 +1,11 @@ - +@if (pruefis$ | async; as pruefis) { + +} diff --git a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts index 142779e15..2ed13e6b2 100644 --- a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts +++ b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts @@ -8,7 +8,7 @@ import { } from '@angular/forms'; import { AhbService } from '../../../../core/api'; import { CommonModule } from '@angular/common'; -import { of } from 'rxjs'; +import { map, of, tap } from 'rxjs'; @Component({ selector: 'app-pruefi-input', @@ -39,9 +39,12 @@ export class PruefiInputComponent implements ControlValueAccessor { this.pruefis$ = of([]); return; } - this.pruefis$ = this.ahbService.getPruefis({ - 'format-version': formatVersion, - }); + this.control.disable(); + this.pruefis$ = this.ahbService + .getPruefis({ + 'format-version': formatVersion, + }) + .pipe(tap(() => this.control.enable())); }); } diff --git a/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html b/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html index bafecf2c7..d3951c00d 100644 --- a/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html +++ b/src/app/features/ahbs/views/ahb-landing-page/ahb-landing-page.component.html @@ -61,7 +61,7 @@

data-twe-ripple-color="light" (click)="onClickSubmit()" > - Dokument oeffnen + Dokument öffnen

diff --git a/src/app/features/ahbs/views/ahb-page/ahb-page.component.html b/src/app/features/ahbs/views/ahb-page/ahb-page.component.html index 2e793b29b..57fab766f 100644 --- a/src/app/features/ahbs/views/ahb-page/ahb-page.component.html +++ b/src/app/features/ahbs/views/ahb-page/ahb-page.component.html @@ -1,4 +1,35 @@ - + +
+ + @if ( + headerSearchForm.controls.formatVersion.errors?.["required"] && + (headerSearchForm.controls.formatVersion.dirty || + headerSearchForm.controls.formatVersion.touched) + ) { +

Dieses Feld ist ein Pflichtfeld

+ } + + @if ( + headerSearchForm.controls.pruefi.errors?.["required"] && + (headerSearchForm.controls.pruefi.dirty || + headerSearchForm.controls.pruefi.touched) + ) { +

Dieses Feld ist ein Pflichtfeld

+ } + + + + +
@if (ahb$ | async; as ahb) {
diff --git a/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts b/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts index 8aafde76b..b372fd023 100644 --- a/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts +++ b/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts @@ -1,10 +1,27 @@ -import { Component, Input, OnChanges, OnInit } from '@angular/core'; +import { + Component, + Input, + OnChanges, + OnInit, + SimpleChanges, + effect, + input, +} from '@angular/core'; import { HeaderComponent } from '../../../../shared/components/header/header.component'; import { AhbTableComponent } from '../../components/ahb-table/ahb-table.component'; import { Ahb, AhbService, FormatVersion } from '../../../../core/api'; import { CommonModule } from '@angular/common'; -import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; import { Observable, map, shareReplay } from 'rxjs'; +import { Router } from '@angular/router'; +import { FormatVersionSelectComponent } from '../../components/format-version-select/format-version-select.component'; +import { PruefiInputComponent } from '../../components/pruefi-input/pruefi-input.component'; @Component({ selector: 'app-ahb-page', @@ -15,32 +32,52 @@ import { Observable, map, shareReplay } from 'rxjs'; CommonModule, FormsModule, ReactiveFormsModule, + FormatVersionSelectComponent, + PruefiInputComponent, ], templateUrl: './ahb-page.component.html', }) -export class AhbPageComponent implements OnChanges { - @Input() formatVersion!: string; - @Input() pruefi!: string; +export class AhbPageComponent { + formatVersion = input.required(); + pruefi = input.required(); searchQuery = new FormControl(''); ahb$?: Observable; lines$?: Observable; - constructor(private readonly ahbService: AhbService) {} + headerSearchForm = new FormGroup({ + formatVersion: new FormControl('', Validators.required), + pruefi: new FormControl('', Validators.required), + }); - ngOnChanges(): void { - this.ahb$ = this.ahbService - .getAhb({ - 'format-version': this.formatVersion as FormatVersion, // todo remove cast -> fix openapi spec - pruefi: this.pruefi, - }) - .pipe(shareReplay()); - this.lines$ = this.ahb$.pipe(map((ahb) => ahb.lines)); + constructor( + private readonly ahbService: AhbService, + private readonly router: Router, + ) { + effect(() => { + this.ahb$ = this.ahbService + .getAhb({ + 'format-version': this.formatVersion(), + pruefi: this.pruefi(), + }) + .pipe(shareReplay()); + this.lines$ = this.ahb$.pipe(map((ahb) => ahb.lines)); + setTimeout(() => { + this.headerSearchForm.setValue({ + formatVersion: this.formatVersion(), + pruefi: this.pruefi(), + }); + }, 1000); + console.log( + this.formatVersion(), + this.pruefi(), + this.headerSearchForm.value, + ); + }); } onSearchQueryChange() { - console.log(this.searchQuery.value); this.lines$ = this.ahb$?.pipe( map((ahb) => ahb.lines), map( @@ -51,4 +88,16 @@ export class AhbPageComponent implements OnChanges { ), ); } + + onClickHeaderSearchSubmit() { + if (!this.headerSearchForm.valid) { + this.headerSearchForm.markAllAsTouched(); + return; + } + this.router.navigate([ + '/ahb', + this.headerSearchForm.value.formatVersion, + this.headerSearchForm.value.pruefi, + ]); + } } diff --git a/src/app/shared/components/header/header.component.html b/src/app/shared/components/header/header.component.html index fbe44a60d..512d92273 100644 --- a/src/app/shared/components/header/header.component.html +++ b/src/app/shared/components/header/header.component.html @@ -14,6 +14,6 @@

AHB Tabelle

+ - From 71cbf3180c987825c11db4507bbee563c39ae441 Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 20:11:20 +0200 Subject: [PATCH 09/15] Cleanup --- .example.env | 2 +- .../ahbs/views/ahb-page/ahb-page.component.ts | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.example.env b/.example.env index c5b000fbc..bcbfdfb7c 100644 --- a/.example.env +++ b/.example.env @@ -1,4 +1,4 @@ -ENABLE_CORS=false +ENABLE_CORS=true AHB_CONTAINER_NAME='uploaded-files' AZURE_BLOB_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol='http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;' diff --git a/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts b/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts index b372fd023..b42c90fa1 100644 --- a/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts +++ b/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts @@ -63,17 +63,10 @@ export class AhbPageComponent { }) .pipe(shareReplay()); this.lines$ = this.ahb$.pipe(map((ahb) => ahb.lines)); - setTimeout(() => { - this.headerSearchForm.setValue({ - formatVersion: this.formatVersion(), - pruefi: this.pruefi(), - }); - }, 1000); - console.log( - this.formatVersion(), - this.pruefi(), - this.headerSearchForm.value, - ); + this.headerSearchForm.setValue({ + formatVersion: this.formatVersion(), + pruefi: this.pruefi(), + }); }); } From f11e379360d9204a0bb69c4e3360f7b3700f5155 Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 20:18:11 +0200 Subject: [PATCH 10/15] Add github actions --- .eslintrc.json | 41 + .github/workflows/action_pull_request.yml | 31 + .gitignore | 3 + angular.json | 9 +- package-lock.json | 2558 +++++++++++++++++++-- package.json | 11 +- 6 files changed, 2433 insertions(+), 220 deletions(-) create mode 100644 .eslintrc.json create mode 100644 .github/workflows/action_pull_request.yml diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..1d6e2c032 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,41 @@ +{ + "root": true, + "ignorePatterns": ["projects/**/*"], + "overrides": [ + { + "files": ["*.ts"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ] + } + }, + { + "files": ["*.html"], + "extends": [ + "plugin:@angular-eslint/template/recommended", + "plugin:@angular-eslint/template/accessibility" + ], + "rules": {} + } + ] +} diff --git a/.github/workflows/action_pull_request.yml b/.github/workflows/action_pull_request.yml new file mode 100644 index 000000000..8bf04486e --- /dev/null +++ b/.github/workflows/action_pull_request.yml @@ -0,0 +1,31 @@ +name: "Pull Request" +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.ref }} + fetch-depth: 0 + + - uses: actions/setup-node@v2 + with: + node-version: "20.13" + cache: "npm" + + - name: Install modules + run: npm ci + + - name: Lint frontend + run: npm run ng:lint + + - name: Prettier + run: npm run format:check diff --git a/.gitignore b/.gitignore index e2928b31c..a0fb981f5 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ testem.log # System files .DS_Store Thumbs.db + +.nx/cache +.nx/workspace-data diff --git a/angular.json b/angular.json index 9820ca0dc..0075c0d03 100644 --- a/angular.json +++ b/angular.json @@ -73,11 +73,18 @@ "styles": ["src/styles.scss"], "scripts": [] } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"] + } } } } }, "cli": { - "analytics": false + "analytics": false, + "schematicCollections": ["@angular-eslint/schematics"] } } diff --git a/package-lock.json b/package-lock.json index bb7f4ebad..e54659c51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,11 +27,19 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.3.7", + "@angular-eslint/builder": "17.4.1", + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@angular-eslint/schematics": "17.4.1", + "@angular-eslint/template-parser": "17.4.1", "@angular/cli": "^17.3.7", "@angular/compiler-cli": "^17.3.0", "@types/jasmine": "~5.1.0", + "@typescript-eslint/eslint-plugin": "7.8.0", + "@typescript-eslint/parser": "7.8.0", "autoprefixer": "^10.4.19", "concurrently": "^8.2.2", + "eslint": "^8.57.0", "jasmine-core": "~5.1.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", @@ -344,6 +352,139 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-eslint/builder": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.4.1.tgz", + "integrity": "sha512-UVnErsAGXTi8OChkoSxDVVGV2jkFpTaXQT+0fgapSwaOt3Ki7BVwJJoNaX0Zs01c64bjNPZ5ONb/i6nC8QiP9Q==", + "dev": true, + "dependencies": { + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", + "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", + "dev": true + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.1.tgz", + "integrity": "sha512-05bN1UB4H2CuX7Sw6fz+rMobsa+Bl3g15IYldH08hbJSnVemO8mf86bIjRN2Th79sO9WOiXXimnfIt7KRf8l0Q==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", + "@typescript-eslint/utils": "7.8.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.1.tgz", + "integrity": "sha512-oYP7yzOpn63g1Mpwc8F8ERiywaGRhAs27ttI9t+5NXaLrwHSfc/AJleC7jjkB5xu1p88JY1mb4oIYOjeZAhHIg==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", + "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", + "dev": true, + "dependencies": { + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", + "ignore": "5.3.1", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", + "strip-json-comments": "3.1.1", + "tmp": "0.2.3" + }, + "peerDependencies": { + "@angular/cli": ">= 17.0.0 < 18.0.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.1.tgz", + "integrity": "sha512-fJQpwQXexgs7Z3yYpQAfuAkFB2Y5H8SSlo+eAPPafOOPpPSIm/yP4dQ2e06tE8zWB5yjYnVBMJnUKSmG5GJSDw==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "eslint-scope": "^8.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@angular-eslint/template-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.1.tgz", + "integrity": "sha512-ptpWSrN7hfLtbStOB5vlwjh088WRu+sT1XIXCROrX5uXR5sQMu5ZitnoObSe+Of+1lugguPvMvFm/pzTMp3LIg==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@typescript-eslint/utils": "7.8.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, "node_modules/@angular/animations": { "version": "17.3.8", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.8.tgz", @@ -2958,6 +3099,162 @@ "node": ">=12" } }, + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.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==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.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==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "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==", + "dev": true + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3079,6 +3376,18 @@ "node": ">=8" } }, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -3493,54 +3802,85 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", - "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", - "engines": { - "node": ">=8.0.0" + "node_modules/@nrwl/devkit": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.0.4.tgz", + "integrity": "sha512-wOb7qiluWjVgmfhIGxWXAgJ61ZoL7rDYfx0mibPhbBlqm+86NHJ9CbKTfbfamS20fkzCYdhYeE6xd7sdpcZIZA==", + "dev": true, + "dependencies": { + "@nx/devkit": "19.0.4" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@nrwl/tao": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.0.4.tgz", + "integrity": "sha512-ZoHM5hbj0fOaWiiQoN/Wjozc6lbBCCcH7jCIX7amN6aztmcwNYk+Q3NKJE5Jh0/Js5M78VTnLRG2h4KHPzKSKg==", "dev": true, - "optional": true, - "engines": { - "node": ">=14" + "dependencies": { + "nx": "19.0.4", + "tslib": "^2.3.0" + }, + "bin": { + "tao": "index.js" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", - "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", - "cpu": [ - "arm" - ], + "node_modules/@nx/devkit": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.0.4.tgz", + "integrity": "sha512-nsD0RaL61nZLHSJbog2XwxcI8bML5GlI69Z1k2rvd2zvylqdjNS4SXakMPl/Ar9xX2mAW3Qbup850V0jG87y/Q==", "dev": true, - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@nrwl/devkit": "19.0.4", + "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": ">= 17 <= 20" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", - "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", - "cpu": [ - "arm64" - ], + "node_modules/@nx/devkit/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", - "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "node_modules/@nx/devkit/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/devkit/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.0.4.tgz", + "integrity": "sha512-EwTMKVFdMF42b+DG3ACtrGVE3iiAgOw+VJ4Vekm59+ZkTg6GrZly2VNbthoNSJd6/uPQssoljx36NZH953ieBw==", "cpu": [ "arm64" ], @@ -3548,12 +3888,216 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", - "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "node_modules/@nx/nx-darwin-x64": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.0.4.tgz", + "integrity": "sha512-W+SVaYOHWRHcws7wZVcWyxoT57r1qXLMUBvpTVBf5PsVfsI+t9sINwzZjcXWaGNVcPGrVYUZF6Cp3/exkPNUBw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.0.4.tgz", + "integrity": "sha512-8Wl2+TOXiRDLbI8mwsbx1sHQLKAaNvfTm2e5Kf+4ay4W/UsrHONRDRA4d/LhMOLQMo+2+q2q+u8DziqT0w0Vaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.0.4.tgz", + "integrity": "sha512-C3PBsyNM5Npq8G8h/WHjUwwlKZpfWK4tK1ZeNseb6LtoNIgNF0PVrJQERqXABt29lanoQ4SeJ8RPgppB3xgCwg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.0.4.tgz", + "integrity": "sha512-d7gJv/QlaaBKTHpN+DmnQvo1FBNOGfh9b819WMaNXgDLSNpw9CpaOBZPbPgduee3OaGwbfWmll8VDYzUZgKWuw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.0.4.tgz", + "integrity": "sha512-lQ76O4AtXAQJ6r1MdVDVp4GG+o2vylWFjcyZvZpclhjag+fWKSdO0igL/14HsqNwCPmcPtaHmgqQNlw3MMtL3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.0.4.tgz", + "integrity": "sha512-1K95WMdKHM4pMACzsO9m9TWqSXwL5cg9/1UuS9LUKhjY/bX2y3iTtzT0tFBptCVzRVLZG8wAZphxwQfBIQvnCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.0.4.tgz", + "integrity": "sha512-iZ+TH/qT2R6nb+bqL8oJDDeUUEJmzYxtacFlf5yLjaiG5nvOxq7cu/lUw/LEqT+BUgK33T7acr3BDC0/q2bFZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.0.4.tgz", + "integrity": "sha512-YiRyGZecH4hIy5shZz8SNX5NwY+dZC3Xs09QlMeLKNhf6klfmjJYNtd+9250V4cjJS3opKYf08uG4x+EtuEB5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.0.4.tgz", + "integrity": "sha512-eHEdPjV0GlblyBM501xfe47tPRzugw2U+YOkZh++Ago9MDOrs/ULS9+RM3NhvZl2WnkpNYDbQMjzbQ0r7rxlTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", + "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", "cpu": [ "x64" ], @@ -3818,6 +4362,12 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -4050,6 +4600,12 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -4106,76 +4662,325 @@ "@types/node": "*" } }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", + "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, "engines": { - "node": ">=14.6.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "node_modules/@typescript-eslint/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "node_modules/@typescript-eslint/type-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", @@ -4282,6 +5087,37 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -4324,6 +5160,15 @@ "acorn": "^8" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", @@ -4524,11 +5369,35 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, "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==" }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4571,6 +5440,26 @@ "postcss": "^8.1.0" } }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -5901,6 +6790,12 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -5966,6 +6861,15 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -5993,6 +6897,15 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6023,6 +6936,18 @@ "node": ">=6" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -6101,6 +7026,21 @@ "url": "https://dotenvx.com" } }, + "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==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -6112,11 +7052,26 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "node_modules/electron-to-chromium": { - "version": "1.4.763", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz", - "integrity": "sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==", - "dev": true + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.763", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz", + "integrity": "sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==", + "dev": true }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6162,6 +7117,15 @@ "node": ">=0.10.0" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/engine.io": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", @@ -6205,6 +7169,18 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -6335,47 +7311,390 @@ "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", "dev": true, - "bin": { - "esbuild": "bin/esbuild" + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/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, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/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/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, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/eslint/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, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -6391,6 +7710,27 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -6616,6 +7956,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -6652,6 +7998,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6747,6 +8135,20 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", @@ -6843,6 +8245,12 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -7055,6 +8463,12 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -7707,6 +9121,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -7925,15 +9348,197 @@ "funding": { "url": "https://github.com/sponsors/isaacs" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine-core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz", + "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/jasmine-core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz", - "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", - "dev": true + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, "node_modules/jest-worker": { "version": "27.5.1", @@ -8019,6 +9624,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", @@ -8040,6 +9651,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -8287,6 +9904,15 @@ "node": ">=10" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8408,6 +10034,19 @@ "node": ">=0.10.0" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/license-webpack-plugin": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", @@ -8482,6 +10121,12 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9077,6 +10722,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/needle": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", @@ -9367,6 +11018,12 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -9455,138 +11112,426 @@ "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.2.1.tgz", + "integrity": "sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA==", + "dev": true, + "dependencies": { + "@npmcli/redact": "^1.1.0", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-watch": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.13.0.tgz", + "integrity": "sha512-MYcgocqCzYA44feZhFoYj69FfSaO0EeRE1gcRcmPaXIpNhUMAhNJ1pwic2C4Hn0OPOQmZKSl90CPgmwvOsVhTg==", + "dev": true, + "dependencies": { + "nodemon": "^3.0.1", + "through2": "^4.0.2" + }, + "bin": { + "npm-watch": "cli.js" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nx": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.0.4.tgz", + "integrity": "sha512-E+wkP3H+23Vu9jso6Xw7cbXPzy2PMyrPukrEUDWkQrr/eCqf0Npkj5zky1/lKFSBaLtNYgsFD21co+b4rwxtdw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/tao": "19.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.6.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.3.1", + "dotenv-expand": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "js-yaml": "4.1.0", + "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", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.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": "19.0.4", + "@nx/nx-darwin-x64": "19.0.4", + "@nx/nx-freebsd-x64": "19.0.4", + "@nx/nx-linux-arm-gnueabihf": "19.0.4", + "@nx/nx-linux-arm64-gnu": "19.0.4", + "@nx/nx-linux-arm64-musl": "19.0.4", + "@nx/nx-linux-x64-gnu": "19.0.4", + "@nx/nx-linux-x64-musl": "19.0.4", + "@nx/nx-win32-arm64-msvc": "19.0.4", + "@nx/nx-win32-x64-msvc": "19.0.4" + }, + "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/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nx/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/nx/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=7.0.0" } }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "node_modules/nx/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nx/node_modules/dotenv": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", + "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/nx/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { - "semver": "^7.1.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14.14" } }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "node_modules/nx/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 + }, + "node_modules/nx/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { - "ignore-walk": "^6.0.4" + "universalify": "^2.0.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/npm-pick-manifest": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", - "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "node_modules/nx/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/npm-registry-fetch": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.2.1.tgz", - "integrity": "sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA==", + "node_modules/nx/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "@npmcli/redact": "^1.1.0", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm-registry-fetch/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, + "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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/npm-watch": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.13.0.tgz", - "integrity": "sha512-MYcgocqCzYA44feZhFoYj69FfSaO0EeRE1gcRcmPaXIpNhUMAhNJ1pwic2C4Hn0OPOQmZKSl90CPgmwvOsVhTg==", + "node_modules/nx/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "dependencies": { - "nodemon": "^3.0.1", - "through2": "^4.0.2" - }, - "bin": { - "npm-watch": "cli.js" + "engines": { + "node": ">=14.14" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/nx/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": ">= 10.0.0" } }, "node_modules/object-assign": { @@ -9681,6 +11626,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -10427,6 +12389,15 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", @@ -10441,6 +12412,32 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -10503,6 +12500,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -10599,6 +12602,12 @@ "node": ">= 0.8" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -11805,6 +13814,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -11814,6 +13832,35 @@ "node": ">=6" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -11999,6 +14046,22 @@ "node": ">=10" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -12165,6 +14228,12 @@ "node": ">=8" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -12186,6 +14255,12 @@ "node": ">=0.8" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", @@ -12289,12 +14364,38 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -12747,6 +14848,18 @@ "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -13848,6 +15961,15 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index e97ebfde9..37cfb959b 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "server:watch": "npm-watch server:start", "format:check": "prettier '**/*.{js,jsx,ts,tsx,html,css,scss,json,yml,md}' --check", "format": "prettier '**/*.{js,jsx,ts,tsx,html,css,scss,json,yml,md}' --write", - "ng-openapi-gen": "ng-openapi-gen --input openapi.yml --output ./src/app/core/api --indexFile=true" + "ng-openapi-gen": "ng-openapi-gen --input openapi.yml --output ./src/app/core/api --indexFile=true", + "lint": "ng lint" }, "watch": { "server:start": { @@ -46,11 +47,19 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.3.7", + "@angular-eslint/builder": "17.4.1", + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@angular-eslint/schematics": "17.4.1", + "@angular-eslint/template-parser": "17.4.1", "@angular/cli": "^17.3.7", "@angular/compiler-cli": "^17.3.0", "@types/jasmine": "~5.1.0", + "@typescript-eslint/eslint-plugin": "7.8.0", + "@typescript-eslint/parser": "7.8.0", "autoprefixer": "^10.4.19", "concurrently": "^8.2.2", + "eslint": "^8.57.0", "jasmine-core": "~5.1.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", From bd956b810affbce0115bf4af8825ec3cd20cbb3f Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 20:36:58 +0200 Subject: [PATCH 11/15] sort --- .github/workflows/action_pull_request.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/action_pull_request.yml b/.github/workflows/action_pull_request.yml index 8bf04486e..b45453cf8 100644 --- a/.github/workflows/action_pull_request.yml +++ b/.github/workflows/action_pull_request.yml @@ -24,8 +24,8 @@ jobs: - name: Install modules run: npm ci - - name: Lint frontend - run: npm run ng:lint - - name: Prettier run: npm run format:check + + - name: Lint frontend + run: npm run ng:lint From 53530687704e00cc9cfc6b4d29bf838666425844 Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 21:06:04 +0200 Subject: [PATCH 12/15] Fix lint --- src/app/app.routes.ts | 1 - .../format-version-select.component.ts | 2 +- .../pruefi-input/pruefi-input.component.ts | 2 +- .../ahbs/views/ahb-page/ahb-page.component.ts | 12 ++---------- src/server/infrastructure/errors.ts | 2 +- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index f42655d5c..129e27747 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,5 +1,4 @@ import { Routes } from '@angular/router'; -import { LandingPageComponent } from './features/landingpage/views/landing-page/landing-page.component'; export const routes: Routes = [ { diff --git a/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts b/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts index 0b588377c..1003e2cb6 100644 --- a/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts +++ b/src/app/features/ahbs/components/format-version-select/format-version-select.component.ts @@ -49,7 +49,7 @@ export class FormatVersionSelectComponent this.onChange = fn; } - registerOnTouched(fn: () => void): void { + registerOnTouched(): void { // do nothing } diff --git a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts index 2ed13e6b2..b99b82f2a 100644 --- a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts +++ b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts @@ -8,7 +8,7 @@ import { } from '@angular/forms'; import { AhbService } from '../../../../core/api'; import { CommonModule } from '@angular/common'; -import { map, of, tap } from 'rxjs'; +import { of, tap } from 'rxjs'; @Component({ selector: 'app-pruefi-input', diff --git a/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts b/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts index b42c90fa1..7caf9e32c 100644 --- a/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts +++ b/src/app/features/ahbs/views/ahb-page/ahb-page.component.ts @@ -1,15 +1,7 @@ -import { - Component, - Input, - OnChanges, - OnInit, - SimpleChanges, - effect, - input, -} from '@angular/core'; +import { Component, effect, input } from '@angular/core'; import { HeaderComponent } from '../../../../shared/components/header/header.component'; import { AhbTableComponent } from '../../components/ahb-table/ahb-table.component'; -import { Ahb, AhbService, FormatVersion } from '../../../../core/api'; +import { Ahb, AhbService } from '../../../../core/api'; import { CommonModule } from '@angular/common'; import { FormControl, diff --git a/src/server/infrastructure/errors.ts b/src/server/infrastructure/errors.ts index 083e42513..18c375815 100644 --- a/src/server/infrastructure/errors.ts +++ b/src/server/infrastructure/errors.ts @@ -2,7 +2,7 @@ import { ErrorRequestHandler } from 'express'; export class NotFoundError extends Error {} -export const httpErrorHandler: ErrorRequestHandler = (err, _, res, _next) => { +export const httpErrorHandler: ErrorRequestHandler = (err, _, res) => { console.error('in error handler'); if (err instanceof NotFoundError) { res.status(404).json({ From 4cef9f99db19eb9a2fcc369ad4c3c8da5a113bd8 Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 21:06:14 +0200 Subject: [PATCH 13/15] Add more github action steps --- .github/workflows/action_pull_request.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/action_pull_request.yml b/.github/workflows/action_pull_request.yml index b45453cf8..2fa5c048e 100644 --- a/.github/workflows/action_pull_request.yml +++ b/.github/workflows/action_pull_request.yml @@ -29,3 +29,18 @@ jobs: - name: Lint frontend run: npm run ng:lint + + - name: Lint server + run: exit 0 # todo: add stuff + + - name: Test frontend + run: exit 0 # todo: add stuff + + - name: Test server + run: exit 0 # todo: add stuff + + - name: Build frontend + run: npm run ng:build + + - name: Build server + run: npm run server:build From 8eaf6076d6fff2402260a369371b1514f64b963c Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 21:07:58 +0200 Subject: [PATCH 14/15] Fix lint --- .../ahbs/components/pruefi-input/pruefi-input.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts index b99b82f2a..2b4a3bc2e 100644 --- a/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts +++ b/src/app/features/ahbs/components/pruefi-input/pruefi-input.component.ts @@ -56,7 +56,7 @@ export class PruefiInputComponent implements ControlValueAccessor { this.onChange = fn; } - registerOnTouched(_: () => void): void { + registerOnTouched(): void { // do nothing } From 6addefbe17ac606e6cd7d18f85f9d47eea72a9ff Mon Sep 17 00:00:00 2001 From: Maxim Uhlemann Date: Fri, 17 May 2024 21:14:06 +0200 Subject: [PATCH 15/15] Exclude auto generated code from prettier --- .prettierignore | 1 + src/app/core/api/api.module.ts | 39 +++---- src/app/core/api/base-service.ts | 5 +- src/app/core/api/fn/ahb/get-ahb.ts | 38 +++--- .../core/api/fn/ahb/get-format-versions.ts | 29 ++--- src/app/core/api/fn/ahb/get-pruefis.ts | 32 +++--- .../core/api/fn/maintenance/version-get.ts | 28 ++--- src/app/core/api/models/ahb.ts | 30 ++--- src/app/core/api/request-builder.ts | 108 +++++------------- src/app/core/api/services/ahb.service.ts | 36 ++---- .../core/api/services/maintenance.service.ts | 13 +-- src/app/core/api/strict-http-response.ts | 2 +- 12 files changed, 133 insertions(+), 228 deletions(-) create mode 100644 .prettierignore diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..9ef99346a --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +src/app/core/api \ No newline at end of file diff --git a/src/app/core/api/api.module.ts b/src/app/core/api/api.module.ts index d57cb6066..21858cb53 100644 --- a/src/app/core/api/api.module.ts +++ b/src/app/core/api/api.module.ts @@ -1,11 +1,6 @@ /* tslint:disable */ /* eslint-disable */ -import { - NgModule, - ModuleWithProviders, - SkipSelf, - Optional, -} from '@angular/core'; +import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { ApiConfiguration, ApiConfigurationParams } from './api-configuration'; @@ -19,37 +14,35 @@ import { MaintenanceService } from './services/maintenance.service'; imports: [], exports: [], declarations: [], - providers: [AhbService, MaintenanceService, ApiConfiguration], + providers: [ + AhbService, + MaintenanceService, + ApiConfiguration + ], }) export class ApiModule { - static forRoot( - params: ApiConfigurationParams, - ): ModuleWithProviders { + static forRoot(params: ApiConfigurationParams): ModuleWithProviders { return { ngModule: ApiModule, providers: [ { provide: ApiConfiguration, - useValue: params, - }, - ], - }; + useValue: params + } + ] + } } - constructor( + constructor( @Optional() @SkipSelf() parentModule: ApiModule, - @Optional() http: HttpClient, + @Optional() http: HttpClient ) { if (parentModule) { - throw new Error( - 'ApiModule is already loaded. Import in your base AppModule only.', - ); + throw new Error('ApiModule is already loaded. Import in your base AppModule only.'); } if (!http) { - throw new Error( - 'You need to import the HttpClientModule in your AppModule! \n' + - 'See also https://github.com/angular/angular/issues/20575', - ); + throw new Error('You need to import the HttpClientModule in your AppModule! \n' + + 'See also https://github.com/angular/angular/issues/20575'); } } } diff --git a/src/app/core/api/base-service.ts b/src/app/core/api/base-service.ts index c6b248ffa..24c2c7270 100644 --- a/src/app/core/api/base-service.ts +++ b/src/app/core/api/base-service.ts @@ -11,8 +11,9 @@ import { ApiConfiguration } from './api-configuration'; export class BaseService { constructor( protected config: ApiConfiguration, - protected http: HttpClient, - ) {} + protected http: HttpClient + ) { + } private _rootUrl?: string; diff --git a/src/app/core/api/fn/ahb/get-ahb.ts b/src/app/core/api/fn/ahb/get-ahb.ts index 424497208..166247ec4 100644 --- a/src/app/core/api/fn/ahb/get-ahb.ts +++ b/src/app/core/api/fn/ahb/get-ahb.ts @@ -10,39 +10,33 @@ import { Ahb } from '../../models/ahb'; import { FormatVersion } from '../../models/format-version'; export interface GetAhb$Params { - /** - * Formatversion of the AHB to return - */ + +/** + * Formatversion of the AHB to return + */ 'format-version': FormatVersion; - /** - * Pruefidentifikator of the AHB to return - */ +/** + * Pruefidentifikator of the AHB to return + */ pruefi: string; } -export function getAhb( - http: HttpClient, - rootUrl: string, - params: GetAhb$Params, - context?: HttpContext, -): Observable> { +export function getAhb(http: HttpClient, rootUrl: string, params: GetAhb$Params, context?: HttpContext): Observable> { const rb = new RequestBuilder(rootUrl, getAhb.PATH, 'get'); if (params) { rb.path('format-version', params['format-version'], {}); rb.path('pruefi', params.pruefi, {}); } - return http - .request( - rb.build({ responseType: 'json', accept: 'application/json', context }), - ) - .pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse; - }), - ); + return http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); } getAhb.PATH = '/api/ahb/{format-version}/{pruefi}'; diff --git a/src/app/core/api/fn/ahb/get-format-versions.ts b/src/app/core/api/fn/ahb/get-format-versions.ts index dd794cb5a..9dcfb3610 100644 --- a/src/app/core/api/fn/ahb/get-format-versions.ts +++ b/src/app/core/api/fn/ahb/get-format-versions.ts @@ -6,28 +6,23 @@ import { filter, map } from 'rxjs/operators'; import { StrictHttpResponse } from '../../strict-http-response'; import { RequestBuilder } from '../../request-builder'; -export interface GetFormatVersions$Params {} -export function getFormatVersions( - http: HttpClient, - rootUrl: string, - params?: GetFormatVersions$Params, - context?: HttpContext, -): Observable>> { +export interface GetFormatVersions$Params { +} + +export function getFormatVersions(http: HttpClient, rootUrl: string, params?: GetFormatVersions$Params, context?: HttpContext): Observable>> { const rb = new RequestBuilder(rootUrl, getFormatVersions.PATH, 'get'); if (params) { } - return http - .request( - rb.build({ responseType: 'json', accept: 'application/json', context }), - ) - .pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse>; - }), - ); + return http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse>; + }) + ); } getFormatVersions.PATH = '/api/format-versions'; diff --git a/src/app/core/api/fn/ahb/get-pruefis.ts b/src/app/core/api/fn/ahb/get-pruefis.ts index 8a5b3e952..4cbea1e29 100644 --- a/src/app/core/api/fn/ahb/get-pruefis.ts +++ b/src/app/core/api/fn/ahb/get-pruefis.ts @@ -9,33 +9,27 @@ import { RequestBuilder } from '../../request-builder'; import { FormatVersion } from '../../models/format-version'; export interface GetPruefis$Params { - /** - * Formatversion of the AHB to return - */ + +/** + * Formatversion of the AHB to return + */ 'format-version': FormatVersion; } -export function getPruefis( - http: HttpClient, - rootUrl: string, - params: GetPruefis$Params, - context?: HttpContext, -): Observable>> { +export function getPruefis(http: HttpClient, rootUrl: string, params: GetPruefis$Params, context?: HttpContext): Observable>> { const rb = new RequestBuilder(rootUrl, getPruefis.PATH, 'get'); if (params) { rb.path('format-version', params['format-version'], {}); } - return http - .request( - rb.build({ responseType: 'json', accept: 'application/json', context }), - ) - .pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse>; - }), - ); + return http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse>; + }) + ); } getPruefis.PATH = '/api/format-versions/{format-version}/pruefis'; diff --git a/src/app/core/api/fn/maintenance/version-get.ts b/src/app/core/api/fn/maintenance/version-get.ts index b7ac219be..c7cfc34e6 100644 --- a/src/app/core/api/fn/maintenance/version-get.ts +++ b/src/app/core/api/fn/maintenance/version-get.ts @@ -8,28 +8,22 @@ import { RequestBuilder } from '../../request-builder'; import { Version } from '../../models/version'; -export interface VersionGet$Params {} +export interface VersionGet$Params { +} -export function versionGet( - http: HttpClient, - rootUrl: string, - params?: VersionGet$Params, - context?: HttpContext, -): Observable> { +export function versionGet(http: HttpClient, rootUrl: string, params?: VersionGet$Params, context?: HttpContext): Observable> { const rb = new RequestBuilder(rootUrl, versionGet.PATH, 'get'); if (params) { } - return http - .request( - rb.build({ responseType: 'json', accept: 'application/json', context }), - ) - .pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse; - }), - ); + return http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); } versionGet.PATH = '/version'; diff --git a/src/app/core/api/models/ahb.ts b/src/app/core/api/models/ahb.ts index 8830649a5..3810fd4bb 100644 --- a/src/app/core/api/models/ahb.ts +++ b/src/app/core/api/models/ahb.ts @@ -2,20 +2,20 @@ /* eslint-disable */ export interface Ahb { lines: Array<{ - ahb_expression: string; - data_element: string; - guid: string; - index: number; - name: string; - section_name: string; - segment_code: string; - segment_group_key: string; - value_pool_entry: string; - }>; +'ahb_expression': string; +'data_element': string; +'guid': string; +'index': number; +'name': string; +'section_name': string; +'segment_code': string; +'segment_group_key': string; +'value_pool_entry': string; +}>; meta: { - description: string; - direction: string; - maus_version: string; - pruefidentifikator: string; - }; +'description': string; +'direction': string; +'maus_version': string; +'pruefidentifikator': string; +}; } diff --git a/src/app/core/api/request-builder.ts b/src/app/core/api/request-builder.ts index 49dd7c87b..5b7a63b87 100644 --- a/src/app/core/api/request-builder.ts +++ b/src/app/core/api/request-builder.ts @@ -1,12 +1,6 @@ /* tslint:disable */ /* eslint-disable */ -import { - HttpRequest, - HttpParameterCodec, - HttpParams, - HttpHeaders, - HttpContext, -} from '@angular/common/http'; +import { HttpRequest, HttpParameterCodec, HttpParams, HttpHeaders, HttpContext } from '@angular/common/http'; /** * Custom parameter codec to correctly handle the plus sign in parameter @@ -43,13 +37,7 @@ interface ParameterOptions { * Base class for a parameter */ abstract class Parameter { - constructor( - public name: string, - public value: any, - public options: ParameterOptions, - defaultStyle: string, - defaultExplode: boolean, - ) { + constructor(public name: string, public value: any, public options: ParameterOptions, defaultStyle: string, defaultExplode: boolean) { this.options = options || {}; if (this.options.style === null || this.options.style === undefined) { this.options.style = defaultStyle; @@ -63,21 +51,13 @@ abstract class Parameter { if (value === null || value === undefined) { return ''; } else if (value instanceof Array) { - return value - .map((v) => - this.serializeValue(v) - .split(separator) - .join(encodeURIComponent(separator)), - ) - .join(separator); + return value.map(v => this.serializeValue(v).split(separator).join(encodeURIComponent(separator))).join(separator); } else if (typeof value === 'object') { const array: string[] = []; for (const key of Object.keys(value)) { let propVal = value[key]; if (propVal !== null && propVal !== undefined) { - propVal = this.serializeValue(propVal) - .split(separator) - .join(encodeURIComponent(separator)); + propVal = this.serializeValue(propVal).split(separator).join(encodeURIComponent(separator)); if (this.options.explode) { array.push(`${key}=${propVal}`); } else { @@ -107,7 +87,7 @@ class PathParameter extends Parameter { value = ''; } let prefix = this.options.style === 'label' ? '.' : ''; - let separator = this.options.explode ? (prefix === '' ? ',' : prefix) : ','; + let separator = this.options.explode ? prefix === '' ? ',' : prefix : ','; let alreadySerialized = false; if (this.options.style === 'matrix') { // The parameter name is just used as prefix, except in some cases... @@ -116,36 +96,26 @@ class PathParameter extends Parameter { prefix = ';'; if (value instanceof Array) { // For arrays we have to repeat the name for each element - value = value.map( - (v) => `${this.name}=${this.serializeValue(v, ';')}`, - ); + value = value.map(v => `${this.name}=${this.serializeValue(v, ';')}`); value = value.join(';'); alreadySerialized = true; } else { // For objects we have to put each the key / value pairs value = this.serializeValue(value, ';'); - alreadySerialized = true; + alreadySerialized = true } } } - value = - prefix + - (alreadySerialized ? value : this.serializeValue(value, separator)); + value = prefix + (alreadySerialized ? value : this.serializeValue(value, separator)); // Replace both the plain variable and the corresponding variant taking in the prefix and explode into account path = path.replace(`{${this.name}}`, value); - path = path.replace( - `{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, - value, - ); + path = path.replace(`{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, value); return path; } // @ts-ignore serializeValue(value: any, separator = ','): string { - var result = - typeof value === 'string' - ? encodeURIComponent(value) - : super.serializeValue(value, separator); + var result = typeof value === 'string' ? encodeURIComponent(value) : super.serializeValue(value, separator); result = result.replace(/%3D/g, '='); result = result.replace(/%3B/g, ';'); result = result.replace(/%2C/g, ','); @@ -169,16 +139,10 @@ class QueryParameter extends Parameter { params = params.append(this.name, this.serializeValue(v)); } } else { - const separator = - this.options.style === 'spaceDelimited' - ? ' ' - : this.options.style === 'pipeDelimited' - ? '|' - : ','; - return params.append( - this.name, - this.serializeValue(this.value, separator), - ); + const separator = this.options.style === 'spaceDelimited' + ? ' ' : this.options.style === 'pipeDelimited' + ? '|' : ','; + return params.append(this.name, this.serializeValue(this.value, separator)); } } else if (this.value !== null && typeof this.value === 'object') { // Object serialization @@ -187,10 +151,7 @@ class QueryParameter extends Parameter { for (const key of Object.keys(this.value)) { const propVal = this.value[key]; if (propVal !== null && propVal !== undefined) { - params = params.append( - `${this.name}[${key}]`, - this.serializeValue(propVal), - ); + params = params.append(`${this.name}[${key}]`, this.serializeValue(propVal)); } } } else if (this.options.explode) { @@ -247,6 +208,7 @@ class HeaderParameter extends Parameter { * Helper to build http requests from parameters */ export class RequestBuilder { + private _path = new Map(); private _query = new Map(); private _header = new Map(); @@ -256,8 +218,8 @@ export class RequestBuilder { constructor( public rootUrl: string, public operationPath: string, - public method: string, - ) {} + public method: string) { + } /** * Sets a path parameter @@ -289,11 +251,7 @@ export class RequestBuilder { } else { this._bodyContentType = contentType; } - if ( - this._bodyContentType === 'application/x-www-form-urlencoded' && - value !== null && - typeof value === 'object' - ) { + if (this._bodyContentType === 'application/x-www-form-urlencoded' && value !== null && typeof value === 'object') { // Handle URL-encoded data const pairs: Array<[string, string]> = []; for (const key of Object.keys(value)) { @@ -308,9 +266,7 @@ export class RequestBuilder { } } } - this._bodyContent = pairs - .map((p) => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`) - .join('&'); + this._bodyContent = pairs.map(p => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`).join('&'); } else if (this._bodyContentType === 'multipart/form-data') { // Handle multipart form data const formData = new FormData(); @@ -347,7 +303,7 @@ export class RequestBuilder { return value; } if (typeof value === 'object') { - return new Blob([JSON.stringify(value)], { type: 'application/json' }); + return new Blob([JSON.stringify(value)], {type: 'application/json'}) } return String(value); } @@ -368,6 +324,7 @@ export class RequestBuilder { /** Allow passing HttpContext for HttpClient */ context?: HttpContext; }): HttpRequest { + options = options || {}; // Path parameters @@ -379,7 +336,7 @@ export class RequestBuilder { // Query parameters let httpParams = new HttpParams({ - encoder: ParameterCodecInstance, + encoder: ParameterCodecInstance }); for (const queryParam of this._query.values()) { httpParams = queryParam.append(httpParams); @@ -400,17 +357,12 @@ export class RequestBuilder { } // Perform the request - return new HttpRequest( - this.method.toUpperCase(), - url, - this._bodyContent, - { - params: httpParams, - headers: httpHeaders, - responseType: options.responseType, - reportProgress: options.reportProgress, - context: options.context, - }, - ); + return new HttpRequest(this.method.toUpperCase(), url, this._bodyContent, { + params: httpParams, + headers: httpHeaders, + responseType: options.responseType, + reportProgress: options.reportProgress, + context: options.context + }); } } diff --git a/src/app/core/api/services/ahb.service.ts b/src/app/core/api/services/ahb.service.ts index 3e8adb6e8..d1ae83cd8 100644 --- a/src/app/core/api/services/ahb.service.ts +++ b/src/app/core/api/services/ahb.service.ts @@ -17,6 +17,7 @@ import { GetFormatVersions$Params } from '../fn/ahb/get-format-versions'; import { getPruefis } from '../fn/ahb/get-pruefis'; import { GetPruefis$Params } from '../fn/ahb/get-pruefis'; + /** * Everything about AHB documents */ @@ -39,10 +40,7 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getAhb$Response( - params: GetAhb$Params, - context?: HttpContext, - ): Observable> { + getAhb$Response(params: GetAhb$Params, context?: HttpContext): Observable> { return getAhb(this.http, this.rootUrl, params, context); } @@ -58,7 +56,7 @@ export class AhbService extends BaseService { */ getAhb(params: GetAhb$Params, context?: HttpContext): Observable { return this.getAhb$Response(params, context).pipe( - map((r: StrictHttpResponse): Ahb => r.body), + map((r: StrictHttpResponse): Ahb => r.body) ); } @@ -75,10 +73,7 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getFormatVersions$Response( - params?: GetFormatVersions$Params, - context?: HttpContext, - ): Observable>> { + getFormatVersions$Response(params?: GetFormatVersions$Params, context?: HttpContext): Observable>> { return getFormatVersions(this.http, this.rootUrl, params, context); } @@ -92,18 +87,14 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getFormatVersions( - params?: GetFormatVersions$Params, - context?: HttpContext, - ): Observable> { + getFormatVersions(params?: GetFormatVersions$Params, context?: HttpContext): Observable> { return this.getFormatVersions$Response(params, context).pipe( - map((r: StrictHttpResponse>): Array => r.body), + map((r: StrictHttpResponse>): Array => r.body) ); } /** Path part for operation `getPruefis()` */ - static readonly GetPruefisPath = - '/api/format-versions/{format-version}/pruefis'; + static readonly GetPruefisPath = '/api/format-versions/{format-version}/pruefis'; /** * Get a list of all available Pruefidentifikators for a given format version. @@ -115,10 +106,7 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getPruefis$Response( - params: GetPruefis$Params, - context?: HttpContext, - ): Observable>> { + getPruefis$Response(params: GetPruefis$Params, context?: HttpContext): Observable>> { return getPruefis(this.http, this.rootUrl, params, context); } @@ -132,12 +120,10 @@ export class AhbService extends BaseService { * * This method doesn't expect any request body. */ - getPruefis( - params: GetPruefis$Params, - context?: HttpContext, - ): Observable> { + getPruefis(params: GetPruefis$Params, context?: HttpContext): Observable> { return this.getPruefis$Response(params, context).pipe( - map((r: StrictHttpResponse>): Array => r.body), + map((r: StrictHttpResponse>): Array => r.body) ); } + } diff --git a/src/app/core/api/services/maintenance.service.ts b/src/app/core/api/services/maintenance.service.ts index 88bc34851..db21b05ad 100644 --- a/src/app/core/api/services/maintenance.service.ts +++ b/src/app/core/api/services/maintenance.service.ts @@ -32,10 +32,7 @@ export class MaintenanceService extends BaseService { * * This method doesn't expect any request body. */ - versionGet$Response( - params?: VersionGet$Params, - context?: HttpContext, - ): Observable> { + versionGet$Response(params?: VersionGet$Params, context?: HttpContext): Observable> { return versionGet(this.http, this.rootUrl, params, context); } @@ -49,12 +46,10 @@ export class MaintenanceService extends BaseService { * * This method doesn't expect any request body. */ - versionGet( - params?: VersionGet$Params, - context?: HttpContext, - ): Observable { + versionGet(params?: VersionGet$Params, context?: HttpContext): Observable { return this.versionGet$Response(params, context).pipe( - map((r: StrictHttpResponse): Version => r.body), + map((r: StrictHttpResponse): Version => r.body) ); } + } diff --git a/src/app/core/api/strict-http-response.ts b/src/app/core/api/strict-http-response.ts index 174cdbd76..42589fac4 100644 --- a/src/app/core/api/strict-http-response.ts +++ b/src/app/core/api/strict-http-response.ts @@ -7,4 +7,4 @@ import { HttpResponse } from '@angular/common/http'; */ export type StrictHttpResponse = HttpResponse & { readonly body: T; -}; +}